#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语句删掉以后,液晶有显示了,但是温湿度示数是错误的,并且不断波动,程序哪里错了呀?求帮助,在下新手...求各位前辈指点,不胜感激... |