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

同理可知,通過修改R1和R3的電阻值,可以獲得不同的放大倍率。 3.4硬件模塊基礎——ADC0809 圖是ADC0809的外部引腳封裝結構,其詳細說明如下。 (1) OUT1~OUT8:8位并行數字量輸出引腳。 (2) INO~IN7:8位模擬量輸入引腳。 (3) VCC:正電源(圖中無標示)。 (4) GND:電源地(圖中無標示)。 (5)VREF(+):參考電壓正端引腳。 (6) VREF(-):參考電壓負端引腳。 (7) START: A/D轉換啟動信號輸入端。 (8) ALE:地址鎖存允許信號輸入端。 (9) EOC:轉換結束信號輸出引腳,開始轉換時為低電平,當轉換結束時為高電平。 (10) OE:輸出允許控制端,用于打開三態數據輸出鎖存器。 (11) CLOCK:時鐘信號輸入引腳。 (12) ADDA、ADDB、ADDC:地址輸入引腳,用于選擇輸入通道。 ADC0808進行模擬數字轉換的操作步驟如下。 (1)清除START和OE引腳電平,對ADC0809進行初始化。 (2)設置地址通道ADDA~ADDC,選擇待采集的通道數。 (3)設置START引腳,發送啟動采集信號。 (4)等待轉換完成,EOC引腳輸出高電平。 (5)設置OE引腳為高電平,讀取A/D轉換數據。 4 自動換擋數字電壓表的軟件設計 4.1 自動換擋數字電壓表的軟件模塊劃分和工作流程 自動換擋數字電壓表的軟件可以劃分為顯示模塊和A/D采集模塊兩個部分,其工作流程如下圖所示。 
,4.2 1602液晶驅動模塊函數設計 1602液晶驅動模塊函數主要用于對1602液晶進行相應的基礎操作,包括以下操作函數,其應用代碼如下所示。 (1) void delay(unsignedintz):ms級延時函數。 (2) voicl write_com(unsigned char c):向1602寫命令子函數。 (3) void write_data(unsigned char d):向1602寫數據子函數。 (4) voidlnltialize():LCD初始化子函數。 應用代碼使用P0端口作為數據通信端口,然后使用P2.0和P2.1作為相應的控制引腳對1602進行控制。 void delay(unsignedintz) //延時子函數 z*1ms { unsigned int x,y; for(x=z;x>0x--) for(y=110;y>0;y--); } void write_com(unsigned char c) //寫命令子函數 { lcdrs=0;//低電平選擇為“寫指令” lcden=0; LEDDATA=c;//把指令寫入P0口 delay(5);//參考時序圖 lcden=1; //開使能 delay(5);//讀取指令 lcden=0;//關閉使能 } void write_data(unsigned char d) //寫數據子函數 { lcdrs=1; //高電平選擇為“寫數據” LEDDATA=d; //把數據寫入P0口 delay(5); //參考時序圖 lcden=1; //開使能 delay(5); //讀取數據 lcden=0; //關閉使能 } void initialize() //LCD初始化函數 { unsigned char num; lcden=0; write_com(0x38); //設辮16x2顯示,5x7點陣顯示.8位數據接口 writc_com(0x0c); //00001DCB,D(開關顯示).C(是否顯示光標),B(光標閃爍, //光標不顯示) write_com(0x06); //000001N0,N(地址指針+-1) write_com(0x01); //清屏指令 每次顯示下一屏內容時,必須清屏 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:高電平移動字符,低電平移動光標; //R/L:高電平左移,低電平右移 delay(300); } delay(1000); write_com(0x01);∥清屏指令,每次顯示下一屏內容時,必須清屏 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 自動換擋數字電壓表的軟件綜合 自動換擋數字電壓表的軟件綜合如下所示,其中涉及的1602液晶的驅動模塊函數代碼可以參考前一節。 應用代碼分別定義了v20_on,v2_on和v02_on三個宏定義,用于擋位的切換。
5 自動換擋數字電壓表應用系統仿真與總結 在Proteus中繪制如圖16.3所示的電路,其中涉及的Proteus電路器件參見表。 
單擊運行,調節RV1的電阻值,可以看到對應的測量輸出,如圖所示。 
總結:如果設置更多的放大器放大倍率,則可以增加數字電壓表的擋位。
單片機源程序如下:- #include <AT89X52.H>
- #define LEDDATA P0
- #define v20_on {s3=0;s2=0;s1=1;} //宏定義不同量程,不同的開關狀態
- #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黑下載附件…………
復制代碼
1.png (22.98 KB, 下載次數: 73)
下載附件
2017-12-1 21:26 上傳
proteus仿真+源碼+教程下載:
http://www.zg4o1577.cn/bbs/dpj-100242-1.html
|