1、1 引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。本文设计了一种基于单片机的简易数字电压表。该设计主要由三个模块组成:A/D 转换模块,数据处理模块及显示模块。A/D 转换主要由芯片 ADC0804 来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。数据处理则由芯片 STC89C52 来完成,其负责把 ADC0804 传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着 ADC0804 芯片工作。该系统的
2、数字电压表电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。此数字电压表可以测量 0-5V 的 1 路模拟直流输入电压值,并通过 7 段数码管显示出来。2 设计总体方案2.1 设计要求以 MCS-51 系列单片机为核心器件,组成一个简单的直流数字电压表。采用 1 路模拟量输入,能够测量 0-5V 之间的直流电压值。电压显示用 LED 数码管显示,至少能够显示两位小数。 尽量使用较少的元器件。2.2 设计思路根据设计要求,选择 STC89C52 单片机为核心控制器件。A/D 转换采用 ADC0804 实现,与单片机的 P1 口相连接。电压显示采用三个 7 段 LED 数码管显示,另外三位
3、数码管显示 A/D 转换的数字量的值。LED 数码的段选码和位选码均由单片机 P0 口经过两片 74HC573 锁存器输入。2.3 设计方案硬件电路设计由 6 个部分组成; A/D 转换电路,STC89C52 单片机系统,LED 显示系统、时钟电路、复位电路以及测量电压输入电路。硬件电路设计框图如图 1 所示。时钟电路 复位电路A/D 转换电路 测量电压输入显示系统STC89C52 P1 P2 P0 图 2-1 数字电压表系统硬件设计框图3 硬件电路设计3.1 单片机系统本次课设选择的单片机是 STC89C52,之所以选择这块芯片,是因为该芯片的各项功能均符合本次课设的指标要求,并且该芯片有很
4、多成熟的资料供我们学习,使用用起来很方便,也有专门的下载程序平台,方便现场调试。3.2 复位电路和时钟电路3.2.1 复位电路单片机在启动运行时都需要复位,使 CPU 和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。MCS-51 单片机有一个复位引脚 RST,采用施密特触发输入。当震荡器起振后,只要该引脚上出现 2 个机器周期以上的高电平即可确保时器件复位。复位完成后,如果 RST 端继续保持高电平,MCS-51 就一直处于复位状态,只要 RST 恢复低电平后,单片机才能进入其他工作状态。单片机的复位方式有上电自动复位和手动复位两种,图 6 是 51 系列单片机统常用的上电复
5、位和手动复位组合电路,只要 Vcc 上升时间不超过 1ms,它们都能很好的工作。图 3-1 复位电路3.2.2 时钟电路单片机中 CPU 每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。CPU 执行一条指令的各个微操作所对应时间顺序称为单片机的时序。MCS-51 单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1 为该放大器的输入端,XTAL2 为该放大器输出端,但形成时钟电路还需附加其他电路。本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和 2 个电容即可图 3-2 时钟电
6、路3.3 A/D 转换模块本次课设采用的 A/D 转换芯片是 AD0804,其为逐次比较型 A/D 转换芯片,它完成一次转换所需时间与其位数和时钟频率有关,位数越少,时钟频率越高,转换时间越短,该芯片的分辨率为 8 位,转换时间为 100m,输入电压范围为05V。芯片内部具有三态输出锁存器,可直接连接在数据总线上。由于本次显示小数点后两位的电压值,因此 A/D0804 满足要求。3.4 LED 显示系统设计LED 是发光二极管显示器的缩写。LED 由于结构简单、价格便宜、与单片机接口方便等优点而得到广泛应用。在单片机中使用最多的是七段数码显示器。本次采用的是共阴极 7 端数码管。并且采用软件译
7、码的方式,既简化了硬件电路又增加了程序编写的灵活性。表 3.1 共阴极字段码表显示字符 共阴极字段码0 3FH1 06H2 5BH3 4FH4 66H5 6DH6 7DH7 07H8 7FH9 6FH3.4.1 LED 显示器与单片机接口设计由于单片机的并行口不能直接驱动 LED 显示器,所以,在一般情况下,必须采用专用的驱动电路芯片,使之产生足够大的电流,显示器才能正常工作。为了简化数字式直流电压表的电路设计,在 LED 驱动电路的设计上,可以利用单片机 P0 口上外接的上拉电阻来实现。由于数码管的个数较多,因此用两片74HC573 锁存器芯片与单片机 P0 口相连,分别控制数码管的段选码和
8、位选码。3.5 总体电路设计此电路的工作原理是:+5V 模拟电压信号通过变阻器 Re2 分压后由 ADC0804的 Vin+通道进入(由于使用的 Vin+通道,所以 Vin-接地) ,经过模/数转换后,产生相应的数字量经过其输出通道 D0-D7 传送给 STC89C52 芯片的 P1 口,STC89C52 负责把接收到的数字量经过数据处理,产生正确的 7 段数码管的显示段码传送给四位 LED,同时它还通过 P0 口产生位选信号控制数码管的亮灭。此外,STC89C52 还控制 ADC0804 的工作。片选 CS 与单片机的 P07 相连,WR、RD 分别与 P3.6 和 P3.7 相连,数据输出
9、端与 P1 口相连。工作是先将 CS 置为低电平,即选中该 AD 转换芯片,/WR 随后置低电平,经过短暂延迟后,/WR 拉高,随后 AD转换器被启动,并且经过(1-8 个 A/D 时钟周期后)时间后,A/D 转换结束,转换结果存入数据锁存器,延迟一段时间后,将/RD 之低电平,再延迟一段时间后,将端口上的数据读到 P1 口上,读走数据后将/RD 拉高,并将 CS 拉高。简易数字直流电压表的硬件电路已经设计完成,就可以选取相应的芯片和元器件,利用 Proteus 软件绘制出硬件的原理,并仔细地检查修改,直至形成完善的硬件原理图。但要真正实现电路对电压的测量和显示的功能,还需要有相应的软件配合,
10、才能达到设计要求。图 5-1 总体电路图4 程序设计4.1 程序设计总方案利用 KEIL 软件进行程序编写,根据模块的划分原则,将该程序划分初始化模块,A/D 转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图 12 所示。开始初始化调用 A/D 转换子程序调用显示子程序结束图 4-1 数字式直流电压表主程序框图5 仿真5.1 软件调试软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。编好程序后,在 KEIL 平台下对程序进行调试,由于程序代码不多,因此调试也较为顺利,但还是遇到一些问题,因此也
11、学到了不少东西,积累了一些调试经验。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 简易数字电压表与“标准”数字电压表对比测试表标准电压
12、值/V简易电压表测量值/V绝对误差/V0.00 0.00 0.000.14 0.13 0.010.25 0.25 0.000.48 0.50 0.021.00 1.01 0.012.00 2.01 0.012.50 2.52 0.023.50 3.52 0.024.00 4.01 0.014.50 5.52 0.02由于单片机 STC89C52 为 8 位处理器,当输入电压为 5.00V 时,ADC0804 输出数据值为 255(FFH) ,因此单片机最高的数值分辨率为 0.0196V(5/255)。这就决定了电压表的最高分辨率只能到 0.0196V,从上表可看到,测试电压一般以 0.01V
13、的幅度变化。从上表可以看出,简易数字电压表测得的值基本上比标准电压值偏大 0-0.01V,这可以通过校正 ADC0804 的基准电压来解决。因为该电压表设计时直接用 5V 的供电电源作为电压,所以电压可能有偏差。当要测量大于 5V 的电压时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。6 设计总结与体会经过一段时间的努力,基于单片机的简易数字电压表基本完成。但设计中的不足之处仍然存在。在这过程中,我对电路设计,单片机的使用等都有了新的认识。通过这次设计我加深了对 Keil 软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计
14、流程,积累了不少经验。基于单片机的数字电压表使用性强、结构简单、成本低、外接元件少。在实际应用工作应能好,测量电压准确,精度高。系统功能、指标达到了课题的预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。本文设计主要实现了简易数字电压表测量一路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。通过本次设计,我对单片机这门课有了进一步的了解。无论是在硬件连接方面还是在软件编程方面。本次设计采用了 STC89C52 单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。设计中还用到了模/数转换芯片 ADC0804,以前在学
15、单片机课程时只是对其理论知识有了初步的理解。通过这次设计,对它的工作原理有了更深的理解。在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。总之这次电路的设计和仿真,基本上达到了设计的功能要求。在以后的实践中,我将继续努力学习电路设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。参考文献1胡健.单片机原理及接口技术.北京:机械工业出版社,2004 年 10 月2王毓银.数字电路逻辑设计.高等教育出版社,2005 年 12 月3于殿泓、王新年.单片机原理与程序设计实验教程.西安电子科技大学出版社,2007 年 5 月4谢维成、杨加国.单片机原理与应
16、用及 C51 程序设计实例.电子工业出版社,2006 年 3 月5李广弟.单片机基础.北京航空航天大学出版社,2007 年 5 月6姜志海,黄玉清等著.单片机原理及应用M .北京:电子工业出版社.2005 年7 月 7魏立峰.单片机原理及应用技术.北京大学出版社,2005 年8周润景.Protues 在 MCS-51 /IO 口定义sbit adwr=P36;sbit diola=P25;sbit dula=P26;sbit wela=P27;unsigned int j,k,ADVAL1,adval;uchar a,A1,A2,A3,A4,A5,A6;void delay(unsigned
17、char i)/延时程序for(j=i;j0;j-)/for(k=125;k0;k-);for(k=110;k0;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;P0=0x80;wela=1;wela=0;delay(1);/*显示输出电压的个位*/P0=t
18、ableGEWEI+0x80;dula=1;dula=0;P0=0xfe;wela=1;wela=0;delay(1);/*显示输出电压的十分位*/dula=0;P0=tableSHIFENWEI;dula=1;dula=0;wela=0;P0=0xfd;wela=1;wela=0;delay(1);/*显示输出电压的百分位*/P0=tableBAIFENWEI;dula=1;dula=0;wela=0;P0=0xfb;wela=1;wela=0;delay(1);/*数码管后三位输出 AD 转换的实际值*/void display1( uchar bai,uchar shi,uchar ge
19、)/*显示百位*/dula=0; P0=0;dula=1;dula=0;P0=0xf7;wela=1;wela=0;delay(1);dula=0;P0=tablebai;dula=1;dula=0;P0=0xf7;wela=1;wela=0;delay(1);/*显示十位*/dula=0;P0=tableshi;dula=1;dula=0;wela=0;P0=0xef;wela=1;wela=0;delay(1);/*显示个位*/dula=0;P0=tablege;dula=1;dula=0;wela=0;P0=0xdf;wela=1;wela=0;delay(1);dula=0;P0=0;
20、dula=1;dula=0;wela=0;P0=0xdf;wela=1;wela=0;delay(1);void ADCHANGE()wela=1; /重新打开有 AD 片选信号锁存器的锁存端P1=0xff; /读取 P1 口之前先给其写全 1P0=0; /选通 ADCSadrd=0; /AD 读使能adval=P1; /AD 数据读取赋给 P1 口ADVAL1=P1;adval=adval*5*100/255; /将 AD 转换的数据再次转换为实际电压值adrd=1; /5 为参考电压P0=0xff; /关闭 ADCSadwr=0;A1= adval/100;/A1A3 为实际电压值,A4A
21、6 为 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; /选通 ADCSadwr=0; /AD 写入?_nop_();adwr=1;P0=0xff; /关闭 ADCSdelay(10);wela=0; /关闭有 AD 片选信号锁存器的锁存端以防止在操作数码管时使 AD 的片选发生变化ADCHANGE();for(a=20;a0;a-) display(A1,A2,A3);display1(A4,A5,A6); /送去显示各位。