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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9162|回復: 1
打印 上一主題 下一主題
收起左側

單片機+酒精傳感器檢測實驗源碼+電路原理詳解

[復制鏈接]
跳轉到指定樓層
樓主
ID:418816 發表于 2018-10-31 22:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
實驗1 酒精傳感器實驗
1.實驗目的
學習酒精檢測傳感器MQ-3的使用方法;
2.實驗設備
硬件:酒精傳感器節點,串口線;
軟件:Keil u Vision4編譯軟件,STC下載軟件STC_ISP;
芯片手冊:配套光盤\附件\芯片手冊\酒精檢測傳感器
電路原理圖路徑:配套光盤\附件\電路原理圖;
源碼路徑:配套光盤\源代碼\傳感器原理與應用\實驗1 酒精傳感器實驗-V20161122
hex文件路徑:配套光盤\源代碼\傳感器原理與應用\實驗1 酒精傳感器實驗-V20161122\out
3.實驗原理
3.1MQ-3的介紹
  MQ-3氣體傳感器所使用的氣敏材料是在清潔空氣中電導率較低的二氧化錫(SnO2)。當傳感器所處環境中存在酒精蒸汽時,傳感器的電導率隨空氣中酒精氣體濃度的增加而增大。使用簡單的電路即可將電導率的變化轉換為與該氣體濃度相對應的輸出信號。
MQ-3氣體傳感器對酒精的靈敏度高,可以抵抗汽油、煙霧、水蒸氣的干擾。這種傳感器可檢測多種濃度酒精氣氛,是一款適合多種應用的低成本傳感器。
元器件結構外形如圖3.1:

圖3.1  酒精傳感器形型
圖3.2  酒精傳感器基本測試電路

基本測試回路,圖3.2是酒精傳感器的基本測試電路。該傳感器需要施加2個電壓:加熱器電壓(VH)和測試電壓(VC)。其中 VH用于為傳感器提供特定的工作溫度。VC 則是用于測定與傳感器串聯的負載電阻(RL)上的電壓(VRL)。這種傳感器具有輕微的極性,VC需用直流電源。在滿足傳感器電性能要求的前提下,VC和VH可以共用同一個電源電路。為更好利用傳感器的 性能,需要選擇恰當的RL值。酒精傳感器的技術指標如表1。
表1  酒精傳感器技術指
產品型號
MQ-3
產品類型
半導體氣敏元件
標準封裝
膠木(黑膠木)
檢測氣體
酒精蒸汽
檢測濃度
0.04-4mg/L酒精
標準電路條件
回路電壓
Vc
≤24V DC
加熱電壓
VH
5.0V±0.2V ACorDC
負載電阻
RL
可調
標準測試條件下氣敏元件特性
加熱電阻
RH
31Ω±3Ω(室溫)
加熱功耗
PH
≤900mW
敏感體表面電阻
Rs
2KΩ-20KΩ(in 0.4mg/L酒精)
靈敏度
S
Rs(in air)/Rs(0.4mg/L酒精)≥5
濃度斜率
α
≤0.6(R300ppm/R100ppm酒精)
標準測試條件
溫度、濕度
20℃±2℃;65%±5%RH
標準測試電路
Vc:5.0V±0.1V;
VH: 5.0V±0.1V
預熱時間
不少于48小時

酒精傳感器靈敏度特性圖3.3所示:
圖3.3  酒精傳感器靈敏度特性圖

3.2 MQ-3酒精傳感器的電路原理圖
MQ-3酒精傳感器的電路原理如圖3.4所示:
圖3.4  酒精傳感器電路
其中U1(MQ-3)的PIN5與PIN2為加熱端,對應測試回路的H端;PIN1、PIN3、PIN4、PIN6為檢測回路;MQ-3傳感器的供電電壓Vc和加熱電壓Vh都為5V,負載電阻R1為1K歐姆。從技術指標表中可知,在0.4mg/L酒精中,傳感器電阻Rs為2K~20K,取Rs = 12K。假設檢測到酒精濃度為10mg/L時報警,由靈敏度特性曲線可知靈敏度為0.12,MQ3電阻值為12K * 0.12 = 1.44K(Rs / Ro = 靈敏度,其中Ro為傳感器在0.4mg/L酒精時的電阻值),ADC1(P1.1) = 5V * 1K / (1K + 1.44K) = 2.00V,AD讀數為2.00 / 3.3 * 1024 = 620,當AD采集的數值大于620時表明檢測到酒精。
4.實驗步驟
4.1 編寫實驗源代碼文件
4.1.1 取酒精傳感器節點,打開Keil集成開發環境,打開配套光盤\源代碼\傳感器原理與應用\實驗1 酒精傳感器實驗-V20161122的工程文件。
4.1.2點擊左上角的Rebuild按鍵,編譯整個工程,將生成jiujing.hex可執行文件,該可執行文件自動保存在配套光盤\源代碼\傳感器原理與應用\實驗1 酒精傳感器實驗-V20161122\out目錄下。(注意:請根據該目錄下 jiujing.hex 文件的生成時間,判斷該文件是否是自己剛剛編譯完成的。)
4.1.3 使用串口線將電腦與酒精傳感器節點的串口相連,將酒精傳感器節點上的S1開關撥打到左邊,讓STC單片機和DB9相連。
4.1.4 根據 配套光盤\第三方應用軟件\STC_ISP的STC-ISP軟件使用說明書-甄鵬-V20160423,使用STC-ISP軟件將4.1.2步中生成的可執行jiujing.hex文件通過STC_ISP串口下載軟件下載進STC單片機中。
4.2  實驗源代碼解析
  1. /**********************************************************/
  2. //晶振頻率:11.0592MHz
  3. //文件名  :Main.c
  4. //功能說明:酒精傳感器讀取實驗
  5. //制作    :www.frotech.com
  6. //技術支持:020-22883196 QQ:
  7. //變更記錄: 2016.11.22
  8. //變更內容: 新建造
  9. /**********************************************************/

  10. #include <STC12C5A60S2.h>


  11. #define                            BUF_LENTH              128                            //定義串口接收緩沖長度
  12. #define     uint unsigned int
  13. #define     uchar unsigned char
  14. unsigned char               uart1_wr;                            //寫指針
  15. unsigned char               uart1_rd;                            //讀指針
  16. unsigned char               xdata RX0_Buffer[BUF_LENTH];              //接收緩沖
  17. unsigned char flag;
  18. unsigned char i;
  19. unsigned char   xdata mbus_buffer[255];
  20. unsigned char   xdata mbus_Sendbuf[255];
  21. unsigned char   xdata Crc_buf[2];  //聲明存儲CRC校驗值的高8位及低8位的緩存
  22. unsigned int  Crc_return_data;  //聲明CRC校驗值
  23. bit                            B_TI; //發送完成標志
  24. sbit  P1_0 = P1^0;//定義P1.0端口
  25. //                                                                                                                7       6      5       4         3      2    1    0   Reset Value
  26. //sfr ADC_CONTR = 0xBC;                            ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000              //AD 轉換控制寄存器
  27. #define ADC_OFF()              ADC_CONTR = 0
  28. #define ADC_ON                            (1 << 7)
  29. #define ADC_90T                            (3 << 5)
  30. #define ADC_180T              (2 << 5)
  31. #define ADC_360T              (1 << 5)
  32. #define ADC_540T              0
  33. #define ADC_FLAG              (1 << 4)              //軟件清0
  34. #define ADC_START              (1 << 3)              //自動清0
  35. #define ADC_CH0                            0
  36. #define ADC_CH1                            1
  37. #define ADC_CH2                            2
  38. #define ADC_CH3                            3
  39. #define ADC_CH4                            4
  40. #define ADC_CH5                            5
  41. #define ADC_CH6                            6
  42. #define ADC_CH7                            7

  43. uint adc10_start(uchar channel);
  44. void              uart1_init(void);
  45. void Uart1_TxByte(unsigned char dat);
  46. void Uart1_String(unsigned char code *puts);
  47. void delay_ms(unsigned char ms);
  48. unsigned int cal_crc(unsigned char *snd, unsigned char num);
  49. /*************** 用戶定義參數 *****************************/

  50. #define MAIN_Fosc                            11059200UL            
  51. #define Baudrate0                            9600UL                           
  52.                                                                                                                              
  53. /**********************************************************/


  54. /****************** 編譯器自動生成,用戶請勿修改 ***********************/

  55. #define BRT_Reload                                          (256 - MAIN_Fosc / 16 / Baudrate0)                            //Calculate the timer1 reload value ar 1T mode


  56. /**********************************************************/

  57. //**********************************************************************
  58. //函數名:main(void)
  59. //輸入  :無
  60. //輸出  :無
  61. //功能描述:當單片機接收到酒精濃度讀取指令,采集酒精濃度,再向串口返回
  62. //酒精濃度的指令         
  63. //**********************************************************************
  64. void              main(void)
  65. {
  66.               uint              j;
  67.               uart1_init();//初始化串口
  68.               P1ASF = (1 << ADC_CH1);              //STC12C5A16S2系列模擬輸入(AD)選擇ADC1(P1.1)
  69.               ADC_CONTR = ADC_360T | ADC_ON;
  70.               while(1)
  71.               {
  72.                
  73.               if(flag==1)
  74.                                           {                            delay_ms(5);
  75.                                                                                                                                                                                                                                                      
  76.                                                                       if(RX0_Buffer[0x03] == 0x30)
  77.                                                                       {
  78.                                                                                   j = adc10_start(1);              //(P1.1)ADC1轉換
  79.                                                                                                      mbus_Sendbuf[3] = ((j>>8)&0xff);
  80.                                                                                                      mbus_Sendbuf[4] = j&0xff;
  81.                                                                                                      mbus_Sendbuf[2] = (((RX0_Buffer[0x04] * 16) + RX0_Buffer[0x05]) * 2);                                                                                                   
  82.                                                                                                      mbus_Sendbuf[0] = RX0_Buffer[0];
  83.                                                                                                      mbus_Sendbuf[1] = 0x03;
  84.                                                                                                       
  85.                                                                                                 
  86.                                                                                                      Crc_return_data=cal_crc(mbus_Sendbuf, 5);  //取得將要發送數據的CRC值
  87.                                                                                  Crc_buf[0]=((Crc_return_data >> 8)&0xff);  //取得CRC值的高8位
  88.                                                                                  Crc_buf[1]=(Crc_return_data & 0xff);   //取得CRC值的低8位
  89.                                                                                                      mbus_Sendbuf[5]=Crc_buf[1];  //CRC值低8位賦值給將要發送的數據的倒數第二個字節
  90.                                                                                                      mbus_Sendbuf[6]=Crc_buf[0];  //CRC值高8位賦值給將要發送的數據的最后一個
  91.                                                                                              for(i = 0; i < 7; i++)
  92.                                                                                                {            
  93.                                                                                                                         Uart1_TxByte(mbus_Sendbuf[i]);            
  94.                                                                                                }
  95.                                                                                                                 flag=0;                                            
  96.                                                                                                   uart1_wr=0;                             
  97.                                                                       }            
  98.                                             }
  99.               }
  100. }
  101. //**********************************************************************
  102. //函數名:adc10_start(uchar channel)
  103. //輸入  :ADC轉換的通道
  104. //輸出  :ADC值
  105. //功能描述:ADC轉換
  106. //**********************************************************************
  107. uint              adc10_start(uchar channel)              //channel = 0~7
  108. {
  109.               uint              adc;
  110.               uchar              i;

  111.               ADC_RES = 0;
  112.               ADC_RESL = 0;

  113.               ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
  114.               i = 250;
  115.               do{
  116.                             if(ADC_CONTR & ADC_FLAG)
  117.                             {
  118.                                           ADC_CONTR &= ~ADC_FLAG;
  119.                                           adc = (uint)ADC_RES;
  120.                                           adc = (adc << 2) | (ADC_RESL & 3);
  121.                                           return              adc;
  122.                             }
  123.               }while(--i);
  124.               return              1024;
  125. }
  126. /*****************************CRC校驗計算函數********************************/
  127. unsigned int cal_crc(unsigned char *snd, unsigned char num)

  128. {

  129.    unsigned char i, j;

  130.    unsigned int c,crc=0xFFFF;

  131.    for(i = 0; i < num; i ++)

  132.    {

  133.        c = snd[i] & 0x00FF;

  134.        crc ^= c;

  135.        for(j = 0;j < 8; j ++)

  136.        {

  137.            if (crc & 0x0001)

  138.            {

  139.                crc>>=1;

  140.                crc^=0xA001;

  141.            }

  142.            else crc>>=1;

  143.        }

  144.    }  

  145.    return(crc);
  146. }
  147. //**********************************************************************
  148. //函數名:uart1_init(void)
  149. //輸入  :無
  150. //輸出  :無
  151. //功能描述:串口初始化函數,通信參數為9600 8 N 1
  152. //**********************************************************************
  153. void              uart1_init(void)
  154. {
  155.               PCON |= 0x80;                            //UART0 Double Rate Enable
  156.               SCON = 0x50;                            //UART0 set as 10bit , UART0 RX enable
  157.               AUXR |=  0x01;                            //UART0 使用BRT
  158.               AUXR |=  0x04;                            //BRT set as 1T mode
  159.               BRT = BRT_Reload;
  160.               AUXR |=  0x10;                            //start BRT            

  161.               ES  = 1;
  162.               EA = 1;
  163. }
  164. //**********************************************************************
  165. //函數名:Uart1_TxByte(unsigned char dat)
  166. //輸入  :需要發送的字節數據
  167. //輸出  :無
  168. //功能描述:從串口發送單字節數據
  169. //**********************************************************************
  170. void Uart1_TxByte(unsigned char dat)
  171. {
  172.     B_TI = 0;
  173.               SBUF = dat;
  174.               while(!B_TI);
  175.               B_TI = 0;
  176. }
  177. //**********************************************************************
  178. //函數名:Uart1_String(unsigned char code *puts)
  179. //輸入  :字符串首地址
  180. //輸出  :無
  181. //功能描述:從串口發送字符串
  182. //**********************************************************************
  183. void Uart1_String(unsigned char code *puts)
  184. {
  185.     for(; *puts != 0; puts++)
  186.               {
  187.         Uart1_TxByte(*puts);

  188.               }
  189. }

  190. //**********************************************************************
  191. //函數名:UART1_RCV (void)
  192. //輸入  :無
  193. //輸出  :無
  194. //功能描述:串口中斷接收函數
  195. //**********************************************************************
  196. void UART1_RCV (void) interrupt 4
  197. {
  198.               if(RI)
  199.               {
  200.                             RI = 0;
  201.                             RX0_Buffer[uart1_wr++] = SBUF;
  202.                             //if(++uart0_wr >= BUF_LENTH)              uart0_wr = 0;
  203.                             flag = 1;
  204.               }

  205.               if(TI)
  206.               {
  207.                             TI = 0;
  208.                             B_TI = 1;
  209.               }
  210. }

  211. void delay_ms(unsigned char ms)
  212. {
  213.     unsigned int i;
  214.               do{
  215.                   i = MAIN_Fosc /1400;
  216.                             while(--i);
  217.               }while(--ms);
  218. }
復制代碼

4.3 實驗運行效果
節點S1開關撥打到左邊讓STC單片機和DB9連接,打開串口調試助手,進入如圖4.1所示界面,在串口參數設置選擇正確的端口號以及9600-8-N-1串口配置,選擇16進制發送,16進制接收,把酒精讀取指令01 03 00 30 00 01 84 05復制到發送區,打開串口,
點擊發送: 01 03 00 30 00 01 84 05
返回:01 03 02 00 04 B9 87
其中倒數三四字節00 04是酒精濃度的數值,嘗試使用酒精棉蘸取少量酒精接近接近酒精傳感器,觀察數這兩個字節的變化。
注意:不要把酒精灑在電路板或者傳感器上,免得腐蝕相關電路,把酒精輕輕靠近即可。
圖4.1

完整的Word格式文檔51黑下載地址:
實驗1 酒精傳感器實驗-V20161122.doc (445.5 KB, 下載次數: 42)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:500268 發表于 2019-3-30 22:33 | 只看該作者
請問你的hex文件怎么獲取
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品色 | 日韩欧美电影在线 | 国产精品视频在线免费观看 | 欧美日韩一区二区三区四区 | 国产成人综合在线 | 91在线视频精品 | 日韩福利电影 | 精品国产免费一区二区三区演员表 | 国产99久久久国产精品 | 国产真实精品久久二三区 | www.欧美视频| 国产精品欧美日韩 | 欧美成年黄网站色视频 | 97精品久久 | 五月天婷婷丁香 | 欧美三级三级三级爽爽爽 | 福利国产 | 亚洲欧美激情精品一区二区 | 欧美日韩国产免费 | 日韩一区二区三区四区五区六区 | 欧美在线视频a | 亚洲精品一区二区三区在线 | 成人免费视频 | 精品欧美一区二区三区久久久 | 99热热热热 | 亚洲国产福利视频 | 久久中文字幕一区 | 日本成人综合 | 久久久久国产一区二区三区 | 91文字幕巨乱亚洲香蕉 | 亚洲欧洲国产视频 | 一区二区久久精品 | 精品久久99 | 日韩久久久久久 | 久久高潮 | 日韩在线免费电影 | 国产伦一区二区三区视频 | 爱综合 | 成人在线播放网址 | 欧美性猛片aaaaaaa做受 | 国产精品3区 |