基于stcc的数字电压表

基于stcc的数字电压表
基于stcc的数字电压表

1引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。本文设计了一种基于单片机的简易数字电压表。该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。A/D转换主要由芯片ADC0804来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。数据处理则由芯片STC89C52来完成,其负责把ADC0804传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着ADC0804芯片工作。该系统的数字电压表电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。此数字电压表可以测量0-5V的1路模拟直流输入电压值,并通过7段数码管显示出来。

2 设计总体方案

2.1设计要求

⑴以MCS-51系列单片机为核心器件,组成一个简单的直流数字电压表。

⑵采用1路模拟量输入,能够测量0-5V之间的直流电压值。

⑶电压显示用LED数码管显示,至少能够显示两位小数。

⑷尽量使用较少的元器件。

2.2设计思路

⑴根据设计要求,选择STC89C52单片机为核心控制器件。

⑵A/D转换采用ADC0804实现,与单片机的P1口相连接。

⑶电压显示采用三个7段LED数码管显示,另外三位数码管显示A/D转换的数字量的

值。

⑷LED数码的段选码和位选码均由单片机P0口经过两片74HC573锁存器输入。

2.3设计方案

硬件电路设计由6个部分组成; A/D转换电路,STC89C52单片机系统,LED显示系统、时钟电路、复位电路以及测量电压输入电路。硬件电路设计框图如图1所示。

图2-1 数字电压表系统硬件设计框图

3 硬件电路设计

3.1单片机系统

本次课设选择的单片机是STC89C52,之所以选择这块芯片,是因为该芯片的各项功能均符合本次课设的指标要求,并且该芯片有很多成熟的资料供我们学习,使用用起来很方

便,也有专门的下载程序平台,方便现场调试。

3.2复位电路和时钟电路

单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。MCS-51单片机有一个复位引脚RST,采用施密特触发输入。当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位。复位完成后,如果RST端继续保持高电平,MCS-51就一直处于复位状态,只要RST恢复低电平后,单片机才能进入其他工作状态。单片机的复位方式有上电自动复位和手动复位两种,图6是51系列单片机统常用的上电复位和手动复位组合电路,只要Vcc上升时间不超过1ms,它们都能很好的工作。

图3-1复位电路

3.2.2 时钟电路

单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。CPU执行一条指令的各个微操作所对应时间顺序称为单片机的时序。MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路。

本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和2个电容即可

图3-2 时钟电路

3.3 A/D转换模块

本次课设采用的A/D转换芯片是AD0804,其为逐次比较型A/D转换芯片,它完成一次转换所需时间与其位数和时钟频率有关,位数越少,时钟频率越高,转换时间越短,该芯片的分辨率为8位,转换时间为100μm,输入电压范围为0~5V。芯片内部具有三态输出锁存器,可直接连接在数据总线上。由于本次显示小数点后两位的电压值,因此A/D0804满足要求。

3.4 LED显示系统设计

LED是发光二极管显示器的缩写。LED由于结构简单、价格便宜、与单片机接口方便等优点而得到广泛应用。在单片机中使用最多的是七段数码显示器。本次采用的是共阴极7端数码管。并且采用软件译码的方式,既简化了硬件电路又增加了程序编写的灵活性。

表3.1 共阴极字段码表

3.4.1 LED显示器与单片机接口设计

由于单片机的并行口不能直接驱动LED显示器,所以,在一般情况下,必须采用专用的驱动电路芯片,使之产生足够大的电流,显示器才能正常工作。为了简化数字式直流电压表的电路设计,在LED驱动电路的设计上,可以利用单片机P0口上外接的上拉电阻来实现。由于数码管的个数较多,因此用两片74HC573锁存器芯片与单片机P0口相连,分别控制数码管的段选码和位选码。

3.5总体电路设计

此电路的工作原理是:+5V模拟电压信号通过变阻器Re2分压后由ADC0804的Vin+通道进入(由于使用的Vin+通道,所以Vin-接地),经过模/数转换后,产生相应的数字量经过其输出通道D0-D7传送给STC89C52芯片的P1口,STC89C52负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码传送给四位LED,同时它还通过P0口产生位选信号控制数码管的亮灭。此外,STC89C52还控制ADC0804的工作。片选CS与单片机的P0^7相连,WR、RD分别与P3.6和P3.7相连,数据输出端与P1口相连。工作是先将CS置为低

电平,即选中该AD转换芯片,/WR随后置低电平,经过短暂延迟后,/WR拉高,随后AD 转换器被启动,并且经过(1-8个A/D时钟周期后)时间后,A/D转换结束,转换结果存入数据锁存器,延迟一段时间后,将/RD之低电平,再延迟一段时间后,将端口上的数据读到P1口上,读走数据后将/RD拉高,并将CS拉高。

简易数字直流电压表的硬件电路已经设计完成,就可以选取相应的芯片和元器件,利用Proteus软件绘制出硬件的原理,并仔细地检查修改,直至形成完善的硬件原理图。但要真正实现电路对电压的测量和显示的功能,还需要有相应的软件配合,才能达到设计要求。

图5-1 总体电路图

4 程序设计

4.1程序设计总方案

利用KEIL软件进行程序编写,根据模块的划分原则,将该程序划分初始化模块,A/D 转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图12所示。

图4-1 数字式直流电压表主程序框图

5仿真

5.1软件调试

软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。编好程序后,在KEIL 平台下对程序进行调试,由于程序代码不多,因此调试也较为顺利,但还是遇到一些问题,因此也学到了不少东西,积累了一些调试经验。

5.2 结果显示及误差分析

5.2.1结果显示

(1)当IN0口输入电压值为0.50V时,显示结果如图5-1所示,测量误差为0.52V

前三位为实际电压值,后三位为A/D转换的数值

(2)当IN0输入电压值为2.00V时,显示结果如图15所示。测量误差为2.01 V。

(3)当IN0口输入电压值为3.50V时,显示结果如图16。测量误差为3.52V。

5.2.2 误差分析

通过以上仿真测量结果可得到简易数字电压表与“标准”数字电压表对比测试表,如下表5.1所示:

表4 简易数字电压表与“标准”数字电压表对比测试表

由于单片机STC89C52为8位处理器,当输入电压为5.00V时,ADC0804输出数据值为255(FFH),因此单片机最高的数值分辨率为0.0196V(5/255)。这就决定了电压表的最高分辨率只能到0.0196V,从上表可看到,测试电压一般以0.01V的幅度变化。

从上表可以看出,简易数字电压表测得的值基本上比标准电压值偏大0-0.01V,这可以通过校正ADC0804的基准电压来解决。因为该电压表设计时直接用5V的供电电源作为电压,所以电压可能有偏差。当要测量大于5V的电压时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。

6 设计总结与体会

经过一段时间的努力,基于单片机的简易数字电压表基本完成。但设计中的不足之处仍然存在。在这过程中,我对电路设计,单片机的使用等都有了新的认识。通过这次设计我加深了对Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。

基于单片机的数字电压表使用性强、结构简单、成本低、外接元件少。在实际应用工作应能好,测量电压准确,精度高。系统功能、指标达到了课题的预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。本文设计主要实现了简易数字电压表测量一路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。

通过本次设计,我对单片机这门课有了进一步的了解。无论是在硬件连接方面还是在软件编程方面。本次设计采用了STC89C52单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。设计中还用到了模/数转换芯片ADC0804,以前在学单片机课程时只是对其理论知识有了初步的理解。通过这次设计,对它的工作原理有了更深的理解。在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。

总之这次电路的设计和仿真,基本上达到了设计的功能要求。在以后的实践中,我将继续努力学习电路设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。

参考文献

[1]胡健.单片机原理及接口技术.北京:机械工业出版社,2004年10月

[2]王毓银.数字电路逻辑设计.高等教育出版社,2005年12月

[3]于殿泓、王新年.单片机原理与程序设计实验教程.西安电子科技大学出版社,2007年5月

[4]谢维成、杨加国.单片机原理与应用及C51程序设计实例.电子工业出版社,2006年3月

[5]李广弟.单片机基础.北京航空航天大学出版社,2007年5月

[6]姜志海,黄玉清等着.单片机原理及应用[M] .北京:电子工业出版社.2005年7月

[7]魏立峰.单片机原理及应用技术.北京大学出版社,2005年

[8]周润景.Protues在MCS-51&ARM7系统中的应用百例.第一版.北京:电子工业出版社,2006年

[9]边春远等着.MCS-51单片机应用开发实用子程序[M] .北京:人民邮电出版社.2005年9月.

[10]苗红霞.单片机实现数字电压表的软硬件设计[J] .河海大学常州分校学报,2002,(03).

[11]宋凤娟,孙军,李国忠.基于89C51单片机的数字电压表设计[J] .工业控制计算机,2007,(04).

说明:改程序只在实验板上能正常显示电压,在proteus里面显示数码管会乱码,不知道问什么。但是电路图是和实物一模一样的。

附录

程序代码

#include

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit adrd=P3^7; //IO口定义

sbit adwr=P3^6;

sbit diola=P2^5;

sbit dula=P2^6;

sbit wela=P2^7;

unsigned int j,k,ADVAL1,adval;

uchar a,A1,A2,A3,A4,A5,A6;

void delay(unsigned char i)//延时程序

{

for(j=i;j>0;j--)

//for(k=125;k>0;k--);

for(k=110;k>0;k--);

}

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,

0x79,0x71};

void display(uchar GEWEI,uchar SHIFENWEI,uchar BAIFENWEI) //显示程序{

P0=0x00;

dula=1;

dula=0;

wela=1;

wela=0;

delay(1);

//**显示输出电压的个位**//

P0=table[GEWEI]+0x80;

dula=1;

dula=0;

P0=0xfe;

wela=1;

wela=0;

delay(1);

//***显示输出电压的十分位****// dula=0;

P0=table[SHIFENWEI];

dula=0;

wela=0;

P0=0xfd;

wela=1;

wela=0;

delay(1);

//**显示输出电压的百分位**// P0=table[BAIFENWEI];

dula=1;

dula=0;

wela=0;

P0=0xfb;

wela=1;

wela=0;

}

//********数码管后三位输出AD转换的实际值***************// void display1( uchar bai,uchar shi,uchar ge)

{

//******显示百位*******//

dula=0;

P0=0;

dula=1;

dula=0;

P0=0xf7;

wela=1;

wela=0;

delay(1);

dula=0;

P0=table[bai];

dula=1;

dula=0;

P0=0xf7;

wela=1;

wela=0;

delay(1);

//******显示十位*******// dula=0;

P0=table[shi];

dula=1;

dula=0;

wela=0;

P0=0xef;

wela=1;

delay(1);

//********显示个位******// dula=0;

P0=table[ge];

dula=1;

dula=0;

wela=0;

P0=0xdf;

wela=1;

wela=0;

delay(1);

dula=0;

P0=0;

dula=1;

wela=0;

P0=0xdf;

wela=1;

wela=0;

delay(1);

}

void ADCHANGE()

{

wela=1; //重新打开有AD片选信号锁存器的锁存端P1=0xff; //读取P1口之前先给其写全1

P0=0; //选通ADCS

adrd=0; //AD读使能

adval=P1;

//AD数据读取赋给P1口

ADVAL1=P1;

adval=adval*5*100/255; //将AD转换的数据再次转换为实际电压值adrd=1; //5为参考电压

P0=0xff; //关闭ADCS

adwr=0;

A1= adval/100;//A1~A3为实际电压值,A4~A6为AD转换后实际值

A2= adval%100/10;

A3= adval%100%10;

A4=ADVAL1/100;

A5=ADVAL1%100/10;

A6=ADVAL1%100%10;

}

//*************主函数***************//

void main()

{

diola=1;

P1=0xff;//关闭流水灯

diola=0;

P1=0;

while(1)

{

wela=1;

P0=0; //选通ADCS

adwr=0;

//AD写入?

_nop_();

adwr=1;

P0=0xff; //关闭ADCS

delay(10);

wela=0; //关闭有AD片选信号锁存器的锁存端以防止在操作数码管时

使AD的片选发生变化

相关文档
最新文档