|
圖3.2 為DHT11傳感器實物圖,其性能指標和特性如下: (1)工作電壓范圍:3.5V-5.5V; (2)工作電流 :平均0.5mA; (3)濕度測量范圍:20-90%RH ; (4)溫度測量范圍:0-50℃ ; (5)濕度分辨率 :1%RH 8位; (6)溫度分辨率 :1℃ 8位; (7)采樣周期 :1S ; (8)單總線結構 ; (9)與TTL兼容(5V)
0.png (30.12 KB, 下載次數: 66)
下載附件
2016-6-3 12:00 上傳
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無符號8位整型變量 */
- typedef signed char S8; /* defined for signed 8-bits integer variable 有符號8位整型變量 */
- typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無符號16位整型變量 */
- sbit set=P2^2 ;
- // 設置
- sbit setup=P2^1 ;
- // 設置+
- sbit setdown=P2^0 ;
- // 設置-
- sbit speek=P1^0;
- sbit hh=P1^1;
- sbit ll=P1^2;
- sbit LCD_RS=P2^7;
- sbit LCD_RW=P2^6;
- sbit LCD_EN=P2^5;
- sbit P2_0 = P3^7 ;
- sbit P2_1 = P3^1 ;
- //----------------------------------------------//
- //----------------定義區--------------------//
- //----------------------------------------------//
- U8 U8FLAG;
- U8 U8count,U8temp;
- U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- U8 U8comdata;
- U8 indata[5];
- U8 count, count_r=0;
- U16 U16temp1,U16temp2;
- uchar settem_h,settem_l,sethum_h,sethum_l,con=0;
- bit sethumbz_h=0,sethumbz_l=0,settembz_h=0,settembz_l=0,setkey;
- uchar i;
- void Delay_1(U16 j)
- {
- U8 i;
- for(;j>0;j--)
- {
- for(i=0;i<127;i++);
- }
- }
- //void elay(unsigned int num)//延時函數
- //{
- // while( --num );
- //}
- void Delay_10us(void)
- {
- U8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
-
- /********************************************************************/
- /* */
- /*檢查LCD忙狀態 */
- /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */
- /* */
- /********************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return result;
- }
- /********************************************************************/
- /* */
- /*寫指令數據到LCD */
- /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
- /* */
- /********************************************************************/
- void lcd_wcmd(uchar cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EN = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EN = 0;
- }
- /********************************************************************/
- /* */
- /*寫顯示數據到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
- /* */
- /********************************************************************/
- void lcd_wdat(uchar dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EN = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EN = 0;
- }
- /********************************************************************/
- /* */
- /* LCD初始化設定 */
- /* */
- /********************************************************************/
- void lcd_init()
- {
- lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
- Delay_1(5);
- lcd_wcmd(0x38);
- Delay_1(5);
- lcd_wcmd(0x38);
- Delay_1(5);
- lcd_wcmd(0x0c); //顯示開,關光標
- Delay_1(5);
- lcd_wcmd(0x06); //移動光標
- Delay_1(5);
- lcd_wcmd(0x01); //清除LCD的顯示內容
- Delay_1(5);
- }
- /********************************************************************/
- /* */
- /* 設定顯示位置 */
- /* */
- /********************************************************************/
- void lcd_pos(uchar pos)
- {
- lcd_wcmd(pos | 0x80); //數據指針=80+地址變量
- }
- void LCD1602PutStr(char* s)
- {
- uchar i = 0;
- while (*(i + s)) {
- lcd_wdat(*(i + s));
- i++;
- }
- }
- //串行總線
- void COM(void)
- {
- U8 i;
- for(i=0;i<8;i++)
- {
-
- U8FLAG=2;
- //----------------------
- P2_1=0 ; //T
- P2_1=1 ; //T
- //----------------------
-
- while((!P2_0)&&U8FLAG++);
- Delay_10us();
- Delay_10us();
- // Delay_10us();
- U8temp=0;
- if(P2_0)U8temp=1;
- U8FLAG=2;
- while((P2_0)&&U8FLAG++);
-
- //----------------------
- P2_1=0 ; //T
- P2_1=1 ; //T
- //----------------------
- //超時則跳出for循環
- if(U8FLAG==1)break;
- //判斷數據位是0還是1
-
- // 如果高電平高過預定0高電平值則數據位為 1
-
- U8comdata<<=1;
- U8comdata|=U8temp; //0
- }//rof
- }
- //--------------------------------
- //-----濕度讀取子程序 ------------
- //--------------------------------
- //----以下變量均為全局變量--------
- //----溫度高8位== U8T_data_H------
- //----溫度低8位== U8T_data_L------
- //----濕度高8位== U8RH_data_H-----
- //----濕度低8位== U8RH_data_L-----
- //----校驗 8位 == U8checkdata-----
- //----調用相關子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- void RH(void)
- {
- //主機拉低18ms
- P2_0=0;
- Delay_1(180);
- P2_0=1;
- //總線由上拉電阻拉高 主機延時20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主機設為輸入 判斷從機響應信號
- P2_0=1;
- //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
- if(!P2_0) //T !
- {
- U8FLAG=2;////////////////////////////////////////////////////
- //判斷從機是否發出 80us 的低電平響應信號是否結束
- while((!P2_0)&&U8FLAG++);
- U8FLAG=2;
- //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
- while((P2_0)&&U8FLAG++);
- //數據接收狀態
- COM();
- U8RH_data_H_temp=U8comdata;
- COM();
- U8RH_data_L_temp=U8comdata;
- COM();
- U8T_data_H_temp=U8comdata;
- COM();
- U8T_data_L_temp=U8comdata;
- COM();
- U8checkdata_temp=U8comdata;
- P2_0=1;
- //數據校驗
-
- U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
- if(U8temp==U8checkdata_temp)
- {
- U8RH_data_H=U8RH_data_H_temp;
- U8RH_data_L=U8RH_data_L_temp;
- U8T_data_H=U8T_data_H_temp;
- U8T_data_L=U8T_data_L_temp;
- U8checkdata=U8checkdata_temp;
- }//fi
- }//fi
- }
- Disp_Temperature()//顯示溫度
- {
- //unsigned char n=0;
- // display[4]=temp_data[0]&0x0f;
- // display[0]=ditab[display[4]]; //查表得小數位的值
-
- // display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
- lcd_pos(0x04);
- lcd_wdat('0'+U8RH_data_H/10);
- lcd_wdat('0'+U8RH_data_H%10);
- lcd_pos(0x44);
- lcd_wdat('0'+U8T_data_H/10);
- lcd_wdat('0'+U8T_data_H%10);
- lcd_pos(9);
- lcd_wdat('0' + sethum_h / 10);
- lcd_wdat('0' + sethum_h % 10); /* 顯示濕度上限 */
- lcd_pos(13);
- lcd_wdat('0' + sethum_l / 10);
- lcd_wdat('0' + sethum_l % 10); /* 顯示濕度下限 */
-
- lcd_pos(0x49);
- lcd_wdat('0' + settem_h / 10);
- lcd_wdat('0' + settem_h % 10); /* 顯示溫度上限 */
- lcd_pos(0x4d);
- lcd_wdat('0' + settem_l / 10);
- lcd_wdat('0' + settem_l % 10); /* 顯示溫度下限 */
-
- if (settembz_h)
- {
- lcd_pos(0x4f);
- lcd_wdat(' ');
- lcd_pos(0x0f);
- lcd_wdat(' ');
- lcd_pos(0x0b);
- lcd_wdat(' ');
- lcd_pos(0x4b);
- lcd_wdat(127);
- }
- if (settembz_l)
- {
- lcd_pos(0x0f);
- lcd_wdat(' ');
- lcd_pos(0x0b);
- lcd_wdat(' ');
- lcd_pos(0x4b);
- lcd_wdat(' ');
- lcd_pos(0x4f);
- lcd_wdat(127);
- }
- if (sethumbz_h)
- {
- lcd_pos(0x0f);
- lcd_wdat(' ');
- lcd_pos(0x4b);
- lcd_wdat(' ');
- lcd_pos(0x4f);
- lcd_wdat(' ');
- lcd_pos(0x0b);
- lcd_wdat(127);
-
- }
- if (sethumbz_l)
- {
- lcd_pos(0x4f);
- lcd_wdat(' ');
- lcd_pos(0x4b);
- lcd_wdat(' ');
- lcd_pos(0x0b);
- lcd_wdat(' ');
- lcd_pos(0x0f);
- lcd_wdat(127);
- }
- }
- void doing()
- {
- uchar xianzhi_mi ,shiduzhi;
- xianzhi_mi=U8T_data_H ;
- shiduzhi=U8RH_data_H;
- if((xianzhi_mi<settem_h)&(xianzhi_mi>settem_l)&(shiduzhi<sethum_h)&(shiduzhi>sethum_l))
- {
- ll=1 ;
- hh=1 ;
- speek=1 ;
- }
- if((xianzhi_mi>settem_h)||(shiduzhi>sethum_h))
- {
- hh=0 ;
- ll=1;
- speek=0;
- }
- if((xianzhi_mi<settem_l)||(shiduzhi<sethum_l))
- {
- hh=1 ;
- ll=0 ;
- speek=0 ;
- }
- }
- void key()
- {
- if(set==0)
- {
- Delay_1(2);
- if(set==0)
- {
- while(!set);
- con++;
- setkey=1;
-
- }
- switch(con)
- {
- case 1:sethumbz_h=1;sethumbz_l=0;;break;
- case 2:sethumbz_h=0;sethumbz_l=1;break;
- case 3:settembz_h=1;settembz_l=0;sethumbz_l=0;break;
- case 4:settembz_h=0;settembz_l=1;break;
- default:sethumbz_h=0;sethumbz_l=0;settembz_h=0;settembz_l=0;con=0;setkey=0;
- }
- }
- if((setup==0)&setkey)
- {
- Delay_1(5);
- while(!setup);
- if(sethumbz_h==1)
- {
- if(sethum_h<=99)
- sethum_h++;
- }
- if(settembz_h==1)
- {
- if(settem_h<=99)
- settem_h++;
- }
- if(sethumbz_l==1)
- {
- if((sethum_l<sethum_h)&(sethum_l<=99))
- sethum_l++;
- }
- if(settembz_l==1)
- {
- if((settem_l<settem_h)&(settem_l<=99))
- settem_l++;
- }
- }
- if((setdown==0)&setkey)
- {
- Delay_1(5);
- while(!setdown);
- if(sethumbz_h==1)
- {
- if((sethum_h>sethum_l)&(sethum_h>=1))
- sethum_h--;
- }
- if(settembz_h==1)
- {
- if((settem_h>settem_l)&(settem_h>=1))
- settem_h--;
- }
- if(settembz_l==1)
- {
- if(settem_l>=1)
- settem_l--;
- }
- if(sethumbz_l==1)
- {
- if(sethum_l>=1)
- sethum_l--;
- }
- }
- }
- void init_time()
- {
- TMOD=0x01 ;
- TH0=(65535-5000)/256;
- TL0=(65535-5000)%256 ;
- TR0=1 ;
- EA=1 ;
- ET0=1 ;
- }
- void main(void)
- {
- P1=0xff;
- settem_h=30 ;
- //設置高溫
- settem_l=0 ;
- //設置低溫
- sethum_h=70;//濕度上線報警值
- sethum_l=0;//濕度下限報警值
- lcd_init();
- lcd_pos(0);
- LCD1602PutStr("hum:"); /* 第一行顯示濕度 */
- lcd_pos(7);
- LCD1602PutStr("H "); /* 上限值 */
- lcd_pos(12);
- LCD1602PutStr("L");
- lcd_pos(0x40);
- LCD1602PutStr("tem:"); /*第二行顯示溫度*/
- lcd_pos(0x47);
- LCD1602PutStr("H "); /* 下限值 */
- lcd_pos(0x4c);
- LCD1602PutStr("L");
- init_time();
- while(1)
- {
-
- Disp_Temperature();
- key();
- doing();
- }
- }
- time0() interrupt 1
- {
-
- i++;
- if(i==20)
- {
- RH();
- i=0;
- }
- TH0=(65535-5000)/256;
- TL0=(65535-5000)%256;
- }
復制代碼
|
-
-
DHT11原理圖.docx
2016-6-2 13:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
42.15 KB, 下載次數: 26, 下載積分: 黑幣 -5
-
-
DHT-11.docx
2016-6-2 13:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
17.01 KB, 下載次數: 28, 下載積分: 黑幣 -5
評分
-
查看全部評分
|