由于我們?cè)谠O(shè)計(jì)的過(guò)程中未接觸到實(shí)際傳感器,在protues仿真軟件中采用電位器模擬的辦法,因此我們只是了解了傳感器的原理。傳感器電路設(shè)計(jì)部分并未實(shí)現(xiàn)。
本系統(tǒng)經(jīng)過(guò)采用AD0809芯片,其中11腳為電源端,最主要的6腳START,啟動(dòng)控制端口,高電平有效,EOC連接51單片機(jī)的終端輸入端,觸發(fā)中斷的信號(hào)。9腳是輸出時(shí)能端,電路圖中可以看出它是由P2.6控制的。10腳為時(shí)鐘接口,12,16分別為參考正,參考負(fù)。26腳為通道0的信號(hào)輸入端,23,24,25為通道選擇引腳,22為鎖存使能信號(hào)端,下面的八路信號(hào)是輸出端,由低到高的對(duì)應(yīng)八位二進(jìn)制數(shù)。13為參考地。 (見(jiàn)附錄電路原理設(shè)計(jì)圖)
電路圖可以參見(jiàn)上面的圖2-8,大致控制是通過(guò)P0口將段碼送給245增加驅(qū)動(dòng)后,送至LED的A-DP的輸入端,控制顯示的大小。同時(shí)通過(guò)P2.0,P2.1作為139譯碼器的輸入信號(hào)選出一路信號(hào)后,作為位碼送至LED的1-4端口,決定哪一位顯示。整個(gè)LED顯示電路的控制主要是通過(guò)245的使能端控制實(shí)現(xiàn)的。至于它的動(dòng)態(tài)顯示,是由于在一個(gè)時(shí)刻,只能送一個(gè)位碼,一個(gè)段碼,也就是只能保證一位數(shù)字的正確顯示,通過(guò)快速的程序循環(huán)就實(shí)現(xiàn)了動(dòng)態(tài)的顯示過(guò)程。
BU(P2.5接口)蜂鳴器用于報(bào)警。當(dāng)檢測(cè)到液位高于200cm或者低于100cm時(shí),啟動(dòng)報(bào)警裝置。
第六章 系統(tǒng)軟件部分的設(shè)計(jì)
系統(tǒng)的硬件確定以后,功能完善的軟件能夠很好的指導(dǎo)和協(xié)調(diào)硬件的工作,可使系統(tǒng)發(fā)揮其最大的作用,并且便利以后的更新?lián)Q代升級(jí)。
一個(gè)完整的系統(tǒng)都離不開(kāi)對(duì)系統(tǒng)狀態(tài)的監(jiān)控,為了更好的協(xié)調(diào)軟件,硬件各個(gè)部分正常工作就必須對(duì)整個(gè)系統(tǒng)進(jìn)行嚴(yán)密監(jiān)控。在本系統(tǒng)中定時(shí)器T0中斷服務(wù)程序擔(dān)任數(shù)據(jù)讀取,處理和輸出顯示任務(wù),每隔一定的時(shí)間對(duì)A/D轉(zhuǎn)化進(jìn)行一次采樣,并進(jìn)行相應(yīng)的處理,在經(jīng)過(guò)LED驅(qū)動(dòng)電路來(lái)實(shí)現(xiàn)液位的顯示。而主程序完成的任務(wù)相對(duì)簡(jiǎn)單,它只是完成初始化和啟動(dòng)T0定時(shí)的工作。
在該系統(tǒng)的軟件部分的設(shè)計(jì)中,第一部分主要是對(duì)流程圖的介紹,第二部分是系統(tǒng)工作程序的編程內(nèi)容,由于全部編程部分較多,只取最重要的水位檢測(cè)主程序段。本程序段主要實(shí)現(xiàn)啟動(dòng)ADC0809轉(zhuǎn)換器,并從A/D轉(zhuǎn)換器采集信號(hào)的功能。
二 程序清單
#include<reg51.h>
unsigned char A_DV0; //A_D轉(zhuǎn)換得到值
unsigned Hmax,Hmin; //上下限值
unsigned char A_DV[4]; //當(dāng)前液位值
char T0c=0;
char A; //T0計(jì)時(shí)次數(shù)
void T0Run(void); //T0啟動(dòng)子程序
void LED(unsigned char A_DV[]); //LED顯示子程序
void A_DRun(void); //啟動(dòng)A_D轉(zhuǎn)換子程序
void A_DReA_D(void); //A_D轉(zhuǎn)換子程序
int Height;
bit Bjj(int Height,unsigned Hmax,Hmin); //數(shù)值比較函數(shù)
sbit BU=P2^5;
sbit L1=P2^0;
sbit L2=P2^1;
sbit ST=P2^6;
sbit OE=P2^7;
sbit EOC=P3^2;
main()
{
BU=0;
Hmax=200; //上限值,根據(jù)實(shí)際情況設(shè)定
Hmin=100; //下限值 ,根據(jù)實(shí)際情況設(shè)定
T0Run();
while(1);
}
void T0Run(void) //T0啟動(dòng)子程序
{
IE=0x82; //啟動(dòng)中斷T0
TMOD=0x01; //設(shè)置T0工作于模式1
TH0=0xff;
TL0=0xec; //送入計(jì)數(shù)初值
TR0=1;
ST=0;
OE=0; //啟動(dòng)定時(shí)器T0
}
void time0(void) interrupt 1
{
TH0=0xff;
TL0=0xec; //重裝計(jì)數(shù)初值
T0c++;
if(T0c>19) //如果計(jì)時(shí)20次即1s
{
T0c=0;
A_DRun(); //啟動(dòng)A_D轉(zhuǎn)換
A_DReA_D();
LED(A_DV);
Bjj(Height,Hmax,Hmin);
}
}
void A_DRun(void) //啟動(dòng)A_D程序
{
ST=0;
ST=1;
ST=0;
}
void A_DReA_D(void)
{
int A_DV0;
while(EOC==0);
OE=1;
A_DV0=P1;
OE=0;
Height=A_DV0; //計(jì)算A_D轉(zhuǎn)換值
A_DV[0]=Height%10; //逐位分離液位值
A_DV[1]=(Height%100)/10;
A_DV[2]=(Height%1000)/100;
A_DV[3]=0;
}
void LED(unsigned char A_DV[]) //LED顯示子程序
{
int i,k;
char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//數(shù)字零到數(shù)字九的共陽(yáng)極顯示時(shí)的七段碼
char b[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
for(i=0;i<1000;i++)
//設(shè)定循環(huán)次數(shù),使這四位數(shù)循環(huán)快速顯示,實(shí)現(xiàn)長(zhǎng)時(shí)間的動(dòng)態(tài)顯示
{
k=A_DV[3];
L1=1;
L2=1;
A=a[k];
P0=A;
//顯示第3位
k=A_DV[0];
L1=0;
L2=1;
A=b[k];
P0=A;
//顯示第2位
k=A_DV[1];
L1=1;
L2=0;
A=a[k];
P0=A;
//顯示第1位
k=A_DV[2];
L1=0;
L2=0;
A=a[k];
P0=A;
}
}
bit Bjj(int Height,unsigned Hmax,Hmin) //數(shù)值比較函數(shù)
{ if(Height>Hmax||Height<Hmin)
BU=1;
else BU=0; //p2.5接的是蜂鳴器,到有高電平時(shí),蜂鳴器就會(huì)響起
return 1;
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |