自動換擋數(shù)字電壓表 電壓表是用于測量當(dāng)前電路兩點(diǎn)之間電壓值的儀器,而數(shù)字電壓表是用模/數(shù)轉(zhuǎn)換器將測量電壓值轉(zhuǎn)換成數(shù)字形式并以數(shù)字形式表示的儀器,它是電路設(shè)計中最常用的儀器之一。 本章應(yīng)用實(shí)例涉及的知識如下: >數(shù)字電壓表的實(shí)現(xiàn)原理; >運(yùn)算放大器LM324的應(yīng)用原理: > A/D芯片ADC0809的應(yīng)用原理; > 1602數(shù)字字符液晶模塊的應(yīng)用原理。 1 自動換擋數(shù)字電壓表的背景介紹 數(shù)字電壓表通常都有擋程的概念,所謂擋程是指電壓表當(dāng)前的測量范圍,這個范圍決定了測量的精度。例如,當(dāng)被測量電壓范圍為0~2V時選擇0~5V擋就比選擇0~10V擋測量精度要高。 自動換擋數(shù)字電壓表就是一個能自動切換擋程的數(shù)字電壓表,可以測量0~20V的電壓,并且有0~0.2V、0~2V和0~20V三個擋程可供選擇,當(dāng)待測量電壓值發(fā)生變化之后,電壓表可以根據(jù)輸入電壓的情況自動選擇合適的擋程進(jìn)行測量,并且把測量結(jié)果顯示出來。 2 自動換擋數(shù)字電壓表的設(shè)計思路 2.1 自動換擋數(shù)字電壓表的工作流程 自動換擋數(shù)字電壓表的工作流程如圖所示。 
2.2 自動換擋數(shù)字電壓表的需求分析 設(shè)計自動換擋數(shù)字電壓表,需要考慮以下幾方面的內(nèi)容: (1) 51單片機(jī)使用何種方式將模擬電壓值轉(zhuǎn)換為數(shù)字值; (2) 51單片機(jī)如何控制進(jìn)行相應(yīng)的擋位切換:比較 (3) 51單片機(jī)如何顯示對應(yīng)的采集值: (4)需要設(shè)計合適的單片機(jī)軟件。 2.3 自動換擋數(shù)字電壓表的換擋原理 自動換擋數(shù)字電壓表對當(dāng)前的輸入電壓信號進(jìn)行調(diào)理,得到三種不同放大倍率的電壓信號,然后分別對這三組信號進(jìn)行檢測,通過相應(yīng)的算法選擇合適的電壓信號進(jìn)行采集。 3 自動換擋數(shù)字電壓表的硬件設(shè)計 3.1 自動換擋數(shù)字電壓表的硬件模塊 自動換擋數(shù)字電壓表的硬件模塊如圖所示,其各個部分詳細(xì)說明如下。 
(1) 51單片機(jī):自動換擋數(shù)字電壓表的核心控制器。 (2)顯示模塊:顯示當(dāng)前的測量電壓。 (3)擋位切換/電壓調(diào)理模塊:對輸入電壓進(jìn)行調(diào)理,并且選擇合適的測量擋位。 (4) A/D采集模塊:將當(dāng)前的模擬電壓信號轉(zhuǎn)換為數(shù)字信號。 3.2 自動換擋數(shù)字電壓表的電路 自動換擋數(shù)字電壓表的電路如圖所示,51單片機(jī)使用P0端口以及P2.0. P2.1驅(qū)動一塊1602液晶模塊用于顯示當(dāng)前的電壓值,使用P1和P3的部分引腳擴(kuò)展一片ADC0808作為模擬擻字信號轉(zhuǎn)換器,輸入的待檢測電壓信號經(jīng)過調(diào)理模塊腳心調(diào)理后變成三路獨(dú)立的信號輸出。 
圖中AMP模塊是輸入信號電路調(diào)理模塊,如圖所示。 
由上圖可知,輸入信號經(jīng)過三個不同放大倍率的放大電路進(jìn)行放大之后,再通過一個跟隨器處理得到三個不同倍率的電壓信號,以供ADC0808進(jìn)行處理。 自動換擋數(shù)字電壓表中涉及的典型元件說明參考下表。 
3.3 硬件模塊基礎(chǔ)-LI\/1324 LM324是四運(yùn)放集成電路,它采用14腳雙列直插塑料封裝,其引腳封裝結(jié)構(gòu)如圖所示。 
LM324的內(nèi)部集成了四組形式完全相同的運(yùn)算放大器,它們除公用電源外彼此獨(dú)立,其引腳說明如下。 (1)“+”:同相輸入引腳,表示和運(yùn)放輸出引腳Vo的信號相同。 (2)“-”:反相輸入引腳,表示和運(yùn)放輸出引腳Vo的信號相反。 (3)“V+”:正電源輸入引腳。 (4)“V-”:負(fù)電源輸入引腳。 (5)“Vo":信號輸出端。 運(yùn)算放大器的具體使用方法可以參考如下內(nèi)容。 uA741是最常用的通用高增益運(yùn)算放大器,其基本參數(shù)如下: (1)雙列直插8引腳或圓筒8引腳封裝。 (2)工作電壓:+、-12V。 (3)差分電壓:+/-30V。 (4)輸入電壓:+/-18V (5)允許功耗:500mW。 其引腳與OP7運(yùn)算放大器完全一樣,可以互相替代。使用方法如下: 單片機(jī)應(yīng)用系統(tǒng)通常使用集成運(yùn)算放大器來對信號進(jìn)行放大操作。集成運(yùn)算放大器(運(yùn)放) 是具有很高放大倍數(shù)的電路單元,在實(shí)際應(yīng)用電路中,通常結(jié)合反饋網(wǎng)絡(luò)共同組成某種功能模塊。由于早期應(yīng)用于模擬計算機(jī)中,用于實(shí)現(xiàn)數(shù)學(xué)運(yùn)算,故得名“運(yùn)算放大器”,此名稱一直沿用至今。運(yùn)算放大器是一個從功能的角度命名的電路單元,其功能既可以由分立的元器件實(shí)現(xiàn),也可以在半導(dǎo)體芯片中實(shí)現(xiàn)。隨著半導(dǎo)體技術(shù)的發(fā)展,如今絕大部分的運(yùn)算放大器是以單片的形式存在。運(yùn)算放大器的種類繁多,應(yīng)用廣泛。 如下圖左所示,運(yùn)算放大器通常包括反相輸入端(-,引腳2)、同相輸入端(+,引腳3)和一個輸出端(引腳1),引腳4和引腳8則分別接供電電源正極和供電電源負(fù)極,最常見的集成運(yùn)算放大器的芯片有uA741等。 
使用運(yùn)算放大器對輸入信號進(jìn)行放大的應(yīng)用電路如上圖右所示,運(yùn)算放大器的輸入和輸出電壓的關(guān)系如下。 
從上式可以看到,通過修改R1和R2的電阻值,可以得到不同的放大倍率,下圖是一個正弦波通過同相放大器的輸入、輸出信號波形的對比。 
上圖是使用集成放大器實(shí)現(xiàn)同相放大(也就是說輸出電壓和輸出電壓的極性是相同的)的應(yīng)用電路,而在實(shí)際使用中常常使用反相放大電路對電壓進(jìn)行放大,其應(yīng)用電路如下圖所示。 
運(yùn)算放大器反相放大電路的輸入、輸出電壓關(guān)系可通過下式獲得,下圖是正弦波通過反相放大器的輸入、輸出信號波形對比。 

同理可知,通過修改R1和R3的電阻值,可以獲得不同的放大倍率。 3.4硬件模塊基礎(chǔ)——ADC0809 圖是ADC0809的外部引腳封裝結(jié)構(gòu),其詳細(xì)說明如下。 (1) OUT1~OUT8:8位并行數(shù)字量輸出引腳。 (2) INO~I(xiàn)N7:8位模擬量輸入引腳。 (3) VCC:正電源(圖中無標(biāo)示)。 (4) GND:電源地(圖中無標(biāo)示)。 (5)VREF(+):參考電壓正端引腳。 (6) VREF(-):參考電壓負(fù)端引腳。 (7) START: A/D轉(zhuǎn)換啟動信號輸入端。 (8) ALE:地址鎖存允許信號輸入端。 (9) EOC:轉(zhuǎn)換結(jié)束信號輸出引腳,開始轉(zhuǎn)換時為低電平,當(dāng)轉(zhuǎn)換結(jié)束時為高電平。 (10) OE:輸出允許控制端,用于打開三態(tài)數(shù)據(jù)輸出鎖存器。 (11) CLOCK:時鐘信號輸入引腳。 (12) ADDA、ADDB、ADDC:地址輸入引腳,用于選擇輸入通道。 ADC0808進(jìn)行模擬數(shù)字轉(zhuǎn)換的操作步驟如下。 (1)清除START和OE引腳電平,對ADC0809進(jìn)行初始化。 (2)設(shè)置地址通道ADDA~ADDC,選擇待采集的通道數(shù)。 (3)設(shè)置START引腳,發(fā)送啟動采集信號。 (4)等待轉(zhuǎn)換完成,EOC引腳輸出高電平。 (5)設(shè)置OE引腳為高電平,讀取A/D轉(zhuǎn)換數(shù)據(jù)。 4 自動換擋數(shù)字電壓表的軟件設(shè)計 4.1 自動換擋數(shù)字電壓表的軟件模塊劃分和工作流程 自動換擋數(shù)字電壓表的軟件可以劃分為顯示模塊和A/D采集模塊兩個部分,其工作流程如下圖所示。 
,4.2 1602液晶驅(qū)動模塊函數(shù)設(shè)計 1602液晶驅(qū)動模塊函數(shù)主要用于對1602液晶進(jìn)行相應(yīng)的基礎(chǔ)操作,包括以下操作函數(shù),其應(yīng)用代碼如下所示。 (1) void delay(unsignedintz):ms級延時函數(shù)。 (2) voicl write_com(unsigned char c):向1602寫命令子函數(shù)。 (3) void write_data(unsigned char d):向1602寫數(shù)據(jù)子函數(shù)。 (4) voidlnltialize():LCD初始化子函數(shù)。 應(yīng)用代碼使用P0端口作為數(shù)據(jù)通信端口,然后使用P2.0和P2.1作為相應(yīng)的控制引腳對1602進(jìn)行控制。 void delay(unsignedintz) //延時子函數(shù) z*1ms { unsigned int x,y; for(x=z;x>0x--) for(y=110;y>0;y--); } void write_com(unsigned char c) //寫命令子函數(shù) { lcdrs=0;//低電平選擇為“寫指令” lcden=0; LEDDATA=c;//把指令寫入P0口 delay(5);//參考時序圖 lcden=1; //開使能 delay(5);//讀取指令 lcden=0;//關(guān)閉使能 } void write_data(unsigned char d) //寫數(shù)據(jù)子函數(shù) { lcdrs=1; //高電平選擇為“寫數(shù)據(jù)” LEDDATA=d; //把數(shù)據(jù)寫入P0口 delay(5); //參考時序圖 lcden=1; //開使能 delay(5); //讀取數(shù)據(jù) lcden=0; //關(guān)閉使能 } void initialize() //LCD初始化函數(shù) { unsigned char num; lcden=0; write_com(0x38); //設(shè)辮16x2顯示,5x7點(diǎn)陣顯示.8位數(shù)據(jù)接口 writc_com(0x0c); //00001DCB,D(開關(guān)顯示).C(是否顯示光標(biāo)),B(光標(biāo)閃爍, //光標(biāo)不顯示) write_com(0x06); //000001N0,N(地址指針+-1) write_com(0x01); //清屏指令 每次顯示下一屏內(nèi)容時,必須清屏 write_com(0x80+0xl0); //第一行,頂格顯示 tor(num=0;num<17;num++) write_data(mytable0[num]); delay(10); write_com(0x80+0x50); //第二行,從第一格開始顯示 for(num=0;num<15; num++) { write_data(mytable1[num]); delay(10); } for(num=0;num<16;num++) { write_com(0x1c); //0001(S/C)(R/L)**;S/C:高電平移動字符,低電平移動光標(biāo); //R/L:高電平左移,低電平右移 delay(300); } delay(1000); write_com(0x01);∥清屏指令,每次顯示下一屏內(nèi)容時,必須清屏 write_com(0x80); for(num=0;num<14;num++) { write_data(line0[num]); delay(10); } write_com(0x80+0x40); for(num=0;num<15;num++) { write_data(line1[num]); delay(10); } } void value(unsigned char add,unsigned char dat) { write_com(0x80+0x47+add); if(l= =3&&add==2||l!=3&&add==1) { write_data(0x2e); } else { write_data(0x30+dat); } } 4.3 自動換擋數(shù)字電壓表的軟件綜合 自動換擋數(shù)字電壓表的軟件綜合如下所示,其中涉及的1602液晶的驅(qū)動模塊函數(shù)代碼可以參考前一節(jié)。 應(yīng)用代碼分別定義了v20_on,v2_on和v02_on三個宏定義,用于擋位的切換。
5 自動換擋數(shù)字電壓表應(yīng)用系統(tǒng)仿真與總結(jié) 在Proteus中繪制如圖16.3所示的電路,其中涉及的Proteus電路器件參見表。 
單擊運(yùn)行,調(diào)節(jié)RV1的電阻值,可以看到對應(yīng)的測量輸出,如圖所示。 
總結(jié):如果設(shè)置更多的放大器放大倍率,則可以增加數(shù)字電壓表的擋位。
單片機(jī)源程序如下:- #include <AT89X52.H>
- #define LEDDATA P0
- #define v20_on {s3=0;s2=0;s1=1;} //宏定義不同量程,不同的開關(guān)狀態(tài)
- #define v2_on {s3=0;s2=1;s1=0;}
- #define v02_on {s3=1;s2=0;s1=0;}
- unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4~0x66,0x6d,0x7d,0x07,0x7f,0x6t0x00};
- unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};
- unsigned char getdata;
- unsigned long temp;
- unsigned char i,k,l,m;
- unsigned char code mytable0[]="Welc0met0use “;
- unsigned char code mytable1[]="Auto Voltmeter!";
- unsigned char code line0[]=" Voltmeter "; //初始化顯示
- unsigned char code Iine1[]=”Value: V ";
- //引腳定義
- sbit lcdrs=P2^0;
- sbit lcden=P2^1;
- sbit s3=P3^7;
- sbit s2=P3^6;
- sbit s1=P3^5;
- sbit OE=P3^0;
- sbit EOC=P3^1;
- sbit ST=P3^2;
- main()
- {
- initialize();
- while(1)
- _20v:
- {
- v20_on;
- ST=0;
- ST=1;
- ST=0;
- while(EOC==0);
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata<21)
- {goto _2v; }
- l=3;
- temp=getdata;
- temp=temp*1000/51)/2;
- goto disp;
- _2v:
- v2_on;
- ST=0;
- ST=1;
- ST=0;
- while(EOC==0);
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata<21)
- {
- goto _02v;
- }
- else if(getdata>204)
- {
- goto _20v;
- }
- l=2;
- temp=getdata;
- tempjtemp*1000/51)/2;
- goto disp;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
1.png (22.98 KB, 下載次數(shù): 73)
下載附件
2017-12-1 21:26 上傳
proteus仿真+源碼+教程下載:
http://www.torrancerestoration.com/bbs/dpj-100242-1.html
|