找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机的可燃气体报警传感器设计

[复制链接]
跳转到指定楼层
楼主
ID:519189 发表于 2019-4-23 19:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人上周才完成了单片机的可燃气体报警传感器。
用了一周时间才算完成。附件中包含了源码程序以及PCB电路设计。
皆为原创作品 请大家多多指导。
  1. /*头文件*/

  2. #include<reg52.h>
  3. #include <intrins.h>

  4. /*AD寄存器定义*/
  5. sfr ADC_CONTR=0xBC;
  6. sfr ADC_DATA=0xBD;
  7. sfr ADC_LOW2=0xBE;
  8. sfr P1_ADC_EN=0x9D;
  9. sfr P4=0xC0;
  10. /*****************宏定义******************/
  11. #define uint unsigned int
  12. #define uchar unsigned char
  13. #define ADC_POWER 0x80
  14. #define ADC_FLAG 0x10
  15. #define ADC_START 0x08
  16. #define ADC_SPEEDHH 0x00
  17. #define ADC_SPEEDH 0x20
  18. #define ADC_SPEEDL 0x40
  19. #define ADC_SPEEDLL 0x60
  20. #define uint unsigned int
  21. #define uchar unsigned char
  22. uint ad_value,NH4_value;
  23. float AN_value;
  24. /***********位操作端口定义**************/
  25. sbit set_key=P1^4;          //“设置”键 K1
  26. sbit add_key=P1^5;           //“加”键 K2
  27. sbit cut_key=P1^7;           //  “减”键 K3
  28. sbit speak=P3^7;          //   蜂鸣器
  29. sbit JK=P3^6;                 //           继电器
  30. sbit qian_wei=P1^0;
  31. sbit bai_wei=P1^1;
  32. sbit shi_wei=P1^2;
  33. sbit ge_wei=P1^3;
  34. uchar y_data[4];   //储存烟雾的数据
  35. int set_data=50;   //报警初始值的设定
  36. uchar temp[4]={0,0,0,0};
  37. uchar bianma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  38. uchar flog4;
  39. void delay_1ms(uchar i)
  40. {
  41.           uint x,y;
  42.         for(x=i;x>0;x--)
  43.                 for(y=124;y>0;y--);
  44. }

  45. void display()
  46. {
  47.         qian_wei=0;
  48.         bai_wei=1;
  49.         shi_wei=1;
  50.         ge_wei=1;
  51.         P2=bianma[y_data[0]];
  52.         delay_1ms(5);
  53.         qian_wei=1;
  54.         bai_wei=0;
  55.         shi_wei=1;
  56.         ge_wei=1;
  57.         P2=bianma[y_data[1]];
  58.         delay_1ms(5);
  59.         P2=0xff;
  60.         qian_wei=1;
  61.         bai_wei=1;
  62.         shi_wei=0;
  63.         ge_wei=1;
  64.         P2=bianma[y_data[2]];
  65.         delay_1ms(5);
  66.         P2=0xff;
  67.         qian_wei=1;
  68.         bai_wei=1;
  69.         shi_wei=1;
  70.         ge_wei=0;
  71.         P2=bianma[y_data[3]];
  72.         delay_1ms(5);
  73.         P2=0xff;
  74. }
  75. void display2()
  76. {
  77.         temp[0]=set_data/1000;                  
  78.         temp[1]=(set_data%1000)/100;
  79.         temp[2]=(set_data%100)/10;
  80.         temp[3]=set_data%10;
  81.         qian_wei=0;
  82.         bai_wei=1;
  83.         shi_wei=1;
  84.         ge_wei=1;
  85.         P2=bianma[temp[0]];
  86.         delay_1ms(5);
  87.         P2=0xff;
  88.         qian_wei=1;
  89.         bai_wei=0;
  90.         shi_wei=1;
  91.         ge_wei=1;
  92.         P2=bianma[temp[1]];
  93.         delay_1ms(5);
  94.         P2=0xff;
  95.         qian_wei=1;
  96.         bai_wei=1 ;
  97.         shi_wei=0;
  98.         ge_wei=1;
  99.         P2=bianma[temp[2]];
  100.         delay_1ms(5);
  101.         P2=0xff;
  102.         qian_wei=1;
  103.         bai_wei=1;
  104.         shi_wei=1;
  105.         ge_wei=0;
  106.         P2=bianma[temp[3]];
  107.         delay_1ms(5);
  108.         P2=0xff;
  109. }

  110. /********** 模数转换初始换函数******************/
  111. void init_ADC()
  112. {
  113.         P1_ADC_EN=0x40;
  114.         ADC_DATA=0;
  115.         ADC_LOW2=0;
  116.         ADC_CONTR=ADC_SPEEDLL|ADC_POWER;
  117.         delay_1ms(20);
  118. }
  119. /********** 模数转换函数******************/
  120. uint  ADC(uchar num)  //参数num用于指定是哪个模拟量转换
  121. {
  122.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|num|ADC_START;
  123.         _nop_();_nop_();_nop_();_nop_();
  124.         while(!(ADC_CONTR&ADC_FLAG));

  125.         ADC_CONTR&=~ADC_FLAG;
  126.         ad_value=ADC_DATA*4+ADC_LOW2;    //转换的结果是十位的 高八位放在ADC_DATA中 低两位放在ADC_LOW2
  127.         return ad_value;                                 //        将转换后的数字量返回
  128. }
  129. /********** 模数转换后数据处理函数******************/
  130. void pos_AD()
  131. {
  132.         AN_value=ADC(6); //          装换氨气的浓度 把转换后的数字量结果赋给AN_value
  133.         delay_1ms(5);
  134. //        /***对转换后的数字量进行矫正***/
  135.         if(AN_value>900)
  136.         {
  137.                 AN_value=900;
  138.         }
  139.         NH4_value=(900-AN_value)*0.9765625;
  140.         y_data[0]=NH4_value/1000;                   //将气体浓度值的个位 十位 百位 千位 分开  用于显示
  141.         y_data[1]=(NH4_value%1000)/100;
  142.         y_data[2]=(NH4_value%100)/10;
  143.         y_data[3]=NH4_value%10;
  144. }
  145. /********** 报警处理函数******************/
  146. void baojing()
  147. {
  148.           if(set_data<NH4_value) //判断是否有报警 如果有就进入函数
  149.           {
  150.                         speak=0;
  151.                         JK=0;
  152.           }
  153.           else                   //没有报警情况的出现
  154.           {   
  155.                  speak=1;                                 
  156.                  JK=1;                       
  157.           }          
  158. }
  159. /**********主函数******************/
  160. void main()
  161. {       
  162.         init_ADC();           //模数转换初始化
  163.         speak=1;                                 
  164.         JK=1;
  165.         while(1)
  166.         {
  167.                 if(set_key==0)
  168.          {
  169.                  delay_1ms(5);
  170.                 if(set_key==0)
  171.                 {                 
  172.                         flog4=!flog4;
  173.                         while(set_key==0);
  174.                 }
  175.         }
  176.         if(flog4==1)
  177.         {
  178.                  if(add_key==0)
  179.                         {
  180.                          delay_1ms(5);
  181.                          if(add_key==0)
  182.                          {
  183.                                  set_data=set_data+1;
  184.                                 while(add_key==0);
  185.                                 if(set_data>5000)
  186.                                         {
  187.                                                 set_data=5000;
  188.                                         }
  189.                          }
  190.                         }
  191.                         if(cut_key==0)
  192.                         {
  193.                          delay_1ms(5);
  194.                          if(cut_key==0)
  195.                          {
  196.                                  set_data=set_data-1;
  197.                                 while(cut_key==0);
  198.                                 if(set_data<=0)
  199.                                 {
  200.                                         set_data=0;
  201.                                 }
  202.                          }
  203.                         }
  204.                           display2();
  205.                   }
  206.                 else
  207.                 {
  208.                     pos_AD();
  209.                         display();
  210.                         baojing();
  211.                 }
  212.                 }                         

  213. }
复制代码


原理图.pdf

153.37 KB, 下载次数: 40, 下载积分: 黑币 -5

原理图

烟雾报警器.rar

1.56 KB, 下载次数: 34, 下载积分: 黑币 -5

源码

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

使用道具 举报

沙发
ID:520134 发表于 2019-4-24 03:44 来自触屏版 | 只看该作者
学习了啊是不是
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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