基于单片机的数字万用表设计.docx
《基于单片机的数字万用表设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字万用表设计.docx(23页珍藏版)》请在冰点文库上搜索。
基于单片机的数字万用表设计
基于单片机的数字万用表设计
摘要
本次设计用单片机芯片AT89C52设计一个数字万用表,能够测量直流电压值、直流电流、直流电阻,四位数码显示。
此系统由分流电阻、分压电阻、基准电阻、电容测试芯片电路、51单片机最小系统、显示部分、报警部分、AD转换和控制部分组成。
为使系统更加稳定,使系统整体精度得以保障,本电路使用了AD0809数据转换芯片,单片机系统设计采用AT89C52单片机作为主控芯片,驱动液晶显示管显示。
程序每执行周期耗时缩到最短,这样保证了系统的实时性。
关键词数字万用表AT89C52单片机AD转换与控制
Abstract
ThisdesignisdesignadigitaluniversalmeterwithchipAT89C52ofone-chipcomputer,canmeasureandhandin,directcurrentpressingvalue,directcurrentflow,thedirectcurrentishindered,fournumbersshow.Thissystemisshuntedresistance,resistanceofpartialpressure,basicresistance,minimumsystemof51one-chipcomputers,shownthatsome,warningpart,ADchangeandcontrolmakinguppartly.Inordertomakethesystemmoresteady,makethewholeprecisionofthesystembeensured,thiscircuithasusedAD0809datatochangethechip,theone-chipcomputersystemisdesignedtoadoptAT89C52one-chipcomputerasthetopmanagementchip,urge4numberstobeinchargeofshowing.Theeveryexecutioncycleconsumingtimeofprocedurecontractstogetshortest,inthiswaythereal-timecharacterofthesecuritysystem.
Keyword:
DigitaluniversalmeterAT89S52one-chipcomputerADchangesandcontrols
一、设计背景
数字万用表亦称数字多用表,简称DMM(DigtialMultimeter)。
它是采用数字化测量技术,把连续的模拟量转换成不连续的、离散的数字形式并加以显示的仪表。
传统的指针式万用表功能单精度低,不能满足数字化时代的需求,采用单片的数字万用表,精度高、抗干扰能力强,可扩展尾强、集成方便,目前,由各种单片机芯片构成的数字电万用表,已被广泛用于电子与电工测量、工业自动化仪表、自动测试系统等智能化测量领域,显示出强大的生命力。
二、数字万用表的设计依据
根据数字万用表的原理,结合以下的设计要求:
“设计一个数字万用表,能够测量直流电压值,直流电流、直流电阻,四位数码显示。
实现多级量程的直流电压测量,其量程范围是5V、,20V,.实现多级量程的直流电流测量,其量程范围是2mA ,20mA,200mA.实现多级量程的电阻测量,其量程范围是200、1k,10k。
”由此设想出以下的解决方法,即数字万用表的系统由分流电阻、分压电阻、基准电阻、电容测试芯片电路、51单片机最小系统、显示部分、报警部分、AD转换和控制部分组成。
为使系统更加稳定,使系统整体精度得以保障。
三、设计任务
3.1设计目的
采用8位8路A/D转换器ADC0809和AT89S52单片机,设计一台数字多用表,能进行电压、电流和电阻的测量,测量结果通过液晶显示管显示,通过按键进行测量功能转换。
3.2设计指标与要求
电压测量范围0~5,0~20V,电流测量范围1~2,1~20,1~200mA,电阻测量范围0~200,0~1K,0~10KΩ。
四、设计思路与总体框图
4.1设计思路
首先利用P0口数据地址复用,将地址通过P0口输入到单片机中。
再利用模数转换将模拟信号转换成数字信号,再次利用P0口将其输入到单片机。
最后,充分利用单片机强大的运算转化功能将其转成适当的二进制信号控制数显以确保正确的显示被测量的读数。
4.2总体框图
图1—1
五、MCU主控制器的选择与论证
方案一此方案采用凌阳公司的16位单片机SPCE061A作为主控制器,它具有体积小、驱动能力高、集成度高、易扩展、可靠性高、功耗低、结构简单、中断处理能力强、处理速度高等特点,尤其适用于语音处理和识别等领域。
但是其软件设计相对复杂,故我们放弃此方案。
方案二此方案采用STC公司的8位单片机STC89C52作为主控制器,具有与MCS-51指令集完全兼容的CIP-51内核,但其同样时钟下运行速度和抗干扰能力军比普通80518位单片机要高,而且开发环境是我们很熟悉的KeilC51,编译效率高,非常适合C语言开发人员,因此我们采用该方案。
六、A/D转换器的选择与论证
方案一此方案选用12位串行A/D转换集成AD574,只需要2根线就能够很好的与MCU相通信组成测量系统,但其输入电压不能为负值,故使用范围受到了限制,不适合用作负压测量电路中而且价格较高。
因此,我们放弃此方案。
方案二此方案选用双积A/D转换器AD0809,它的性能比较稳定,转换精度高,具有很高的抗干扰能力,电路结构简单,其缺点是工作速度较低。
它的特点是在每次A/D转换前,内部电路都自动进行调零操作,可保证零点在常温下的长期稳定。
图2—1AD转换电路
七、测量电路的选择与论证
7.1电阻测量
图1所示为数字多用表的电阻测量输入电路。
运算放大器的反馈电阻R
作为待测量电阻,通过R14,R2,R15与多路开关接到电源-5V。
假定运算放大器理想,那么放大器的输出电压RV=,将RV送给ADC0809,转换后得到数字量为DV=。
单片机读取A/D转换数据,再经过逆向运算可得R
=,注意此时得到的R
为二进制数,需要转化为十进制数后才能送给液晶显示管显示。
程序中采用4字节专利号除法,连续进行4次除以10的除法。
为使电路所求电阻更加精确,故采用了一个单刀三掷开关,当所测电阻处于千欧级别时,闭合开关一,由所得电压得出待测电阻。
当待测电阻处于200至一千欧时,如果再次以10千欧作为比例电阻,则所测待测电阻准确度大大下降,顾此时应闭合开关二,以一千欧电阻作为比例电阻,可大大扩大所测电阻精度。
同理当所测电阻为0至200欧时,闭合开关三,此时所测电阻才能更加精确。
图1电阻测量原理图
7.2电压测量输入电路
图3所示为数字多用表的电压测量输入电路。
待测电压经过低通滤波器滤除高频干扰,再送给ADC0809,电压测量范围为0~5,0~20V,ADC0809的分辨率为8位.当待测电压为为0~5V,关闭开关一,经过滤波电路后此时输出的电压VV=Vx,将VV送给ADC0809,转换后得到数字量为DV=。
单片机读取A/D转换数据,再经过逆向运算可得Vx=
注意此时得到的Vx为二进制数,需要转化为十进制数后才能送给液晶管显示。
当电压为5~20V时,因为AD0809的工作电压为5V,所以需降压,闭合开关二,输出的电压为待测电压的五分之一。
图二直流电压的测量
7.3直流电流的测量
测量电流的原理是:
根据欧姆定律,用合适的取样电阻把待测电流转换为相应的电压,再进行测量。
如下图为直流电流的测量原理图,当输入一个电流时,先判断待测电流大概在哪个范围内,然后根据下图中的开关,来控制待测电流的精确度和准确度。
如输入一个待测电流时,集成运放正相端电压即为V+=R
Ix,同时此电流也经过一个交流滤波电路,滤除交流成分,由于V+最大值为0.2V,比较小,若直接输出,则误差较大,因此进行同相放大4倍,使输出的电压大大提高,从而使输出的电流更加准确。
从运放端输出的电压IV=V+
4,将IV送给ADC0809,转换后得到数字量为DV=。
单片机读取A/D转换数据,再经过逆向运算可得Ix=
注意此时得到的Vx为二进制数,需要转化为十进制数后才能送给液晶显示管显示。
根据不同的开关可得到在不同范围内待测电流值。
7.4蜂鸣器的设置
如下图所示,为报警部分,当万用表的外接部分短接时,则电路出现高电平,此时蜂鸣器发出声音。
图四蜂鸣器的设计
八、结论和体会
8.1设计结果综述:
(1)、数字万用表完成的功能主要是对电压、电流、电阻的测量,它主要由分流电阻、分压电阻、基准电阻、51单片机最小系统、显示部分、报警部分、AD转换和控制部分组成。
(2)、数字万用表属于一种测量工具,其本身的好坏直接影响到测量结果。
(3)、单片机部分跟AD转换部分是整个设计的核心,ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。
实际显示的电压值(D/256*VREF);AT89S52单片机作为主控芯片,配以RC上电复位电路和11.0592MHZ震荡电路,使系统稳定运行。
(4)、在本次软件设计过程中,采用的是c语言。
(5)、对于硬件的制作,由于布线麻烦等原因,做起来复杂,对Proteus仿真软件使用不熟练,使画仿真图时遇到不少问题。
51单片机基础知识不扎实,电路分析遇到比较多的问题。
捍接也很难,以致未能完全实现设计报告要求。
8.2体会
这次课程设计暴露出了很多问题,但在做课程设计的过程中也学到了很多东西。
比如查阅资料,动手焊接万用板等等,这些都是平时很少做的。
此次课程设计让我对基于单片机的c语言有了新的认识,另外对于电子设计也有基本的了解,这会让我在以后更能有效地去学习这方面的知识,对单片机学习有很大的助益,也在激励我们多动手,从实践中去获取新知识。
附录一
电路图仿真图(图2—1):
图2—1
程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]="0123456789.vAmA";
uinti,j;
sbitST=P2^0;
sbitEOC=P2^1;
sbitOE=P2^2;
sbitk1=P1^0;
sbitk2=P1^1;
sbitk3=P1^2;
sbitx1=P2^4;
sbitx2=P2^5;
sbitx3=P2^6;
sbitE=P1^5;
sbitRS=P1^4;
sbitRW=P1^3;
voiddelay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
voidDelay(uinti)
{
uintx,j;
for(j=0;j
for(x=0;x<=148;x++);
}
bitBusy(void)
{
bitbusy_flag=0;
RS=0;
RW=1;
E=1;
Delay(5);
busy_flag=(bit)(P3&0x80);
E=0;
returnbusy_flag;
}
voidwcmd(uchardel)
{
while(Busy());
RS=0;
RW=0;
E=0;
Delay(5);
P3=del;
Delay(5);
E=1;
Delay(5);
E=0;
}
voidwdata(uchardel)
{
while(Busy());
RS=1;
RW=0;
E=0;
Delay(5);
P3=del;
Delay(5);
E=1;
Delay(5);
E=0;
}
voidL1602_init(void)
{
wcmd(0x38);
Delay(5);
wcmd(0x38);
Delay(5);
wcmd(0x38);
Delay(5);
wcmd(0x38);
wcmd(0x08);
wcmd(0x0c);
wcmd(0x04);
wcmd(0x01);
}
voidL1602_char(ucharhang,ucharlie,charsign)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
wcmd(a);
wdata(sign);
}
voidmain()
{
uinta1,a2,a3,a4;
ucharadd;
while
(1)
{
ST=0;
OE=0;
P0=0xff;
ST=1;
_nop_();_nop_();_nop_();
ST=0;
_nop_();_nop_();_nop_();_nop_();
while(EOC==0);
OE=1;add=P0;
_nop_();
OE=0;
Delay(30);
L1602_init();
if(k2==0)
{
Delay(10);
if(k2==0)
{
if(x1==0)
{
Delay(10);
if(x1==0)
{
a1=(add*20)/1000;
a2=(add*20)%1000/100;
a3=(add*20)%100/10;
a4=(add*20)%10;
L1602_char(2,7,table[10]);
L1602_char(2,6,table[a1]);
L1602_char(2,8,table[a2]);
L1602_char(2,9,table[a3]);
}
}
}
if(x2==0)
{
a1=(add*10)/1000;
a2=(add*10)%1000/100;
a3=(add*10)%100/10;
a4=(add*10)%10;
L1602_char(2,8,table[10]);
L1602_char(2,6,table[a1]);
L1602_char(2,7,table[a2]);
L1602_char(2,9,table[a3]);
}
}
if(k3==0)
{
if(x1==0)
{
a1=(add*2)/1000;
a2=(add*2)%1000/100;
a3=(add*2)%100/10;
a4=(add*2)%10;
L1602_char(2,7,table[10]);
L1602_char(2,6,table[a1]);
L1602_char(2,8,table[a2]);
L1602_char(2,9,table[a3]);
L1602_char(2,10,table[a4]);
}
if(x2==0)
{
a1=add/5/1000;
a2=add/5%1000/100;
a3=add/5%100/10;
a4=add/5%10;
L1602_char(2,7,table[10]);
L1602_char(2,6,table[a1]);
L1602_char(2,8,table[a2]);
L1602_char(2,9,table[a3]);
}
if(x3==0)
{
a1=add/50/1000;
a2=add/50%1000/100;
a3=add/50%100/10;
a4=add/50%10;
L1602_char(2,7,table[10]);
L1602_char(2,6,table[a1]);
L1602_char(2,8,table[a2]);
L1602_char(2,9,table[a3]);
L1602_char(2,10,table[a4]);
}
}
if(k1==0)
{
if(x1==0)
{
a1=add*2/5/1000;
a2=add*2/5%1000/100;
a3=(add*2/5)%100/10;
a4=(add*2/5)%10;
L1602_char(2,8,table[10]);
L1602_char(2,6,table[a1]);
L1602_char(2,7,table[a2]);
L1602_char(2,9,table[a3]);
}
if(x2==0)
{
a1=(add*4)/1000;
a2=(add*4)%1000/100;
a3=(add*4)%100/10;
a4=(add*4)%10;
L1602_char(2,7,table[10]);
L1602_char(2,6,table[a1]);
L1602_char(2,8,table[a2]);
L1602_char(2,9,table[a3]);
}
if(x3==0)
{
a1=(add*80)/1000;
a2=(add*80)%1000/100;
a3=(add*80)%100/10;
a4=(add*80)%10;
L1602_char(2,9,table[10]);
L1602_char(2,6,table[a1]);
L1602_char(2,7,table[a2]);
L1602_char(2,8,table[a3]);
L1602_char(2,10,table[a4]);
}
}
}
}
附录二:
主要元器件功能介绍
1、AT89S52芯片功能特性描述
AT89S52引脚框图:
图2.12AT89S52芯片引脚图
AT89S52主要性能:
1、与MCS-51单片机产品兼容
2、8K字节在系统可编程Flash存储器
3、1000次擦写周期
4、全静态操作:
0Hz~33Hz
5、三级加密程序存储器
6、32个可编程I/O口线
7、三个16位定时器/计数器
8、八个中断源
9、全双工UART串行通道
10、低功耗空闲和掉电模式
l1、掉电后中断可唤醒
l2、看门狗定时器
13、双数据指针
l4、掉电标识符
功能特性描述:
AT89S52是一种低功耗、高性能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内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
表2.1P1口的第二功能
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。
在flash编程和校验时,P3口也接收一些控制信号。
2、ADC0809介绍
ADC0809是带有8位A/D转换器、8路多路开关以与微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
(1)ADC0809的内部逻辑结构
图2.14ADC0809的内部逻辑结构
上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
(2)引脚结构
图2.15ADC0809引脚结构图
IN0-IN7:
8条模拟量输入通道
ADC0809对输入模拟量要求:
信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:
4条
ALE为地址锁存允许输入线,高电平有效。
当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经