DHT11溫濕度 傳感器設計報告 院系:信息工程與科學學院 電氣工程學院 專業(yè):電子信息工程,自動化 年級:2014,2015 學生姓名:文*成,嚴*喜

二、實物圖




五、硬件設計分析以及使用 1、程序通過usb數(shù)據(jù)線燒寫到單片機,單片機凹口靠usb下載口插入單片機底座,數(shù)據(jù)下載分別與單片機3.0和3.1(TXD和RXD)連接; 2、自鎖開關未電源開關,按下通電,按起斷電; 3、lcd1604引腳1接口靠usb下載口,對應引腳插入lcd1604液晶,液晶v0引腳接高精度電位器,液晶亮度可旋轉(zhuǎn)電位器調(diào)節(jié),液晶DB0到DB7接口連接單片機的P0引腳,RS,RW和E分別連接單片機的P2^5,P2^6和P2^7引腳; 4、8550三極管基極通過100歐電阻后與單片機P2^4引腳連接,發(fā)射極接vcc,集電極與蜂鳴器正極連接,蜂鳴器負極接地,當有信號觸發(fā)三極管懂啊同后,蜂鳴器發(fā)出響聲,集電極與蜂鳴器之間有跳線帽,拔開跳線帽則與蜂鳴器斷開,有無信號蜂鳴器均不會響; 5、DHT11的數(shù)據(jù)引腳與單片機的P3^6引腳連接,負極與單片機的P3^7引腳連接,且又與電源負極連接,連接之間有跳線帽,拔開后可通過單片機控制DHT11的工作和停止工作,正極與電源正極相連 6、5個電容按鍵從左到右,從上之下分別是時間設置按鍵,時間”+”按鍵,濕度設置按鍵,濕度”+”按鍵,系統(tǒng)復位按鍵。通電后,液晶顯示,第一行是時間設置數(shù)值,初始值為0,第二行是本產(chǎn)品實際工作時間,第三行是當前濕度以及設定控制濕度值,控制濕度值初始為0,第四行為當前溫度值。當時間設置鍵按下,光標閃爍,工作時間停止,按時間”+”按鍵設置指定工作時間,按一次進入秒設置,第二次分設置,第三次時設置,第四次設置完成,退出時間設置;同理,濕度設置,按一次進入設置,再按一次設置完畢,退出濕度設置;當時間到了設定值,蜂鳴器則發(fā)出響聲,當濕度低于設定值,蜂鳴器也會發(fā)出響聲。
四、程序 - #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define unint unsigned int
- unsigned char code str4[12] ={' ',' ','0','0',':','0','0',':','0','0',' ',' '};
- unsigned char code str1[] ={"alarm:00:00:00"};
- //unsigned char num1[]={""};
- //unsigned char num2[]={""};
- unsigned char code dis1[] = {"RH: "};
- unsigned char code dis2[] = {"T: "};
- uchar numble,count,hour,minute,sound;
- int hours,minutes,sounds,flag,key1num;
- uchar TH_data,TL_data,RH_data,RL_data,CK_data;
- uchar TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
- uchar com_data,untemp,temp;
- uchar respond;
- uchar RH_shu,rhflag,key2num;
-
- sbit TRH = P3^6;//溫濕度傳感器DHT11數(shù)據(jù)接入
- sbit LCD_RS = P2^5;
- sbit LCD_RW = P2^6;
- sbit LCD_EN = P2^7;
- sbit key1 = P1^0; //時間調(diào)整選擇按鈕
- sbit key2 = P1^2; //時間加按鈕
- sbit key3 = P3^2; //濕度調(diào)整選擇按鈕
- sbit key4 = P3^5; //濕度加按鈕
- sbit beep = P2^4; //時間報警
- sbit alarm = P1^1; //濕度報警
- void write_time(uchar time,uchar x);
- void write_time1(uchar time,uchar x);
- /*********************************************************************************/
- void timer() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count++;
- if(count==20)
- {
- count=0;
- sound++;
- if(sound==60)
- {
- sound=0;
- minute++;
- if(minute==60)
- {
- minute=0;
- hour++;
- if(hour==24)
- {
- hour = 0;
- }
- write_time(hour,4);
- }
- write_time(minute,7);
- }
- write_time(sound,10);
- }
-
- }
- void delay(unint k)
- {
- unint x,y;
- for(x=k;x>0;x--)
- for(y=110;y>0;y--);
- }
- void delayNOP()
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- /*********************************************************************************/
- /*********************************************************************************/
- // 毫秒級延時子程序
- /*********************************************************************************/
- void delay_ms(unsigned char ms)
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i< 150; i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- /*********************************************************************************/
- /*********************************************************************************/
- //5us級延時程序
- /*********************************************************************************/
- void delay_us()
- {
- uchar i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- /********************************************************************************/
- /********************************************************************************/
- // 測試LCD忙碌狀態(tài)
- //lcd_busy()為1時,忙,等待。lcd_busy()為0時,閑,可寫指令與數(shù)據(jù)。
- /********************************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result=(bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************************/
- /*******************************************************************************/
- // 寫入指令數(shù)據(jù)到LCD
- /*******************************************************************************/
- void lcd_wcmd(unsigned char cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*****************************************************************************/
- /*****************************************************************************/
- //寫顯示數(shù)據(jù)到LCD
- //RS=高電平,RW=低電平,E=高脈沖,D0-D7=數(shù)據(jù)。
- /*****************************************************************************/
- void lcd_wdata(unsigned char dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /****************************************************************************/
- /****************************************************************************/
- //LCD初始化設定
- /****************************************************************************/
- void lcd_init()
- {
- // delay_ms(15);
- lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數(shù)據(jù)
- // delay_ms(5);
- lcd_wcmd(0x38);
- // delay_ms(5);
- lcd_wcmd(0x38);
- // delay_ms(5);
- lcd_wcmd(0x0c); //顯示開,關光標
- // delay_ms(5);
- lcd_wcmd(0x06); //移動光標
- // delay_ms(5);
- //lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容,如果屏幕過暗,可將這倆句刪除
- //delay_ms(5);
- lcd_wcmd(0x80+0x40+2);
- for(numble=0;numble<10;numble++)
- {
- lcd_wdata(str4[numble]);
- }
- lcd_wcmd(0x80+1);
- for(numble=0;numble<14;numble++)
- {
- lcd_wdata(str1[numble]);
- }
- lcd_wcmd(0x90+11);
- lcd_wdata('0');
- lcd_wdata('0');
- lcd_wdata('%');
- lcd_wdata('R');
- lcd_wdata('H');
- TMOD = 0x01;
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- /****************************************************************************/
- void write_time(uchar time,uchar x)
- {
- uchar shi , ge;
- shi = time/10;
- ge = time%10;
- lcd_wcmd(0x80+0x40+x);
- lcd_wdata(0x30+shi);
- lcd_wdata(0x30+ge);
- }
- void write_time1(uchar time,uchar x)
- {
- uchar shi , ge;
- shi = time/10;
- ge = time%10;
- lcd_wcmd(0x80+x);
- lcd_wdata(0x30+shi);
- lcd_wdata(0x30+ge);
- }
- void write_rh(uchar time,uchar x)
- {
- uchar shi , ge;
- shi = time/10;
- ge = time%10;
- lcd_wcmd(0x90+x);
- lcd_wdata(0x30+shi);
- lcd_wdata(0x30+ge);
- }
- /****************************************************************************/
- void keyscan()
- {
- if(key1==0)
- {
- delay(5);
- if(key1==0)
- {
- key1num++;
- while(!key1);
- switch(key1num)
- {
- case 1:
- TR0 = 0;
- lcd_wcmd(0x80+13);
- lcd_wcmd(0x0f);
- break;
- case 2:
- lcd_wcmd(0x80+10);
- lcd_wcmd(0x0f);
- break;
- case 3:
- lcd_wcmd(0x80+7);
- lcd_wcmd(0x0f);
- break;
- case 4:
- TR0 = 1;
- lcd_wcmd(0x0c);
- key1num = 0;
- flag=1;
- break;
- }
- }
- }
- if(key1num!=0)
- {
- if(key2 == 0)
- {
- delay(5);
- if(key2 == 0)
- {
- while(!key2);
- switch(key1num)
- {
- case 1:
- sounds++;
- if(sounds==60)
- sounds=0;
- write_time1(sounds,13);
- lcd_wcmd(0x80+13);
- break;
- case 2:
- minutes++;
- if(minutes==60)
- minutes=0;
- write_time1(minutes,10);
- lcd_wcmd(0x80+10);
- break;
- case 3:
- hours++;
- if(hours==24)
- hours=0;
- write_time1(hours,7);
- lcd_wcmd(0x80+7);
- break;
- }
- }
- }
- }
- if(hour==hours&&minute==minutes&&sound==sounds&&flag==1)
- {
- beep = 0;
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- key2num++;
- while(!key3);
- switch(key2num)
- {
- case 1:
- lcd_wcmd(0x90+12);
- lcd_wcmd(0x0f);
- break;
- case 2:
- rhflag=1;
- case 3:
- key2num=0;
- lcd_wcmd(0x0c);
- break;
- }
- }
- }
- if(key2num!=0)
- {
- if(key4==0)
- {
- delay(5);
- if(key4==0)
- {
- while(!key4);
- switch(key2num)
- {
- case 1:
- RH_shu++;
- if(RH_shu==100)
- RH_shu=0;
- write_rh(RH_shu,11);
- // rhflag = 1;
- break;
- }
- }
- }
- }
- }
- //設定LCD顯示位置
- /****************************************************************************/
- void lcd_dis_pos(unsigned char pos)
- {
- lcd_wcmd(pos | 0x90); //數(shù)據(jù)指針=80+地址變量
- }
- /****************************************************************************/
- /****************************************************************************/
- //收發(fā)信號檢測,數(shù)據(jù)讀取
- /****************************************************************************/
- char receive()
- {
- uchar i;
- com_data=0;
- for(i=0;i<=7;i++)
- {
- respond=2;
- while((!TRH)&&respond++);
- delay_us();
- delay_us();
- delay_us();
- if(TRH)
- {
- temp=1;
- respond=2;
- while((TRH)&&respond++);
- }
- else
- temp=0;
- com_data<<=1;
- com_data|=temp;
- }
- return(com_data);
- }
- /****************************************************************************/
- /****************************************************************************/
- //濕度讀取子程序
- //溫度高8位== TL_data
- //溫度低8位== TH_data
- //濕度高8位== RH_data
- //濕度低8位== RH_data
- //校驗 8位 == CK_data
- //調(diào)用的程序有 delay();, Delay_5us();,RECEIVE();
- /***************************************************************************/
- void read_TRH()
- {
- //主機拉低18ms
- TRH=0;
- delay_ms(18);
- TRH=1;
- //DATA總線由上拉電阻拉高 主機延時20us
- delay_us();
- delay_us();
- delay_us();
- delay_us();
- //delay_us();
- //delay_us();delay_us();delay_us();delay_us();
- //主機設為輸入 判斷從機響應信號
- TRH=1;
- //判斷DHT11是否有低電平響應信號 如不響應則跳出,響應則向下運行
- if(!TRH)
- {
- respond=2; //判斷DHT11發(fā)出 80us 的低電平響應信號是否結(jié)束
- while((!TRH)&& respond++);
- respond=2; //判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數(shù)據(jù)接收狀態(tài)
- while(TRH && respond++); //數(shù)據(jù)接收狀態(tài)
- RH_temp = receive();
- RL_temp = receive();
- TH_temp = receive();
- TL_temp = receive();
- CK_temp = receive();
- TRH=1; //數(shù)據(jù)校驗
- untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
- if(untemp==CK_temp)
- {
- RH_data = RH_temp;
- RL_data = RL_temp;
- TH_data = TH_temp;
- TL_data = TL_temp;
- CK_data = CK_temp;
- }
- }
- }
- void lcd_display()
- {
- lcd_dis_pos(0x03);
- lcd_wdata(0x30+RH_data/10);
- lcd_dis_pos(0x04);
- lcd_wdata(0x30+RH_data%10);
- lcd_dis_pos(0x05);
- lcd_wdata(0x2e);
- lcd_dis_pos(0x06);
- lcd_wdata(0x30+RL_data%10);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼 完整的Word格式文檔51黑下載地址:
DHT11設計報告.docx
(1.15 MB, 下載次數(shù): 154)
2018-3-8 15:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|