找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8066|回复: 16
打印 上一主题 下一主题
收起左侧

基于单片机的CO检测系统 物联网在线实时监测的设计 带源程序和原理图

  [复制链接]
跳转到指定楼层
楼主
自己做的,原理图什么都有,
基于单片机的CO检测系统
本设计是基于STC单片机的CO检测系统,可以220V供电,也可以5V供电,可以检测CO浓度,自行设置报警值,当检测到CO浓度超过该设定值后进行声光报警,并将此时的CO浓度值和该时刻的时间存储,存储后可以查询,每次可存储3次报警值,可以通过蓝牙在手机上读取出当前的CO浓度和时间。
该系统共有7个按键,从左至右依次是功能按键、查询按键、加(上翻)按键、减(下翻)按键、清空按键、退出按键、复位按键
当系统供电后,显示主界面,如图1所示。

                       图1 主界面
1602液晶第一行显示时间,第二行前半部分显示此时CO浓度,即CO:****ppm(注意当系统供电后,CO传感器会有一个预热时间,需要55S左右的预热),第二行后半部分显示设定的报警值,即H:****,当按下功能按键后,进入报警值调节界面,如图2所示。此时通过加(上翻)按键、减(下翻)按键来调节报警值,当调节完成后,按下退出按键,返回图1所示界面。


                             图2 报警值设置界面
当CO浓度超过设置报警值后,蜂鸣器响,红色LED发光,当浓度值降低到报警值以下后报警自动解除,此次的报警时间和报警值将被存储。通过查询按键,进入查看存储报警值的界面,如图3所示。

       图3 查询界面
该系统可以进行3次报警值的存储,即连续发生3次报警后,这3次的报警值可以被存储,通过加(上翻)按键、减(下翻)按键进行翻页查询。当3次存储完成后,按下清除按键可以清空存储数据,为下次存储做准备。查询或清除完成后,通过退出按键,返回图1 所示界面。复位按键对单片机系统复位,出现死机后,通过该按键重启。
注意事项
1.   程序下载
程序利用串口下载,首先将下载器正确连接(说明一下,板子上的下载口从左到右依次接下载器的TX、RX,下载器上标的有,+5V和GND和蓝牙共用,共用的目的是下载程序时把蓝牙拔掉,切记),打开STC下载器如图。

选择STC125A60S2,点击“打开程序文件”选择源程序文件夹中的Output文件夹的(源程序) .hex文件。
点击下载,当提示上电时拔下电源再插上就可以了。
免冷切下载器不需要把电。

如果对我们的设计满意,请把我们推荐给您身边其他需要帮助的同学。
赠人玫瑰,手有余香



基于物联网CO在线实时监测的设计的原理图:


部分源码预览(元整的源码请下载附件)
  1. /*
  2. *********************************************************************************************************
  3. *                                          
  4. *        模块名称 : ADC采集配置
  5. *        文件名称 : adc.h
  6. *        版    本 : V1.0
  7. *        说    明 : 负责co输出电压采集           
  8. *        修改记录 :
  9. *   版本号     日期       作者      说明
  10. *   v1.0     2015-4-30            
  11. *               
  12. *     
  13. *********************************************************************************************************
  14. */
  15. #include "adc.h"
  16. /******************************************************************************
  17. *函数名称:uint adc10_start(uchar channel);
  18. *函数功能:adc采集                                                                                         
  19. *输入参数:channel:1-7               
  20. *输出参数:adc
  21. *返回值:adc10_start()
  22. *******************************************************************************/
  23. uint adc10_start(uchar channel)        //channel = 0~7
  24. {
  25.         uint        adc;
  26.         uchar        i;

  27.         ADC_RES = 0;
  28.         ADC_RESL = 0;

  29.         ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;

  30.         i = 250;
  31.         do{
  32.                 if(ADC_CONTR & ADC_FLAG)
  33.                 {
  34.                         ADC_CONTR &= ~ADC_FLAG;
  35.                         adc = (uint)ADC_RES;
  36.                         adc = (adc << 2) | (ADC_RESL & 3);
  37.                         return        adc;
  38.                 }
  39.         }while(--i);
  40.         return        1024;
  41. }
  42. /******************************************************************************
  43. *函数名称:void  delay1_ms(unsigned char ms);
  44. *函数功能:延时函数                                                                                         
  45. *输入参数:ms               
  46. *输出参数:无
  47. *返回值:无
  48. *******************************************************************************/
  49. void  delay1_ms(unsigned char ms)
  50. {
  51.      unsigned int i;
  52.          do{
  53.               i = MAIN_Fosc / 14000;
  54.                   while(--i)        ;   //14T per loop
  55.      }while(--ms);
  56. }
  57. /******************************************************************************
  58. *函数名称:void  INputchange(uchar date);
  59. *函数功能:选择12C5A60AD/S2系列模拟输入(AD)选择                                                                                         
  60. *输入参数:date               
  61. *输出参数:无
  62. *返回值:无
  63. *******************************************************************************/
  64. void  INputchange(uchar date)
  65. {
  66.              P1ASF = date;//0x03;//(1 << ADC_CH0);                        //12C5A60AD/S2系列模拟输入(AD)选择
  67.           ADC_CONTR = ADC_360T | ADC_ON;
  68.    
  69. }
  70. /******************************************************************************
  71. *函数名称:uint  AdHandle(uchar num);
  72. *函数功能:AD数据处理函数                                                                                         
  73. *输入参数:num               
  74. *输出参数:number
  75. *返回值:AdHandle
  76. *******************************************************************************/
  77. uint  AdHandle(uchar num)
  78. {           uint        count;
  79.        uint number;
  80.            delay1_ms(100);
  81.            delay1_ms(100);
  82.            count = adc10_start(num);                // P1.0 ADC
  83.            number = ((float)count*4.8828 );         //将采集的电压放大1000倍,主要是为了提高co计算的精度
  84.            return number;
  85.      
  86. }
复制代码


  1. /*
  2. *********************************************************************************************************
  3. *                                          
  4. *        模块名称 : 按键发送配置
  5. *        文件名称 : key.h
  6. *        版    本 : V1.0
  7. *        说    明 : 负责按键的配置           
  8. *        修改记录 :
  9. *   版本号     日期       作者      说明
  10. *   v1.0     2015-4-30            
  11. *               
  12. *      
  13. *********************************************************************************************************
  14. */
  15. #include <reg51.h>
  16. #include"key.h"
  17. #include"LCD1602.h"
  18. #include"buzzer.h"
  19. int Key_Num = 200;
  20. uchar select=3;
  21. uchar page;
  22. /******************************************************************************
  23. *函数名称:uint Key_Alarm(void);
  24. *函数功能:报警值设置                                                                                
  25. *输入参数:无               
  26. *输出参数:Key_Num
  27. *返回值:Key_Alarm()
  28. *******************************************************************************/
  29. uint Key_Alarm(void)
  30. {
  31.         if(select==1)                                //在功能界面时才能对报警值经行设置
  32.         {         
  33.                 if(key_add == 0)                //判断key_add是否按下
  34.                 {
  35.                      while(!key_add);         //保证按键按下一次加一次
  36.                         Key_Num+=10;                 //报警值加10   
  37.                 }
  38.                 if(key_reduce == 0)
  39.                 {
  40.                      while(!key_reduce);
  41.                         Key_Num-=10;                    
  42.                 }
  43.                 if (Key_Num<=0)
  44.                 {
  45.                         Key_Num=0;
  46.                 }
  47.         }
  48.    return Key_Num;         
  49. }
  50. /******************************************************************************
  51. *函数名称:uchar key_Interface(void);
  52. *函数功能:查询界面按键切换                                                                                
  53. *输入参数:无               
  54. *输出参数:page
  55. *返回值:key_Interface()
  56. *******************************************************************************/

  57. uchar key_Interface(void)
  58. {
  59.         if(select==2)                                  //判断是否在查询界面
  60.         {         
  61.                 if(key_add == 0)                  //判断key_add是否按下
  62.                 {
  63.                      while(!key_add);        
  64.                         page++;                             //页面上翻
  65.                 }
  66.                 if(key_reduce == 0)
  67.                 {
  68.                      while(!key_reduce);        //防止按键抖动,按键对应的I/0一直低电平,
  69.                         page--;                    
  70.                 }
  71.                 if (page<=1)                        //页面范围为1-3当小于1时按键再减则不起作用
  72.                 {
  73.                         page=1;
  74.                 }
  75.                 if (page>=3)                        //当大于3是按键再加也不起作用
  76.                 {
  77.                         page=3;
  78.                 }
  79.         }
  80.    return page;         
  81. }
  82. /******************************************************************************
  83. *函数名称:void key_Empty(void);
  84. *函数功能:按键清空                                                                                
  85. *输入参数:无               
  86. *输出参数:无
  87. *返回值:无
  88. *******************************************************************************/
  89. void key_Empty(void)
  90. {
  91.         Empty();
  92. }
  93. /******************************************************************************
  94. *函数名称:uchar Key_function(void);
  95. *函数功能:主界面按键切换                                                                                
  96. *输入参数:无               
  97. *输出参数:select
  98. *返回值:Key_function()
  99. *******************************************************************************/
  100. uchar Key_function(void)
  101. {
  102.            if(key_function == 0)                  //判断功能按键是否按下
  103.         {
  104.              while(!key_function);        //防止按键抖动,按键对应的I/0一直低电平,
  105.                 lcd_init();                                 //液晶清屏
  106.                 select=1;                             //显示功能界面
  107.         }
  108.         if(key_inquire == 0)                  //判断查询按键是否按下
  109.         {
  110.              while(!key_inquire);        //防止按键抖动,按键对应的I/0一直低电平,
  111.                 lcd_init();
  112.                 select=2;                              //显示查询界面
  113.         }
  114.          if(key_exit == 0)                         //判断退出按键是否按下
  115.         {
  116.              while(!key_exit);        //防止按键抖动,按键对应的I/0一直低电平,
  117.                 lcd_init();
  118.                 select=3;                            //显示主界面
  119.         }
  120.         return select;
  121. }
复制代码
  1. /*
  2. *********************************************************************************************************
  3. *                                          
  4. *        模块名称 : ADC采集配置
  5. *        文件名称 : adc.h
  6. *        版    本 : V1.0
  7. *        说    明 : 负责co输出电压采集           
  8. *        修改记录 :
  9. *   版本号     日期       作者      说明
  10. *   v1.0     2015-4-30            
  11. *               
  12. *     
  13. *********************************************************************************************************
  14. */
  15. #include "adc.h"
  16. /******************************************************************************
  17. *函数名称:uint adc10_start(uchar channel);
  18. *函数功能:adc采集                                                                                         
  19. *输入参数:channel:1-7               
  20. *输出参数:adc
  21. *返回值:adc10_start()
  22. *******************************************************************************/
  23. uint adc10_start(uchar channel)        //channel = 0~7
  24. {
  25.         uint        adc;
  26.         uchar        i;

  27.         ADC_RES = 0;
  28.         ADC_RESL = 0;

  29.         ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;

  30.         i = 250;
  31.         do{
  32.                 if(ADC_CONTR & ADC_FLAG)
  33.                 {
  34.                         ADC_CONTR &= ~ADC_FLAG;
  35.                         adc = (uint)ADC_RES;
  36.                         adc = (adc << 2) | (ADC_RESL & 3);
  37.                         return        adc;
  38.                 }
  39.         }while(--i);
  40.         return        1024;
  41. }
  42. /******************************************************************************
  43. *函数名称:void  delay1_ms(unsigned char ms);
  44. *函数功能:延时函数                                                                                         
  45. *输入参数:ms               
  46. *输出参数:无
  47. *返回值:无
  48. *******************************************************************************/
  49. void  delay1_ms(unsigned char ms)
  50. {
  51.      unsigned int i;
  52.          do{
  53.               i = MAIN_Fosc / 14000;
  54.                   while(--i)        ;   //14T per loop
  55.      }while(--ms);
  56. }
  57. /******************************************************************************
  58. *函数名称:void  INputchange(uchar date);
  59. *函数功能:选择12C5A60AD/S2系列模拟输入(AD)选择                                                                                         
  60. *输入参数:date               
  61. *输出参数:无
  62. *返回值:无
  63. *******************************************************************************/
  64. void  INputchange(uchar date)
  65. {
  66.              P1ASF = date;//0x03;//(1 << ADC_CH0);                        //12C5A60AD/S2系列模拟输入(AD)选择
  67.           ADC_CONTR = ADC_360T | ADC_ON;
  68.    
  69. }
  70. /******************************************************************************
  71. *函数名称:uint  AdHandle(uchar num);
  72. *函数功能:AD数据处理函数                                                                                         
  73. *输入参数:num               
  74. *输出参数:number
  75. *返回值:AdHandle
  76. *******************************************************************************/
  77. uint  AdHandle(uchar num)
  78. {           uint        count;
  79.        uint number;
  80.            delay1_ms(100);
  81.            delay1_ms(100);
  82.            count = adc10_start(num);                // P1.0 ADC
  83.            number = ((float)count*4.8828 );         //将采集的电压放大1000倍,主要是为了提高co计算的精度
  84.            return number;
  85.      
  86. }
复制代码



原理图下载: PCB_Project_24.pdf (540.98 KB, 下载次数: 92)
基于物联网CO在线实时监测的设计源码下载: 源程序1 - 副本.zip (107.37 KB, 下载次数: 115)

评分

参与人数 3黑币 +108 收起 理由
lxllxlcc + 5 很给力!
一世顾你 + 3 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:105624 发表于 2016-7-17 10:20 | 只看该作者
一些功能的介绍 【功能介绍】基于单片机的一氧化碳检测与蓝牙通信.doc (502.5 KB, 下载次数: 53)
回复

使用道具 举报

板凳
ID:105624 发表于 2016-7-17 10:22 | 只看该作者
有好多设计,平常学的时候作者玩的,有需要的联系我,有缘人直接带走
回复

使用道具 举报

地板
ID:110780 发表于 2016-12-1 10:47 | 只看该作者
好厉害啊
回复

使用道具 举报

5#
ID:153626 发表于 2017-1-12 21:10 | 只看该作者
很可以。
回复

使用道具 举报

6#
ID:147215 发表于 2017-1-13 18:29 | 只看该作者
谢谢分享!,,,,
回复

使用道具 举报

7#
ID:185587 发表于 2017-4-2 16:27 | 只看该作者
很不错
回复

使用道具 举报

8#
ID:117562 发表于 2017-5-11 20:03 | 只看该作者
楼主仿真图用什么软件打开
回复

使用道具 举报

9#
ID:198499 发表于 2017-5-27 10:35 | 只看该作者
为什么测出的浓度100多,这么高
回复

使用道具 举报

10#
ID:298027 发表于 2018-3-28 12:58 | 只看该作者
求问这两块是什么意思?

TIM图片20180328125718.png (3.6 KB, 下载次数: 77)

TIM图片20180328125718.png

TIM图片20180328125723.png (7.34 KB, 下载次数: 74)

TIM图片20180328125723.png
回复

使用道具 举报

11#
ID:298213 发表于 2018-3-28 13:20 | 只看该作者
大神啊,牛逼
回复

使用道具 举报

12#
ID:242842 发表于 2018-3-28 15:21 | 只看该作者
检测一氧化碳的是什么芯片?
回复

使用道具 举报

13#
ID:242842 发表于 2018-3-28 15:26 | 只看该作者
qq3119564 发表于 2018-3-28 12:58
求问这两块是什么意思?

同问
回复

使用道具 举报

14#
ID:435279 发表于 2018-11-28 20:58 | 只看该作者
很有用哈哈
回复

使用道具 举报

15#
ID:453311 发表于 2019-12-4 13:08 | 只看该作者
狼牙小帅 发表于 2016-7-17 10:22
有好多设计,平常学的时候作者玩的,有需要的联系我,有缘人直接带走

我需要
回复

使用道具 举报

16#
ID:517951 发表于 2020-11-15 16:18 | 只看该作者
不错,值得学习。51hei有你更精彩!!
回复

使用道具 举报

17#
ID:719679 发表于 2021-5-13 00:03 | 只看该作者
qq3119564 发表于 2018-3-28 12:58
求问这两块是什么意思?

第二个是电源模块
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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