電壓表編程
A. 怎樣用單片機設計多路數字電壓表
單片機設計多路數字電壓表,主要是設計採集,將輸入的電壓量(模擬信號)轉換成數字量(二進制),通常老的方案都是用51單片機+AD轉換晶元。AD轉換晶元的位數就決定了你的解析度,你的是5V/0.019=263,轉換成為二進制數8位AD晶元可能精度不夠,要選用10位AD晶元,最小解析度可以達到0.0048V,如果按照經典老方案來做,你的成本會比較高51單片機6元+10位AD晶元20元。建議你採用帶有51內核並自帶AD功能的單片機,如STC5412AD,價格只要13-14元就可以了,而且編程方便,不需要增加外圍電路。因為STC5412AD晶元IO口比較少,只有23個IO口,我數碼管顯示和鍵盤掃描用的ZLG7289,我自己做出來一個,效果很好,電壓能精確到0.001V顯示。我只了1路顯示,STC5412AD單片機還有其他AD口可以用,一塊晶元可以做出4路電壓採集來。多路的話建議用多路開關進行切換就好了,否則成本太高。
B. 數字電壓表設計論文
基於PC的數字電壓表設計
本文運用AT89S51和AD678進行A/D轉換,根據數據採集的工作原理,設計實現數字電壓表,最後完成單片機與PC的數據通信,傳送所測量的電壓值
數字電壓表的設計和開發,已經有多種類型和款式。傳統的數字電壓表各有特點,它們適合在現場做手工測量,要完成遠程測量並要對測量數據做進一步分析處理,傳統數字電壓表是無法完成的。然而基於PC通信的數字電壓表,既可以完成測量數據的傳遞,又可藉助PC,做測量數據的處理。所以這種類型的數字電壓表無論在功能和實際應用上,都具有傳統數字電壓表無法比擬的特點,這使得它的開發和應用具有良好的前景。
新型數字電壓表的整機設計
該新型數字電壓表測量電壓類型是直流,測量范圍是-5~+5V。整機電路包括:數據採集電路的單片機最小化設計、單片機與PC介面電路、單片機時鍾電路、復位電路等。下位機採用AT89S51晶元,A/D轉換採用AD678晶元。通過RS232串列口與PC進行通信,傳送所測量的直流電壓數據。整機系統電路如圖1所示。
數據採集電路的原理
在單片機數據採集電路的設計中,做到了電路設計的最小化,即沒用任何附加邏輯器件做介面電路,實現了單片機對AD678轉換晶元的操作。
AD678是一種高檔的、多功能的12位ADC,由於其內部自帶有采樣保持器、高精度參考電源、內部時鍾和三態緩沖數據輸出等部件,所以只需要很少的外部元件就可以構成完整的數據採集系統,而且一次A/D轉換僅需要5ms。
在電路應用中,AD678採用同步工作方式,12位數字量輸出採用8位操作模式,即12位轉換數字量採用兩次讀取的方式,先讀取其高8位,再讀取其低4位。根據時序關系,在晶元選擇/CS=0時,轉換端/SC由高到低變化一次,即可啟動A/D轉換一次。再查詢轉換結束端/EOC,看轉換是否已經結束,若結束則使輸出使能/OE變低,輸出有效。12位數字量的讀取則要控制高位元組有效端/HBE,先讀取高位元組,再讀取低位元組。整個A/D操作大致如此,在實際開發應用中調整。
由於電路中採用AD678的雙極性輸入方式,輸入電壓范圍是-5~+5V,根據公式Vx10(V)/4096*Dx,即可計算出所測電壓Vx值的大小。式中Dx為被測直流電壓轉換後的12位數字量值。
RS232介面電路的設計
AT89S51與PC的介面電路採用晶元Max232。Max232是德州儀器公司(TI)推出的一款兼容RS232標準的晶元。該器件包含2個驅動器、2個接收器和1個電壓發生器電路提供TIA/EIA-232-F電平。Max232晶元起電平轉換的功能,使單片機的TTL電平與PC的RS232電平達到匹配。
串口通信的RS232介面採用9針串口DB9,串口傳輸數據只要有接收數據針腳和發送針腳就能實現:同一個串口的接收腳和發送腳直接用線相連,兩個串口相連或一個串口和多個串口相連。在實驗中,用定時器T1作波特率發生器,其計數初值X按以下公式計算:
串列通信波特率設置為1200b/s,而SMOD=1,fosc=6MHz,計算得到計數初值X=0f3H。在編程中將其裝入TL1和THl中即可。
為了便於觀察,當每次測量電壓採集數據時,單片機有埠輸出時,用發光二極體LED指示。
軟體編程
軟體程序主要包括:下位機數據採集程序、上位機可視化界面程序、單片機與PC串口通信程序。單片機採用C51語言編程,上位機的操作顯示界面採用VC++6.0進行可視化編程。在串口通信調試過程中,藉助「串口調試助手」工具,有效利用這個工具為整個系統提高效率。
單片機編程
下位機單片機的數據採集通信主程序流程如圖2所示、中斷子程序如圖3所示、採集子程序如圖4所示。單片機的編程模擬調試藉助WAVE2000模擬器,本系統有集成的ISP模擬調試環境。
在採集程序中,單片機的編程操作要完全符合AD678的時序規范要求,在實際開發中,要不斷加以調試。最後將下位機調試成功而生成的.bin文件固化到AT89S51的Flash單元中。
人機界面編程
打開VC++6.0,建立一個基於對話框的MFC應用程序,串口通信採用MSComm控制項來實現。其他操作此處不贅述,編程實現一個良好的人機界面。數字直流電壓表的操作界面如圖5所示。運行VC++6.0編程實現的Windows程序,整個樣機功能得以實現。
功能結果
根據上面所述工作原理及實施方案,在實踐中很好地實現了整個樣機的功能,各項指標達到了預先的設計要求。電路工作穩定,每次測量均伴有LED發光指示,可視化界面顯示也正常。
AD678轉換精度是12位,它的解析度為1/4096。這為整機系統的高精度提供了保障。為了提高測量精度,運用了AD678自帶的校準電路,這樣使其A/D轉換精度更高。在實際測量中,整機測量精度達到了0.8%。
C. 數字電壓表 一、 要求:以單片機為核心,設計一個數字電壓表
單片機為控制器,採用中斷方式,對2路0~5V的模擬電壓進行?
更好被了
D. 數字電壓表電路怎麼設計啊
摘 要:
本文介紹了用ADC0808集成電壓轉換晶元和AT89C51單片機設計製作的數字直流電壓表。在測量儀器中,電壓表是必須的,而且電壓表的好壞直接影響到測量精度。具有一個精度高、轉換速度快、性能穩定的電壓表才能符合測量的要求。為此,我們設計了數字電壓表,此作品主要由A/D0808轉換器和單片機AT89C51構成,A/D轉換器在單片機的控制下完成對模擬信號的採集和轉換功能,最後由數碼管顯示採集的電壓值。此設計通過調試完全滿足設計的指標要求。電路設計簡單,設計製作方便有較強的實用性。
關鍵詞:
ADC0808;單片機AT89C51;數字電壓表
Abstract:
In this paper, with ADC0808 voltage converter integrated chips and microcontroller designed AT89C51 the number of DC voltage table. In measuring instruments, voltage meter is necessary, and voltage meter will have a direct impact on measurement accuracy. With a high precision, the conversion speed and stable performance of the voltage meter to conform to the requirements of measurement. To this end, we design a digital voltage meter, this works mainly by A/D0808 converter and a microcontroller AT89C51, A / D converter under the control of the MCU to complete the acquisition and analog signal conversion functions, from the final Acquisition of the digital display voltage value. This design through debugging to fully meet the design requirements of the target. Circuit design simple, designed to facilitate a more practical.
Key words:
ADC0808; SCM AT89C51; Digital Voltmeter
目 錄
1.設計方案……………………………………………………………………………………1
2. 系統硬體設計……………………………………………………………………………2
2.1單片機晶元……………………………………………………………………………2
2.1.1.單片機晶元選擇……………………………………………………………2
2.1.2.單片機管腳說明……………………………………………………………3
2.2.A/D轉換器……………………………………………………………………………5
2.2.1.A/D轉換器晶元選擇………………………………………………………5
2.2.2.A/D轉換器管腳說明………………………………………………………6
2.3.電壓顯示電路…………………………………………………………………………7
3.系統程序設計……………………………………………………………………………………8
3.1.軟體總體框架設計……………………………………………………………………8
4.系統總圖及程序…………………………………………………………………………………9
5.參考文獻………………………………………………………………………………………………12
6.結束語……………………………………………………………………………………………………13
1.設計方案
在電量的測量中,電壓、電流和頻率是最基本的三個被測量,其中電壓量的測量最為經常。而且隨著電子技術的發展,更是經常需要測量高精度的電壓,所以數字電壓表就成為一種必不可少的測量儀器。數字電壓表(Digital Voltmeter)簡稱DVM,它是採用數字化測量技術,把連續的模擬量(直流或交流輸入電壓)轉換成不連續、離散的數字形式並加以顯示的儀表。由於數字式儀器具有讀數准確方便、精度高、誤差小、靈敏度高和解析度高、測量速度快等特點而倍受青睞。本設計從各個角度分析了由單片機組成的數字電壓表的設計過程及各部分電路的組成及其原理,並且分析了程序如何驅動單片機進而使系統運行起來的原理及方法。框圖如下:
本設計主要分為兩部分:硬體電路及軟體程序。而硬體電路又大體可分為A/D轉換電路、LED顯示電路,各部分電路的設計及原理將會在硬體電路設計部分詳細介紹;程序的設計使用匯編語言編程,利用WAVE和PROTEUS 軟體對其編譯和模擬,詳細的設計演算法將會在程序設計部分詳細介紹。
2.系統硬體電路設計
2.1 單片機晶元
2.1.1.單片機晶元選擇
AT89C51簡介
AT89C51是一種帶4K位元組閃爍可編程可擦除只讀存儲器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機。由於將多功能8位CPU和閃爍存儲器組合在單個晶元中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。外形及引腳排列如圖所示
圖2.1_1 AT89C51引腳圖
2.1.2.單片機管腳說明
主要特性:
•與MCS-51 兼容
•4K位元組可編程閃爍存儲器
•壽命:1000寫/擦循環
•數據保留時間:10年
•全靜態工作:0Hz-24Hz
•三級程序存儲器鎖定
•128×8位內部RAM
•32可編程I/O線
•兩個16位定時器/計數器
•5個中斷源
•可編程串列通道
•低功耗的閑置和掉電模式
•片內振盪器和時鍾電路
管腳接法說明:
VCC:供電電壓我們接+5V。
GND:接地。
P0口:在這個設計中我們將AT89C51做為BCD碼的輸出口與LED顯示器相連。由於P0口輸出驅動電路中沒有上拉電阻,所以我們在外接電路上接上拉電阻。
P1口:把AT89C51中的P1口與ADC0808的輸出端相連,做為數字信號的接收端。
P2口:我們把P2口做為位碼輸出口,以P2.0—2.3輸出位控線與LED顯示器相連.
P3口:利用P3.0,P3.1,P3.2,P3.4,P3.5,P3.6分別與ADC0808的OE,EOC,START/ALE,A,B,C端相連。
XTAL1 ,XTAL2:外接一振盪電路。
圖2.1.2 振盪電路
RST:在此端接一復位電路。
圖2.1.3 復位電路
2.2 A/D轉換器與單片機介面電路
2.2.1.A/D轉換器晶元選擇
A/D轉換器是模擬量輸入通道中的一個環節,單片機通過A/D轉換器把輸入模擬量變成數字量再處理。
隨著大規模集成電路的發展,目前不同廠家已經生產出了多種型號的A/D轉換器,以滿足不同應用場合的需要。如果按照轉換原理劃分,主要有3種類型,即雙積分式A/D轉換器、逐次逼近式A/D轉換器和並行式A/D轉換器。目前最常用的是雙積分和逐次逼近式。
雙積分式A/D轉換器具有抗干擾能力強、轉換精度高、價格便宜等優點,比如ICL71XX系列等,它們通常帶有自動較零、七段碼輸出等功能。與雙積分相比,逐次逼近式A/D轉換的轉換速度更快,而且精度更高,比如ADC0808、ADC0809等,它們通常具有8路模擬選通開關及地址解碼、鎖存電路等,它們可以與單片機系統連接,將數字量送入單片機進行分析和顯示。
本設計中,由於對精度沒做很大要求,我們採用逐次逼近式A/D轉換ADC0808,精度為0.02,所以四位LED顯示中的最後一位我們設置為V。
圖2.2.1 ADC0808引腳圖
2.2.2.A/D轉換器ADC0808的管腳說明:
IN0~IN7:為模擬量的輸入口,我們選取IN3口為入口,外接可變電阻,通過改變阻值來控制模擬量的輸入。
A、B、C:3位地址輸入,2個地址輸入端的不同組合選擇八路模擬量輸入。這里我們將A,B接高電平,C為低電平。
ALE:地址鎖存啟動信號,在ALE的上升沿,將A、B、C上的通道地址鎖存到內部的地址鎖存器。
D0~D7:八位數據輸出線,A/D轉換結果由這8根線傳送給單片機。
OE:允許輸出信號。當OE=1時,即為高電平,允許輸出鎖存器輸出數據。
START:啟動信號輸入端,START為正脈沖,其上升沿清除ADC0808的內部的各寄存器,其下降沿啟動A/D開始轉換。
EOC:轉換完成信號,當EOC上升為高電平時,表明內部A/D轉換已完成。
CLK:時鍾輸入信號,選用頻率500KHZ。
圖2.2.2 時鍾信號
2.3 電壓顯示電路:
設計中採用的是4段LED數碼管來顯示電壓值。LED具有耗電低、亮度高、視角大、線路簡單、耐震及壽命長等優點,它由4個發光二極體組成,其中3個按『8』字型排列,另一個發光二極體為圓點形狀,位於右下角,常用於顯示小數點。把4個發光二極體連在一起,公共端接高電平,叫共陽極接法,相反,公共端接低電平的叫共陰極接法,我們採用共陰極接法。當發光二極體導通時,相應的一段筆畫或點就發亮,從而形成不同的發光字元。其8段分別命名為dp g f e d c b a。例如,要顯示「0」,則dp g f e d c b a分別為:00111111B;若要顯示多個數字,只要讓若干個數碼管的位碼循環為高電平就可以了。
根據設計要求,顯示電路需要至少4位LED數碼管來顯示電壓值,我們再多加一位用來顯示電壓單位「V」,則有7位LED循環顯示。利用單片機的I/O口驅動LED數碼管的亮滅,設計中由P0口驅動LED的段碼顯示,即顯示字元,由P2口選擇LED位碼,即選擇點
亮哪位LED來顯示。
圖2.3 LED管
另外,一般I/O介面晶元的驅動能力是很有限的,在LED顯示器介面電路中,輸出口所能提供的驅動電流一般是不夠的尤其是設計中需要用到多位LED,此時就需要增加LED驅動電路。驅動電路有多種,常用的是TTL或MOS集成電路驅動器,在本設計中採用了ADC0808晶元驅動電路。
3.系統程序設計
3.1軟體總體框架設計
在編寫匯編語言時,先存放數碼管的段碼,再存放轉換後的數據,選取通道並設值.再將AD轉換結果轉換成BCD碼,通過換算LED上顯示.
再換算中,利用關系得到LED上個位,十位,百位的顯示,然後設置小數點:
開始
預設初值
選取通道3
啟動A/D轉換
否
是
數碼顯示子程序
延時顯示結果
結束
在系統上電開始測量前,要用萬用表的電壓檔對被測電壓進行估測,然後再測。
4.系統總圖及程序
LED_0 EQU 30H;
LED_1 EQU 31H;
LED_2 EQU 32H;
LED_3 EQU 33H;
ADC EQU 35H;
ST BIT P3.2;
OE BIT P3.0;
EOC BIT P3.1;
ORG 00H;
START: MOV LED_0,#00H;
MOV LED_1,#00H;
MOV LED_2,#00H;
MOV LED_3,#00H;
MOV DPTR,#TABLE;
SETB P3.4;
SETB P3.5;
CLR P3.6;
WAIT: CLR ST;
SETB ST;
CLR ST;
JNB EOC,$;
SETB OE;
MOV ADC,P1;
CLR OE;
MOV A,ADC;
MOV B,#51;
DIV AB;
MOV LED_3,A;
MOV A,B;
MOV B,#5;
DIV AB;
MOV LED_2,A;
MOV LED_1,B;
LCALL DISP;
SJMP WAIT;
DISP: MOV A,#3EH;
CLR P2.3;
MOV P0,A;
LCALL DELAY;
SETB P2.3;
MOV A,LED_1;
MOVC A,@A+DPTR;
CLR P2.2;
MOV P0,A;
LCALL DELAY;
SETB P2.2;
MOV A,LED_2;
MOVC A,@A+DPTR;
CLR P2.1;
MOV P0,A;
LCALL DELAY;
SETB P2.1;
MOV A,LED_3;
MOVC A,@A+DPTR;
ORL A,#80H;
CLR P2.0;
MOV P0,A;
LCALL DELAY;
SETB P2.0;
RET;
DELAY: MOV R6,#10;
D1: MOV R7,#250;
DJNZ R7,$;
DJNZ R6,D1;
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,
END
數字直流電壓表的總圖
E. 數字電壓表軟體編程,需要測0~5V,誤差怎麼改
有個基準采樣電壓。把那個弄准確了。。。一般就不會錯了。。。
F. 單片機at89s51和adc0809設計一個數字電壓表,能夠測量0~5v 的直流電壓,三位數碼顯示,要求使用元件盡量
轉載:數字電壓表程序,
用數字濾波的方式,並在LCD 1602上顯示
//////////////////////////////////////////////////
// Author : Toby
// Date : 2009/03/08
// Function : 數字電壓表程序,用數字濾波的方式,並在LCD 1602上顯示
// MCU : PIC16F877A
// C Compiler : PICC 8.05
// IDE : MPLAB IDE v8.10
/////////////////////////////////////////////////
__CONFIG(0x1832);
//晶元配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振盪
union adres //定義一個共用體,用於存放10位A/D轉換的結果
{int y1;
unsigned char adre[2];
}adresult;
unsigned int ADC=0;
void adinitial_voltage(void); // RA0為AD輸入
const char TABLE[]={'0','1','2','3','4','5','6','7','8','9'}; //定義常數0-9的數據表格
const char data[4]={'0','0','0','0'};
#define rs RA1
#define rw RA2
#define e RA3
const char voltage[ ]={'V','O','L','T','A','G','E','='};
unsigned char ge=0,shi=0,=0,qian=0; //定義6個臨時變數
void init(); //申明I/O口初始化函數
void lcd_init(); //申明LCD初始化函數
void lcd_dis();
void write_voltage();
void write(char x); //申明顯示1位元組數據函數
void lcd_enable(); //申明LCD顯示設置函數
void delay(); //申明延時函數
//---------------------------------------
//主函數
void main()
{
unsigned char a;
init(); //調用I/O口初始化函數
while(1)
{
adinitial_voltage();
lcd_init(); //調用LCD初始化函數
for(a=10;a>=1;a--)
{
PORTD=0X80;
lcd_enable();
write_voltage();
PORTD=TABLE[qian]; //待顯示數據送PORTD口
lcd_dis();
PORTD='.'; //待顯示數據送PORTD口
lcd_dis();
PORTD=TABLE[]; //待顯示數據送PORTD口
lcd_dis();
PORTD=TABLE[shi]; //待顯示數據送PORTD口
lcd_dis();
PORTD=TABLE[ge]; //待顯示數據送PORTD口
lcd_dis();
}
}
}
//---------------------------------------
//I/O口初始化函數
void init()
{
ADCON1=0X0; //設置A口為普通I/O口
TRISA=0B00000001; //設置A口為輸出
TRISD=0X00; //設置D口為輸出
}
//---------------------------------------
//LCD初始化函數
void lcd_init()
{
PORTD=0X1; //清除顯示
lcd_enable();
PORTD=0X38; //8位2行5*7點陣
lcd_enable();
PORTD=0X0c; //顯示開,游標開,閃爍
lcd_enable();
PORTD=0X06; //文字不動,游標右移
lcd_enable();
}
//--------------------------------------
//顯示公司tel函數
void write_voltage()
{
unsigned char i;
for(i=0;i<=7;i++) //一共顯示16位元組數據
{
write(voltage[i]); //查表獲取數據並調用寫一個位元組數據函數送LCD顯示
}
}
//--------------------------------------
//寫一個位元組數據函數
void write(char x)
{
PORTD=x; //待顯示數據送PORTD口
lcd_dis();
}
//--------------------------------------
//LCD顯示設置函數
void lcd_enable()
{
rs=0; //該位元組數據為命令,而不是數據 RS=1數據RS=0命令
rw=0; //此次操作為寫,而不是讀 RW=1讀RW=0寫
e=0; //拉低使能信號
delay(); //保持使能信號為低一段時間
e=1; //拉高使能信號,建立LCD操作所需要的上升沿
}
void lcd_dis()
{
rs=1; //該位元組數據為命令,而不是數據 RS=1數據RS=0命令
rw=0; //此次操作為寫,而不是讀 RW=1讀RW=0寫
e=0; //拉低使能信號
delay(); //保持使能信號為低一段時間
e=1; //拉高使能信號,建立LCD操作所需要的上升沿
}
//延時函數
void delay()
{
int i;
for(i=0;i<50;i++);
}
void adinitial_voltage(void) // RA0為AD輸入
{
unsigned int AD_data[5]={0,0,0,0,0},j=0,temp=0;
for(j=0;j<=4;++j)
{
ADCON0=0B01000001; //A/D 轉換器模塊工作;但AD轉換不進行;FOSC/8
ADCON1=0B11101110; //ADRESH 寄存器的高6 位讀為0;6位與7位須置1
ADGO=1;
while(ADGO); //等AD轉換完成
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //讀取並存儲A/D轉換結果
AD_data[j]=adresult.y1;
}
for(j=0;j<=4;++j)
if(AD_data[j]>AD_data[j+1])
{temp=AD_data[j];AD_data[j]=AD_data[j+1];AD_data[j+1]=temp;} //找出最大的數,
for(j=0;j<=3;++j)
if(AD_data[j]<AD_data[j+1])
{temp=AD_data[j];AD_data[j]=AD_data[j+1];AD_data[j+1]=temp;} //找出最小數
ADC=((AD_data[0]+AD_data[1]+AD_data[2])/3)/213.20008328128253175098896523006*1000; //中間數作平均
qian=ADC/1000;
=ADC%1000/100;
shi=ADC%100/10;
ge=ADC%10;
}
G. 用51單片機製作電壓表怎麼編程
AD574全12位轉換讀數據函數:
http://blog.21ic.com/user1/3074/archives/2008/53881.html
希望能解決您的問題。
H. 使用icl7106/7做電壓表用不用編程
icl7106/7是3位半的A/D轉換晶元,7106用單電源9V,顯示用液晶(LED),7107用正負5V雙電源工作,顯示用LED。標准電路,內部時序都已固定好了。不用編程,按標准電路外圍器件連接好就能應用。
I. 求單片機高手,編程序實現下圖(兩路數字電壓表),四位數碼管輪流顯示兩路電壓,最左邊一位顯示通道數
我來試試,照你的圖畫好了,正在編程序……
