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

標題: 基于51單片機的溫度和可燃氣體探測的仿真模型+源碼 [打印本頁]

作者: rodgersli    時間: 2018-10-22 21:59
標題: 基于51單片機的溫度和可燃氣體探測的仿真模型+源碼
    本系統主要實現的功能為:溫度采集電路實時采集環境中的溫度,氣體監測電路實時監測環境中的可燃氣體(如甲烷、丙烷等),監測到的溫度數據和可燃氣體數據通過相應的傳感器轉換為模擬電信號送到AD轉換器中,AD轉換器將模擬信號轉換為數字信號送到MCU中進行處理,MCU根據AD轉換器送來的數字信號計算出溫度值和有害氣體濃度等級并送到顯示模塊進行顯示,當溫度值超過設定值時,風扇電路啟動風扇工作,當可燃氣體濃度超過設定等級時,報警電路啟動蜂鳴器報警。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <math.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. #define LCD1602_IO P0
  7. #define GPIO_MOTOR P1

  8. sbit LCD1602_RS=P2^0;
  9. sbit LCD1602_RW=P2^1;
  10. sbit LCD1602_E=P2^2;

  11. sbit ADC0832_CS=P1^5;
  12. sbit ADC0832_CLK=P1^6;
  13. sbit ADC0832_DO=P1^7;      //將CS置高電平禁用芯片

  14. sbit MOTOR_CS=P2^3;
  15. sbit BUZZER_CS=P3^2;

  16. void Delay1ms(uint c);

  17. void LcdInit();
  18. void LcdWriteCom(uchar com);
  19. void LcdWriteData(uchar dat);
  20. uchar Get_AD_Result(bit channel);
  21. void  Motor_stepper();

  22. uchar line1[]={'C','H','0',' ','T','E','P',':',' ','0','0','.','0',' ',0xdf,'C'};
  23. uchar line2[]={'C','H','1',' ','L','E','V','E','L',':',' ','0',' ',' ',' ',' '};

  24.                                   
  25. void main(void)
  26. {
  27.         uint i;
  28.         double ADCdata,NTCr,t;
  29.         int t_temp;
  30.         bit channel;
  31.         LcdInit();
  32.         for(i=0;i<16;i++)
  33.         {
  34.                 LcdWriteData(line1[i]);       
  35.         }
  36.         LcdWriteCom(0x80|0x40);  //設置數據指針起點為第二行
  37.         for(i=0;i<16;i++)
  38.         {
  39.                 LcdWriteData(line2[i]);       
  40.         }
  41.         MOTOR_CS=1;
  42.         BUZZER_CS=0;
  43.         while(1)
  44.         {       
  45.                 channel = 0;
  46.                  ADCdata = Get_AD_Result(channel)*5.0/256;
  47.                 NTCr= 10*ADCdata/(5-ADCdata);
  48.                 t=1/(log(NTCr/10)/3900+1/(25+273.15))-273.15;        //B=3435
  49.                
  50.                 if(t>=25)
  51.                 {
  52.                         MOTOR_CS=0;                //開風扇
  53.                 }               
  54.                 else
  55.                 {
  56.                         MOTOR_CS=1;                //關風扇       
  57.                 }
  58.                
  59.                 if(t<0)
  60.                 {
  61.                         line1[8]='-';
  62.                         t=-t;
  63.                 }
  64.                 else
  65.                 {
  66.                          line1[8]=' ';
  67.                 }
  68.                                
  69.                 t_temp=t*10;
  70.                 line1[9]=t_temp/100+'0';
  71.                 line1[10]=t_temp/10%10+'0';
  72.                 line1[12]=t_temp%10+'0';

  73.           LcdWriteCom(0x80);
  74.                 for(i=0;i<16;i++)
  75.                 {
  76.                         LcdWriteData(line1[i]);       
  77.                 }

  78.                 channel = 1;
  79.                  ADCdata = Get_AD_Result(channel)*5.0/256;

  80.           if(ADCdata<=0.5)
  81.                         line2[11]='0';
  82.                 else if(ADCdata>0.5&&ADCdata<=1)       
  83.                         line2[11]='1';
  84.                 else if(ADCdata>1&&ADCdata<=2)       
  85.                         line2[11]='2';
  86.                 else if(ADCdata>2&&ADCdata<=3)       
  87.                         line2[11]='3';
  88.                 else if(ADCdata>3&&ADCdata<=4)       
  89.                         line2[11]='4';
  90.                 else       
  91.                         line2[11]='5';

  92.                 if(ADCdata>1)
  93.                         BUZZER_CS=1;
  94.                 else
  95.                         BUZZER_CS=0;

  96.           LcdWriteCom(0x80|0x40);
  97.                 for(i=0;i<16;i++)
  98.                 {
  99.                         LcdWriteData(line2[i]);       
  100.                 }

  101.         }       
  102.                        
  103. }


  104. void Delay1ms(uint c)   //誤差 0us
  105. {
  106.     uint a,b;
  107.         for (; c>0; c--)
  108.         {
  109.                  for (b=199;b>0;b--)
  110.                  {
  111.                           for(a=1;a>0;a--);
  112.                  }      
  113.         }
  114.            
  115. }

  116. void LcdInit()                                                  //LCD初始化子程序
  117. {
  118.         LcdWriteCom(0x38);  //開顯示,8位數據端口、兩行顯示、5x7點陣字符
  119.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  120.         LcdWriteCom(0x06);  //寫一個指針加1
  121.         LcdWriteCom(0x01);  //清屏
  122.         LcdWriteCom(0x80);  //設置數據指針起點為第一行第一個字符
  123. }


  124. /*******************************************************************************
  125. * 函 數 名         : LcdWriteCom
  126. * 函數功能                   : 向LCD寫入一個字節的命令
  127. * 輸    入         : com
  128. * 輸    出         : 無
  129. *******************************************************************************/
  130. void LcdWriteCom(uchar com)          //寫入命令
  131. {
  132.         LCD1602_E = 0;     //使能
  133.         LCD1602_RS = 0;           //選擇發送命令
  134.         LCD1602_RW = 0;           //選擇寫入
  135.        
  136.         LCD1602_IO = com;     //放入命令
  137.         Delay1ms(1);                //等待數據穩定

  138.         LCD1602_E = 1;                  //寫入時序
  139.         Delay1ms(5);          //保持時間
  140.         LCD1602_E = 0;
  141. }

  142. /*******************************************************************************
  143. * 函 數 名         : LcdWriteData
  144. * 函數功能                   : 向LCD寫入一個字節的數據
  145. * 輸    入         : dat
  146. * 輸    出         : 無
  147. *******************************************************************************/                             
  148. void LcdWriteData(uchar dat)                        //寫入數據
  149. {
  150.         LCD1602_E = 0;        //使能清零
  151.         LCD1602_RS = 1;        //選擇輸入數據
  152.         LCD1602_RW = 0;        //選擇寫入

  153.         LCD1602_IO = dat; //寫入數據
  154.         Delay1ms(1);

  155.         LCD1602_E = 1;   //寫入時序
  156.         Delay1ms(5);   //保持時間
  157.         LCD1602_E = 0;
  158. }

  159. uchar Get_AD_Result(bit channel)
  160. {
  161.         uchar i;
  162.         int data1=0x00,data2=0x00;
  163.         ADC0832_CLK=0;      //初始化
  164.         ADC0832_DO=1;
  165.         _nop_();
  166.         ADC0832_CS=0;
  167.         _nop_();
  168.         ADC0832_CLK=1;
  169.         _nop_();
  170.                                                 //在第2、3個脈沖下沉之前DI端應輸入2位數據用于選擇通道功能
  171.         ADC0832_CLK=0;             //通道第一位
  172.         ADC0832_DO=1;
  173.         _nop_();
  174.         ADC0832_CLK=1;
  175.         _nop_();
  176.         ADC0832_CLK=0;             //通道0的第二位
  177.         ADC0832_DO=channel;
  178.         _nop_();
  179.         ADC0832_CLK=1;
  180.         _nop_();
  181.          
  182.         ADC0832_CLK=0;
  183.         ADC0832_DO=1;
  184.         for(i=0;i<8;i++)     //讀取前8位的值 先高位后低位
  185.         {
  186.                  _nop_();
  187.                   data1<<=1;
  188.                   ADC0832_CLK=1;
  189.                   _nop_();
  190.                   ADC0832_CLK=0;
  191.                   if(ADC0832_DO)
  192.                            data1|=0x01;
  193.                   else
  194.                            data1|=0x00;
  195.          }

  196.         for(i=0;i<8;i++)     //讀取后8位的值 先低位后高位
  197.         {
  198.                   data2>>=1;
  199.                   if(ADC0832_DO)
  200.                            data2|=0x80;
  201.                   else
  202.                            data2|=0x00;
  203.                   _nop_();
  204.                   ADC0832_CLK=1;
  205.                   _nop_();
  206.                   ADC0832_CLK=0;
  207.         }

  208.         _nop_();
  209.         ADC0832_CS=1;              //將CS置高電平禁用芯片
  210.         ADC0832_DO=1;
  211.         ADC0832_CLK=1;
  212.         return (data1 == data2) ? data1:0;
  213. }
復制代碼

所有資料51hei提供下載:
信息采集與處理-溫度和可燃氣體濃度采集模型.rar (102.83 KB, 下載次數: 189)



作者: 51Crystal    時間: 2018-10-24 11:49
很棒,感謝樓主分享
作者: 2871899131    時間: 2019-1-4 21:30
很好用, 謝謝樓主分享
作者: 1183953327    時間: 2019-2-27 15:06
按鍵怎么沒有了
作者: joindp    時間: 2019-3-24 20:44
可以用,感謝分享
作者: joindp    時間: 2019-3-24 20:46
建議用一些帶AD收集的芯片,省很多事
作者: qwer123456qw    時間: 2020-5-17 14:57
感謝分享




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产视频第一页 | 成人免费在线视频 | 狠狠婷婷综合久久久久久妖精 | 一级在线免费观看 | 国产精品久久久久久福利一牛影视 | 一区二区电影 | 91亚洲国产成人久久精品网站 | 亚洲视频精品在线 | 日韩一区二区三区视频在线播放 | 午夜丁香视频在线观看 | 午夜精品一区二区三区免费视频 | 国产精品3区| 九九视频网 | 日韩精品在线一区 | 日韩日韩日韩日韩日韩日韩日韩 | 亚洲综合99 | 国产福利视频在线观看 | 午夜精品一区二区三区在线视频 | 亚洲一区成人 | 国产专区在线 | 黄色一级大片在线免费看产 | 亚洲国产精品一区二区第一页 | 波多野结衣一区二区 | 精品一区av| 日韩久久精品 | 精品91久久| 中文字幕乱码一区二区三区 | www久久99 | 国产精品三级 | 欧美二区在线 | 久久精品二区亚洲w码 | 成人在线中文字幕 | 亚洲性免费| 日韩在线一区二区三区 | 精品国产乱码久久久久久图片 | 夜夜草天天草 | 91精品国产色综合久久 | 黄色片免费看 | 亚洲精品成人网 | 亚洲男人天堂 | 91传媒在线播放 |