還有就是那個從機響應函數response()加上的話lcd就什么也不顯示了,不加的話現在顯示濕度68,溫度46,
程序如下
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DATA=P2^0;
- sbit rs=P2^6;
- sbit rw=P2^5;
- sbit en=P2^7;
- uchar rec_dat[9]; //用于顯示的接收數據數組
- /*1ms延時函數*/
- void delay1ms(uint x) //誤差 0us
- {
- unsigned char a,b,c;
- for(c=x;c>0;c--)
- for(b=142;b>0;b--)
- for(a=2;a>0;a--);
- }
- /*80us延時函數*/
- void delay80us(void) //誤差 0us
- {
- unsigned char a,b;
- for(b=11;b>0;b--)
- for(a=2;a>0;a--);
- }
- /*60us延時函數*/
- void delay60us(void) //誤差 0us
- {
- unsigned char a,b;
- for(b=3;b>0;b--)
- for(a=8;a>0;a--);
- }
- /*24us延時函數*/
- void delay24us(void) //誤差 0us
- {
- unsigned char a,b;
- for(b=3;b>0;b--)
- for(a=2;a>0;a--);
- }
- /*27us延時函數*/
- void delay27us(void) //誤差 0us
- {
- unsigned char a;
- for(a=12;a>0;a--);
- }
- /*主機發送起始信號*/
- void start()
- {
- DATA=0;
- delay1ms(20);
- DATA=1;
- delay24us();
- }
- /*檢測從機應答信號*/
- void response()
- {
- DATA=0;
- delay80us();
- DATA=1;
- delay80us();
- }
- /*接收1字節數據*/
- uint receivebyte()
- {
- uchar i,dat=0;
- for(i=0;i<8;i++)
- {
- while(!DATA);//等待50ms低電平過去
- delay27us();
- if(DATA==1)
- dat+=1;
- dat<<=1;//數據移位
- while(DATA);
- }
- return dat;
- }
- void DHT11()
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revive;
- start();
- DATA=1;
- // response();
- if(DATA==0)
- {
- while(DATA==0);
- delay80us();
- R_H=receivebyte(); //接收濕度高八位
- R_L=receivebyte(); //接收濕度低八位
- T_H=receivebyte(); //接收溫度高八位
- T_L=receivebyte(); //接收溫度低八位
- revive=receivebyte(); //接收校正位
- delay60us();
- }
- if((R_H+R_L+T_H+T_L)==revive) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- /*數據處理,方便顯示*/
- rec_dat[0]='0'+(RH/10);
- rec_dat[1]='0'+(RH%10);
- rec_dat[2]='R';
- rec_dat[3]='H';
- rec_dat[4]=' ';
- rec_dat[5]=' ';
- rec_dat[6]='0'+(TH/10);
- rec_dat[7]='0'+(TH%10);
- rec_dat[8]='C';
- }
- void lcd_wcom(uchar com)
- {
- rs=0;
- rw=0;
- P0=com;
- delay1ms(5);
- en=1;
- delay1ms(5);
- en=0;
- }
- void lcd_wdat(uchar dat)
- {
- rs=1;
- rw=0;
- P0=dat;
- delay1ms(5);
- en=1;
- delay1ms(5);
- en=0;
- }
- void lcd_init()
- {
- lcd_wcom(0x38);
- lcd_wcom(0x0c);
- lcd_wcom(0x06);
- lcd_wcom(0x01);
- }
- void main()
- {
- uchar i;
- lcd_init();
- delay1ms(1000);
- while(1)
- {
- DHT11();
- lcd_wcom(0x80);
- for(i=0;i<9;i++)
- {
- lcd_wdat(rec_dat[i]);
- }
- }
- }
復制代碼
|