酒精傳感器仿真中沒有,其實就是傳感器檢測時相應的電阻值會變化,用滑動電位器代替就ok
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (17.75 KB, 下載次數: 65)
下載附件
2019-6-1 02:57 上傳
數碼管顯示酒精測試儀元件清單
1) 9*15萬用板
2) STC89C51單片機
3) AD0809
4) 40腳IC座
5) 28腳IC座
6) MQ-3酒精傳感器
7) 103排阻
8) 0.56四位一體共陽數碼管
9) 9012三極管*5
10) 2.2k電阻*6
11) 220歐姆電阻
12) 10k電阻
13) 10uf電容
14) 30pf電容*2
15) 12M晶振
16) 5mm紅LED
17) 按鍵*3
18) 蜂鳴器
19) 自鎖開關
20) DC電源插口
21) 導線若干
22) 焊錫若干
23) USB電源線或電池盒+DC插頭
單片機源程序如下:
- //程序頭函數
- #include <reg52.h>
- //宏定義
- #define uint unsigned int
- #define uchar unsigned char
- #define Data_ADC0809 P1 //定義P1口為Data_ADC0809
-
- //管腳聲明
- sbit Feng = P3^0; //蜂鳴器
- //ADC0809
- sbit ST=P3^3;
- sbit EOC=P3^4;
- sbit OE=P3^2;
- //按鍵
- sbit Key1=P3^5;
- sbit Key2=P3^6;
- sbit Key3=P3^7;
- bit shan=0; //閃爍標志位
- //顯示數組 0-9+F
- uchar Data_[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x71,0x3f}; //共陰顯示數組
- sbit Wei1 = P2^7;
- sbit Wei2 = P2^6;
- sbit Wei3 = P2^5;
- sbit Wei4 = P2^4; //四個數碼管的位選端口
- //函數聲明
- extern uchar ADC0809();
- void Display(uchar X,uchar Data);
- void delay(uint t);
- //酒精含量變量
- uchar temp=0;
- //蜂鳴器變量
- uchar FF=10;
- //顯示模式
- uchar Mode=0;
- uchar p;
- void main() //主函數
- {
- TH0=0x3c;
- TL0=0xb0;//賦初值50ms
- TMOD=0x01;//設置工作方式
- EA=1;//打開中斷總開關
- ET0=1;//打開允許開關
- TR0=1; //打開定時器定時開關
- while(1) //進入循環,括號內為1,所以程序進入循環就不會出來了,所以就叫死循環
- {
- //正常模式
- if(Mode==0)
- {
- //讀取AD值
- temp=ADC0809();
- for(p=0;p<30;p++) //調用三十次顯示函數
- Display(0,temp);
- //判斷是否報警
- if((shan==1)&&(temp>FF)) //閃爍變量為1時并且大于報警值
- {
- Feng=0; //蜂鳴器響
- }
- if(shan==0) //閃爍變量為0時
- {
- Feng=1; //關閉蜂鳴器
- } //(閃爍變量shan受定時器控制,500ms取反一次,達到1秒響一下的效果)
- }
- //調整模式
- else
- {
- Display(1,FF); //顯示報警值界面
- }
- //功能鍵
- if(Key3==0) //設置鍵按下(按鍵一端接地,一端接單片機IO口,當按鍵按下時,單片機的IO口就會檢測到低電平)
- {
- Feng=0; //蜂鳴器響
- delay(100); //延時去抖
- while(Key3==0) //判斷按鍵是否按下
- {
- if(Mode==0) //正常模式
- Display(0,temp);//顯示正常界面
- else //設置報警值
- Display(1,FF); //顯示報警值界面
- }
- if(Mode==0) //如果是正常模式,按下設置鍵,就切換到設置模式
- Mode=1;
- else //如果是設置模式,按下設置鍵,就切換到正常模式
- Mode=0;
- Feng=1; //關閉蜂鳴器
- }
- //增加
- if(Key2==0&&Mode==1) //加鍵按下
- {
- Feng=0; //蜂鳴器響
- delay(100);
- while(Key2==0)
- {
- Display(1,FF); //顯示設置界面
- }
- FF++; //報警值加
- if(FF>=251) //最大加到250
- FF=250;
- Feng=1; //關閉蜂鳴器
- }
- //減少
- if(Key1==0&&Mode==1) //減按鍵按下,注釋參考加按鍵注釋
- {
- Feng=0;
- delay(100);
- while(Key1==0)
- {
- Display(1,FF);
- }
- FF--;
- if(FF==0xff) //報警值減到小于0
- FF=0; //最小值就是0
- Feng=1;
- }
- }
- }
- //ADC0809讀取信息
- uchar ADC0809()
- {
- uchar temp_=0x00;
- //初始化高阻太
- OE=0;
- //轉化初始化
- ST=0;
- //開始轉換
- ST=1;
- ST=0;
- //外部中斷等待AD轉換結束
- while(EOC==0)
- //讀取轉換的AD值
- OE=1;
- temp_=Data_ADC0809;
- OE=0;
- return temp_;
- }
- //延時
- void delay(uint t)
- {
- uint i,j;
- for(i=0;i<t;i++)
- for(j=0;j<10;j++);
- }
- //顯示 X表示狀態 Data表示數據
- void Display(uchar X,uchar Data)
- {
- Wei1=1;
- Wei2=1;
- Wei3=1;
- Wei4=1;
- P0=0xff; //關閉顯示
- //正常模式
- if(X==0)
- {
- P0=~Data_[11]; //顯示0,也就是正常模式時,第一個位置顯示0
- }
- //非正常
- else
- {
- P0=~Data_[10]; //設置模式,第一位顯示字母F
- }
- Wei1=0; //選中第一位,其他位關閉
- Wei2=1;
- Wei3=1;
- Wei4=1;
- delay(10); //延時
- Wei1=1; //關閉所有位
- Wei2=1;
- Wei3=1;
- Wei4=1;
- P0=~Data_[Data/100]; //顯示數值的百位,例如數據是123,除以100的商是1,這里顯示的就是數字1
- Wei1=1;
- Wei2=0; //選中第二位
- Wei3=1;
- Wei4=1;
- delay(10); //延時
- Wei1=1; //關閉所有位
- Wei2=1;
- Wei3=1;
- Wei4=1;
- P0=~Data_[Data%100/10];//顯示數值的十位,數值是123,取余的作用就是除以100后的余數,是23,23再除以10得到的商是2,這里顯示的就是2
- Wei1=1;
- Wei2=1;
- Wei3=0;
- Wei4=1;
- delay(10);
- Wei1=1;
- Wei2=1;
- Wei3=1;
- Wei4=1;
- P0=~Data_[Data%10]; //顯示數值的個位,數值是123,取余10就是數值除以10的余數就是3,這里顯示的就是3
- Wei1=1;
- Wei2=1;
- Wei3=1;
- Wei4=0;
- delay(10);
- Wei1=1;
- Wei2=1;
- Wei3=1;
- Wei4=1;
- }
- void time0() interrupt 1//定時器函數
- {
- uchar m;
- TH0=0x3c;
- TL0=0xb0;//重新賦初值
- m++; //定時器進入一次是50ms,m加一次
- if(m==10) //加10次,也就是500ms
- {
- shan=~shan; //控制shan變量取反,就是0變1,1變0
- m=0; //m清零
- }
- }
復制代碼
所有資料51hei提供下載:
數碼管酒精濃度測試儀.rar
(2.8 MB, 下載次數: 113)
2019-5-31 16:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|