基于51單片機的1602液晶屏顯示DHT11溫濕度
單片機源程序如下:
- #include<reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit leden=P1^0; //EN使能
- sbit ledrs=P1^2; //高寫指令低寫數據
- sbit ledbj=P1^4;
- sbit Data=P3^6; //定義數據線
- uchar rec_dat[11]; //用于顯示的接收數據數組
- uchar num,i;
- uchar code table[]="I LIKE QAU";
- void csh();
- void delay1ms(uint a);
- void DHT11_delay_us(uchar n);
- void DHT11_delay_ms(uint z);
- void DHT11_start();
- void DHT11_receive();
- void com(uchar c);
- void dat(uchar d);
- void main()
- {
- com(0x01); //清屏
- csh();
- while(1)
- {
- DHT11_delay_ms(1500); //DHT11上電后要等待1S以越過不穩定狀態在此期間不能發送任何指令
- com(0x80+0x02);
- DHT11_receive();
- for(i=0;i<11;i++) //顯示溫度數據
- dat(rec_dat[i]);
- }
-
- }
- void csh() //1602初始化
- { ledbj=0;
- leden=0;
- com(0x38);
- com(0x0C);
- com(0x06);
- com(0x80);
- com(0x80+0x43);
- for(num=0;num<10;num++) //顯示table1值
- {
- dat(table[num]);
- delay1ms(200);
- }
- }
- void delay1ms(uint a) //100000=1s,1ms=100
- { uint i,j;
- for(i=a;i>0;i--)
- for(j=100;j>0;j--);
- }
- void com(uchar com) //寫指令
- {
- ledrs=0;
- P2=com;
- delay1ms(5); //
- leden=1;
- delay1ms(5);
- leden=0;
- }
- void dat(uchar dat) //寫數據
- {
- ledrs=1;
- P2=dat;
- delay1ms(5);
- leden=1;
- delay1ms(5);
- leden=0;
- }
- 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--);
- }
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(20); //延時18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- uchar DHT11_rec_byte() //接收一個字節
- {
- uchar i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數據
- {
- while(!Data); ////等待50us低電平過去
- DHT11_delay_us(8); //延時60us,如果還為高則數據為1,否則為0
- dat<<=1; //移位使正確接收8位數據,數據為0時直接移位
- if(Data==1) //數據為1時,使dat加1來接收數據1
- dat+=1;
- while(Data); //等待數據線拉低
- }
- return dat;
- }
- void DHT11_receive() //接收40位的數據
- {
- 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); //拉高后延時80us
- 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;
- }
- /*數據處理*/
- rec_dat[0]=' ';
- rec_dat[1]='T';
- rec_dat[2]='E';
- rec_dat[3]='M';
- rec_dat[4]=' ';
- rec_dat[5]=' ';
- rec_dat[6]='0'+(TH/10);
- rec_dat[7]='0'+(TH%10);
- rec_dat[8]='.';
- rec_dat[9]='0'+TL;
- rec_dat[10]='C';
- if(TH>=32)
- {
- ledbj=1;
- }
- else
- {
- ledbj=0;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
測量溫度顯示.zip
(90.98 KB, 下載次數: 41)
2018-12-4 12:09 上傳
點擊文件名下載附件
|