|
protues仿真DHT11顯示溫濕度
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (41.82 KB, 下載次數(shù): 188)
下載附件
2018-4-10 02:44 上傳
0.jpg (38.59 KB, 下載次數(shù): 151)
下載附件
2018-4-10 02:44 上傳
DHT11單片機(jī)源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Data=P3^6; //定義數(shù)據(jù)線
- uchar rec_dat[9]; //用于顯示的接收數(shù)據(jù)數(shù)組
- sbit lcdrs=P3^0;
- sbit lcdrw=P3^1;
- sbit lcden=P3^2;
- void delay(uint n)
- { uint x,y;
- for(x=n;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)
- {
- lcdrs=0; //rs=0時(shí)輸入指令
- P2=com;
- delay(5);
- lcden=1; //en=1時(shí)讀取信息
- delay(5);
- lcden=0; //1 -> 0 執(zhí)行指令
- }
- void write_dat(uchar dat)
- {
- lcdrs=1; //rs=1時(shí)輸入數(shù)據(jù)
- P2=dat;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init_lcd()
- {
- lcden=0;
- lcdrw=0;
- write_com(0x38); //8位數(shù)據(jù),雙列,5*7字形
- write_com(0x0c); //開(kāi)啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍
- write_com(0x06); //顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位
- write_com(0x01);
- }
- 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(30); //延時(shí)18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- uchar DHT11_rec_byte() //接收一個(gè)字節(jié)
- {
- uchar i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)
- {
- while(!Data); ////等待50us低電平過(guò)去
- DHT11_delay_us(8); //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0
- dat<<=1; //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
- if(Data==1) //數(shù)據(jù)為1時(shí),使dat加1來(lái)接收數(shù)據(jù)1
- dat+=1;
- while(Data); //等待數(shù)據(jù)線拉低
- }
- return dat;
- }
- void DHT11_receive() //接收40位的數(shù)據(jù)
- {
- 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); //拉高后延時(shí)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); //結(jié)束
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- /*數(shù)據(jù)處理,方便顯示*/
- 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';
- }
- }
- /*這里使用lcd1602來(lái)顯示采集到的數(shù)據(jù),lcd1602驅(qū)動(dòng)程序在博主的51單片機(jī)系列博文中有詳細(xì)講解*/
- void main()
- {
- uchar i;
- init_lcd(); //lcd1602初始化
- while(1)
- {
- DHT11_delay_ms(100); //DHT11上電后要等待1S以越過(guò)不穩(wěn)定狀態(tài)在此期間不能發(fā)送任何指令
- DHT11_receive();
- write_com(0x80); //從lcd1602第一行第一個(gè)位置開(kāi)始顯示
- for(i=0;i<9;i++)
- write_dat(rec_dat[i]); //顯示數(shù)據(jù)
- write_com(0x80+0x40);
- write_dat(0x2d);
- write_dat(0x42);
- write_dat(0x3a);
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
DHT11.rar
(51.42 KB, 下載次數(shù): 1700)
2018-4-9 23:53 上傳
點(diǎn)擊文件名下載附件
仿真以及源碼 下載積分: 黑幣 -5
|
|