久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9248|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产乱码久久久久久蜜柚 | 天天射天天干 | 热久久免费视频 | 国产在线1 | 五月天婷婷综合 | 啪一啪在线视频 | 精品国产99| 欧美一二三四成人免费视频 | 日韩久久久久久 | 成人久久久久 | 欧美一区二区三区在线播放 | 夜夜干夜夜操 | 国产精品亚洲精品日韩已方 | 久久久久综合 | 欧美日韩中文在线 | 国产一级淫片免费视频 | 亚洲激情网站 | 亚洲精品一区二区在线观看 | 97av视频在线 | 中文字幕视频网 | 自拍偷拍亚洲欧美 | 国产欧美一区二区三区久久手机版 | 国产网站在线播放 | 亚洲精品一区中文字幕 | 国产一区91精品张津瑜 | 在线免费av电影 | 亚洲天天干 | 国产精品视频yy9299一区 | 欧美一级在线免费观看 | 国产精品国产成人国产三级 | 久久久tv| 成人在线中文 | 激情五月激情综合网 | 九九亚洲精品 | 精品免费视频 | 亚洲精品国产成人 | 91色视频在线观看 | 国产一区二区在线播放 | 欧美福利久久 | 福利精品| 亚洲人在线播放 |