基于51单片机的数字万用表设计(1)
基于51单片机的数字万用表设计
摘要
本文介绍一种以AT89S52单片机为核心的智能型数字式多用表, 该系统采用AD0808为采样元件,对待测交直流电压信号进行实时采样,数据处理,输出显示,并可以直流电流和电阻,且具有键盘选择测量对象、量程和自动量程转换功能。
关键词:A/D转换器,单片机,模拟开关,自动量程转换
第一章 前言
功能:实现交直流测量,量程自动转换,过电压自动报警。
仿真及编译软件:Proteus ,Keil ,Wave
主要元件:AT89C52,CD4511,AD0808,7段数码管(8个),蜂鸣器
预定性能指标:
直流电压:范围-40—+50V,精度20mv ,实时无间断测量,4%。
交流信号:测量范围-5—+5V,频率范围:300Hz 到100Khz 误差5%。
初步方案及进展:
小组成员及任务分配:
组长:陈文豹 硬件电路设计参数确定与调试
组员:庞 明 软件程序设计
邓玉龙 资料查询并辅助电路设计
数字万用表设计分析
本设计可以分为直流电压测量电路;交流/直流转换电路;电流/电压转换电路;电阻/电压转换电路;功能控制和数据显示电路这五个的主要电路模块。
在设计直流电压测量电路时,利用反相比例运算电路,加上自己设计的四选一模拟开关,组成了一个直流电压测量电路。但该电路在实践中存在问题,不能实现预期的结果。做了适当的修改,改为由电阻、模拟开关和运放组成放大倍数可调的比例电路。 由于无论是指针式万用表还是普通的真有效值或平均值响应的数字万用表,其交流电压档的频率特性都较差,一般只能测量几十赫兹到几千赫兹的低频电压。我发现对于指针式万用表造成频率特性较差的原因主要是万用表的分压电阻采用精密电阻器,其本身的分布电容较大,在对高频电压信号进行测量时,由于分布电容的容抗大为减少使得测量值明显低于实际电压值,而对于数字万用表除上述原因以外,另一主要原因是受平均值响应,转换器本身频率特性的限制。但此缺陷可通过采用宽频带运算放大器加以改善。因此,消除分压电阻器分布电容的影响就可以提高万用表工作频率的上限,大大改善其频率特性。
数字万用表简介
数字万用表(DMM )亦称数字多用表,是目前在电子检测及维修工作中最常用、最得力的一种工具类数字仪表。它采用的数字化测量技术,通过对连续的模拟量(直流输入电压)的采样将其转换成不连续、离散的数字量,并以十进制数字形式显示出来。由
于内部采用了运放电路, 内阻可以做得很大, 往往在1M 欧或更大(即可以得到更高的灵敏度) 。这使得对被测电路的影响可以更小,测量精度较高。
传统的指针式万用表功能单一、精度低,已经不能满足数字化时代的需求,而采用单片A/D转换器构成的数字万用表,具有读数方便、精度高,测试功能强、集成度高、微功耗、抗干扰能力强等特点,另外带有单片机的智能型数字万用表更是具有自动校准,自动测量,自动数据处理和实时通讯等多种功能。
目前,数字万用表已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。与此同时,由DMM 扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。
第二章 电路设计
§2.1 系统整体方案选择
系统整体框图如下:
系统框图
下图为系统整体硬件电路:
总原理图
§2.2 AD转换电路
本设计采用直通方式如下图:
AD0808连接图
其中v0,v1,v2,v3分别作为待测信号,通过ABC 选通并输入AD 。
§2.3 信号及其处理
2.3.1直流电压测量电路:
由于待测电压范围太大,高的可到500v ,而AD 只能参考输入为+-5V,所以对于未知信号,可以先衰减再测量。
信号分压与放大电路
由于输入信号幅值未知,所以考虑安全因素,尽可能的将待测信号Vx 经电阻分压
后输入放大器进行范围判断。因此,应尽可能大的使用大功率的分压电阻。V1是VI 经U3放大十倍后的信号,v2是VI 经U5放大后的信号。V0即为VI 。VI 是待测信号衰减一百倍的信号,将VI 输入给电压比较电路,进行范围判断。
电压比较阵列电路
衰减后的信号经过以上比较器,可以大致划分为:0—5V ,5—50V 和50V 以上等三个范围,即可以组成1档,10档,100档三个档位,将比较器的结果输入到单片机中,进行判断处理,当比较器C 输出为逻辑0时,可以确定待测范围为0—5V ,将v2送入AD 测量。当比较器C 输出为1,比较器B 输出为0时,可以确定待测信号范围为5—50V ,将v1送入AD 测量。当比较器C 和B 输出为1时,可以确定待测信号范围为50v 以上,将v0送入AD 测量。在处理数据时候,分别对转换结果乘以1,10和100,即可还原真实值。
大电压衰减测量:
经单片机判断后,需对AD0808 的ABC 引脚进行操作,选择通道输入。
对于0—5V 信号,选择v2作为输入
对于5—50V 电路,选择v1作为输入
对于50V 以上的信号,选择v0作为输入
对于50V 以上信号可将输入比较器阵列的VI 信号作为输入进行测量。
2.3.2交流电压测量电路:
交流/直流转换电路
方案一:半波整流电路。利用二极管的单向导电性,可以很容易的得到直流电压,且能满足设计要求。
方案二:采用真有效值转换芯片, 性能参数方面也都能满足设计要求, 并且还能测量非正弦波,但一般真有效值转换芯片价格比较贵。
鉴于此,故采用方案一。
如图所示所示, 这个电路是利用低漂移单运算放大器741与二极管D1N4148组成平均值精密半波整流电路。该电路可避免二极管在小信号整理时所引起的非线性误差,使交流/直流转换电路的输入电压与输出电压成线性关系,适合测量40-400Hz 的正弦电压,测量准确度优于±1%。
交直流转换电路
仿真图:
精密半波检波仿真结果
将信号进行半波整理,然后进行峰值检波,求出信号峰值,根据波峰因素等电路原理,进行处理,通过软件方式,求出有效值,进行显示。
2.3.3电流/电压转换电路
如图2.3所示,普通模拟开关可以通过的电流很微小,所以通过单片机控制继电器来控制线路导通断开,将被测电流信号(0-500mA )转换为相应的电压信号(0-200mV ),然后经过OP07将信号放大10倍,最后输入A/D转换器MC14433的Vin 端。1A/250V的熔丝管FU 为限流保护电路,两个二极管1N4007构成保护为过压保护电路。阻值为90Ω、9Ω的电阻采用误差为±0.5%的精密金属膜电阻,而阻值为0.4Ω、0.6Ω的电阻通过的电流很大必须采用误差为±0.5%的精密绕线电阻。
图2.3 电流/电压转换电路图[1]
2.3.4 电阻/电压转换电路
方案一:利用运算放大器采用反相比例运算的方法进行测量。该方法实现比较简单,且能满足设计要求。
方案二:采用分压原理,利用流过标准电阻R0和被测电阻Rx 的电流基本相等来得到电压与电阻的关系,但当电阻很小时电流过大。
鉴于此,故采用方案一。
如图2.4所示。稳压二极管1N4730A 的稳压值为3.9V (即B 点处电压值),采用运算放大器反相比例运算的方法,将B 点处的电压值衰减到2V (即A 点处电压值),单片机通过控制模拟开关MAX4618(超低导通电阻)选择适当的标准参照电阻R1 ,再利用运算放大器反相比例运算的方法,将被测电阻RX 的阻值转换成与之相对应的电压量,输入A/D转换电路。
电阻/电压转换电路的计算公式:UA/R1=Uin/Rx,推得:Rx=R1* Uin/ UA。
图2.4 电阻/电压转换电路图[2]
[1][2]图参考湖北经济学院 郑娇 毕业论文数字万用表设计
§2.4 单片机控制与显示电路
2.4.1单片机及其外电路
单片机及其外围电路主要是为系统提供稳定的时钟源和复位操作,详细电路如图:
单片机及其外围电路
2.4.2显示电路
4511用于对输出的数字信号译码,传送给4个共阴数码管,以进行动态显示。
§2.5 报警及电源端电路
2.5.1报警电路:
蜂鸣器报警电路
单片机经判断后,如果超过待测信号范围(即比较器ABC 输出为111),用P3^7脚控制三极管的截止与开通,从而引发蜂鸣器开启,实现报警。
2.5.2直流正负电压判断电路:
正负电压判断电路
将VI 输入过零比较器比较器,输出结果给P00口,实现正负号判断,并显示
第三章 主要元器件介绍
3.1模数转换器ADC0808
ADC0808是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS 组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。
1.ADC0808的内部逻辑结构
由下图可知,ADC0808由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE 端为高电平时,才可以从三态输出锁存器取走转换完的数据。
2. ADC0808引脚结构
ADC0808各脚功能如下:
D7-D0:8位数字量输出引脚。
IN0-IN7:8位模拟量输入引脚。
VCC :+5V工作电压。
GND :地。
REF (+):参考电压正端。
REF (-):参考电压负端。
START :A/D转换启动信号输入端。
ALE :地址锁存允许信号输入端。
(以上两种信号用于启动A/D转换).
EOC :转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。 OE :输出允许控制端,用以打开三态数据输出锁存器。
CLK :时钟信号输入端(一般为500KHz )。
A 、B 、C :地址输入线。
ADC0808对输入模拟量要求:信号单极性,电压范围是0-5V ,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输
入前增加采样保持电路。
地址输入和控制线:4条 ALE 为地址锁存允许输入线,高电平有效。当ALE 线为高电平时,地址锁存与译码器将A ,B ,C 三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A ,B 和C 为地址输入线,用于选通IN0-IN7上的一路模拟量输入。通道选择表如下表所示。
数字量输出及控制线:11条
VREF (+),VREF (-)为参考电压输入。 3. ADC0808应用说明
(1). ADC0808内部带有输出锁存器,可以与AT89S51单片机直接相连。 (2). 初始化时,使ST 和OE 信号全为低电平。 (3). 送要转换的哪一通道的地址到A ,B ,C 端口上。 (4). 在ST 端给出一个至少有100ns 宽的正脉冲信号。 (5). 是否转换完毕,我们根据EOC 信号来判断。
(6). 当EOC 变为高电平时,这时给OE 为高电平,转换的数据就输出给单片机了。 4.(1). 进行A/D转换时,采用查询EOC 的标志信号来检测A/D转换是否完毕,若完毕则把数据通过P0端口读入,经过数据处理之后在数码管上显示。 (2). 进行A/D转换之前,要启动转换的方法: ABC =110选择第三通道
ST =0,ST =1,ST =0产生启动转换的正脉冲信号 .
AD0808时序图
3.2主控芯片AT89C52
单片机选择的是较为熟悉的AT89C52, AT89C52是一种低功耗、高性能CMOS8位微控制器, 具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash 允许程序存储器在系统可编程,亦适于 常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash ,使得AT89S52为众多嵌入式控制应用系统提 供高灵活、超有效的解决方案。 AT89S52具有以下标准功能:8k 字节Flash ,256字节RAM ,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
3.3 CD4511资料
CD4511是BCD 锁存/7段译码器/驱动器,常用的显示译码器件,MAX7219和他功能差不多。
CD4511引脚功能:
BI :4脚是消隐输入控制端,当BI=0 时,不管其它输入端状态是怎么样的,七段数码管都会处于消隐也就是不显示的状态。
LE :锁定控制端,当LE=0时,允许译码输出。 LE=1时译码器是锁定保持状态,译码器输出被保持在LE=0时的数值。
LT :3脚是测试信号的输入端,当BI=1,LT=0 时,译码输出全为1,不管输入 DCBA 状态如何,七段均发亮全部显示。它主要用来检测数7段码管是否有物理损坏。 A1、A2、A3、A4、为8421BCD 码输入端。
a 、b 、c 、d 、e 、f 、g :为译码输出端,输出为高电平1有效。 CD4511的里面有上拉电阻,可直接或者接一个电阻与七段数码管接口。
数字电路CD4511的原理(引脚及功能) CD4511是一个用于驱动共阴极 LED (数码管)显示器的 BCD 码—七段码译码器,特点:具有BCD 转换、消隐和锁存控制、七段译码及驱动功能的CMOS 电路能提供较大的拉电流。可直接驱动LED 示器。
CD4511 是一片 CMOS BCD —锁存/7 段译码/驱动器,引脚排列如图 2 所示。其中a b c d 为 BCD 码输入,a 为最低位。LT 为灯测试端,加高电平时,显示器正常显示,加低电平时,显示器一直显示数码“8”,各笔段都被点亮,以检查显示器是否有故障。BI 为消隐功能端,低电平时使所有笔段均消隐,正常显示时, B1端应加高电平。另外 CD4511有拒绝伪码的特点,当输入数据越过十进制数9(1001)时,显示字形也自行消隐。LE 是锁存控制端,高电平时锁存,低电平时传输数据。a ~g 是 7 段输出,可驱动共阴LED 数码管。另外,CD4511显示数“6”时,a 段消隐;显示数“9”时,d 段消隐,所以显示6、9这两个数时,字形不太美观 图3是 CD4511和CD4518配合而成一位计数显示电路,若要多位计数,只需将计数器级联,每级输出接一只 CD4511 和 LED 数码管即可。所谓共阴 LED 数码管是指 7 段 LED 的阴极是连在一起的,在应用中应接地。限流电阻要根据电源电压来选取,电源电压5V 时可使用300Ω的限流电阻。 其功能介绍如下:
BI :4脚是消隐输入控制端,当BI=0 时,不管其它输入端状态如何,七段数码管均处于熄灭(消隐)状态,不显示数字。 LT :3脚是测试输入端,当BI=1,LT=0 时,译码输出全为1,不管输入 DCBA 状态如何,七段均发亮,显示“8”。它主要用来检测数码管是否损坏。
LE :锁定控制端,当LE=0时,允许译码输出。 LE=1时译码器是锁定保持状态,译码器输出被保持在LE=0时的数值。
A1、A2、A3、A4、为8421BCD 码输入端。
a 、b 、c 、d 、e 、f 、g :为译码输出端,输出为高电平1有效。
CD4511具有锁存、译码、消隐功能,通常以反相器作输出级,通常用以驱动LED 。其引脚图如3-2所示。
各引脚的名称:其中7、1、2、6分别表示A 、B 、C 、D ;5、4、3分别表示LE 、BI 、LT ;13、12、11、10、9、15、14分别表示 a、b 、c 、d 、e 、f 、g 。左边的引脚表示输入,右边表示输出,还有两个引脚8、16分别表示的是VDD 、VSS 。 CD4511的工作原理 1.CD4511的工作真值表如表3-2
第四章 系统软件设计
由于本设计,在纯软件坏境中完成,所以对干扰等因素考虑较少,但在实际设计中,这些因素不可避免,对一些小的方面注意事项,总结如下:
对于数字电源端,需在电源与地之间加一个去耦电容,如下图:
数字电源端
对于模拟电源端:
对于接地端,应采用,数字地接在一起,模拟地接在一起,最后同时接在公共地上,并且公共地线应尽量粗一些。
数字芯片电源及地引脚:由于在proteus 环境下,各种芯片电源及地端配置为为默认值,因此在原理图上部分引脚未标明。
小结
本系统预计完成任务书的所有内容,如下:
1、测量对象、范围及误差范围:电压 DC :0~20V 误差
AC :0.2~20V (正弦信号)误差
电流 DC :0~500mA 误差
由于条件和时间有限,设计里并未将数字智能万用表做的很复杂。在proteus 仿真环境下,库元件不够齐全,导致器件选型受到限制,如AD 只用到了8位,直接影响设计的分辨率和精度,在实际设计中,可以考虑采用精度更高的ADC ,提高分辨率,而交流测量中,由于没有交直流转换芯片库元件,本设计采用了简单的半波整理电路,对交流信号的精确测量会有一定影响。总体来说,整个设计正能算是一个简易万用表,如若作为应用,方案仍需改进。
进展情况:
以上电路以及基本程序设计完成,经Proteus 仿真,结果如下:
原信号为5V ,经分压(电阻器50%)后本为2.5V 作为待测信号,显示结果如图,2.49V (第二个小数点问题解决中)。
可测得最小值如图(分压比为1%时),0.058V 。
参考文献
[1] 吴金戌、沈庆阳、郭庭吉 《8051单片机实践与应用》[M].北京:清华大学出版社,
2002年;
[2] 杨立、邓振杰、荆淑霞 《微型计算机原理与接口技术》[M].中国铁道出版社,2006
年;
[3] 高峰,《单片微型计算机与接口技术》[M].北京:科学出版社,2003;
[4] 华成英、童诗白 主编,《模拟电子技术基础》(第四版)[M].高等教育出版社,2006
年.
[5] 阎 石,《数字电子技术基础》[M].高等教育出版社,1983年
[6] 张永瑞 《电子测量技术》[M].西安电子科技大学出版社,2000年3月 [7] 黄海萍、陈用昌 编 《微机原理与接口技术实验指导》[M].北京:国防工业出版
社,2004年
[8] 李 华,《MCS -51系列单片机实用接口技术》[M].北京航空航天大学出版社,1993
年
[9] 余孟尝 主编,《数字电子技术基础简明教程》(第二版) 北京:高等教育出版社1999
(2006重印)
附:
1总原理图
2 以上功能程序:
#include "reg52.h" #include
#define uchar unsigned char
#define Dat P1 //转换的数据由P1口传入 sbit ST=P2^0; sbit EOC=P2^1; sbit OE=P2^2; sbit Dot=P2^3; sbit S0=P3^4; sbit S1=P3^5; sbit S3=P3^6; char v0,v1,v2,v3; void delay(uchar t) {
uchar i;
for(i=100;i>0;i--) while(t--); }
void Init_0808() {
ST=0; OE=0; }
void ADC_0808()
ST=0; ST=1; ST=0; //OE=0;
while(EOC==0); //自动发送 OE=1; }
void Cal() //输入计算处理 {
float Vol; int tem;
Vol=Dat*0.019608; //0.019608=5.0/255.0 Vol=Vol*1000.0; tem=(int)(Vol);
v0=tem/1000; v0=v0+(7
void Vol_dip() //P3口动态显示 {
while(1) {
P3=v0; Dot=1; P3=v2; Dot=0; P3=v1; Dot=0; P3=v3; Dot=0; } }
void main() {
delay(10);
TMOD=0x01;
TH0=(65536-4000)/256; TL0=(65536-4000)%256; TR0=1; ET0=1; EA=1;
Init_0808();
while(1) {
ADC_0808(); while(1) {
Vol_dip(); } } }
void Timer0() interrupt 1 {
TH0=(65536-4000)/256; TL0=(65536-4000)%256; EA=0;
ADC_0808(); Cal(); EA=1; }
//定时采样