找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机一氧化碳报警器程序+PCB文件设计

[复制链接]
跳转到指定楼层
楼主
Altium Designer画的一氧化碳报警器原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. /*头文件*/
  2. #include<reg52.h>
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define yh 0x80 //LCD第一行的初始位置
  7. #define er 0x80+0x40 //LCD第二行初始位置
  8. sbit set_key=P1^2;          //“设置”键 K1
  9. sbit add_key=P1^3;           //“加”键 K2
  10. sbit cut_key=P1^4;           //  “减”键 K3
  11. sbit rs=P1^0;          
  12. sbit en=P1^1;                 
  13. sbit speak=P3^7;           //   蜂鸣器
  14. sbit led1=P3^6;                        //        温度led

  15. sbit CS=P2^0;
  16. sbit CLK=P2^2;
  17. sbit DO=P2^3;

  18. sbit DI=P2^4;//数据输入

  19. uchar flog4,temp,a;
  20. uchar code tab1[]={"BrAC:   PPM"}; //测量值显示的固定字符
  21. uchar code tab2[]={"setD:   PPM"};//报警值显示的固定字符
  22. uint set_D=24;        //报警初始值的设定
  23. uchar XX[3]={0,0,0};
  24. uchar MQ_data[3];
  25. uchar temp,i;
  26. uint MQ,MQ1;
  27. void delay_1ms(uint xms)//延时函数,有参函数
  28. {
  29.         uint x,y;
  30.         for(x=xms;x>0;x--)
  31.          for(y=124;y>0;y--);
  32. }
  33. //****液晶写入指令函数****//
  34. void write_1602com(uchar com)

  35. {                                               
  36.         rs=0;//数据/指令选择置为指令
  37.         P0=com;//送入数据
  38.         delay_1ms(12);
  39.         en=1;//拉高使能端,为制造有效的下降沿做准备
  40.         delay_1ms(12);
  41.         en=0;//en由高变低,产生下降沿,液晶执行命令
  42. }
  43. //***液晶写入数据函数****//
  44. void write_1602dat(uchar dat)
  45. {
  46.         rs=1;//数据/指令选择置为数据
  47.         P0=dat;//送入数据
  48.         delay_1ms(12);
  49.         en=1; //en置高电平,为制造下降沿做准备
  50.         delay_1ms(12);
  51.         en=0; //en由高变低,产生下降沿,液晶执行命令
  52. }
  53. //***液晶初始化函数****//
  54. void lcd_init()
  55. {
  56.         write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  57.         write_1602com(0x0c);//开显示不显示光标
  58.         write_1602com(0x06);//整屏不移动,光标自动右移
  59.         write_1602com(0x01);//清显示

  60.         write_1602com(yh+0);//显示固定符号从第一行第1个位置之后开始显示
  61.         for(a=0;a<11;a++)
  62.         {
  63.          write_1602dat(tab1[a]);//向液晶屏写显示的固定符号部分
  64.         }
  65.         write_1602com(er+0);//         显示第二行固定符号
  66.         for(a=0;a<11;a++)
  67.         {
  68.         write_1602dat(tab2[a]);//
  69.         }
  70. }
  71. void pros_data()
  72. {
  73.         XX[0]=set_D/100;
  74.         XX[1]=set_D%100/10;
  75.         XX[2]=set_D%10;
  76.         write_1602com(er+5);
  77.         for(a=0;a<3;a++)
  78.         {  
  79.           write_1602dat(XX[a]+0x30);
  80.         }
  81. }


  82. void startADC()
  83. {
  84. CS=1;
  85. _nop_();
  86. _nop_();
  87. CLK=0;
  88. _nop_();
  89. _nop_();
  90. CS=0;
  91. _nop_();
  92. _nop_();
  93. DI=1;
  94. _nop_();
  95. _nop_();
  96. CLK=1;
  97. _nop_();
  98. _nop_();
  99. DI=0;
  100. _nop_();
  101. _nop_();
  102. CLK=0;
  103. _nop_();
  104. _nop_();
  105. }
  106. void choiceADC(uint CH)//CH为0选择通道ch0,为1,选择ch1进行AD转换
  107. {
  108. startADC();
  109. if(CH==0)
  110. {
  111. DI=1;
  112. _nop_();
  113. CLK=1;//上升沿DI=1
  114. _nop_();
  115. CLK=0;//1个下降沿DI=1
  116. _nop_();
  117. DI=0;
  118. _nop_();
  119. CLK=1;
  120. _nop_();
  121. CLK=0;//第3个上升沿DI=0
  122. _nop_();
  123. }
  124. else
  125. {
  126. CLK=0;
  127. _nop_();
  128. DI=1;
  129. _nop_();
  130. CLK=1;//上升沿DI=1
  131. _nop_();
  132. CLK=0;//1个下降沿DI=1
  133. _nop_();
  134. DI=1;
  135. _nop_();
  136. CLK=1;//第3个上升沿DI=0
  137. _nop_();
  138. }
  139. /********通道选择结束开始读取转换后的二进制数****/
  140. CLK=1;
  141. _nop_();
  142. CLK=0;//下降沿读数,一下进行判断和处理,共8次
  143. for(i=0;i<8;i++)
  144.       {
  145.    DI=1;
  146.    if(DO)
  147.       {
  148.    temp|=0x01;
  149.    }
  150.     else
  151.       {
  152.    temp&=0xfe;
  153.    }
  154.       CLK=0;
  155.    _nop_();
  156.    CLK=1;
  157.    temp=temp<<1;
  158.    }
  159.    MQ=temp;
  160. }

  161. /********** 报警处理函数******************/
  162. void baojing()
  163. {
  164.           if(MQ1>set_D)//判断是否有报警 如果有就进入函数 然后再判断具体是哪个值报警
  165.           {
  166.                    speak=0;       
  167.                         led1=0;
  168.         }       
  169.         else
  170.         {
  171.                 led1=1;
  172.                 speak=1;
  173.         }
  174. }               
  175. /**********显示函数******************/
  176. void display1()            //设置报警值显示
  177. {
  178.   pros_data();
  179. }
  180. void display2()                        //测量显示
  181. {
  182.         choiceADC(0);
  183.     delay_1ms(1);
  184.         if(MQ>210)
  185.         {
  186.                 MQ=210;
  187.         }
  188.         MQ1=(210-MQ)*0.9765625;
  189.         MQ_data[0]=MQ1/100;
  190.         MQ_data[1]=MQ1%100/10;
  191.         MQ_data[2]=MQ1%10;
  192.         write_1602com(yh+5);
  193.         for(a=0;a<3;a++)
  194.         {
  195.           write_1602dat(MQ_data[a]+0x30);
  196.         }
  197. }

  198. /**********主函数******************/
  199. void main()
  200. {       
  201.         led1=1;
  202.         speak=1;
  203.         lcd_init();
  204.         display1();  
  205.         while(1)
  206.         {
  207.                 if(set_key==0)   
  208.                  {
  209.                          delay_1ms(5);
  210.                         if(set_key==0)
  211.                         {                 
  212.                                 flog4=!flog4;
  213.                                 while(set_key==0);
  214.                         }
  215.                 }
  216.                 if(flog4==1)     
  217.                 {
  218.                          if(add_key==0)
  219.                                 {
  220.                                  delay_1ms(5);
  221.                                  if(add_key==0)
  222.                                  {
  223.                                          set_D=set_D+1;
  224.                                         while(add_key==0);
  225. ……………………

  226. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
一氧化碳报警器.rar (9.46 MB, 下载次数: 89)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:445280 发表于 2020-2-13 16:43 | 只看该作者
你这个为什么测出来的浓度值是100多ppm这么大的? 是不是ad那有问题呀?
回复

使用道具 举报

板凳
ID:742448 发表于 2020-6-11 17:34 | 只看该作者
终于找到了 参考参考 没有一点点的头绪
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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