單片機驅動DHT11獲取環境溫濕度并在1602顯示,同時可以調整溫濕度的各自的上下限,有提示降溫除濕功能。程序實測可用
原理圖,Proteus仿真文件(需要8.5以上版本才能打開)都有:
0.png (34.38 KB, 下載次數: 131)
下載附件
2017-7-1 22:23 上傳
0.png (65.03 KB, 下載次數: 86)
下載附件
2017-7-1 22:26 上傳
單片機源程序如下:
- //http://www.zg4o1577.cn/bbs/dpj-51190-1.html
- #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 speek =P3^4; //報警
- sbit hh =P2^1; //高燈
- sbit ll =P2^2; //高燈
- sbit LCD_RS =P1^3;
- sbit LCD_RW =P1^4;
- sbit LCD_EN =P1^5;
- //sbit LCD_RS =P2^4;
- //sbit LCD_RW =P2^5;
- //sbit LCD_EN =P2^6;
- sbit setup =P1^6; // 設置+
- sbit setdown=P1^7; // 設置-
- sbit set =P3^0; // 設置
- sbit P2_0 =P1^0; //DHT11的DATE
- 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;
- bit BIAO;
- void Delay_1(U16 j) //100us延時
- {
- U8 i;
- for(;j>0;j--)
- {
- for(i=0;i<27;i++);
- }
- }
- //void elay(unsigned int num)//延時函數
- //{
- // while( --num );
- //}
- void Delay_10us(void) //進入函數3us
- {
- U8 i; //1us
- i--; //1us
- 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));
- Delay_1(200);
- i++;
- }
- }
- void COM(void) //串行讀一個字節數據
- {
- U8 i;
- for(i=0;i<8;i++)
- {
- U8FLAG=2;
- while((!P2_0)&&U8FLAG++); //自加254次 默認執行下面程序 50us低電平結束判斷
- Delay_10us();
- Delay_10us();
- Delay_10us();
- U8temp=0;
- if(P2_0)U8temp=1;
- U8FLAG=2;
- while((P2_0)&&U8FLAG++);
-
- if(U8FLAG==1)break; //屏蔽
- U8comdata<<=1;
- U8comdata|=U8temp;
- }
- }
- //--------------------------------
- //-----濕度讀取子程序 ------------
- //--------------------------------
- //----以下變量均為全局變量--------
- //----溫度高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)
- { TR0=0;
- //主機拉低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) //判斷從機是否有低電平響應信號 如不響應則不讀數據,響應則向下運行
- { //speek=0;
- U8FLAG=2;
- while((!P2_0)&&U8FLAG++);
- U8FLAG=2;
- 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;
-
- }
- TR0=1;
- }
- }
- void 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);
- Delay_1(200);
- lcd_pos(0x04);
- lcd_wdat('0'+U8RH_data_H/10); /* 顯示濕度 */
- Delay_1(200);
- lcd_wdat('0'+U8RH_data_H%10);
- Delay_1(200);
- lcd_pos(0x44);
- lcd_wdat('0'+U8T_data_H/10); /* 顯示溫度*/
- Delay_1(200);
- lcd_wdat('0'+U8T_data_H%10);
- Delay_1(200);
- lcd_pos(9);
- lcd_wdat('0' + sethum_h / 10);
- Delay_1(200);
- lcd_wdat('0' + sethum_h % 10); /* 顯示濕度上限 */
- Delay_1(200);
- lcd_pos(13);
- lcd_wdat('0' + sethum_l / 10);
- Delay_1(200);
- lcd_wdat('0' + sethum_l % 10); /* 顯示濕度下限 */
-
- Delay_1(200);
- lcd_pos(0x49);
- lcd_wdat('0' + settem_h / 10);
- Delay_1(200);
- lcd_wdat('0' + settem_h % 10); /* 顯示溫度上限 */
- Delay_1(200);
- lcd_pos(0x4d);
- lcd_wdat('0' + settem_l / 10);
- Delay_1(200);
- lcd_wdat('0' + settem_l % 10); /* 顯示溫度下限 */
-
- if ((settembz_h==0)&&(settembz_l)&&(sethumbz_h)&&(sethumbz_l))
- {
- lcd_pos(0x4f); //消濕度下限的箭頭
- lcd_wdat(' ');
- Delay_1(10);
- lcd_pos(0x0f);
- lcd_wdat(' ');
-
- }
- if (settembz_h)
- {
- lcd_pos(0x4f); //消濕度下限的箭頭
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于51單片機的DHT11溫濕度控制系統.rar
(2.05 MB, 下載次數: 345)
2017-7-1 21:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|