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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3008|回復: 2
收起左側

單片機酒精濃度檢測儀設計資料

[復制鏈接]
ID:339166 發表于 2018-5-27 16:38 | 顯示全部樓層 |閱讀模式
本設計基于STC12C5A16AD單片機設計的酒精氣體濃度探測儀,可用來檢測酒精氣體濃度,酒精氣體濃度測試儀在生產生活中有重要的應用,比如,在一些環境要求嚴格的生產車間,用這種酒精濃度探測儀,可隨時檢測車間內的酒精氣體濃度,當酒精氣體濃度高于允許限定值時,發出警報,提醒人們及時通風換氣,做到安全生產,此酒精測試儀經過再一步的改進可以使用到酒后駕駛測試上面去,利用該測試儀來告誡駕駛員請勿酒后駕駛。
在這次的設計中,利用了MQ-3型酒精的傳感器通過對空氣中的酒精濃度測試轉換成0~5V的模擬量電壓進行輸出,把這個0~5V的電壓傳送到STC12C5A16AD內部自帶的A/D轉換模塊中去,通過模擬量模塊的轉換輸出一個8位0~255的數據給單片機的P1口,再通過單片機進行一些軟件程序的處理顯示在LCD的液晶上面。

  1. #include "STC12c5A.h"
  2. #include "1602.h"
  3. #include "2402.h"

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

  6. //聲明常量
  7. #define ALCH       80       //醉駕標準80mg/L
  8. //K_MG_MV和K_ZERO為傳感器校準系數,要根據每個MQ-3模塊校準
  9. #define K_MG_MV    160/66  //傳感器靈敏度系數,每毫克/L對應的10毫伏數
  10. #define K_ZERO     0       //傳感器零點漂移,約130mV

  11. //定義按鍵
  12. sbit Key_Up = P3^6;
  13. sbit Key_Down = P3^7;

  14. //定義LED報警燈
  15. sbit Led_Warn1 = P3^4;
  16. sbit Led_Warn2 = P3^5;

  17. //定義乙醇傳感器TTL電平輸出引腳
  18. sbit DOUT = P1^4;

  19. //定義標識
  20. volatile bit FlagStartAL = 0;  //開始轉換標志
  21. volatile bit FlagKeyPress = 0; //有鍵彈起標志

  22. //全局變量定義
  23. uchar Threshold;                   //酒精濃度上限報警值
  24. uint  ALCounter;                //酒精轉換計時器
  25. uint   ALValue;                   //酒精測量值
  26. float ALtemp;                    //計算臨時變量

  27. uint keyvalue, keyUp, keyDown; //鍵值
  28. char * pSave;                  //EEPROM存盤用指針

  29. //函數聲明
  30. void Data_Init();
  31. void Timer0_Init();
  32. void Port_Init();
  33. void ADC_Init();
  34. uchar GetADVal();
  35. void KeyProcess(uint );

  36. //數據初始化
  37. void Data_Init()
  38. {
  39.    ALCounter = 0;
  40.    ALValue = 0;
  41.    Led_Warn1 = 1;
  42.    Led_Warn2 = 2;
  43.    keyvalue = 0;
  44.    keyUp = 1;
  45.    keyDown = 1;
  46. }

  47. //定時器0初始化,中斷時間約2毫秒
  48. //計算:晶振11.0592MHz,定時器時鐘11059200/12=921600,每毫秒922個脈沖
  49. //      16位定時器初值65536-1844=63692=0xf8cc
  50. void Timer0_Init()
  51. {
  52.         ET0 = 1;        //允許定時器0中斷
  53.         TMOD = 1;       //定時器工作方式選擇
  54.         TL0 = 0xcc;     //
  55.         TH0 = 0xf8;     //定時器賦予初值,大約為2毫秒中斷1次
  56.         TR0 = 1;        //啟動定時器
  57. }

  58. //定時器0中斷
  59. void Timer0_ISR (void) interrupt 1 using 0
  60. {
  61.         TL0 = 0xcc;
  62.         TH0 = 0xf8;     //定時器賦予初值

  63.         //每1秒鐘啟動一次AD轉換
  64.     ALCounter ++;
  65.     if (ALCounter >= 500)
  66.     {
  67.        FlagStartAL = 1;
  68.            ALCounter = 0;
  69.     }
  70. }

  71. void Port_Init()  //設定AD啟動;
  72. {
  73.    P1M0 = 0x80;     //10000000,P1.7作為AD輸入;
  74.    P1M1 = 0x80;     //
  75. }

  76. void ADC_Init()
  77. {
  78.    uint i;
  79.    P1ASF = 0x80;             //設P1.7為AD輸入
  80.    ADC_RES = 0;              //清先前的結果
  81.    ADC_CONTR|=0x80;                 //POWER=1,打開ADC電源
  82.    for(i=5000;i>0;i--) ; //延時
  83.    ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位
  84.    ADC_CONTR = ADC_CONTR&0xf8|0x07; //設置當前通道號為P1.7
  85.    for(i=2500;i>0;i--) ; //延時

  86. }

  87. //進行AD轉換,得到當前酒精值
  88. uchar GetADVal()
  89. {
  90.    uint i;
  91.    ADC_CONTR&=0xf7;
  92.    for(i=250;i>0;i--);         //待輸入電壓穩定后開始轉換
  93.    //ADC_RES = 0;
  94.    ADC_CONTR |= 0x08;          //ADC_Start=1, 啟動轉換
  95.    while((ADC_CONTR&0x10)==0); //等待轉換結束ADC_FLAG=1
  96.    ADC_CONTR&=0xe7;                   //清ADC_FLAG和ADC_START位,停止轉換
  97.    return ADC_RES;
  98. }

  99. //存入設定值
  100. void Save_Setting()
  101. {
  102.    pSave =  (char *)&Threshold;          //地址低位對應低8位,高位對應高8位
  103.    wrteeprom(0, *pSave);              //存醉酒閾值低8位
  104.    DELAY(300);
  105.    pSave ++;
  106.    wrteeprom(1, *pSave);              //存醉酒閾值高8位
  107.    DELAY(300);
  108. }

  109. //載入設定值
  110. void Load_Setting()
  111. {
  112.    pSave =  (char *)&Threshold;
  113.    *pSave++ = rdeeprom(0);
  114.    *pSave = rdeeprom(1);
  115.    if ((Threshold>=255)||(Threshold<0)) Threshold = 80;
  116. }

  117. //按鍵處理程序,參數為鍵值,1為Up鍵,2為Down鍵
  118. void KeyProcess(uint num)
  119. {
  120.    switch (num)
  121.    {
  122.       case 1:
  123.              if (Threshold<255) Threshold++;
  124.              break;
  125.           case 2:
  126.              if (Threshold>1) Threshold--;
  127.              break;
  128.           default:
  129.              break;
  130.    }
  131.    L1602_int(2,9,Threshold);
  132.    Save_Setting();
  133. }

  134. void main()
  135. {
  136.    uint i,j;

  137.    EA = 0;
  138.    Data_Init();     //數據初始化
  139.    Timer0_Init();   //定時器0初始化
  140.    Port_Init();     //端口初始化
  141.    ADC_Init();      //ADC初始化
  142.    EA = 1;
  143.    L1602_init();
  144.    L1602_string(1,1,"Welcome to ALCT! ");
  145.    L1602_string(2,1,"Lijiang Nbjsxy  ");
  146.    //L1602_string(2,1,"Designed by AAA  ");
  147.    //延時
  148.    for (i=0;i<1000;i++)
  149.       for (j=0;j<1000;j++)
  150.              {;}
  151.    //清屏
  152.    L1602_string(1,1,"                ");
  153.    L1602_string(2,1,"                ");
  154.    L1602_string(1,1,"Alcohol:    mg/L");
  155.    L1602_string(2,1,"Setting:    mg/L");
  156.    //載入設定值
  157.    Load_Setting();
  158.    L1602_int(2,9,Threshold);
  159.    while(1)
  160.    {
  161.       //如果FlagStartAL標志置位,則進行AD轉換
  162.           if (FlagStartAL == 1)
  163.           {
  164.              //酒精濃度換算,50mg/L=62.5ppm,傳感器靈敏度應事先校準
  165.          ALValue = 500 * GetADVal() / 256;        //8位ADC,首先得到電壓值,單位10毫伏
  166.              ALValue = ALValue - K_ZERO;              //首先減去零點漂移,一般是130mV
  167.                  if (ALValue < 0) ALValue = 0;                          
  168.                  ALValue = ALValue * K_MG_MV;             //將mV轉變成mg/L,K_MG_MV系數需要校準           
  169.          L1602_int(1,9,ALValue);
  170.                  if (ALValue > Threshold) Led_Warn1 = 0;  //超過閾值,則 Led_Warn1燈報警,否則報警燈滅。
  171.                  else Led_Warn1 = 1;
  172.                  FlagStartAL = 0;
  173.            }
  174.        //查詢乙醇傳感器TTL電平,該指示燈為傳感器模塊報警
  175.            if (DOUT == 0)  Led_Warn2 = 0;
  176.            else            Led_Warn2 = 1;
  177.            //鍵盤查詢,在彈起時響應
  178.            if ((Key_Up)&&(keyUp==0)) {FlagKeyPress = 1; keyvalue = 1;}
  179.        else if ((Key_Down)&&(keyDown==0)) {FlagKeyPress = 1; keyvalue = 2;}
  180.            if (FlagKeyPress == 1)
  181.            {
  182.           KeyProcess(keyvalue);
  183.           FlagKeyPress = 0;           
  184.            }
  185.        if (!Key_Up) keyUp = 0;
  186.            else keyUp = 1;
  187.        if (!Key_Down) keyDown = 0;
  188.            else keyDown = 1;
  189.            DELAY(100);
  190.    }
  191. }
復制代碼


回復

使用道具 舉報

ID:1102785 發表于 2023-12-7 01:34 | 顯示全部樓層
1602.h
回復

使用道具 舉報

ID:1121316 發表于 2024-5-18 20:07 | 顯示全部樓層
ALValue = 500 * GetADVal() / 256;        //8位ADC,首先得到電壓值,單位10毫伏
這個公式是什么意思是
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线欧美 | 一区二区三区视频在线免费观看 | 日本电影免费完整观看 | 一区二区三区国产精品 | 日韩精品区 | 殴美黄色录像 | 久久久www成人免费精品张筱雨 | 亚洲欧美中文日韩在线v日本 | 久久久精品黄色 | 欧美综合久久久 | 欧美精品久久久 | 三级成人在线观看 | 亚洲一区二区三区四区五区中文 | 久操国产| 91精品国产乱码久久久久久 | 亚洲精品久久久蜜桃 | 国产黑丝av | 日韩免费毛片 | 亚洲人成人一区二区在线观看 | 欧美国产亚洲一区二区 | 久久久久亚洲精品 | 99pao成人国产永久免费视频 | 日韩高清中文字幕 | 欧美精品一区二区三区在线播放 | 日韩欧美三级 | 国产在线观看一区二区三区 | 拍真实国产伦偷精品 | 国产激情一区二区三区 | 五月婷婷丁香 | 99国内精品久久久久久久 | 午夜激情免费 | 黄色大片免费网站 | 久久天堂网 | 久久综合香蕉 | 精品国产18久久久久久二百 | 天天色av | 一区二区三区国产精品 | hsck成人网 | 免费一区| 亚洲一区二区久久久 | 亚洲电影一区二区三区 |