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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1668|回復: 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

源碼

回復

使用道具 舉報

ID:520134 發表于 2019-4-24 03:44 來自觸屏版 | 顯示全部樓層
學習了啊是不是
回復

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品毛片一区二区在线看 | 男女啪啪高潮无遮挡免费动态 | 国产不卡在线观看 | 国产一区二区三区色淫影院 | 伊人久操| 在线视频 亚洲 | 日韩成人免费在线视频 | 欧美日韩高清一区 | 国产一区不卡在线观看 | 亚洲欧美日韩精品久久亚洲区 | 欧美一区二区三区 | 欧洲一区二区三区 | 久久久久国产精品人 | 日韩欧美视频网站 | 久久av影院 | 91精品国产欧美一区二区 | 欧美激情精品久久久久久变态 | 欧美日韩亚洲国产 | 精品自拍视频 | 日日天天 | 91国在线观看 | 精品国产欧美日韩不卡在线观看 | 在线视频成人 | 亚洲成av人片在线观看 | 免费在线性爱视频 | 欧美一级大片免费观看 | 精品视频国产 | 国产精品亚洲一区二区三区在线观看 | 国产精品久久久久久久久久久久 | 亚洲视频www | 国产高清性xxxxxxxx | 农夫在线精品视频免费观看 | 亚洲精品在线视频 | 日韩和的一区二区 | 精品日本久久久久久久久久 | 国产精品爱久久久久久久 | 国产在线a视频 | 亚洲精品一区在线观看 | 国产精品亚洲成在人线 | 日本高清不卡视频 | 国产精品永久 |