嚴(yán) 敏
(江蘇旅游職業(yè)學(xué)院 信息工程學(xué)院,江蘇 揚(yáng)州 225127)
數(shù)字電壓表由于具有測(cè)量速度快、測(cè)量精度高、測(cè)量結(jié)果可視化顯示等優(yōu)點(diǎn),已廣泛應(yīng)用于智能測(cè)量控制的某些領(lǐng)域[1-2]。本文設(shè)計(jì)了一個(gè)基于Proteus和MedWin V3.0的直流數(shù)字電壓表,以微控制器芯片AT89C51為主控制器測(cè)量單通道模擬電壓,在ADC0832模數(shù)轉(zhuǎn)換后,輸出數(shù)字電壓值在LCD1602屏幕上實(shí)時(shí)顯示。
該設(shè)計(jì)使用單片機(jī)芯片AT89C51控制ADC0832進(jìn)行模數(shù)轉(zhuǎn)換,ADC0832輸入被測(cè)0~5V模擬電壓,經(jīng)模數(shù)轉(zhuǎn)換后,輸出的數(shù)字電壓值介于0x00~0xFF之間。單片機(jī)讀取ADC0832模數(shù)轉(zhuǎn)換結(jié)果,進(jìn)行數(shù)值量程變換,再送液晶屏LCD1602實(shí)時(shí)顯示,系統(tǒng)設(shè)計(jì)的總體結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)的總體結(jié)構(gòu)
設(shè)計(jì)電路時(shí),將引腳VCC接5 V,將GND引腳接地,并將引腳 (芯片選擇使能)連接到微控制器AT89C51的P2.5端口,引腳CLK(時(shí)鐘輸入端子)連接到AT89C51的P2.6端口,引腳DI(數(shù)據(jù)信號(hào)輸入)和引腳DO(數(shù)據(jù)信號(hào)輸出)在通信期間不同時(shí)有效,并且與AT89C51的接口是雙向的,所以將它們并聯(lián)一起連接到AT89C51的P2.7端口,引腳CH0(模擬輸入通道0)經(jīng)過(guò)滑動(dòng)變阻器連接到被測(cè)模擬電壓,由于只測(cè)量一路電壓,所以不使用引腳CH1(模擬輸入通道1),如圖2所示。當(dāng)然,這里也可以將被測(cè)模擬電壓連接到引腳CH1,不使用引腳CH0。
圖2 ADC0832電路原理圖
LCD1602屏幕可以顯示兩行字符,每行16個(gè),總共32個(gè)字符。在電路設(shè)計(jì)時(shí),引腳VSS接地,引腳VDD接5 V,引腳VEE接地。引腳RS(數(shù)據(jù)/指令寄存器選擇)、引腳R/W(讀/寫選擇)、引腳E(使能端)分別連接到AT89C51的P2端口的P2.0、P2.1、P2.2。引腳D0~ D7(8位數(shù)據(jù))直接連接到AT89C51的P0端口的P0.0~P0.7,這里使用上拉電阻RP1的目的是增加驅(qū)動(dòng)能力。
圖3 LCD1602電路原理圖
LCD1602內(nèi)部有一個(gè)80*8位的DDRAM緩沖區(qū),字符顯示位與DDRAM地址的對(duì)應(yīng)關(guān)系如表1所示,DDRAM第一行的地址從00H開始到27H結(jié)束,第二行的地址從40H開始到67H結(jié)束,每行40個(gè)地址,而LCD1602每行顯示16個(gè)字符,因此在編寫程序的時(shí)候,選用DDRAM的前16個(gè)地址即可,需要特別注意的是第二行地址是從40H開始的。如果要在LCD1602屏幕的某行某列顯示一個(gè)字符,就往某行某列對(duì)應(yīng)的DDRAM地址寫入這個(gè)字符對(duì)應(yīng)的ASCII碼,這時(shí)會(huì)發(fā)現(xiàn)液晶屏幕上并不能正常顯示出這個(gè)字符,原因就是必須在該地址的基礎(chǔ)上還要加上80H。比如,要在第二行第二列顯示電壓?jiǎn)挝环氐姆?hào)“V”,就要先將第二行第二列對(duì)應(yīng)的DDRAM地址41H加上80H,即C1H,然后在C1H地址寫入“V”字符對(duì)應(yīng)的ASCII碼0x56,這樣才能正常顯示,其它字符的顯示依此類推,不再贅述。
表1 顯示位與DDRAM的對(duì)應(yīng)關(guān)系
根據(jù)ADC0832的工作時(shí)序要求和LCD1602液晶顯示要求,該系統(tǒng)控制程序在MedwinV3.0開發(fā)軟件中用C51語(yǔ)言編寫完成,實(shí)現(xiàn)電壓表的測(cè)量功能。
void main()
{ unsigned int val; //定義變量
……
while(1)
{val=ADC(); //進(jìn)行A/D轉(zhuǎn)換
int=(val)/51; //計(jì)算整數(shù)部分
dec=(val%51)*100/51; //計(jì)算小數(shù)部分
Display1(int); //顯示整數(shù)部分
Display2(dec); //顯示小數(shù)部分 ……}
unsigned char ADC()//模數(shù)轉(zhuǎn)換子程序
{ ……
CS=0; //片選有效
CLK=1; CLK=0; //第一個(gè)脈沖的下降沿
DIO=1;
CLK=1; CLK=0; //第二個(gè)脈沖下降沿
DIO=0; //選擇通道CH0
CLK=1; CLK=0; //第三個(gè)脈沖下降沿
DIO=1; //DI失去作用
CLK=1; //第四個(gè)脈沖
for(i=0;i<8;i++)//一個(gè)字節(jié)8位數(shù)據(jù)
{CLK=1; CLK=0;
data<<=1;
data|=(unsigned char)DIO; }
CS=1; //片選無(wú)效
return data; } //將讀取的數(shù)據(jù)返回
LCD1602液晶屏的驅(qū)動(dòng)程序編寫相對(duì)復(fù)雜,一定要弄清楚1602的各個(gè)操作指令的用法和意義,主要包括顯示模式的設(shè)置、顯示開關(guān)控制、輸入模式控制、從DDRAM中讀取數(shù)據(jù)、對(duì)DDRAM進(jìn)行寫數(shù)據(jù)、清屏、光標(biāo)歸位設(shè)定、數(shù)據(jù)地址指針設(shè)置、LCD目前的忙碌工作標(biāo)志等[3],其部分代碼設(shè)計(jì)如下所示:
……
void Lcd_initial()//初始化LCD
{ E=0;
Lcd_writecmd(0x38); //16*2顯示,5*7點(diǎn)陣
msdelay (1);
Lcd_writecmd(0x08); //顯示關(guān)閉
msdelay (2);
Lcd_writecmd(0x01); //顯示清屏
msdelay (2);
Lcd_writecmd(0x06); //設(shè)置光標(biāo),讀寫一個(gè)字符后,光標(biāo)加1
msdelay (1);
Lcd_writecmd (0x0c); //顯示打開,不顯示光標(biāo)
msdelay (1); }
在Medwin V3.0開發(fā)軟件中編寫程序、修改調(diào)試程序、編譯后生成十六進(jìn)制HEX文件,打開Proteus電路設(shè)計(jì)圖,將其加載到AT89C51芯片中并啟動(dòng)仿真按鈕以查看系統(tǒng)設(shè)計(jì)的仿真結(jié)果。根據(jù)分壓原理,改變滑動(dòng)變阻器RV2的阻值大小,從而改變ADC0832輸入通道CH0的被測(cè)模擬電壓值,此時(shí)液晶 LCD1602顯示的電壓值隨之改變,并精確到小數(shù)點(diǎn)后兩位。為了便于電壓測(cè)量結(jié)果的分析,在RV2兩端加一個(gè)虛擬電壓表,同時(shí)觀察虛擬電壓表和LCD1602顯示數(shù)值的大小,分別如圖4和圖5所示。經(jīng)過(guò)多次測(cè)量,得出如下結(jié)論:被測(cè)模擬電壓和模數(shù)轉(zhuǎn)換后的數(shù)字電壓這兩者的電壓數(shù)值誤差較小,基本上約為10mV,小于8位分辨率的電壓精度5V/28≈19.53mV,可見(jiàn)測(cè)量精度高,滿足本設(shè)計(jì)要求。
圖4 虛擬電壓表
圖5 數(shù)字電壓表
本文基于Proteus和MedWin V3.0設(shè)計(jì)了直流數(shù)字電壓表,在MedWin V3.0開發(fā)環(huán)境中編寫、調(diào)試單片機(jī)C51程序,編譯完成后生產(chǎn)HEX文件并將其加載到AT89C51芯片中,以便在Proteus仿真平臺(tái)上進(jìn)行驗(yàn)證。Proteus和MedWin V3.0的聯(lián)合使用,不僅對(duì)單片機(jī)課程的課堂教學(xué)有較好的項(xiàng)目演示功能,而且對(duì)單片機(jī)項(xiàng)目的開發(fā)設(shè)計(jì)有很大的實(shí)際意義。