打印

DHT11的1602液晶显示程序,出错啦,求帮助...谢谢...

[复制链接]
3925|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
白巧克力|  楼主 | 2011-5-31 00:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dht=P1^0;          //dht11的通讯口
sbit lcden=P3^4;       //液晶使能
sbit rs=P3^5;           //液晶指令数据选择段
sbit dula=P2^6;  
sbit wela=P2^7;      //用来关掉开发板上的位选和段选,防止数码管显示乱码   因为液晶数据口和数码管口都是P0口。
uchar rh_temp,rl_temp,th_temp,tl_temp,ck_temp,temp;
uchar rh_data,rl_data,th_data,tl_data,ck_data,com_data;
uchar str1[5],str2[5];
uchar i;
uchar code table[]="shidu:";
uchar code table1[]="wendu:";
void delay(uint z)                 //延时函数
{
    uint x,y;
for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
void delay_10us()                   //延时5us
{
  uint i;
  i--;
  i--;
  i--;
  i--;
  i--;
  i--;
}
uchar receive_comdata()      //接受一个字节的数据
{
  uint i,respond;
  for(i=0;i<8;i++)
  {   
      
      respond=2;
   while((!dht)&&respond++);    //判断数据是否开始传输
   delay_10us();
   delay_10us();
  // delay_10us();
   temp=0;
   if(dht)       //如果这时还是高低平,说明发送的应该为1
   {
   temp=1;
   respond=2;
   while((!dht)&&respond++);
   }
    if(respond==1) break;
   com_data<<=1;
   com_data|=temp; //不同之处.............
   
  }
     return(com_data);
}
void read_dht()     //数据读取子程序
{
  uchar respond;
  dht=0;
  delay(18);
  dht=1;
  delay_10us();
  delay_10us();
  delay_10us();
  delay_10us();
  respond=2;
  while((dht)&&respond++);
  if(!dht)
  {
      
respond=2;
    while((!dht)&&respond++);  //判断dht发出80微秒的低电平响应是否结束
    respond=2;
    while((dht)&&respond++);  //判断dht发出80微秒的高电平响应是否结束 ,结束则开始接受数据
   rh_temp=receive_comdata();
rl_temp=receive_comdata();
th_temp=receive_comdata();
tl_temp=receive_comdata();
ck_temp=receive_comdata();
   dht=1;
   temp=rh_temp+rl_temp+th_temp+tl_temp;    //数据校验
  if(ck_temp==temp)
  {
rh_data=rh_temp;
rl_data=rl_temp;
th_data=th_temp;
tl_data=tl_temp;
ck_data=ck_temp;
led=0;
  }
    }
   str1[0]=0x52;//写湿度代表字符R
   str1[1]=(0x30+rh_data/10);
   str1[2]=(0x30+rh_data%10);
   str1[3]=0x2e;   //写小数点
   str1[4]=(0x30+rl_data/10);
   str2[0]=0x54;//写温度度代表字符T
   str2[1]=(0x30+th_data/10);
   str2[2]=(0x30+th_data%10);
   str2[3]=0x2e;   //写小数点
   str2[4]=(0x30+tl_data/10);
}     
void write_com(uchar com)
{
rs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
rs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void xianshi()   //液晶显示
{
   write_com(0x80+0x06);
   for(i=0;i<5;i++)
   {
write_data(str1[i]);
delay(5);
   }
   write_com(0x80+0x46);
   for(i=0;i<5;i++)
   {
write_data(str2[i]);
delay(5);
   }
}
void init()
{
   dula=0;
   wela=0;
   lcden=0;
   write_com(0x38);
   write_com(0x0c);
   write_com(0x06);
   write_com(0x01);
   write_com(0x80);
   for(i=0;i<6;i++)
   {
write_data(table[i]);
delay(5);
   }
   write_com(0x80+0x40);
   for(i=0;i<6;i++)
   {
write_data(table1[i]);
delay(5);
}
}
void main()
{
init();
while(1)
{
// receive_comdata();
read_dht() ;
xianshi();
delay(1000);
}
}

液晶显示数据一直为零。    我检验了一下程序,是没有进入到这一步temp=rh_temp+rl_temp+th_temp+tl_temp;    //数据校验
  if(ck_temp==temp)          //这个if语句没有进去,也就是说temp不等于CK_temp
  {
rh_data=rh_temp;
rl_data=rl_temp;
th_data=th_temp;
tl_data=tl_temp;
ck_data=ck_temp;
led=0;
  }
我把if语句删掉以后,液晶有显示了,但是温湿度示数是错误的,并且不断波动,程序哪里错了呀?求帮助,在下新手...求各位前辈指点,不胜感激...

相关帖子

沙发
白巧克力|  楼主 | 2011-5-31 22:21 | 只看该作者
自己解决啦...原来是给的时序图有点不正确...自己慢慢调出来了...

使用特权

评论回复
板凳
naught0911| | 2014-7-29 16:43 | 只看该作者
我也遇到了同样的问题,求楼主共享一下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝