找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12202|回复: 19
收起左侧

51单片机一氧化碳CO浓度报警器设计(源码+Proteus仿真)

  [复制链接]
ID:74293 发表于 2020-3-3 23:48 | 显示全部楼层 |阅读模式
基于51单片机的CO浓度报警器设计,实际测试成功。MQ系列气体传感器通用!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png
51hei.png

制作出来的实物图如下:
0.jpg 0.jpg

一氧化碳CO报警器元件清单

1)    9*15万用板
2)    STC89C51单片机
3)    ADC0809
4)    28脚IC座
5)    40脚IC座
6)    1602液晶
7)    16p母座
8)    16p排针
9)    3p排针
10)    7*7风扇
11)    MQ-7烟雾传感器
12)    5v继电器(黄/蓝)
13)    2.2k电阻*3
14)    1.5k电阻
15)    1k电阻*2
16)    5.1Ω电阻
17)    导线、焊锡
17)    220Ω电阻
18)    10k电阻*2
19)    470Ω电阻
20)    10uf电解电容
21)    30pf瓷片电容*2
22)    12M晶振
23)    按键*4
24)    103排阻(10k)
25)    有源蜂鸣器
26)    5mmLED (红绿黄) *3
27)    9012三极管*2
28)    104独石电容
29)    2p接线端子
30)    DC电源接口
31)    自锁开关
32)    USB电源线
或电池盒+DC电源插口

单片机源程序如下:
  1. //程序头函数
  2. #include <reg52.h>
  3. //显示函数
  4. #include <display.h>

  5. //宏定义
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. #define Data_ADC0809 P1

  9. //管脚声明
  10. sbit LED_R= P2^2;//红灯
  11. sbit LED_G= P2^0;//绿灯
  12. sbit FENG = P2^5;//蜂鸣器
  13. sbit san=P3^4;         //风扇控制(选配)
  14. //ADC0809
  15. sbit ST=P3^3;
  16. sbit EOC=P3^6;
  17. sbit OE=P3^2;
  18. //按键
  19. sbit Key1=P2^6;         //设置键
  20. sbit Key2=P2^7;         //加按键
  21. sbit Key3=P3^7;         //减按键

  22. bit bdata flag;         //报警标志位
  23. uchar set;                 //设置状态


  24. //函数声明
  25. extern uchar ADC0809();
  26. extern void Key();

  27. //酒精含量变量
  28. uchar temp=0;

  29. uchar WARNING=25; //报警值

  30. void init()           //初始化函数
  31. {
  32.         TMOD=0x01; //工作方式
  33.          TL0=0xb0;
  34.          TH0=0x3c; //赋初值(12MHz晶振的50ms)
  35.          EA=1;          //打开中断总开关
  36.         ET0=1;          //打开中断允许开关
  37.          TR0=1;          //打开定时器开关
  38. }

  39. void main()          //主函数
  40. {
  41.         Init1602();//初始化显示
  42.         init();           //初始化定时器
  43.         while(1)   //进入循环
  44.         {
  45.                 temp=ADC0809();                                   //读取酒精浓度值
  46.                 if(set==0)                                           //只有在非设置状态时,
  47.                 Display_1602(temp,WARNING);           //才刷新显示实时浓度值
  48.                 if(temp<WARNING&&set==0)           //非设置时当浓度值小于报警值时
  49.                 {
  50.                         flag=0;                                           //报警标志位置0,不报警
  51.                 }
  52.                 else if(temp>WARNING&&set==0)  //非设置时当浓度值大于报警值时
  53.                 {
  54.                         flag=1;                                           //报警标志位置1
  55.                 }
  56.                 Key();                                                   //扫描按键
  57.         }
  58. }
  59. //ADC0809读取信息
  60. uchar ADC0809()
  61. {
  62.         uchar temp_=0x00;
  63.         //初始化高阻太

  64.         OE=0;
  65.         //转化初始化
  66.         ST=0;
  67.         //开始转换
  68.         ST=1;
  69.         ST=0;
  70.         //外部中断等待AD转换结束
  71.         while(EOC==0)
  72.         //读取转换的AD值
  73.         OE=1;
  74.         temp_=Data_ADC0809;//将0809的数值读入单片机
  75.         OE=0;
  76.         return temp_;           //返回读到的数据
  77. }

  78. void Key()                          //按键函数
  79. {
  80.         if(Key1==0)                        //设置键按下时
  81.         {
  82.                 while(Key1==0);        //检测按键是否释放
  83.                 FENG=0;                        //蜂鸣器响
  84.                 set++;                        //设置状态标志加
  85.                 flag=0;                        //停止报警
  86.                 san=1;                        //风扇停止转动(选配)
  87.                 TR0=0;                        //定时器停止
  88.                 write_com(0x80+0x40+13);//选中报警值的位置
  89.                    write_com(0x0f);//打开显示 无光标 光标闪烁
  90.         }
  91.         if(set>=2)                //再按一下设置键时,退出设置
  92.         {
  93.                 set=0;                        //设置状态清零
  94.                 write_com(0x38);//屏幕初始化
  95.                 write_com(0x0c);//打开显示 无光标 无光标闪烁
  96.                 FENG=1;                        //蜂鸣器停止响
  97.                 flag=1;                        //报警标志位置1
  98.                 TR0=1;                        //定时器开始计时
  99.         }
  100.         if(Key2==0&&set!=0)        //当在设置状态时,按下加键时
  101.         {
  102.                 while(Key2==0);        //按键释放
  103.                 FENG=0;                        //蜂鸣器鸣响
  104.                 WARNING++;                //报警阈值加
  105.                 if(WARNING>=255)//阈值最大加到255
  106.                 WARNING=0;                //清零
  107.                 write_com(0x80+0x40+11); //在阈值的位置写入设置的数据
  108.                 write_data('0'+WARNING/100); //显示百位(将123除以100得到的商是1,就是百位数据)123为例子
  109.                 write_data('0'+WARNING/10%10);//显示十位(将123除以10得到商是12,将12除以10的余数就是十位)
  110.                 write_data('0'+WARNING%10);          //显示个位(将123除以10的余数3就是个位数据)123为例子
  111.                 write_com(0x80+0x40+13);//位置
  112.                 FENG=1;//蜂鸣器停止
  113.         }
  114.         if(Key3==0&&set!=0)         //减按键注释参考加按键部分
  115.         {
  116.                 while(Key3==0);
  117.                 FENG=0;
  118.                 WARNING--;
  119.                 if(WARNING<=0)
  120.                 WARNING=255;
  121.                 write_com(0x80+0x40+11);
  122.                 write_data('0'+WARNING/100);
  123.                 write_data('0'+WARNING/10%10);
  124.                 write_data('0'+WARNING%10);
  125.                 write_com(0x80+0x40+13);//位置
  126.                 FENG=1;
  127.         }
  128. }

  129. void  time1_int(void) interrupt 1  //定时器函数
  130. {
  131.         uchar count;
  132.         TL0=0xb0;
  133.          TH0=0x3c;        //重新赋初值
  134.           count++;        //计时变量加
  135.         if(count==10)//定时器定时是50ms,此处计数10次,正好是500ms,用于报警时 灯亮和蜂鸣器响
  136.         {
  137.                 if(flag==0)                   //报警标志为0时
  138.                 {
  139.                         LED_G=0;           //绿灯亮
  140.                         LED_R=1;           //红灯灭
  141.                         FENG=1;                   //蜂鸣器不响
  142.                         san=1;                 //风扇不转(选配)
  143.                 }
  144.                 if(flag==1)                 //报警标志位为1时
  145.                 {
  146.                         LED_G=1;         //绿灯灭
  147.                         LED_R=0;         //红灯亮
  148.                         FENG=0;                 //蜂鸣器响
  149.                         san=0;                 //风扇转动(选配)
  150.                 }
  151.         }

  152.            if(count==20)                 //计数到20时,正好是1000ms,就是1s,这里就是让灯灭,蜂鸣器不响,从而做出闪烁的效果
  153.            {
  154.                 count=0;                 //计到1s时,将count清零,准备重新计数
  155.                 if(flag==0)
  156.                 {
  157.                         LED_G=1;
  158.                         LED_R=1;
  159.                         FENG=1;
  160.                         san=1;                //全部关闭
  161.                 }
  162.                 if(flag==1)
  163.                 {
  164.                         LED_G=1;
  165.                         LED_R=1;
  166.                         FENG=1;
  167.                         san=0;                //报警值,风扇是一直转动的(选配)
  168.                 }
  169.         }
  170. }
复制代码

所有资料51hei提供下载:
CO警器.7z (936.34 KB, 下载次数: 413)

评分

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

查看全部评分

回复

使用道具 举报

ID:712035 发表于 2020-3-21 12:05 | 显示全部楼层
非常感谢,好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:441190 发表于 2020-4-7 14:57 | 显示全部楼层
用Proteus7.5打开
回复

使用道具 举报

ID:730198 发表于 2020-4-16 00:13 | 显示全部楼层
能麻烦大佬教教怎么调试吗
回复

使用道具 举报

ID:731671 发表于 2020-4-17 21:19 | 显示全部楼层
学的时候我一直没搞懂,按键函数的那个按键是指什么?物理开关吗?
回复

使用道具 举报

ID:731712 发表于 2020-4-17 21:57 | 显示全部楼层
向大佬学习。
回复

使用道具 举报

ID:731804 发表于 2020-4-18 07:40 | 显示全部楼层
感谢作者。
回复

使用道具 举报

ID:741251 发表于 2020-4-29 20:48 | 显示全部楼层
感谢楼主的分享!
回复

使用道具 举报

ID:559553 发表于 2020-6-8 13:45 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:772905 发表于 2020-6-8 15:46 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:780003 发表于 2020-6-15 16:35 | 显示全部楼层
compiling 01.c...
01.c(4): warning C318: can't open file 'display.h'
01.C(50): warning C206: 'Init1602': missing function-prototype
01.C(56): warning C206: 'Display_1602': missing function-prototype
01.C(56): error C267: 'Display_1602': requires ANSI-style prototype
Target not created
这是哪里有错误啊

回复

使用道具 举报

ID:780747 发表于 2020-6-16 10:40 | 显示全部楼层
感谢楼主分项
回复

使用道具 举报

ID:854512 发表于 2020-12-4 21:33 | 显示全部楼层
感谢楼主分享,但是为什么代码编译错误呀,大佬求解,有没有运行出来的
回复

使用道具 举报

ID:854512 发表于 2020-12-5 14:38 来自手机 | 显示全部楼层
好多压缩包说是坏了,咋搞
回复

使用道具 举报

ID:854512 发表于 2020-12-5 18:38 来自手机 | 显示全部楼层
proteus仿真在哪里呀
回复

使用道具 举报

ID:855632 发表于 2020-12-6 23:10 来自手机 | 显示全部楼层
受教了,最近一直在做这方面的内容,终于找到了这么好的论坛
回复

使用道具 举报

ID:857301 发表于 2020-12-9 14:51 | 显示全部楼层
大佬有粉尘浓度的吗
回复

使用道具 举报

ID:854512 发表于 2020-12-11 18:27 来自手机 | 显示全部楼层
楼主你的风扇呢
回复

使用道具 举报

ID:270495 发表于 2021-12-8 15:34 | 显示全部楼层
啊~~~第54行,ADC0809返回的数值不是电压值吗?不需要转换才是酒精浓度吗?
回复

使用道具 举报

ID:496636 发表于 2022-10-26 07:24 | 显示全部楼层
你把啦 发表于 2020-12-5 14:38
好多压缩包说是坏了,咋搞

就是用快压压缩的压缩包,快压这软件是垃圾,广告一大堆,装这个软件,七大姑八大姨一块儿来。它无非是用其自己的方式压缩,当然普通的正规的压缩软件如WinRAR就解不了它,非它可解,有一大群人传这种压缩包的资料,叫你去装这个软件。这个软件有个好处就是不需要解压,就可以从一个大压缩包里提取出文件或是加入文件,其实这就不叫压缩了,实质就是一个文件夹而已。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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