找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 9396|回復(fù): 15
收起左側(cè)

51單片機(jī)的酒精檢測Proteus仿真+源代碼

  [復(fù)制鏈接]
ID:585660 發(fā)表于 2019-7-17 11:25 | 顯示全部樓層 |閱讀模式
酒精傳感器仿真中沒有,其實(shí)就是傳感器檢測時(shí)相應(yīng)的電阻值會(huì)變化,用滑動(dòng)電位器代替就ok

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

單片機(jī)源程序如下:
  1. //程序頭函數(shù)
  2. #include <reg52.h>
  3. //顯示函數(shù)
  4. #include <display.h>
  5. #include <intrins.h>
  6. #include "eeprom52.h"
  7. #include "temp.h"

  8. //宏定義
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. #define Data_ADC0809 P1

  12. //管腳聲明
  13. sbit P34=P3^4;//溫度
  14. sbit LED_R= P2^2; //紅指示燈
  15. sbit LED_G= P2^0; //綠色指示燈
  16. sbit FENG = P2^5; //蜂鳴器
  17. //ADC0809
  18. sbit ST=P3^3;
  19. sbit EOC=P3^6;
  20. sbit OE=P3^2;
  21. //按鍵
  22. sbit Key1=P2^6;        //設(shè)置按鍵
  23. sbit Key2=P2^7; //加
  24. sbit Key3=P3^7;        //減
  25. bit bdata flag;//指示燈和蜂鳴器閃爍報(bào)警標(biāo)志位
  26. uchar set;          //設(shè)置標(biāo)志位


  27. //函數(shù)聲明
  28. extern uchar ADC0809();
  29. extern void Key();

  30. //酒精含量變量
  31. unsigned int temp=0;
  32. unsigned int WARNING=25; // 初始報(bào)警值
  33. /******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
  34. void write_eeprom()
  35. {
  36.         SectorErase(0x2000);
  37.         byte_write(0x2000, WARNING);
  38.         byte_write(0x2060, a_a);        
  39. }

  40. /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來*****************/
  41. void read_eeprom()
  42. {
  43.         WARNING   = byte_read(0x2000);
  44.         a_a      = byte_read(0x2060);
  45. }

  46. /**************開機(jī)自檢eeprom初始化*****************/
  47. void init_eeprom()
  48. {
  49.         read_eeprom();                //先讀
  50.         if(a_a != 1)                //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom
  51.         {
  52.                 WARNING=25;
  53.                 a_a = 1;
  54.                 write_eeprom();           //保存數(shù)據(jù)
  55.         }        
  56. }
  57. //初始化函數(shù)
  58. void init()         
  59. {
  60.         TMOD=0x01; //定時(shí)器0方式1
  61.          TL0=0xb0;
  62.          TH0=0x3c;
  63.         TL1=65000/256;
  64.         TH1=65000/256;  //賦初值
  65.          EA=1;        //開總中斷
  66.         ET0=1;        //允許定時(shí)器0中斷
  67.          TR0=1;        //定時(shí)器0開
  68. }
  69. //主函數(shù)
  70. void main()
  71. {
  72.         Init1602();        //1602初始化
  73.         init_eeprom();  //開始初始化保存的數(shù)據(jù)
  74.         init();         //初始化函數(shù)
  75.         while(1)//主循環(huán)
  76.         {
  77.                 if(set==0) //如果沒有按下設(shè)置(默認(rèn)set是0,就是正常顯示狀態(tài))
  78.                 {
  79.                         temp=ADC0809();        //讀取酒精值
  80.                         Display_1602(temp,WARNING,ReadTemperature());         //顯示酒精值
  81.                 }
  82.                 if(temp<WARNING&&set==0)        //如果實(shí)際的酒精值小于報(bào)警值且在正常顯示狀態(tài)下
  83.                 {
  84.                         flag=0;         //執(zhí)行下面flag=0的(主要就是綠燈閃,關(guān)蜂鳴器和繼電器)
  85.                 }
  86.                 else if(temp>WARNING&&set==0)  //如果實(shí)際的酒精值大于報(bào)警值且在正常顯示狀態(tài)下
  87.                 {
  88.                         flag=1;        //執(zhí)行下面flag=1的(主要就是紅燈閃,開蜂鳴器和繼電器)
  89.                 }
  90.                 Key();//按鍵掃描
  91.         }
  92. }
  93. //ADC0809讀取信息
  94. uchar ADC0809()
  95. {
  96.         uchar temp_=0x00;
  97.         //初始化高阻太

  98.         OE=0;
  99.         //轉(zhuǎn)化初始化
  100.         ST=0;
  101.         //開始轉(zhuǎn)換
  102.         ST=1;
  103.         ST=0;
  104.         //外部中斷等待AD轉(zhuǎn)換結(jié)束
  105.         while(EOC==0)
  106.         //讀取轉(zhuǎn)換的AD值
  107.         OE=1;
  108.         temp_=Data_ADC0809;
  109.         OE=0;
  110.         return temp_;
  111. }
  112. //按鍵函數(shù)
  113. void Key()
  114. {
  115.         if(Key1==0)        //如果設(shè)置按鍵按下
  116.         {
  117.                 while(Key1==0);//等待按鍵釋放
  118.                 FENG=0;        //蜂鳴器響
  119.                 set++;        //設(shè)置的變量加1
  120.                 flag=0;        //綠燈閃
  121.                 TR0=0;        //關(guān)定時(shí)器0
  122.                 write_com(0x0f);//打開顯示 無光標(biāo) 光標(biāo)閃爍
  123.                 write_com(0x80+15);//位置
  124. //                   write_com(0x06);//當(dāng)讀或?qū)懸粋€(gè)字符是指針后一一位
  125.                 FENG=1;        //蜂鳴器關(guān)
  126.         }
  127.         if(set>=2)        //又按了下設(shè)置
  128.         {
  129.                 set=0;        //正常顯示狀態(tài)
  130. //                write_com(0x38);//屏幕初始化
  131.                 write_com(0x0c);//打開顯示 無光標(biāo) 無光標(biāo)閃爍
  132.                 FENG=1;        //蜂鳴器關(guān)
  133.                 flag=1;        //紅燈閃
  134.                 TR0=1;        //定時(shí)器0開
  135.         }
  136.         if(Key2==0&&set!=0)          //在設(shè)置的狀態(tài)下按下加
  137.         {
  138.                 while(Key2==0);          //等待按鍵釋放
  139.                 FENG=0;                //蜂鳴器響
  140.                 WARNING++;        //報(bào)警值加1
  141.                 if(WARNING>=255)  //如果報(bào)警值大于等于255
  142.                 WARNING=0;                 //報(bào)警值歸零
  143.                 write_com(0x80+13);
  144.                 write_data('0'+WARNING/100);
  145.                 write_data('0'+WARNING/10%10);
  146.                 write_data('0'+WARNING%10);           //顯示報(bào)警值
  147.                 //write_com(0x80+0x40+13);//調(diào)整位置
  148.                 FENG=1;         //蜂鳴器關(guān)
  149.                 write_eeprom();                           //保存數(shù)據(jù)
  150.         }
  151.         if(Key3==0&&set!=0)         //在設(shè)置的狀態(tài)下按下減
  152.         {
  153.                 while(Key3==0);         //等待按鍵釋放
  154.                 FENG=0;                 //蜂鳴器響
  155.                 WARNING--;         //報(bào)警值減1
  156.                 if(WARNING<=0)        //如果報(bào)警值小于等于0
  157.                 WARNING=255;        //那么報(bào)警值為255
  158.                 write_com(0x80+13);
  159.                 write_data('0'+WARNING/100);
  160.                 write_data('0'+WARNING/10%10);
  161.                 write_data('0'+WARNING%10);
  162.                 //write_com(0x80+0x40+13);//調(diào)整位置
  163.                 FENG=1;         //蜂鳴器關(guān)
  164.                 write_eeprom();                           //保存數(shù)據(jù)
  165.         }
  166. }

  167. void  time1_int(void) interrupt 1 //定時(shí)器中斷0
  168. {
  169.         uchar count;
  170.         TL0=0xb0;
  171.          TH0=0x3c;  //重賦初值50ms
  172.           count++;  ///溢出值加1
  173.         if(count==10)  //如果時(shí)間到半秒
  174.         {
  175.                 if(flag==0)          //如果flag為0
  176.                 {
  177.                         LED_G=0;  //綠燈亮
  178.                         LED_R=1;  //紅燈滅
  179.                         FENG=1;          //蜂鳴器關(guān)
  180.                 }
  181.                 if(flag==1)           //如果flag為1
  182.                 {
  183.                         LED_G=1;   //綠燈關(guān)
  184.                         LED_R=0;   //紅燈亮
  185.                         FENG=0;           //蜂鳴器開
  186.                 }
  187.         }

  188.            if(count==20)          //如果時(shí)間到1秒
  189.            {
  190.                 count=0;          //溢出值清零
  191.                 if(flag==0)         //如果flag為0
  192.                 {
  193.                         LED_G=1;        //綠燈關(guān)
  194.                         LED_R=1;        //紅燈滅
  195.                         FENG=1;           //蜂鳴器關(guān)
  196.                 }
  197.                 if(flag==1)           //如果flag為1
  198.                 {
  199.                         LED_G=1;   //綠燈關(guān)
  200.                         LED_R=1;        //紅燈滅
  201.                         FENG=1;           //蜂鳴器關(guān)
  202.                 }
  203.         }
  204. }
復(fù)制代碼

所有資料51hei提供下載:
終極版2.zip (116.98 KB, 下載次數(shù): 327)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:692185 發(fā)表于 2020-2-14 13:33 | 顯示全部樓層
這200多條是全部代碼嗎
回復(fù)

使用道具 舉報(bào)

ID:732749 發(fā)表于 2020-5-9 19:53 | 顯示全部樓層
為什么我的protues閃退
回復(fù)

使用道具 舉報(bào)

ID:795820 發(fā)表于 2020-7-2 16:56 來自手機(jī) | 顯示全部樓層
請(qǐng)問U2那塊,那個(gè)綠色的是什么芯片。
回復(fù)

使用道具 舉報(bào)

ID:795562 發(fā)表于 2020-7-2 18:07 | 顯示全部樓層
酒精也可以用傳感器檢測,長見識(shí)了。又跟你學(xué)了一招。
回復(fù)

使用道具 舉報(bào)

ID:795820 發(fā)表于 2020-7-3 20:05 來自手機(jī) | 顯示全部樓層
為什么我下載的代碼和仿真圖仿真,那個(gè)LCD顯示那塊,一點(diǎn)都不顯示?
回復(fù)

使用道具 舉報(bào)

ID:849899 發(fā)表于 2020-11-27 08:47 來自手機(jī) | 顯示全部樓層
你好,這個(gè)的編程能給我嗎?
回復(fù)

使用道具 舉報(bào)

ID:782510 發(fā)表于 2020-12-8 22:43 | 顯示全部樓層
為什么程序會(huì)報(bào)錯(cuò)嘞
回復(fù)

使用道具 舉報(bào)

ID:830316 發(fā)表于 2020-12-10 11:35 | 顯示全部樓層
你知道MQ系列傳感器的電壓與濃度的轉(zhuǎn)換公式及其相應(yīng)程序嗎?
回復(fù)

使用道具 舉報(bào)

ID:782510 發(fā)表于 2020-12-10 20:10 | 顯示全部樓層
顯示函數(shù)那塊報(bào)錯(cuò)該怎么解決呢?
回復(fù)

使用道具 舉報(bào)

ID:860507 發(fā)表于 2020-12-18 01:30 | 顯示全部樓層
寫顯示酒精的濃度的程序是那一模塊啊
回復(fù)

使用道具 舉報(bào)

ID:781892 發(fā)表于 2020-12-18 16:31 來自手機(jī) | 顯示全部樓層
非常的好用,設(shè)計(jì)非常的人性
回復(fù)

使用道具 舉報(bào)

ID:863973 發(fā)表于 2020-12-23 17:38 | 顯示全部樓層
單片機(jī)憨憨 發(fā)表于 2020-7-3 20:05
為什么我下載的代碼和仿真圖仿真,那個(gè)LCD顯示那塊,一點(diǎn)都不顯示?

我也想知道是為啥��!
回復(fù)

使用道具 舉報(bào)

ID:992065 發(fā)表于 2021-12-15 16:24 來自手機(jī) | 顯示全部樓層
為什么程序會(huì)報(bào)錯(cuò)呢?
回復(fù)

使用道具 舉報(bào)

ID:1047616 發(fā)表于 2022-10-23 19:52 | 顯示全部樓層
heibxixhsji 發(fā)表于 2021-12-15 16:24
為什么程序會(huì)報(bào)錯(cuò)呢?

KILL5里面我沒報(bào)錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:1047616 發(fā)表于 2022-11-6 10:47 | 顯示全部樓層
你好,請(qǐng)問為什么做出實(shí)物時(shí)LCD一直顯示初始化
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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