仿真很好,但是焊接实物测试连接DHT11模块显示00 有没有大神指点程序如下 自己编写
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar wendu=30,shidu=50;//初始温湿度上限设定
uchar data_byte;
uchar HH,HL,TH,TL;
sbit lcden=P2^7;//定义1602使能端
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit io=P2^0;//定义数据口
sbit s0=P3^0;//定义独立按键口
sbit s1=P3^1;
sbit s2=P3^2;
sbit s3=P3^3;
sbit bee= P1^0;//蜂鸣器口
sbit led1=P1^1;//报警灯口
sbit led2=P1^2;
uchar num;
void delay10(void) //延时10us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=1;a>0;a--);
}
void delay(uint z )//延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay1()//8us延时
{
uchar i;
for(i=0;i<1;i++);
}
//***************LCD1602显示程序*****************//
void write_com(uchar com)//写命令
{
lcdrw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)//写数据
{
lcdrw=0;
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()//LCD初始化
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+ 0x1);
}
void write_addr(uchar addr)//写地址
{
write_com(addr|0x80) ;
}
void display(uchar addr, uchar q)//在某一地址显示某一数据
{
delay(5) ;
write_addr(addr) ;
write_data(q) ;
delay(5);
}
//************DHT11程序************//
void start()//开始信号
{
io=1;//主机拉高
delay1();//延时
io=0;//发送开始信号
delay(25);//延时>18ms
io=1;//开始信号结束后拉高电平
delay10();//20-40us
delay10();
delay10();
}
uchar receive_byte()//接收一个字节
{
uchar i,temp;
for(i=0;i<8;i++)//接收8bit数据
{
while(!io)//等待50us低电平结束
delay1();
delay1();
delay1();
delay1();//延时24us
temp=0;
if(io==1)temp=1;
while(io);
data_byte<<=1;
data_byte|=temp;
}
return data_byte;
}
void receive()//接收数据
{
uchar T_H,T_L,H_H,H_L,check,num_check;
start();//开始
io=1;
if(!io)//读取DHT11开始信号
{
while(!io);//DHT11高电平80us是否结束
while(io);
H_H=receive_byte();
H_L=receive_byte();
T_H=receive_byte();
T_L=receive_byte();
check=receive_byte();
io=0; //拉低延迟50us
delay10();
delay10();
delay10();
delay10();
delay10();
io=1;
num_check=H_H+H_L+T_H+T_L;//校验
if(num_check=check)
{
HH=H_H;
HL=H_L;
TH=T_H;
TL=T_L;
check=num_check;
}
}
}
//*************报警*************//
void warn()
{
if(TH>=wendu)
{
bee=1;
led2=1;
}
if(HH>=shidu)
{
bee=1;
led1=1;
}
if(TH<wendu && HH<shidu)
{bee=0;
led1=0;
led2=0;
}
}
//************温湿度设置***********//
void shezhi()
{
if(s0==0)
{
delay(5);
if(s0==0)
{
while(s0==0);
wendu++;
display(0x4c,wendu/10+0x30);
display(0x4d,wendu%10+0x30);
if(wendu>50)
wendu=0;
}
}
if(s1==0)
{
delay(5);
if(s1==0)
{
while(s1==0);
wendu--;
display(0x4c,wendu/10+0x30);
display(0x4d,wendu%10+0x30);
if(wendu==0)
wendu=50;
}
}
if(s2==0)
{
delay(5);
if(s2==0)
{
while(s2==0);
shidu++;
display(0x0c,shidu/10+0x30);
display(0x0d,shidu%10+0x30);
if(shidu==100)
shidu=0;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(s3==0);
shidu--;
display(0x0c,shidu/10+0x30);
display(0x0d,shidu%10+0x30);
if(shidu==0)
shidu=100;
}
}
}
//**************主函数***************//
void main()
{
init();//初始化
while(1)
{
receive();//接收DHT11数据
delay(30);
display(0x00,'H');//显示湿度
delay(30);
display(0x01,'U');
delay(30);
display(0x02,'M');
delay(30);
display(0x03,':');
delay(30);
display(0x04,HH/10+0x30);//显示DHT11数据
delay(30);
display(0x05,HH%10+0x30);
delay(30);
display(0x06,'%');
delay(30);
display(0x08,'M');//显示设定湿度上限
delay(30);
display(0x09,'A');
delay(30);
display(0x0a,'X');
delay(30);
display(0x0b,':');
delay(30);
display(0x0c,shidu/10+0x30);
delay(30);
display(0x0d,shidu%10+0x30);
delay(30);
display(0x0e,'%');
delay(30);
display(0x40,'T');//显示温度
delay(30);
display(0x41,'E');
delay(30);
display(0x42,'M');
delay(30);
display(0x43,':');
delay(30);
display(0x44,TH/10+0x30);//显示DHT11数据
delay(30);
display(0x45,TH%10+0x30);
delay(30);
display(0x46,'C');
delay(30);
display(0x48,'M');//显示设定温度上限
delay(30);
display(0x49,'A');
delay(30);
display(0x4a,'X');
delay(30);
display(0x4b,':');
delay(30);
display(0x4c,wendu/10+0x30);
delay(30);
display(0x4d,wendu%10+0x30);
delay(30);
display(0x4e,'C');
delay(30);
shezhi();//温室度上限设置
delay(30);
warn();//报警
delay(100);
}
}
|