找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3124|回复: 1
收起左侧

单片机火灾报警源程序与Proteus仿真图 ADC0832+电位器模拟烟雾温度控制电机

[复制链接]
ID:814966 发表于 2022-1-18 10:34 | 显示全部楼层 |阅读模式
此次设计是火灾报警系统,主要功能是实现当出现火灾的时候,通过烟雾报警器和温度报警器进行报警,并带动电机运转进行排烟或者洒水。本单片机系统采用AT89C51单片机控制,整个硬件系统由A/D转换、LCD显示、按键键盘、温度传感器、烟雾传感器、LED灯、电机、继电器等模块组成。系统中设置了4个按键,其中1个是复位键,其余的3个键,其中一个是设置键,另外两个是加减键,用来设置温度、烟雾阈值,用程序来控制实现不同的功能:
(1)LCD液晶显示屏实时显示当前的烟雾值和温度值;
(2)温度和烟雾的报警值可以通过按键设定
(3)当前温度值超过上限时,蓝灯亮,蜂鸣器响;
(4)当前烟雾值超过上线时,黄灯亮,蜂鸣器响,电机运转;
(5)四个按键功能:设置键、加键、减键、复位按键;
(6)通过继电器驱动模块,当烟雾或可燃气体浓度超过报警值时启动继电器,继电器带动风扇转动模拟排烟。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif Snipaste_2022-01-18_10-38-09.jpg

单片机源程序如下:
  1. void main (void)
  2. {
  3.         u8 key;        
  4. //  uint ppm;
  5.         uchar adc = 0;
  6.         float voltage = 0;
  7.         wendu=check_wendu();                                          //初始化时调用温度读取函数 防止开机85°C
  8.         Init1602();                                                                                  //调用初始化显示函数
  9.         LCD_Write_String(0,0,"SET T:00 Y:0.00%");  //开机界面
  10.         LCD_Write_String(1,0,"NOW T:00 Y:0.00%");  
  11.         delay_ms(1000);
  12.         wendu=check_wendu();        //初始化时调用温度读取函数 防止开机85°C
  13.         
  14.         while (1)                                                                        //主循环
  15.         {        
  16.                 key=Key_Scan();                                                                        //按键扫描
  17.                 adc = Adc0832(0);                                                                //读取adc值
  18.                 voltage = adc * 5/255;                                        //将adc值换算成电压
  19. yanwu=(39*adc+100)/100;                          //0-255转化为1-100的线性关系显示,由于显示问题,ppm100-10000除100,显示1-100        
  20. wendu=check_wendu();                          //读取温度值
  21.         
  22.                
  23. //========================================================================
  24. //循环的主程序,进行数据读取,switch循环选择对应的模式进行按键设置
  25. //LED、蜂鸣器、风扇均为低电平有效
  26. //========================================================================
  27.          
  28.                 if(key==KEY_SET)
  29.                         {
  30.                                 Mode++;
  31.                         }                                
  32.                                 switch(Mode)                                //判断模式的值
  33.                                 {
  34.                                  case 0:                                                                                                //监控模式
  35.                                         {
  36.                                                 Display_1602(yushe_wendu,yushe_yanwu,wendu,yanwu);  //显示预设温度,预设烟雾,温度值,烟雾值
  37.                                                 if(yanwu>=yushe_yanwu)                                                                                                                  //烟雾值大于等于预设值时
  38.                                                         {
  39.                                                                 if(flag)
  40.                                                                          {
  41.                                                                                         Led_Blue=1;                                //烟雾指示灯灭
  42.                                                                                         Fan=1;                                                //风扇停止
  43.                                                                                         Buzzer=1;                                        //蜂鸣器不响
  44.                                                                         }
  45.                                                                 else
  46.                                                                          {
  47.                                                                                         Buzzer=0;                                                                  //蜂鸣器报警
  48.                                                                                         delay_ms(100);
  49.                                                                                         Buzzer=1;
  50.                                                                                         Led_Blue=0;                                                          //烟雾指示灯亮
  51.                                                                                         Fan=0;                                                                                //风扇运行
  52.                                                                          }
  53.                                                         }
  54.                                                 else                                                                                                  //烟雾值小于预设值时
  55.                                                         {
  56.                                                                 Led_Blue=1;                                                          //关掉报警灯
  57.                                                                 Fan=1;
  58.                                                                 Buzzer=1;
  59.                                                         }
  60.                                                 if(wendu>=(yushe_wendu*10))                  //温度大于等于预设温度值时(为什么是大于预设值*10:因为我们要显示的温度是有小数点后一位,是一个3位数,25.9°C时实际读的数是259,所以判断预设值时将预设值*10)
  61.                                                         {
  62.                                                                 if(flag)
  63.                                                                          {
  64.                                                                                         Led_Yellow=1;        //烟雾指示灯
  65.                                                                                         Buzzer=1;
  66.                                                                          }
  67.                                                          else
  68.                                                                          {
  69.                                                                                         Buzzer=0;                                //打开蜂鸣器报警
  70.                                                                                         delay_ms(100);
  71.                       Buzzer=1;                                                                                 
  72.                                                                                         Led_Yellow=0;                //打开温度报警灯
  73.                                                                          }
  74.                                                         }                                                                        
  75.                                                 else                                                                                        //温度值小于预设值时
  76.                                                                 {
  77.                                                                          Led_Yellow=1;                        //关闭报警灯
  78.                                                                          Buzzer=1;          //关闭蜂鸣器
  79.                                                                 }                                                        
  80.                                                 if((yanwu<yushe_yanwu)&&(wendu<(yushe_wendu*10)))        //当烟雾小于预设值并且温度也小于预设值时
  81.                                                                 {
  82.                                                                          Buzzer=1;                                        //停止报警
  83.                                                                 }
  84.                                                                 break;
  85.                                                         }
  86.                         case 1:                                                                                                        //预设温度模式
  87.                         {
  88.                                 SelectPosition(0,5) ;                                        //指定位置
  89.                                 write_com(0x0d);                                                        //阴影闪烁
  90.                                 if(key==KEY_ADD)                                                        //加键按下
  91.                                         {
  92.                                                 yushe_wendu++;                                            //预设温度值(阀值)加1
  93.                                                 if(yushe_wendu>=99)                                         //当阀值加到大于等于99时
  94.                                                 yushe_wendu=99;                                                         //阀值固定为99
  95.                                                 LCD_Write_Char(0,6,yushe_wendu,2) ;//显示预设温度
  96.                                         }
  97.                                 if(key==KEY_MINUS)                                                 //减键按下
  98.                                         {
  99.                                                 if(yushe_wendu<=1)                                        //当温度上限值减小到1时
  100.                                                 yushe_wendu=1;                          //固定为1
  101.                                                 yushe_wendu--;                                                        //预设温度值减一,最小为0
  102.                                                 LCD_Write_Char(0,6,yushe_wendu,2) ;//显示预设温度
  103.                                         }
  104.                                                 break;                                                                                          //执行后跳出switch
  105.                         }
  106.                         case 2:                                                                                                        //预设烟雾模式
  107.                         {
  108.                                 SelectPosition(0,10) ;                                //指定位置        
  109.                                 write_com(0x0d);                                                        //打开显示 无光标 光标闪烁
  110.                                 if(key==KEY_ADD)                                                        //加键按下
  111.                                         {
  112.                                                 if(yushe_yanwu>=100)        //当阀值加到大于等于99时
  113.                                                 yushe_yanwu=99;            //阀值固定为98
  114.                                                 yushe_yanwu++;                                            //预设烟雾值(阀值)加1,最大为99
  115.                                                 LCD_Write_Char(0,13,yushe_yanwu,2) ;//显示预设烟雾
  116.                                         }
  117.                                 if(key==KEY_MINUS)                                                //减键按下
  118.                                         {        
  119.                                                 if(yushe_yanwu<=1)                                        //当烟雾上限值减小到1时
  120.                                                 yushe_yanwu=1;                  //固定为1
  121.                                                 yushe_yanwu--;                                                        //预设温度值减一,最小为0         
  122.                                                 LCD_Write_Char(0,13,yushe_yanwu,2) ;//显示预设烟雾
  123.                                         }
  124.                                                 break;
  125.                         }
  126.                                 default        :        
  127.                                         {
  128.                                                 write_com(0x38);                                                //屏幕初始化
  129.                                                 write_com(0x0c);                                                //打开显示 无光标 无光标闪烁
  130.                                                 Mode=0;                                                                            //恢复正常模式
  131.                                                 break;
  132.                                         }        
  133.                         }                        
  134.         }                                                         
  135. }        
复制代码

Keil代码与Proteus仿真下载:
火灾报警仿真代码.7z (99.27 KB, 下载次数: 213)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:964009 发表于 2022-4-7 11:16 | 显示全部楼层
下载的仿真原理图是.pdsprj格式的文件,需要用Proteus8.8这个版本来打开
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表