基于DHT11溫濕度報警系統LCD1602顯示操作說明
本設計系統是DHT11溫濕度報警系統LCD1602顯示,可設置溫度的高溫報警值和低溫報警值、濕度的高濕度報警值和低溫度報警值,當有報警時蜂鳴器會發出滴滴的報警聲,同時綠色發光二極管閃爍,在LCD1602液晶上還能很直觀的看到報警信息。并具有掉電保存功能,數據保存在單片機內部EEPOM中,進入設置界面后如果沒有鍵按下系統會在30秒后自動退出設置界面,人性化的按鍵設置,按鍵還具有連加、減功能,當按下按鍵時有按鍵聲即蜂鳴器叫一聲,按鍵聲可以進入菜單內設置,可設置按鍵聲打開或關閉。系統還設有取消報警回差值,增加的系統的抗干擾性。
報警方式:聲光報警
蜂鳴器滴滴報警聲、發光二極管閃爍。
DHT11溫濕度檢測
單片機電路原理圖:
0.png (142.75 KB, 下載次數: 88)
下載附件
2019-5-26 01:15 上傳
0.png (598.9 KB, 下載次數: 86)
下載附件
2019-5-26 01:13 上傳
蜂鳴器 蜂鳴器 B1
10uF 電容 C1
20pF 電容 C2, C3
D 指示燈 D1, D2, D3, D4,
LCD1602 液晶 LCD1
9012 三極管 Q1
10K 電阻 R3, R4
2K 電阻 R1
2K 電阻 R2, R5
SW-PB 按鍵 S1, S2, S3, S4, S5
sw-灰色 電源開關 SW1
U1 單片機 U1
DHT11 溫濕度傳感器 U2
12M 晶振 Y1
單片機源程序如下:
- #include <reg52.h> //調用單片機頭文件
- #define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
- sbit beep = P1^4; //蜂鳴器
- int flag_300ms ;
- // 按鍵的IO變量的定義
- uchar key_can; //按鍵值的變量
- sbit wh_led = P2^2; //溫度報警指示燈IO口定義
- sbit wl_led = P2^3; //溫度報警指示燈IO口定義
- sbit sh_led = P2^1; //濕度報警指示燈IO口定義
- sbit sl_led = P2^0; //濕度報警指示燈IO口定義
- uchar flag_en = 1;
- uchar menu_1; //菜單設計的變量
- uint t_high = 35,t_low = 10; //溫度報警參數
- uint s_high = 80,s_low = 10; //濕度報警參數
- /***************************************************************
- * 名稱 : delay_1ms()
- * 功能 : 延時1ms函數
- * 輸入 : q
- * 輸出 : 無
- ****************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- sbit dht11=P1^5; //溫度傳感器IO口定義
- uchar table_dht11[5]={1,2,3,4,5};
- uchar code table_num[]="0123456789abcdefg";
- sbit rs=P1^0; //寄存器選擇信號 H:數據寄存器 L:指令寄存器
- sbit rw=P1^1; //寄存器選擇信號 H:數據寄存器 L:指令寄存器
- sbit e =P1^2; //片選信號 下降沿觸發
- /********************************************************************
- * 名稱 : delay_uint()
- * 功能 : 小延時。
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /********************************************************************
- * 名稱 : write_com(uchar com)
- * 功能 : 1602命令函數
- * 輸入 : 輸入的命令值
- * 輸出 : 無
- ***********************************************************************/
- void write_com(uchar com)
- {
- e=0;
- rs=0;
- rw=0;
- P0=com;
- delay_uint(25);
- e=1;
- delay_uint(100);
- e=0;
- }
- /********************************************************************
- * 名稱 : write_data(uchar dat)
- * 功能 : 1602寫數據函數
- * 輸入 : 需要寫入1602的數據
- * 輸出 : 無
- ***********************************************************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=0;
- P0=dat;
- delay_uint(25);
- e=1;
- delay_uint(100);
- e=0;
- }
- /***********************lcd1602上顯示特定的字符****0XDF 度********************/
- void write_zifu(uchar hang,uchar add,uchar date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(date);
- }
- /***********************lcd1602上顯示兩位十進制數************************/
- void write_sfm2(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
- /***********************lcd1602上顯示這字符函數************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- while(1)
- {
- if(*p == '\0') break;
- write_data(*p);
- p++;
- }
- }
- /***********************lcd1602初始化設置************************/
- void init_1602() //lcd1602初始化
- {
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- delay_uint(1000);
- write_string(1,0,"Wd:00 H00 L00 ");
- write_string(2,0,"Sd:00% H00% L00% ");
- write_zifu(1,5,0xdf); //顯示度
- write_zifu(1,10,0xdf); //顯示度
- write_zifu(1,15,0xdf); //顯示度
- write_sfm2(1,3,table_dht11[2]); //顯示溫度
- write_sfm2(2,3,table_dht11[0]); //顯示濕度
- write_sfm2(1,7,t_high); //顯示溫度
- write_sfm2(2,7,s_high); //顯示濕度
- write_sfm2(1,10,t_low); //顯示溫度
- write_sfm2(2,10,s_low); //顯示濕度
- }
- /********************獨立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨立按鍵程序
- {
- static uchar key_new;
- key_can = 20; //按鍵值還原
- P3 |= 0xf0;
- if((P3 & 0xf0) != 0xf0) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動
- if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
- { //確認是按鍵按下
- key_new = 0;
- switch(P3 & 0xf0)
- {
- case 0xd0: key_can = 1; break; //得到k1鍵值
- case 0xb0: key_can = 2; break; //得到K2鍵值
- case 0x70: key_can = 3; break; //得到k3鍵值
- }
- }
- }
- else
- key_new = 1;
- }
- /****************按鍵顯示函數***************/
- void key_with()
- {
- if(key_can == 1) //設置鍵
- {
- menu_1 ++;
- if(menu_1 > 2)
- {
- menu_1 = 0;
- init_1602(); //lcd1602初始化
- }
- }
- if(menu_1 == 1) //設置高溫報警
- {
- if(key_can == 2)
- {
- t_high ++ ; //設置高溫值加1
- if(t_high > 99)
- t_high = 99;
- }
- if(key_can == 3)
- {
- t_high -- ; //設置高溫值減1
- if(t_high <= t_low)
- t_high = t_low + 1;
- }
- write_sfm2(1,8,t_high); //顯示溫度
- write_com(0x80+8); //將光標移動到秒個位
- write_com(0x0f); //顯示光標并且閃爍
- }
- if(menu_1 == 2) //設置低溫報警
- {
- if(key_can == 2)
- {
- t_low ++ ; //設置低溫值加1
- if(t_low >= t_high)
- t_low = t_high - 1;
- }
- if(key_can == 3) //設置高溫值減1
- {
- t_low -- ;
- if(t_low <= 1)
- t_low = 1;
- }
- write_sfm2(1,13,t_low); //顯示濕度
- write_com(0x80+13); //將光標移動到秒個位
- write_com(0x0f); //顯示光標并且閃爍
- }
- if(menu_1 == 3) //設置高濕報警
- {
- if(key_can == 2)
- {
- s_high ++ ; //設置高濕值加1
- if(s_high > 99)
- s_high = 99;
- }
- if(key_can == 3)
- {
- s_high -- ; //設置高濕值減1
- if(s_high <= s_low)
- s_high = s_low + 1;
- }
- write_sfm2(2,8,s_high); //顯示濕度
- write_com(0x80+0x40+8); //將光標移動到秒個位
- write_com(0x0f); //顯示光標并且閃爍
- }
- if(menu_1 == 4) //設置低濕報警
- {
- if(key_can == 2)
- {
- s_low ++ ; //設置低濕值加1
- if(s_low >= s_high)
- s_low = s_high - 1;
- }
- if(key_can == 3) //設置低濕值減1
- {
- s_low -- ;
- if(s_low <= 1)
- s_low = 1;
- }
- write_sfm2(2,13,s_low); //顯示濕度
- write_com(0x80+0x40+13); //將光標移動到秒個位
- write_com(0x0f); //顯示光標并且閃爍
- }
- }
- /*****************讀溫濕度傳感器程序****************/
- void dst11()
- {
- uchar i,j;
- dht11 = 0;
- delay_1ms(5);
- dht11 = 1;
- delay_uint(4); //50us
- if(dht11 == 0) //判斷是否響應 0 為響應
- {
- while(dht11 == 0);
- while(dht11 == 1); //等待響應時間過完
- for(i=0;i<5;i++)
- {
- for(j=0;j<8;j++)
- {
- table_dht11[i] <<= 1;
- while(dht11 == 1);
- delay_uint(4); //50us 數據1的高電平時間為110us 低為27us
- if(dht11 == 1)
- {
- table_dht11[i] |= 0x01;
- while(dht11 == 1); //等待響應時間過完
- }
- }
- }
- }
- dht11 = 1;
- }
- /****************報警函數***************/
- void clock_h_l()
- {
- if((table_dht11[2] >= t_high))
- {
- wh_led = 0; //打開指示燈
- }
- else
- {
- wh_led = 1; //關閉指示燈
- }
- if((table_dht11[2] <= t_low))
- {
- wl_led = 0; //打開指示燈
- }
- else
- {
- wl_led = 1; //關閉指示燈
- }
- if((table_dht11[0] >= s_high))
- {
- sh_led = 0; //打開指示燈
- }else
- {
- sh_led = 1; //關閉指示燈
- }
- if((table_dht11[0] <= s_low))
- {
- sl_led = 0; //打開指示燈
- }else
- {
- sl_led = 1; //關閉指示燈
- }
- if((wh_led == 0) || (wl_led == 0) || (sh_led == 0) || (sl_led == 0))
- {
- if(flag_en == 1)
- beep = ~beep; //蜂鳴器報警
- }
- else
- {
- beep = 1;
- flag_en = 1;
- }
- }
- /******************主程序**********************/
- void main()
- {
- beep = 0; //開機叫一聲
- delay_1ms(150);
- P0 = P1 = P2 = P3 = 0xff;
- init_1602(); //lcd1602初始化
- while(1)
- {
- flag_300ms ++;
- if(flag_300ms >= 300)
- {
- flag_300ms = 0;
- dst11(); //先讀出溫濕度1的值
- write_sfm2(2,3,table_dht11[0]); //顯示濕度
- write_sfm2(1,3,table_dht11[2]); //顯示溫度
- clock_h_l(); //報警函數
- }
- key();
- if(key_can < 10)
- {
- key_with(); //設置報警溫度
- if(key_can == 3)
- {
- flag_en = 0; //手動取消報警
- }
- }
- delay_1ms(1);
- }
- }
復制代碼
所有資料51hei提供下載:
DHT11溫濕度檢測 發送資料.4個燈.rar
(3.52 MB, 下載次數: 329)
2019-5-26 01:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|