摘 要: 本方案以單片機(jī)AT89C51為系統(tǒng)的控制核心,結(jié)合A/D轉(zhuǎn)換芯片ADC0809設(shè)計(jì)一個(gè)數(shù)字電壓表,能夠測(cè)量0—5V之間的直流電壓值,并通過(guò)四位數(shù)碼顯示。數(shù)字電壓表的電路圖設(shè)計(jì)在Proteus軟件中進(jìn)行,執(zhí)行程序應(yīng)用C語(yǔ)言在Keil中編寫(xiě)、調(diào)試。
關(guān)鍵詞: 單片機(jī)(AT89C51) 電壓 A/D轉(zhuǎn)換 ADC0809
數(shù)字電壓表(Dligita Voltmeter)簡(jiǎn)稱DVM,是利用A/D轉(zhuǎn)換原理,把連續(xù)的模擬量(直流輸入電壓)轉(zhuǎn)換成不連續(xù)、離散的數(shù)字形式并加以顯示的儀表。通常數(shù)字電壓表都采用大規(guī)模的A/D轉(zhuǎn)換集成電路,測(cè)量精度高,讀數(shù)方便,在體積、重量、耗電、穩(wěn)定性及可靠性等方面性能指標(biāo)均明顯優(yōu)于指針式萬(wàn)用表。其中,A/D轉(zhuǎn)換器將輸入的模擬量轉(zhuǎn)換成數(shù)字量,邏輯控制電路產(chǎn)生控制信號(hào),按規(guī)定的時(shí)序?qū)/D轉(zhuǎn)換器中各組模擬開(kāi)關(guān)接通或斷開(kāi),保證A/D轉(zhuǎn)換正常進(jìn)行。A/D轉(zhuǎn)換結(jié)果通過(guò)計(jì)數(shù)譯碼電路變換成段碼,最后驅(qū)動(dòng)數(shù)碼管顯示相應(yīng)的數(shù)值。目前,由各種單片A/D轉(zhuǎn)換器構(gòu)成的數(shù)字電壓表,已被廣泛用于電子及電工測(cè)量、工業(yè)自動(dòng)化儀表、自動(dòng)測(cè)試系統(tǒng)等智能化測(cè)量領(lǐng)域,顯示出強(qiáng)大的生命力。本方案以單片機(jī)AT89C51為系統(tǒng)的控制核心,結(jié)合A/D轉(zhuǎn)換芯片ADC0809設(shè)計(jì)一個(gè)數(shù)字電壓表,能夠測(cè)量0—5V之間的直流電壓值,通過(guò)四位數(shù)碼顯示。數(shù)字電壓表的電路圖設(shè)計(jì)在Proteus軟件中進(jìn)行,執(zhí)行程序用C語(yǔ)言在Keil中編寫(xiě)、調(diào)試。
1.數(shù)字電壓表硬件電路設(shè)計(jì)
數(shù)字電壓表由AT89C51單片機(jī)控制電路、12MHz時(shí)鐘電路、復(fù)位電路、數(shù)碼管顯示電路、AD轉(zhuǎn)換電路和電源電路等主要電路組成,總體組成框圖如圖1所示。
1.1時(shí)鐘電路
時(shí)鐘電路也稱為振蕩電路,在計(jì)算機(jī)系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。80C51單片機(jī)芯片機(jī)集成了振蕩電路,只要在芯片的第18、19腳外接晶體振蕩器即可工作。如圖4中的晶體振蕩器(X1)、電容C1和C2即構(gòu)成了單片機(jī)所需的時(shí)鐘電路。
1.2復(fù)位電路
復(fù)位電路的作用是使CPU和系統(tǒng)中的其他功能部件都處在初始狀態(tài),并從初始狀態(tài)開(kāi)始工作。單片機(jī)的復(fù)位電路是由外部電路來(lái)執(zhí)行的,在RST引腳上加上持續(xù)二個(gè)機(jī)器周期以上的高電平就執(zhí)行狀態(tài)復(fù)位。通常采用上電復(fù)位和開(kāi)關(guān)復(fù)位二種方式。如圖4中單片機(jī)第9腳與R1、R2、C3和按鍵開(kāi)關(guān)構(gòu)成了單片機(jī)的復(fù)位電路。
1.3電源電路
電源電路是給數(shù)字電壓表提供+5V的供電電路,保證各電路正常工作。
1.4數(shù)碼管顯示電路
數(shù)碼管顯示電路的作用是顯示輸入0.00—5.00V的電壓值。系統(tǒng)通過(guò)對(duì)LED燈的動(dòng)態(tài)顯示及不停的輪流給數(shù)碼管位選端加驅(qū)動(dòng)電壓,在給其中一個(gè)數(shù)碼管位選段加驅(qū)動(dòng)電壓的時(shí)候它才能變亮,而其他的是暗的,由于數(shù)碼管暗下來(lái)需要一定的時(shí)間,人眼具有視覺(jué)暫留特點(diǎn),同時(shí)系統(tǒng)又給其他的施加驅(qū)動(dòng)電壓,因此我們看到的就是穩(wěn)定的亮著的數(shù)字了,如圖4所示。
1.5A/D轉(zhuǎn)換電路
A/D轉(zhuǎn)換電路的作用是將所輸入的模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),然后進(jìn)行處理。A/D轉(zhuǎn)換器的轉(zhuǎn)換精度對(duì)測(cè)量電路極其重要,它的參數(shù)關(guān)系到測(cè)量電路性能。A/DC0809轉(zhuǎn)換器的性能比較穩(wěn)定,轉(zhuǎn)換精度高,具有很高的抗干擾能力,電路結(jié)構(gòu)簡(jiǎn)單。ADC08098路模擬信號(hào)的分時(shí)采集,片內(nèi)有8路模擬選通開(kāi)關(guān),以及相應(yīng)的通道抵制鎖存用譯碼電路,其轉(zhuǎn)換時(shí)間為100μs左右,圖2為0809引腳圖。
1.5.1ADC0809的內(nèi)部結(jié)構(gòu)
ADC0809的內(nèi)部邏輯結(jié)構(gòu)圖如上圖3所示。
圖中多路開(kāi)關(guān)可選通8個(gè)模擬通道,允許8路模擬量分時(shí)輸入,共用一個(gè)A/D轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換,這是一種經(jīng)濟(jì)的多路數(shù)據(jù)采集方法。地址鎖存與譯碼電路完成對(duì)A、B、C3個(gè)地址位進(jìn)行鎖存和譯碼,其譯碼輸出用于通道選擇,其轉(zhuǎn)換結(jié)果通過(guò)三態(tài)輸出鎖存器存放、輸出,因此可以直接與系統(tǒng)數(shù)據(jù)總線相連,表1為通道選擇表。
1.5.2信號(hào)引腳
ADC0809芯片為28引腳為雙列直插式封裝,其引腳排列見(jiàn)圖3。對(duì)ADC0809主要信號(hào)引腳的功能說(shuō)明如下。
IN7~I(xiàn)N0——模擬量輸入通道。
ALE——地址鎖存允許信號(hào)。對(duì)應(yīng)ALE上跳沿,A、B、C地址狀態(tài)送入地址鎖存器中。
START——轉(zhuǎn)換啟動(dòng)信號(hào)。START上升沿時(shí),復(fù)位ADC0809;START下降沿時(shí)啟動(dòng)芯片,開(kāi)始進(jìn)行A/D轉(zhuǎn)換;在A/D轉(zhuǎn)換期間,START應(yīng)保持低電平。本信號(hào)有時(shí)簡(jiǎn)寫(xiě)為ST。
A、B、C——地址線。通道端口選擇線,A為低地址,C為高地址,引腳圖中為ADDA,ADDB和ADDC。其地址狀態(tài)與通道對(duì)應(yīng)關(guān)系見(jiàn)表1。
CLK——時(shí)鐘信號(hào)。ADC0809的內(nèi)部沒(méi)有時(shí)鐘電路,所需時(shí)鐘信號(hào)由外界提供,因此有時(shí)鐘信號(hào)引腳。通常使用頻率為500KHz的時(shí)鐘信號(hào)。
EOC——轉(zhuǎn)換結(jié)束信號(hào)。EOC=0,正在進(jìn)行轉(zhuǎn)換;EOC=1,轉(zhuǎn)換結(jié)束。使用中該狀態(tài)信號(hào)即可作為查詢的狀態(tài)標(biāo)志,又可作為中斷請(qǐng)求信號(hào)使用。
D7~D0——數(shù)據(jù)輸出線。為三態(tài)緩沖輸出形式,可以和單片機(jī)的數(shù)據(jù)線直接相連。D0為最低位,D7為最高位。
OE——輸出允許信號(hào)。用于控制三態(tài)輸出鎖存器向單片機(jī)輸出轉(zhuǎn)換得到的數(shù)據(jù)。OE=0,輸出數(shù)據(jù)線呈高阻;OE=1,輸出轉(zhuǎn)換得到的數(shù)據(jù)。
Vcc——+5V電源。
Vref——參考電源參考電壓用來(lái)與輸入的模擬信號(hào)進(jìn)行比較,作為逐次逼近的基準(zhǔn)。其典型值為+5V(Vref(+)=+5V,Vref(-)=-5V)。
1.5.3電路電路連接
ADC0809與單片機(jī)的電路連接主要涉及兩個(gè)問(wèn)題。一是8路模擬信號(hào)通道的選擇,二是A/D轉(zhuǎn)換完成后轉(zhuǎn)換數(shù)據(jù)的傳送。根據(jù)表1中所示將ADC0809的地址線A、B、C接低電平即可選擇通道1(IN0),ADC0809的數(shù)據(jù)輸出線D7~D0接80C51的P0口,如圖4所示。
1.6測(cè)試電壓輸入電路
輸入電路的作用是把不同量程的被測(cè)的電壓規(guī)范到A/D轉(zhuǎn)換器所要求的電壓值。本電路設(shè)計(jì)所用電壓為0.00—5.00V,其大小通過(guò)滑動(dòng)變阻器調(diào)節(jié)。
數(shù)字電壓表硬件電路如圖4所示。
2.數(shù)字式電壓表程序設(shè)計(jì)
2.1數(shù)字式電壓表程序流程圖
2.2Keil C51參考程序如下
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
//*————————數(shù)碼管段碼定義————————*//
uchar code table={0xc0,0x99,0xa4,
0xb0,0xf9,0x92,0x82,0xf8,0x80,0x90};
//*————————0809引腳定義————————*//
sbit st=P2^7;
sbit oe=P2^5;
sbit eoc=P2^6;
sbit clk=P2^4;
//*——————-延時(shí)子函數(shù)————————*//
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x——)
for(y=110;y>0;y——);
}
//*———————啟動(dòng)轉(zhuǎn)換子函數(shù)————————*//
void start()
{
st=0;oe=0;st=1;st=0;
}
//*————————顯示子函數(shù)——————————*//
xian(uchar b)
{
P2=0x01;
P0=table[b%10];
delay(1);
P2=0x02;
P0=table[b/10%10];
delay(1);
P2=0x04;
P0=table[b/100%10]&0x7f;
delay(1);
P2=0x08;
P0=table[b/1000];
delay(1);
}
//*————————-主函數(shù)————————*//
void main()
{
uint B;
uchar date;
TMOD=0x01;
TH0=(65536-20)/256;
TL0=(65536-20)%256;
EA=1;
ET0=1;
TR0=1;
start();//啟動(dòng)轉(zhuǎn)換
while(1)
{
while(eoc==0);//等待轉(zhuǎn)換結(jié)束
oe=1;//允許輸出
date=P0;
start();
oe=0;
B=date*5.0/255;
xian(B);//顯示轉(zhuǎn)換結(jié)果
}
}
//*————-T0定時(shí)器中斷子函數(shù)給ADC0809提供時(shí)鐘信號(hào)————-*//
void time0()interrupt 1 using 1
{
TH0=(65536-20)/256;
TL0=(65536-20)%256;
clk=~clk;
}
3.測(cè)試與調(diào)試
本設(shè)計(jì)應(yīng)用Proteus和Keil51軟件,首先根據(jù)自己設(shè)計(jì)的電路圖用Proteus軟件畫(huà)出電路模型,然后用Keil51軟件對(duì)所編寫(xiě)的程序進(jìn)行編譯、鏈接,如果沒(méi)有錯(cuò)誤和警告便可生成程序的hex文件,再將此文件加到電路圖上使軟硬件結(jié)合運(yùn)行,最后進(jìn)行端口電壓的對(duì)比測(cè)試,測(cè)試的結(jié)果如圖5所示。
參考文獻(xiàn):
?。?]姜治臻.單片機(jī)技術(shù)及應(yīng)用.高等教育出版社,2009,7.
?。?]彭偉.單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例.電子工業(yè)出版社,2009,6.