單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Data=P3^6;//定義dht11數據線
- sbit rs=P3^0;
- sbit rw=P3^1;
- sbit en=P3^2;
- uchar rec_dat[30]; //接收1602顯示數據數組
- //延時函數
- void delay(uint n)
- { uint x,y;
- for(x=n;x>0;x--)
- for(y=110;y>0;y--);
- }
- //lcd1602寫入指令
- void write_com(uchar com)
- {
- rs=0;
- P2=com;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- //lcd1602寫入數據
- void write_dat(uchar dat)
- {
- rs=1;
- P2=dat;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- //lcd1602初始化
- void init_lcd()
- {
- en=0;
- rw=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- }
- //DHT11延時函數
- void DHT11_delay_us(uchar n)
- {
- while(--n);
- }
- void DHT11_delay_ms(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- //DHT11驅動
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(25); //延時18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- //DHT11接收8位二進制數
- uchar DHT11_rec_byte()
- {
- uchar i,dat=0;
- for(i=0;i<8;i++)
- {
- while(!Data);
- DHT11_delay_us(8); //延時60ms,如果p3^6口仍然為高電平,則 為1,反之為0
- dat<<=1;
- if(Data==1)
- dat+=1;
- while(Data);
- }
- return dat;
- }
- //DHT11接收40位數據
- void DHT11_receive()
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
- if(Data==0)
- {
- while(Data==0);
- DHT11_delay_us(40);
- R_H=DHT11_rec_byte(); //接收濕度高八位
- R_L=DHT11_rec_byte(); //接收濕度低八位
- T_H=DHT11_rec_byte(); //接收溫度高八位
- T_L=DHT11_rec_byte(); //接收溫度低八位
- revise=DHT11_rec_byte(); //接收校正位
- DHT11_delay_us(25);
- if((R_H+R_L+T_H+T_L)==revise)//判斷接收數據是否正確
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }//1602顯示
- rec_dat[0]='H';
- rec_dat[1]='U';
- rec_dat[2]=':';
- rec_dat[3]='0'+(RH/10);
- rec_dat[4]='0'+(RH%10);
- rec_dat[5]='%';
- rec_dat[6]=' ';
- rec_dat[7]=' ';
- rec_dat[8]='T';
- rec_dat[9]='E';
- rec_dat[10]=':';
- rec_dat[11]='0'+(TH/10);
- rec_dat[12]='0'+(TH%10);
- rec_dat[13]='^';
- rec_dat[14]='C';
- rec_dat[15]='z';
- rec_dat[16]='h';
- rec_dat[17]='a';
- rec_dat[18]='n';
- rec_dat[19]='g';
-
- }
- }
- //主函數
- void main()
- {
- uchar i;
- init_lcd();
- while(1)
- {
- DHT11_delay_us(1000); //dht11上電后等待1秒
- DHT11_receive();
- write_com(0x80); // 在1602第一行顯示
- for(i=0;i<15;i++)
- {
- write_dat(rec_dat[i]);
- }
- write_com(0x80+0x40);//在1602第二行顯示
- for(i=15;i<20;i++)
- {
- write_dat(rec_dat[i]);
- }
- }
- }
復制代碼 |