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

標題: 單片機酒精濃度測試儀,代碼,原理圖 [打印本頁]

作者: GDSTM32    時間: 2020-4-22 10:08
標題: 單片機酒精濃度測試儀,代碼,原理圖
文件共享,文件分享。

綜合項目,花了很久時間精細研究得到的成果,可以完美運行。
       酒精測試儀以STC12C5A60S2單片機作為主控芯片,采用高精度MQ-3乙醇氣體傳感器對空氣中的乙醇濃度進行檢測,主控芯片對檢測信號進行A/D轉換和處理(不需要外接A/D轉換,芯片自帶該功能,),最后通過LCD1602液晶顯示屏顯示出來。酒精濃度測試儀具有醉酒閾值設定功能,可以根用戶需要設定修改醉酒閾值。當檢測到的酒精濃度超過設定閥值時會發出聲光警報。
硬件電路十分簡單,方便學習。
代碼原理圖數據手冊見附件。


單片機源程序如下:
  1. #include "STC12C5A60S2.h"
  2. #include "intrins.h"

  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5.        
  6. sbit RS = P2^7;   
  7. sbit RW = P2^6;
  8. sbit EN = P2^5;
  9. sbit k0 = P3^3;
  10. sbit k1 = P3^4;
  11. sbit tm = P2^0;
  12. sbit in = P1^1;
  13. sbit led0= P1^5;
  14. sbit led1= P1^3;

  15. uchar shi=2,fen,miao;
  16. uchar num=0,n=0;
  17. uchar da1=0,add=0;
  18. double Data,c;
  19. char ac,bc,dc;
  20. char a[5]="";
  21. char b[4]="2.00";

  22. void key();
  23. void jian_ce();
  24. /************************************
  25.            延時函數
  26. *************************************/
  27. //一個機械周期
  28. void DelayUs2x(uchar t)
  29. {   
  30. while(--t);
  31. }
  32. //自定義延時,單位微秒us
  33. void DelayMs(uchar t)
  34. {     
  35.         while(t--)
  36.                 {     
  37.      DelayUs2x(245);
  38.      DelayUs2x(245);
  39.                 }
  40. }

  41. /************************************
  42.             判忙函數
  43. *************************************/
  44. bit LCD_Check_Busy(void)
  45. {
  46.                 P0= 0xFF;
  47.                 RS=0;
  48.                 RW=1;
  49.                 EN=0;
  50.                 _nop_();
  51.                 EN=1;
  52.                 return (bit)(P0 & 0x80);   
  53. }

  54. /************************************
  55.             寫指令函數
  56. *************************************/
  57. void LCD_Write_Com(uchar com)
  58. {  
  59.                 while(LCD_Check_Busy()); //忙則等待
  60.                 RS=0;
  61.                 RW=0;
  62.                 EN=1;
  63.                 P0= com;         
  64.                 _nop_();
  65.                 EN=0;
  66. }

  67. /************************************
  68.             寫數據函數
  69. *************************************/
  70. void LCD_Write_Data(uchar Data)
  71. {
  72.                 while(LCD_Check_Busy()); //忙則等待
  73.                 RS=1;
  74.                 RW=0;
  75.                 EN=1;
  76.                 P0= Data;
  77.                 _nop_();
  78.                 EN=0;
  79. }

  80. /************************************
  81.               清屏函數
  82. *************************************/
  83. void LCD_Clear(void)
  84. {
  85. LCD_Write_Com(0x01);
  86. DelayMs(5);
  87. }

  88. /************************************
  89.            寫字符串函數
  90. *************************************/
  91. void LCD_Write_String(uchar x,uchar y,uchar *s)
  92. {     
  93. if (y == 0)
  94.      {     
  95.      LCD_Write_Com(0x80 + x);      //表示第一行
  96.      }
  97. else
  98.      {      
  99.      LCD_Write_Com(0xC0 + x);      //表示第二行
  100.      }        
  101. while (*s)
  102.      {     
  103. LCD_Write_Data( *s);     
  104.                         s ++;     
  105.      }
  106. }

  107. /************************************
  108.            LCD初始化函數
  109. *************************************/
  110. void LCD_Init(void)
  111. {
  112.    LCD_Write_Com(0x38);   
  113.    DelayMs(5);
  114.    LCD_Write_Com(0x38);
  115.    DelayMs(5);
  116.    LCD_Write_Com(0x38);
  117.    DelayMs(5);
  118.    LCD_Write_Com(0x38);  
  119.    LCD_Write_Com(0x08);     
  120.    LCD_Write_Com(0x01);   
  121.    LCD_Write_Com(0x06);   
  122.    DelayMs(5);
  123.    LCD_Write_Com(0x0C);   
  124. }
  125.    
  126. /************************************
  127.               ADC函數
  128. *************************************/
  129. void InitADC()                         //初始AD寄存器
  130. {
  131.           P1ASF=0X00;      //P1.0腳作為模擬量輸入端
  132.                 ADC_RES=0X00;    //清除高8位緩沖數據
  133.                                                                                  //ADC_CONTR為ADC控制寄存器
  134.                 ADC_CONTR=0xF0;  //AD轉換控制寄存器
  135.                 _nop_();                                 //低三位 000 為P1.0口作為A/D輸入
  136.                 _nop_();
  137.                 _nop_();                                 //必須經過4個空操作延時后執行
  138.                 _nop_();
  139.                 ADC_CONTR=0xE8;  //1110.1000 第三位置一                                                                                                         
  140. }

  141. void timer0() interrupt 1    //定時器0
  142. {
  143.     TH0=(65536-20000)/256;      
  144.     TL0=(65536-20000)%256;      
  145.     InitADC();               
  146. }

  147. void adc_isr() interrupt 5   //ADC中斷   
  148. {   
  149.          da1=ADC_RES;              //獲取轉換結果
  150.          c=((double)da1/256)*5;    //取八位計算基準電壓      
  151.    
  152.    a[0]=((int)c%10+0x30);        //個位
  153.    a[1]='.';                     //小數點
  154.    a[2]=((int)(c*10)%10+0x30);   //十分位
  155.    a[3]=((int)(c*100)%10+0x30);  //百分位
  156.    a[4]='\0';                        
  157.          LCD_Write_String(8,0,a);                         //LCD顯示測量值
  158.    ADC_CONTR&=0xEF;              //標志位清零
  159.    num++;
  160.    if(num==252)num=0;       
  161. }

  162. /************************************
  163.            LCD顯示函數
  164. *************************************/
  165. void LCDXS()
  166. {
  167.     LCD_Init();
  168.     LCD_Clear();                     
  169.                 LCD_Write_String(0,0,"nong du:");
  170.                 LCD_Write_String(12,0,"mg/L");
  171.           LCD_Write_String(0,1,"fen jie:");       
  172.     LCD_Write_String(8,1,b);
  173.           LCD_Write_String(12,1,"mg/L");
  174. }

  175. /************************************
  176.            中斷初始化函數
  177. *************************************/
  178. void Init_zd()
  179. {
  180.     TH0=(65536-20000)/256;           
  181.     TL0=(65536-20000)%256;
  182.                 IE=0xA2; //打開EA(總中斷)
  183.                    //EADC(ADC中斷允許位)
  184.                                                  //ET0(定時器0中斷允許位)
  185.     TR0=1;
  186. }




  187. /************************************
  188.              按鍵控制
  189. *************************************/
  190. void key()
  191. {         
  192.          if(!k0)//按鍵選位
  193.          {
  194.            DelayMs(30);
  195.                  if(!k0)
  196.                  {add++;       
  197.                         while(!k0);       
  198.                         switch (add)
  199.                                 {
  200.                                 case 1:        EA=0;n=1;DelayMs(5);
  201.                                                                 LCD_Write_Com(0xc0+8);
  202.                                                                 LCD_Write_Com(0x0f);                                                               
  203.                                                                 break;
  204.                                        
  205.                                 case 2:        LCD_Write_Com(0xc0+10);                                                                                               
  206.                                                                 break;
  207.                                        
  208.                                 case 3:        LCD_Write_Com(0xc0+11);                                                                                                       
  209.                                                                 break;
  210.                                        
  211.                                 case 4:        LCD_Write_Com(0x0c);                                                               
  212.                                                                 add=0;DelayMs(5);n=0;EA=1;
  213.                                                                 break;               
  214.                                 } //switch(add)
  215.                         }
  216.          }//if(!k0);

  217. if(add!=0)//按鍵加
  218. {       
  219.         switch (add)
  220.                 {
  221.                 case 1:if(!k1)
  222.                                                 {
  223.                                                  DelayMs(30);
  224.                                                  if(!k1)
  225.                                                  {shi++;
  226.                                                         while(!k1);
  227.                                                         if(shi==5)shi=0;                                                                                                                                                  
  228.                                                  }
  229.                                                 }       
  230.                                                 LCD_Write_Com(0xc0+8);
  231.                                                 LCD_Write_Data(0x30+shi);
  232.                                                 LCD_Write_Com(0xc0+8);
  233.                                     break;

  234.                 case 2:if(!k1)
  235.                                                 {
  236.                                                  DelayMs(30);
  237.                                                  if(!k1)
  238.                                                  {fen++;
  239.                                                         while(!k1);                                                       
  240.                                                         if(fen==10)fen=0;                                                                                                                                                  
  241.                                                  }
  242.                                                 }
  243.                                                 LCD_Write_Com(0xc0+10);
  244.                                                 LCD_Write_Data(0x30+fen);
  245.                                                 LCD_Write_Com(0xc0+10);
  246.                                     break;


  247.                 case 3:if(!k1)
  248.                                                 {
  249.                                                  DelayMs(30);
  250.                                                  if(!k1)
  251.                                                  {miao++;
  252.                                                         while(!k1);                                                       
  253.                                                         if(miao==10)miao=0;                                                                                                                                                  
  254.                                                  }
  255.                                                 }       
  256.                                                 LCD_Write_Com(0xc0+11);
  257.                                                 LCD_Write_Data(0x30+miao);
  258.                                                 LCD_Write_Com(0xc0+11);
  259.                                     break;       
  260.                  }//switch()
  261. }//if(add!=0)         
  262. }//key()


  263. /************************************
  264.              主函數
  265. *************************************/
  266. void main()
  267. {
  268.                 LCDXS();       
  269.     DelayMs(255);       
  270.           Init_zd();       
  271.                
  272.     while(1)
  273.                 {       
  274.                         ac=(int)c%10;
  275. ……………………

  276. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
酒精測試儀—程序.rar (43.71 KB, 下載次數: 57)
AD原理圖.rar (15.72 KB, 下載次數: 36)






歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: www.国产精品| 免费成人av网站 | 亚洲午夜视频在线观看 | 亚洲一区二区高清 | 亚洲国产中文字幕 | 日韩不卡一二区 | 精品美女视频在线观看免费软件 | 国产精品99久久久久久人 | 日韩在线小视频 | 国产传媒在线播放 | 伊人精品视频 | 精品在线一区二区 | av一级久久 | 久久精品男人的天堂 | 欧美精品乱码久久久久久按摩 | 欧美成人精品欧美一级 | 伊人看片 | 一级黄色录像毛片 | 久久久高清 | 五月天激情综合网 | 成年网站在线观看 | 精品久久久久久亚洲精品 | 色网站在线免费观看 | 久久国产精品视频免费看 | www.日韩| 亚洲一区综合 | 精品国产欧美一区二区三区不卡 | 精品国产一区二区国模嫣然 | av香蕉| 成人高清视频在线观看 | 日韩成人国产 | 欧美亚洲成人网 | 国产午夜精品一区二区三区嫩草 | 欧美视频一级 | 黑人巨大精品欧美一区二区免费 | 羞羞的视频在线 | 欧美性猛交一区二区三区精品 | 涩涩视频在线看 | 国产精品99久久久久久大便 | 亚洲一区二区三区四区五区中文 | 亚洲精品aⅴ |