此次设计是火灾报警系统,主要功能是实现当出现火灾的时候,通过烟雾报警器和温度报警器进行报警,并带动电机运转进行排烟或者洒水。本单片机系统采用AT89C51单片机控制,整个硬件系统由A/D转换、LCD显示、按键键盘、温度传感器、烟雾传感器、LED灯、电机、继电器等模块组成。系统中设置了4个按键,其中1个是复位键,其余的3个键,其中一个是设置键,另外两个是加减键,用来设置温度、烟雾阈值,用程序来控制实现不同的功能: (1)LCD液晶显示屏实时显示当前的烟雾值和温度值; (2)温度和烟雾的报警值可以通过按键设定 (3)当前温度值超过上限时,蓝灯亮,蜂鸣器响; (4)当前烟雾值超过上线时,黄灯亮,蜂鸣器响,电机运转; (5)四个按键功能:设置键、加键、减键、复位按键; (6)通过继电器驱动模块,当烟雾或可燃气体浓度超过报警值时启动继电器,继电器带动风扇转动模拟排烟。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- void main (void)
- {
- u8 key;
- // uint ppm;
- uchar adc = 0;
- float voltage = 0;
- wendu=check_wendu(); //初始化时调用温度读取函数 防止开机85°C
- Init1602(); //调用初始化显示函数
- LCD_Write_String(0,0,"SET T:00 Y:0.00%"); //开机界面
- LCD_Write_String(1,0,"NOW T:00 Y:0.00%");
- delay_ms(1000);
- wendu=check_wendu(); //初始化时调用温度读取函数 防止开机85°C
-
- while (1) //主循环
- {
- key=Key_Scan(); //按键扫描
- adc = Adc0832(0); //读取adc值
- voltage = adc * 5/255; //将adc值换算成电压
- yanwu=(39*adc+100)/100; //0-255转化为1-100的线性关系显示,由于显示问题,ppm100-10000除100,显示1-100
- wendu=check_wendu(); //读取温度值
-
-
- //========================================================================
- //循环的主程序,进行数据读取,switch循环选择对应的模式进行按键设置
- //LED、蜂鸣器、风扇均为低电平有效
- //========================================================================
-
- if(key==KEY_SET)
- {
- Mode++;
- }
- switch(Mode) //判断模式的值
- {
- case 0: //监控模式
- {
- Display_1602(yushe_wendu,yushe_yanwu,wendu,yanwu); //显示预设温度,预设烟雾,温度值,烟雾值
- if(yanwu>=yushe_yanwu) //烟雾值大于等于预设值时
- {
- if(flag)
- {
- Led_Blue=1; //烟雾指示灯灭
- Fan=1; //风扇停止
- Buzzer=1; //蜂鸣器不响
- }
- else
- {
- Buzzer=0; //蜂鸣器报警
- delay_ms(100);
- Buzzer=1;
- Led_Blue=0; //烟雾指示灯亮
- Fan=0; //风扇运行
- }
- }
- else //烟雾值小于预设值时
- {
- Led_Blue=1; //关掉报警灯
- Fan=1;
- Buzzer=1;
- }
- if(wendu>=(yushe_wendu*10)) //温度大于等于预设温度值时(为什么是大于预设值*10:因为我们要显示的温度是有小数点后一位,是一个3位数,25.9°C时实际读的数是259,所以判断预设值时将预设值*10)
- {
- if(flag)
- {
- Led_Yellow=1; //烟雾指示灯
- Buzzer=1;
- }
- else
- {
- Buzzer=0; //打开蜂鸣器报警
- delay_ms(100);
- Buzzer=1;
- Led_Yellow=0; //打开温度报警灯
- }
- }
- else //温度值小于预设值时
- {
- Led_Yellow=1; //关闭报警灯
- Buzzer=1; //关闭蜂鸣器
- }
- if((yanwu<yushe_yanwu)&&(wendu<(yushe_wendu*10))) //当烟雾小于预设值并且温度也小于预设值时
- {
- Buzzer=1; //停止报警
- }
- break;
- }
- case 1: //预设温度模式
- {
- SelectPosition(0,5) ; //指定位置
- write_com(0x0d); //阴影闪烁
- if(key==KEY_ADD) //加键按下
- {
- yushe_wendu++; //预设温度值(阀值)加1
- if(yushe_wendu>=99) //当阀值加到大于等于99时
- yushe_wendu=99; //阀值固定为99
- LCD_Write_Char(0,6,yushe_wendu,2) ;//显示预设温度
- }
- if(key==KEY_MINUS) //减键按下
- {
- if(yushe_wendu<=1) //当温度上限值减小到1时
- yushe_wendu=1; //固定为1
- yushe_wendu--; //预设温度值减一,最小为0
- LCD_Write_Char(0,6,yushe_wendu,2) ;//显示预设温度
- }
- break; //执行后跳出switch
- }
- case 2: //预设烟雾模式
- {
- SelectPosition(0,10) ; //指定位置
- write_com(0x0d); //打开显示 无光标 光标闪烁
- if(key==KEY_ADD) //加键按下
- {
- if(yushe_yanwu>=100) //当阀值加到大于等于99时
- yushe_yanwu=99; //阀值固定为98
- yushe_yanwu++; //预设烟雾值(阀值)加1,最大为99
- LCD_Write_Char(0,13,yushe_yanwu,2) ;//显示预设烟雾
- }
- if(key==KEY_MINUS) //减键按下
- {
- if(yushe_yanwu<=1) //当烟雾上限值减小到1时
- yushe_yanwu=1; //固定为1
- yushe_yanwu--; //预设温度值减一,最小为0
- LCD_Write_Char(0,13,yushe_yanwu,2) ;//显示预设烟雾
- }
- break;
- }
- default :
- {
- write_com(0x38); //屏幕初始化
- write_com(0x0c); //打开显示 无光标 无光标闪烁
- Mode=0; //恢复正常模式
- break;
- }
- }
- }
- }
复制代码
Keil代码与Proteus仿真下载:
火灾报警仿真代码.7z
(99.27 KB, 下载次数: 218)
|