本設計是基于STC89C52的智能家居環境監測系統主要模塊有DHT11溫濕度數據采集模塊,MQ-2煙霧數據采集模塊,ADC0832模數轉換模塊,LCD1602顯示模塊,蜂鳴器報警電路,LED閃爍電路,外部按鍵電路
主要功能包括通過DHT11進行溫濕度數據采集并通過LCD1602進行實時顯示,MQ-2煙霧模塊采集數據反饋到ADC0832經過模數轉換后傳送到單片機芯片中處理數據,也是通過LCD1602進行顯示,當以上任何一個數據超出閾值時,都會觸發蜂鳴器報警和對應的LED顯示燈閃爍。此外,根據環境的不同需要,可以通過外部按鍵進行更改溫濕度上下限的閾值范圍和煙霧濃度的上限
原理圖如圖所示:
51hei圖片20200601213706.png (63.17 KB, 下載次數: 36)
下載附件
2020-6-1 21:43 上傳
實物圖如圖所示:
51hei圖片20200601215458.jpg (206.45 KB, 下載次數: 39)
下載附件
2020-6-1 21:55 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (20.42 KB, 下載次數: 36)
下載附件
2020-6-2 03:20 上傳
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <absacc.h>
- #include <math.h>
- #include "0832.h"
- #define uchar unsigned char
- #define uint unsigned int
- #include "eeprom52.h"
- sbit DATA = P3^7; //溫濕度
- sbit E=P2^5; //1602使能引腳
- sbit RS=P2^7; //1602數據/命令選擇引腳
- sbit RW=P2^6;
- sbit K1=P1^3;//設置鍵
- sbit K2=P1^4;//加
- sbit K3=P1^5;//減
- sbit LED1=P3^1; //煙霧報警
- sbit LED2=P3^2; //溫度上限
- sbit LED3=P3^3; //溫度下限
- sbit LED4=P3^4; //濕度上限
- sbit LED5=P3^5; //濕度下限
- sbit alarm=P3^0; //蜂鳴器
- uchar U8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;
- uchar U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;
- uchar Mode,humidity,temperature,smog;
- bit BJ_LED1=1,BJ_LED2=1,BJ_LED3=1,BJ_LED4=1,BJ_LED5=1,BJ_LED6=1; //定義LED報警變量
- bit bdata FlagStartRH;
- uchar flag ;//記錄當前設置狀態
- uint count;
- //定時器0初始化
- void Timer0_Init()
- {
- ET0 = 1; //允許定時器0中斷
- TMOD = 0x11; //定時器工作方式選擇
- TL0 = 0xFF;
- TH0 = 0x4B; //定時器賦予初值
- TH1=0xdc;
- TL1=0x00;
- ET1=1;
- TR0 = 1; //啟動定時器
- }
- //定時器0中斷
- void Timer0_ISR (void) interrupt 1 using 0
- {
- uchar RHCounter;
- TL0 = 0xFF;
- TH0 = 0x4B; //定時器賦予初值
- RHCounter++;
- if (RHCounter >= 15)
- {
- FlagStartRH = 1;
- RHCounter = 0;
- }
- }
- void Delay1(uint j)
- {
- uchar i;
- for(;j>0;j--)
- {
- for(i=0;i<27;i++);
- }
- }
- void Delay_10us(void)
- {
- uchar i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- void delay_ms(uint z) //延時函數
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=121;y>0;y--); //約1ms
- }
- void COM(void)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- U8FLAG=2;
- while((!DATA)&&U8FLAG++);
- Delay_10us();
- Delay_10us();
- Delay_10us();
- U8temp=0;
- if(DATA)U8temp=1;
- U8FLAG=2;
- while((DATA)&&U8FLAG++);
- //超時則跳出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();
- //--------------------------------
- uchar RH(void)
- {
- //主機拉低18ms
- DATA=0;
- Delay1(180); //原來為5
- DATA=1;
- //總線由上拉電阻拉高 主機延時20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主機設為輸入 判斷從機響應信號
- DATA=1;
- //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
- if(!DATA) //T !
- {
- U8FLAG=2;
- //判斷從機是否發出 80us 的低電平響應信號是否結束
- while((!DATA)&&U8FLAG++);
- U8FLAG=2;
- //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
- while((DATA)&&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;
- DATA=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;
- }
- return 1;
- }
- else //傳感器不響應
- {
- return 0;
- }
- }
- /********************************************************************
- * 文件名 : 液晶1602顯示.c
- * 描述 : 該程序實現了對液晶1602的控制。
- ***********************************************************************/
- /********************************************************************
- * 名稱 : delay()
- * 功能 : 延時,延時時間大概為140US。
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void delay()
- {
- int i,j;
- for(i=0; i<=10; i++)
- for(j=0; j<=2; j++);
- }
-
- /********************************************************************
- * 名稱 : enable(uchar del)
- * 功能 : 1602命令函數
- * 輸入 : 輸入的命令值
- * 輸出 : 無
- ***********************************************************************/
- void write_1602com(uchar del)
- {
- P0 = del;
- RS = 0;
- E = 1;
- delay();
- E = 0;
- delay();
- }
- /********************************************************************
- * 名稱 : write(uchar del)
- * 功能 : 1602寫數據函數
- * 輸入 : 需要寫入1602的數據
- * 輸出 : 無
- ***********************************************************************/
- void write_1602dat(uchar del)
- {
- P0 = del;
- RS = 1;
- E = 1;
- delay();
- E = 0;
- delay();
- }
- /********************************************************************
- * 名稱 : L1602_init()
- * 功能 : 1602初始化,請參考1602的資料
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void L1602_init(void)
- {
-
- write_1602com(0x38);
- write_1602com(0x0c);
- write_1602com(0x06);
- write_1602com(0x01); //清屏要放在最后
- delay_ms(2);
- }
- void display()
- {
- write_1602com(0x83);
- write_1602dat(temperature%100/10+0x30);
- write_1602dat(temperature%100%10+0x30);
- write_1602com(0x8c);
- write_1602dat(humidity%100/10+0x30);
- write_1602dat(humidity%100%10+0x30);
- write_1602com(0xc3);
- write_1602dat(smog%100/10+0x30);
- write_1602dat(smog%100%10+0x30);
- write_1602com(0x85);
- write_1602dat(0xdf);
- }
- void display_1()
- {
- write_1602com(0x83);
- write_1602dat(TH%100/10+0x30);
- write_1602dat(TH%100%10+0x30);
- write_1602com(0x8c);
- write_1602dat(TL%100/10+0x30);
- write_1602dat(TL%100%10+0x30);
- write_1602com(0xc3);
- write_1602dat(HH%100/10+0x30);
- write_1602dat(HH%100%10+0x30);
- write_1602com(0xcc);
- write_1602dat(HL%100/10+0x30);
- write_1602dat(HL%100%10+0x30);
- }
- void write_string(uchar * str)
- {
- while( * str)
- {
- write_1602dat(* str);
- str++;
- }
- }
- /***按鍵函數***/
- void KEY()
- {
- if(K1==0)
- {
- Delay1(200);
- if(K1==0)
- {
- flag++;
- if(flag==1)
- {
- write_1602com(0x80);
- write_string("TH: C TL: C");
- write_1602com(0xc0);
- write_string("HH: % HL: % ");
- write_1602com(0x85);
- write_1602dat(0xdf);
- write_1602com(0x8e);
- write_1602dat(0xdf);
- display_1();
- write_1602com(0x84);
- write_1602com(0x0f);
- }
- else if(flag==2)
- write_1602com(0x8d);
- else if(flag==3)
- write_1602com(0xc4);
- else if(flag==4)
- write_1602com(0xcd);
- else if(flag==5)
- {
- write_1602com(0xc0);
- write_string(" ");
- write_1602com(0x80);
- write_string("Sg: mg/m3 ");
- write_1602com(0x83);
- write_1602dat(SM/10+0x30);
- write_1602dat(SM%10+0x30);
- write_1602com(0x84);
- }
- else
- {
- write_1602com(0x80);
- write_string("Te: C Hu: % ");
- write_1602com(0xc0);
- write_string("Sg: mg/m3 ");
- write_1602com(0x85);
- write_1602dat(0xdf);
- display();
- write_1602com(0x0c);
- flag=0;
- write_eeprom();
- }
- while(!K1);
- }
- }
- if(K2==0)
- {
- Delay1(200);
- if(K2==0)
- {
- switch (flag)
- {
- case 1: TH++;if(TH>99) TH=0;if(TH<=TL) TH=TL+1; write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30); write_1602com(0x84);break;
- case 2: TL++;if(TL>98) TL=0; if(TL>=TH) TL=TH-1; write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break;
- case 3: HH++;if(HH>99) HH=0; if(HH<=HL) HH=HL+1;write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30); write_1602com(0xc4);break;
- case 4: HL++;if(HL>98) HL=0; if(HL>=HH) HL=HH-1; write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break;
- case 5: SM++;if(SM>9) SM=0; write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break;
- }
- while(!K2);
- }
- }
- if(K3==0)
- {
- Delay1(200);
- if(K3==0)
- {
- switch (flag)
- {
- case 1: TH--;if(TH>99) TH=99; if(TH<=TL) TH=TL+1; write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30); write_1602com(0x84);break;
- case 2: TL--;if(TL>99) TL=98;if(TL>=TH) TL=TH-1; write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break;
- case 3: HH--;if(HH>99) HH=99; if(HH<=HL) HH=HL+1; write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30); write_1602com(0xc4);break;
- case 4: HL--;if(HL>99) HL=98;if(HL>=HH) HL=HH-1; write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break;
- case 5: SM--;if(SM>99) SM=9; write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break;
- }
- while(!K3);
- }
- }
- }
- void Onealarm()
- {
- alarm=0;
- Delay1(200);
- alarm=1;
- }
- void dis_init()
- {
- unsigned char pp=0;
- write_1602com(0x80); //進入設置狀態顯示
- write_string("Welcome to use "); //設置狀態第一行顯示
- write_1602com(0xc0); //選中第二行
- write_string("Please waiting.."); //設置狀態第二行顯示
- P3=0xFE;
- delay_ms(500);
- for(pp=0;pp<8;pp++)
- {
- P3=_crol_(P3,1);
- delay_ms(100);
- }
- P3=0x7F;
- for(pp=0;pp<8;pp++)
- {
- P3=_cror_(P3,1);
- delay_ms(100);
- }
- alarm=1;
- LED1=LED2=LED3=LED4=LED5=0;
- delay_ms(2000);
- }
- /********************************************************************
- * 名稱 : Main()
- * 功能 : 主函數
- ***********************************************************************/
- void main()
- {
- uint testnum;
- EA = 0;
- Timer0_Init(); //定時器0初始化
- EA = 1;
- RW=0;
-
- L1602_init();
- dis_init();
- write_1602com(0x85);
- write_1602dat(0xdf);
- write_1602com(0x80);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
單片機煙霧溫濕度監測.7z
(1.37 MB, 下載次數: 327)
2020-6-2 03:21 上傳
點擊文件名下載附件
程序原理圖仿真圖 下載積分: 黑幣 -5
|