欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5725|回復(fù): 6
收起左側(cè)

基于51單片機(jī)的溫度和可燃?xì)怏w探測的仿真模型+源碼

  [復(fù)制鏈接]
ID:380262 發(fā)表于 2018-10-22 21:59 | 顯示全部樓層 |閱讀模式
    本系統(tǒng)主要實(shí)現(xiàn)的功能為:溫度采集電路實(shí)時(shí)采集環(huán)境中的溫度,氣體監(jiān)測電路實(shí)時(shí)監(jiān)測環(huán)境中的可燃?xì)怏w(如甲烷、丙烷等),監(jiān)測到的溫度數(shù)據(jù)和可燃?xì)怏w數(shù)據(jù)通過相應(yīng)的傳感器轉(zhuǎn)換為模擬電信號送到AD轉(zhuǎn)換器中,AD轉(zhuǎn)換器將模擬信號轉(zhuǎn)換為數(shù)字信號送到MCU中進(jìn)行處理,MCU根據(jù)AD轉(zhuǎn)換器送來的數(shù)字信號計(jì)算出溫度值和有害氣體濃度等級并送到顯示模塊進(jìn)行顯示,當(dāng)溫度值超過設(shè)定值時(shí),風(fēng)扇電路啟動(dòng)風(fēng)扇工作,當(dāng)可燃?xì)怏w濃度超過設(shè)定等級時(shí),報(bào)警電路啟動(dòng)蜂鳴器報(bào)警。

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

單片機(jī)源程序如下:
  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);  //設(shè)置數(shù)據(jù)指針起點(diǎn)為第二行
  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;                //開風(fēng)扇
  53.                 }               
  54.                 else
  55.                 {
  56.                         MOTOR_CS=1;                //關(guān)風(fēng)扇       
  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位數(shù)據(jù)端口、兩行顯示、5x7點(diǎn)陣字符
  119.         LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
  120.         LcdWriteCom(0x06);  //寫一個(gè)指針加1
  121.         LcdWriteCom(0x01);  //清屏
  122.         LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)為第一行第一個(gè)字符
  123. }


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

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

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

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

  155.         LCD1602_E = 1;   //寫入時(shí)序
  156.         Delay1ms(5);   //保持時(shí)間
  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個(gè)脈沖下沉之前DI端應(yīng)輸入2位數(shù)據(jù)用于選擇通道功能
  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. }
復(fù)制代碼

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


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:399521 發(fā)表于 2018-10-24 11:49 | 顯示全部樓層
很棒,感謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:462149 發(fā)表于 2019-1-4 21:30 | 顯示全部樓層
很好用, 謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:253493 發(fā)表于 2019-2-27 15:06 | 顯示全部樓層
按鍵怎么沒有了
回復(fù)

使用道具 舉報(bào)

ID:405625 發(fā)表于 2019-3-24 20:44 | 顯示全部樓層
可以用,感謝分享
回復(fù)

使用道具 舉報(bào)

ID:405625 發(fā)表于 2019-3-24 20:46 | 顯示全部樓層
建議用一些帶AD收集的芯片,省很多事
回復(fù)

使用道具 舉報(bào)

ID:754005 發(fā)表于 2020-5-17 14:57 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表