主控芯片采用STC89C52RC,使用到的模块有 MQ2 红外对管 火焰模块等等。有仿真文件,仅供参考学习之用。
仿真原理图如下(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;//红外对管 报警指示灯
sbit TRH = P1 ^ 7; //温湿度传感器DHT11数据接入
-------------------------------------------------------------------
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; //火焰报警器模块
sbit MQ2 = P2 ^ 7; //烟雾检测模块 检测到为 0
-----------------------------------------------------------------------------------------
//sbit infrared = P3^2; //红外 外部中断0
sbit key_ir = P3 ^ 4; //解除红外报警按钮 为自锁开关
sbit police_ok = P3 ^ 5; //确认收到红外报警按钮
-----------------------------------------------------------------------------------------
按键接线:
-------------------------------------------------------------------------------
sbit KEY1 = P0^2; // 更改/确认建
sbit KEY2 = P0^3; //加
sbit KEY3 = P0^4; //减
sbit KEY4 = P0^5; //下一项
-------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------
| Px | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
----------------------------------------------------------------------
| P1 | LED1 | LED2 | LED3 | LED3 | 火焰L | MQ2 L | 红外L | TRH | 全部为LED 除P1.7
----------------------------------------------------------------------
| P2 | OL_DC | OL_RST| OL_D0 | OL_D1 | | 蜂鸣器| 火 焰 | MQ2 |
----------------------------------------------------------------------
| P3 | | |红外对管| |key_ir|收到key| | | key_ir 为自锁开关
----------------------------------------------------------------------
| P0 | | | KEY1 | KEY2 | KEY3 | KEY4 | | |
----------------------------------------------------------------------
单片机源程序如下:
- /******************************************************************************
- 文 件 名 : main.c
- 版 本 号 : v1.0
- 作 者 : Guokaiyi
- 生成日期 : 2012-12-1
- 最近修改 :
- 功能描述 : OLED演示例程(51系列)
- 说明:
- ----------------------------------------------------------------
- G 电源地
- VCC 接5V或3.3v电源
- D0 P1^0(SCLK)
- D1 P1^1(MOSI)
- RST P1^2
- DC P1^3
- CS 已经默认选中,可以不接
- ----------------------------------------------------------------
- sbit LED_SCL = P1^0;
- sbit LED_SDA = P1^1;
- sbit LED_RST = P1^2;
- sbit LED_DC = P1^3;
- //DHT11温湿度测试程序
- //P2作为LCD的数据控制口,P1.6 作为DHT11data总线 ,P1.1作为状态显示
- ******************************************************************************/
- /*----------------------------------------------------------------------------*
- * 包含头文件 *
- *----------------------------------------------------------------------------*/
- #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;//红外对管 报警指示灯
- 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; // 是否显示光标
- int Cursor_place = 0; //光标位置 0没有 1TL 2TH 3RL 4RH
- bit SetKeyFlag = 0; //是否按下设置键 0 未按下 1按下
- sbit MQ2 = P2 ^ 7; //烟雾检测模块 检测到为 0
- sbit flame = P2 ^ 6; //火焰报警器模块
- sbit beep = P2 ^ 5; //蜂鸣器模块
- //sbit infrared = P3^2; //红外
- sbit key_ir = P3 ^ 4; //解除红外报警按钮
- sbit police_ok = P3 ^ 5; //确认收到红外报警按钮
- #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() //报警
- {
- 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; //报警解除
- } else
- {
- beepbaojingno = 3;
- Ir_LED = 0;
- }
- }
- else
- {
- Ir_LED = 1;
- }
-
- if(beepbaojingno != 0)
- {
- beep = BEEP_ON;
- }else
- {
- beep = BEEP_OFF;
- }
- }
- /*********************************************************************************
- *实验名 :外部中断实验(下降沿触发)
- *实验效果 :按下学习板上第三排任意按键,LED灯前后四位状态调换
- *
- *********************************************************************************/
- void Init_police()
- {
- Flame_LED = 1;
- MQ2_LED = 1;
- Ir_LED = 1;
- beep = BEEP_OFF;
- EA = 1; //全局中断打开
- EX0 = 1; //INT0中断允许
- IT0 = 1; //触发方式为下降沿触发
- }
- void ISR_KEY()interrupt 0
- {
- if(key_ir == 0)
- {
- ir_police = 0; //报警解除
- } else
- {
- ir_police = 1; //报警
- }
- }
- /*----------------------------------------------------------------------------*
- * 内部函数原型 *
- *----------------------------------------------------------------------------*/
- VOID MAIN_Init(VOID); //初始化函数
- VOID DHT11_Display(VOID); //DHT11显示函数
- void delay_display(unsigned char ms); //延时显示 主要解决延迟时间内不能按键操作
- int optimum_judge_T(); //最佳 温度 判断 -1 小于 最小值 0 正常 1 大于最大值
- int optimum_judge_R(); //最佳 湿度 判断 -1 小于 最小值 0 正常 1 大于最大值
- void TR_optimum_adjust(); //温湿度 最佳 调节
- void Optimum_Display(); //最佳温湿度显示
- void Optimum_panduan(); //最佳湿度判断
- void NotDisplayCursor(); //不显示光标
- void DisplayCursor_temp(); //显示光标
- void Call_DisplayCursor(); //必要的调用显示光标函数
- void NotCursor_L3(); //第三行不显示光标
- /*----------------------------------------------------------------------------*
- * 外部函数原型 *
- *----------------------------------------------------------------------------*/
- VOID main(void)
- {
- MAIN_Init();
- Optimum_Display();
- DHT11_Display();
- call_police(); //报警
- while(1)
- {
- delay_display(500);//延时显示 主要解决延迟时间内不能按键操作
- Optimum_panduan();
- if(Cursor_place != 0)
- {
- Call_DisplayCursor();
- }
- call_police(); //报警
- }
- }
- 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) //延时显示 主要解决延迟时间内不能按键操作
- {
- unsigned char i;
- Optimum_panduan(); //最佳湿度判断
- DHT11_Display();//温湿度 显示
- while(ms--)
- {
- for(i = 0; i < 30; i++)
- {
- TR_optimum_adjust();//温湿度 最佳 调节
- }
- }
- }
- void TR_optimum_adjust() //温湿度 最佳 调节
- {
- int key;
- key = key_return(); //1 设置键 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()//湿度
- {
- //湿度整数部分
- str1[0] = (char)(0X30 + RH_data / 10);
- str1[1] = (char)(0X30 + RH_data % 10);
- str1[2] = 0x2e; //小数点
- //湿度小数部分
- str1[3] = (char)(0X30 + RL_data / 10);
- str1[5] = 0X25; //"%"
- str1[6] = 0X52; //"R"
- str1[7] = 0X48; //"H"
-
- }
- void GeShiHuaDht11Data_Temp()//温度
- {
- //温度整数部分
- str2[0] = (char)(0X30 + TH_data / 10);
- str2[1] = (char)(0X30 + TH_data % 10);
- str2[2] = 0x2e; //小数点
- //温度小数部分
- 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); //写湿度数据
- LED_P8x16Str(0, 1, (UCHAR8*)"TRH T: ");
- LED_P8x16Str(64, 1, (UCHAR8*)str2);
- //delay_ms(1000) ;
- }
- void NotDisplayCursor() //不显示光标
- {
- LED_P8x16Str(24, 2, (UCHAR8*)" ");
- LED_P8x16Str(80, 2, (UCHAR8*)" ");
- LED_P8x16Str(24, 3, (UCHAR8*)" ");
- LED_P8x16Str(80, 3, (UCHAR8*)" ");
- }
- void DisplayCursor_temp() //显示光标
- {
- 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(); //显示光标
- }
- }
- 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);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
仓库物流.zip
(201.3 KB, 下载次数: 26)
|