仿真很好,但是焊接實物測試連接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);
}
}
|