|
主控芯片采用STC89C52RC,使用到的模塊有 MQ2 紅外對(duì)管 火焰模塊等等。有仿真文件,僅供參考學(xué)習(xí)之用。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
sbit LED1 = P1 ^ 0; //高于最佳溫度范圍指示燈
sbit LED2 = P1 ^ 1; //低于最佳溫度范圍指示燈
sbit LED3 = P1 ^ 2; //范圍指示燈高于最佳濕度
sbit LED4 = P1 ^ 3; //低于最佳濕度范圍指示燈
sbit Flame_LED = P1 ^ 4;//火焰指示燈
sbit MQ2_LED = P1 ^ 5;//煙霧指示燈
sbit Ir_LED = P1 ^ 6;//紅外對(duì)管 報(bào)警指示燈
sbit TRH = P1 ^ 7; //溫濕度傳感器DHT11數(shù)據(jù)接入
-------------------------------------------------------------------
sbit LED_DC = P2^0; // OLED模塊 DC CS懸空
sbit LED_RST = P2^1; // OLED模塊 RST
sbit LED_SDA = P2^2; // OLED模塊 D1
sbit LED_SCL = P2^3; // OLED模塊 D0
sbit beep = P2 ^ 5; //蜂鳴器模塊
sbit flame = P2 ^ 6; //火焰報(bào)警器模塊
sbit MQ2 = P2 ^ 7; //煙霧檢測(cè)模塊 檢測(cè)到為 0
-----------------------------------------------------------------------------------------
//sbit infrared = P3^2; //紅外 外部中斷0
sbit key_ir = P3 ^ 4; //解除紅外報(bào)警按鈕 為自鎖開(kāi)關(guān)
sbit police_ok = P3 ^ 5; //確認(rèn)收到紅外報(bào)警按鈕
-----------------------------------------------------------------------------------------
按鍵接線:
-------------------------------------------------------------------------------
sbit KEY1 = P0^2; // 更改/確認(rèn)建
sbit KEY2 = P0^3; //加
sbit KEY3 = P0^4; //減
sbit KEY4 = P0^5; //下一項(xiàng)
-------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------
| Px | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
----------------------------------------------------------------------
| P1 | LED1 | LED2 | LED3 | LED3 | 火焰L | MQ2 L | 紅外L | TRH | 全部為L(zhǎng)ED 除P1.7
----------------------------------------------------------------------
| P2 | OL_DC | OL_RST| OL_D0 | OL_D1 | | 蜂鳴器| 火 焰 | MQ2 |
----------------------------------------------------------------------
| P3 | | |紅外對(duì)管| |key_ir|收到key| | | key_ir 為自鎖開(kāi)關(guān)
----------------------------------------------------------------------
| P0 | | | KEY1 | KEY2 | KEY3 | KEY4 | | |
----------------------------------------------------------------------
單片機(jī)源程序如下:
- /******************************************************************************
- 文 件 名 : main.c
- 版 本 號(hào) : v1.0
- 作 者 : Guokaiyi
- 生成日期 : 2012-12-1
- 最近修改 :
- 功能描述 : OLED演示例程(51系列)
- 說(shuō)明:
- ----------------------------------------------------------------
- G 電源地
- VCC 接5V或3.3v電源
- D0 P1^0(SCLK)
- D1 P1^1(MOSI)
- RST P1^2
- DC P1^3
- CS 已經(jīng)默認(rèn)選中,可以不接
- ----------------------------------------------------------------
- sbit LED_SCL = P1^0;
- sbit LED_SDA = P1^1;
- sbit LED_RST = P1^2;
- sbit LED_DC = P1^3;
- //DHT11溫濕度測(cè)試程序
- //P2作為L(zhǎng)CD的數(shù)據(jù)控制口,P1.6 作為DHT11data總線 ,P1.1作為狀態(tài)顯示
- ******************************************************************************/
- /*----------------------------------------------------------------------------*
- * 包含頭文件 *
- *----------------------------------------------------------------------------*/
- #include "common.h"
- #include "oled.h"
- #include <intrins.h>
- #include "SCAN_KEY.h"
- #include "DHT11.h"
- /*----------------------------------------------------------------------------*
- * 宏定義 *
- *----------------------------------------------------------------------------*/
- /*----------------------------------------------------------------------------*
- * 全局變量 *
- *----------------------------------------------------------------------------*/
- unsigned char str1[] = {" "};
- unsigned char str2[] = {" "};
- unsigned char DiWenDu[] = {" "};
- unsigned char GaoWenDu[] = {" "};
- unsigned char DiShiDu[] = {" "};
- unsigned char GaoShiDu[] = {" "};
- sbit LED1 = P1 ^ 0; //高于最佳溫度范圍指示燈
- sbit LED2 = P1 ^ 1; //低于最佳溫度范圍指示燈
- sbit LED3 = P1 ^ 2; //高于最佳濕度范圍指示燈
- sbit LED4 = P1 ^ 3; //低于最佳濕度范圍指示燈
- sbit Flame_LED = P1 ^ 4;//火焰指示燈
- sbit MQ2_LED = P1 ^ 5;//煙霧指示燈
- sbit Ir_LED = P1 ^ 6;//紅外對(duì)管 報(bào)警指示燈
- UCHAR8 TH_data, TL_data, RH_data, RL_data, CK_data;
- DHT11DATA Dht11TRHData;
- volatile int optimum_TL = 26;//最佳溫度 26 -28 度 最適宜溫度
- volatile int optimum_RL = 45;//最佳濕度 45% - 65%
- volatile int optimum_TH = 28;//最佳溫度 26 -28 度 最適宜溫度
- volatile int optimum_RH = 65;//最佳濕度 45% - 65%
- bit Cursor_Flag = 0; // 是否顯示光標(biāo)
- int Cursor_place = 0; //光標(biāo)位置 0沒(méi)有 1TL 2TH 3RL 4RH
- bit SetKeyFlag = 0; //是否按下設(shè)置鍵 0 未按下 1按下
- sbit MQ2 = P2 ^ 7; //煙霧檢測(cè)模塊 檢測(cè)到為 0
- sbit flame = P2 ^ 6; //火焰報(bào)警器模塊
- sbit beep = P2 ^ 5; //蜂鳴器模塊
- //sbit infrared = P3^2; //紅外
- sbit key_ir = P3 ^ 4; //解除紅外報(bào)警按鈕
- sbit police_ok = P3 ^ 5; //確認(rèn)收到紅外報(bào)警按鈕
- #define MQ2_BJ 0
- #define FLAME_BJ 0
- #define IR_BJ 0
- #define BEEP_ON 0
- #define BEEP_OFF 1
- //int ir_key = 0;
- int ir_police = 0;
- void call_police() //報(bào)警
- {
- char beepbaojingno = 0;
-
- if(police_ok == 0) ir_police = 0;
- if(MQ2 == MQ2_BJ) {
- beepbaojingno = 1;
- MQ2_LED = 0;
- } else {
- MQ2_LED = 1;
- }
- if(flame == FLAME_BJ) {
- beepbaojingno = 2;
- Flame_LED = 0;
- } else
- {
- Flame_LED = 1;
- }
- if(ir_police == 1)
- {
- if(key_ir == 0)
- {
- ir_police = 0; //報(bào)警解除
- } else
- {
- beepbaojingno = 3;
- Ir_LED = 0;
- }
- }
- else
- {
- Ir_LED = 1;
- }
-
- if(beepbaojingno != 0)
- {
- beep = BEEP_ON;
- }else
- {
- beep = BEEP_OFF;
- }
- }
- /*********************************************************************************
- *實(shí)驗(yàn)名 :外部中斷實(shí)驗(yàn)(下降沿觸發(fā))
- *實(shí)驗(yàn)效果 :按下學(xué)習(xí)板上第三排任意按鍵,LED燈前后四位狀態(tài)調(diào)換
- *
- *********************************************************************************/
- void Init_police()
- {
- Flame_LED = 1;
- MQ2_LED = 1;
- Ir_LED = 1;
- beep = BEEP_OFF;
- EA = 1; //全局中斷打開(kāi)
- EX0 = 1; //INT0中斷允許
- IT0 = 1; //觸發(fā)方式為下降沿觸發(fā)
- }
- void ISR_KEY()interrupt 0
- {
- if(key_ir == 0)
- {
- ir_police = 0; //報(bào)警解除
- } else
- {
- ir_police = 1; //報(bào)警
- }
- }
- /*----------------------------------------------------------------------------*
- * 內(nèi)部函數(shù)原型 *
- *----------------------------------------------------------------------------*/
- VOID MAIN_Init(VOID); //初始化函數(shù)
- VOID DHT11_Display(VOID); //DHT11顯示函數(shù)
- void delay_display(unsigned char ms); //延時(shí)顯示 主要解決延遲時(shí)間內(nèi)不能按鍵操作
- int optimum_judge_T(); //最佳 溫度 判斷 -1 小于 最小值 0 正常 1 大于最大值
- int optimum_judge_R(); //最佳 濕度 判斷 -1 小于 最小值 0 正常 1 大于最大值
- void TR_optimum_adjust(); //溫濕度 最佳 調(diào)節(jié)
- void Optimum_Display(); //最佳溫濕度顯示
- void Optimum_panduan(); //最佳濕度判斷
- void NotDisplayCursor(); //不顯示光標(biāo)
- void DisplayCursor_temp(); //顯示光標(biāo)
- void Call_DisplayCursor(); //必要的調(diào)用顯示光標(biāo)函數(shù)
- void NotCursor_L3(); //第三行不顯示光標(biāo)
- /*----------------------------------------------------------------------------*
- * 外部函數(shù)原型 *
- *----------------------------------------------------------------------------*/
- VOID main(void)
- {
- MAIN_Init();
- Optimum_Display();
- DHT11_Display();
- call_police(); //報(bào)警
- while(1)
- {
- delay_display(500);//延時(shí)顯示 主要解決延遲時(shí)間內(nèi)不能按鍵操作
- Optimum_panduan();
- if(Cursor_place != 0)
- {
- Call_DisplayCursor();
- }
- call_police(); //報(bào)警
- }
- }
- VOID MAIN_Init(VOID)
- {
- LED1 = 1;
- LED2 = 1;
- LED3 = 1;
- LED4 = 1;
- Init_police();
- LED_Init();//OLED初始化
- key_init();
-
- key_ir = 1;
- }
- void Optimum_panduan() //最佳濕度判斷
- {
- int temp_T, temp_R;
- //最佳溫度判斷 -1 小于 最小值 0 正常 1 大于最大值
- temp_T = optimum_judge_T(); //最佳 溫度 判斷
- temp_R = optimum_judge_R(); //最佳 溫度 判斷
- switch(temp_T)
- {
- case 0:
- LED1 = 1;
- LED2 = 1;
- break;
- case 1:
- LED1 = 0;
- LED2 = 1;
- break;
- case -1:
- LED1 = 1;
- LED2 = 0;
- break;
- }
- switch(temp_R)
- {
- case 0:
- LED3 = 1;
- LED4 = 1;
- break;
- case 1:
- LED3 = 0;
- LED4 = 1;
- break;
- case -1:
- LED3 = 1;
- LED4 = 0;
- break;
- }
- }
- void delay_display(unsigned char ms) //延時(shí)顯示 主要解決延遲時(shí)間內(nèi)不能按鍵操作
- {
- unsigned char i;
- Optimum_panduan(); //最佳濕度判斷
- DHT11_Display();//溫濕度 顯示
- while(ms--)
- {
- for(i = 0; i < 30; i++)
- {
- TR_optimum_adjust();//溫濕度 最佳 調(diào)節(jié)
- }
- }
- }
- void TR_optimum_adjust() //溫濕度 最佳 調(diào)節(jié)
- {
- int key;
- key = key_return(); //1 設(shè)置鍵 2 加 3 減 4 下一條
- switch(key)
- {
- case 1:
- SetKeyFlag = !SetKeyFlag;
- if(SetKeyFlag)
- {
- Cursor_Flag = 1;
- Cursor_place = 1;
- } else
- {
- Cursor_Flag = 0;
- Cursor_place = 0;
- Call_DisplayCursor();
- }
- break;
- case 2:
- if(Cursor_place == 1)
- {
- if(optimum_TL < optimum_TH)
- {
- optimum_TL++;
- }
- } else if(Cursor_place == 2)
- {
- optimum_TH++;
- if( optimum_TH > 99 )
- optimum_TH = 99;
- } else if(Cursor_place == 3)
- {
- if(optimum_RL < optimum_RH)
- {
- optimum_RL++;
- }
- } else if(Cursor_place == 4)
- {
- optimum_RH++;
- if( optimum_RH > 99 )
- optimum_RH = 99;
- }
- break;
- case 3:
- if(Cursor_place == 1)
- {
- optimum_TL--;
- if( optimum_TL < 0 )
- optimum_TL = 0;
- } else if(Cursor_place == 2)
- {
- if(optimum_TH > optimum_TL)
- {
- optimum_TH--;
- }
- } else if(Cursor_place == 3)
- {
- optimum_RL--;
- if( optimum_RL < 0 )
- optimum_RL = 0;
- } else if(Cursor_place == 4)
- {
- if(optimum_RH > optimum_RL)
- {
- optimum_RH--;
- }
- }
- break;
- case 4:
- Cursor_place++;
- if(Cursor_place == 5)
- Cursor_place = 1;
- break;
- }
- if(key != -1)
- {
- Optimum_Display();
- Call_DisplayCursor();
- }
- }
- void GeShiHuaDht11Data_Humi()//濕度
- {
- //濕度整數(shù)部分
- str1[0] = (char)(0X30 + RH_data / 10);
- str1[1] = (char)(0X30 + RH_data % 10);
- str1[2] = 0x2e; //小數(shù)點(diǎn)
- //濕度小數(shù)部分
- str1[3] = (char)(0X30 + RL_data / 10);
- str1[5] = 0X25; //"%"
- str1[6] = 0X52; //"R"
- str1[7] = 0X48; //"H"
-
- }
- void GeShiHuaDht11Data_Temp()//溫度
- {
- //溫度整數(shù)部分
- str2[0] = (char)(0X30 + TH_data / 10);
- str2[1] = (char)(0X30 + TH_data % 10);
- str2[2] = 0x2e; //小數(shù)點(diǎn)
- //溫度小數(shù)部分
- str2[3] = (char)(0X30 + TL_data / 10);
- str2[5] = 0X27; //"'"
- str2[6] = 0X43; //"C"
- }
- VOID DHT11_Display(VOID)
- {
- Dht11TRHData = SendDht11Data();
-
- TH_data = Dht11TRHData.DtempH;
- TL_data = Dht11TRHData.DtempL;
-
- RH_data = Dht11TRHData.DhumiH;
- RL_data = Dht11TRHData.DhumiL;
- GeShiHuaDht11Data_Humi();
- GeShiHuaDht11Data_Temp();
- LED_P8x16Str(0, 0, (UCHAR8*)"TRH RH: ");
- LED_P8x16Str(64, 0, (UCHAR8*)str1); //寫(xiě)濕度數(shù)據(jù)
- LED_P8x16Str(0, 1, (UCHAR8*)"TRH T: ");
- LED_P8x16Str(64, 1, (UCHAR8*)str2);
- //delay_ms(1000) ;
- }
- void NotDisplayCursor() //不顯示光標(biāo)
- {
- LED_P8x16Str(24, 2, (UCHAR8*)" ");
- LED_P8x16Str(80, 2, (UCHAR8*)" ");
- LED_P8x16Str(24, 3, (UCHAR8*)" ");
- LED_P8x16Str(80, 3, (UCHAR8*)" ");
- }
- void DisplayCursor_temp() //顯示光標(biāo)
- {
- switch(Cursor_place)
- {
- case 1:
- LED_P8x16Str(24, 2, (UCHAR8*)"|");
- break;
- case 2:
- LED_P8x16Str(80, 2, (UCHAR8*)"|");
- break;
- case 3:
- LED_P8x16Str(24, 3, (UCHAR8*)"|");
- break;
- case 4:
- LED_P8x16Str(80, 3, (UCHAR8*)"|");
- break;
- }
- }
- void Call_DisplayCursor()
- {
- Cursor_Flag = !Cursor_Flag;
- NotDisplayCursor(); //不顯示
- if(Cursor_Flag == 1)
- {
- DisplayCursor_temp(); //顯示光標(biāo)
- }
- }
- void Optimum_Display() //最佳溫濕度顯示
- {
- // 0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128
- // T L : 2 5 T H : 5 5
- /*--------------------低溫度---------------------------*/
- DiWenDu[0] = (char)(0X30 + optimum_TL / 10);
- DiWenDu[1] = (char)(0X30 + optimum_TL % 10);
- LED_P8x16Str(0, 2, (UCHAR8*)"TL:");
- LED_P8x16Str(32, 2, (UCHAR8*)DiWenDu);
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
倉(cāng)庫(kù)物流.zip
(201.3 KB, 下載次數(shù): 26)
2018-7-26 10:07 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|