基于单片机AT89C51 的数字电压表显示
2022-05-11李泽滔
蒙 欢, 李泽滔
(贵州大学 电气工程学院, 贵阳 550025)
0 引 言
实验是科学探究的重要形式,测量是科学实验的重要环节。 随着电子科学技术的不断发展,电子测量技术也越来越普遍,对测量仪器的各方面性能要求也越来越高。 数字电压表(Digital Voltmeter,DVM)采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。 与传统的模拟式电压表相比,具有显示清晰直观、测量范围广、扩展能力强等优点。此外,与传统的仪表盘电压表相比,数字电压表避免了视觉误差的缺点。
1 电压表总体设计及原理
1.1 数字电压表的设计要求
本文所设计的电压表不同于其它电压表,其主要用于实验室的电压测试,显示精度为小数点后三位。 设计时应满足以下要求:
(1)电压采集电路输出电压要求:对输入量程的要求即是电压采集电路的要求。 如果采集的电压高于5 V(高于量程限制),数码管显示电压表将始终显示5 V。 因此,为了不引起混淆,需要满足电压采集电路的输出电压在0~5 V 之内。
(2)成本及功耗要求:由于电压采集电路的输出电压不是用来直接测量的,且由于转换精度的存在,故经A/D 转换器转换得到的电压值与元件实际电压值是有区别的。 为了程序的简洁性,且又具有一定的精度,选择8 位(即ADC0808)A/D 转换器。
1.2 数字电压表的总体设计
电压采集电路采集元件的电压值,得到的量为模拟量,将此模拟量经A/D 转换器转换为数字量,该数字量经过单片机处理,从而显示在数码管上。电路设计的总体框图如图1 所示。
图1 电路设计总体框图Fig.1 Overall block diagram of the circuit design
2 系统硬件设计
在系统的电路组成中,着重讨论A/D 转换电路,以及单片机最小系统电路与数码管显示电路的原理及作用。
2.1 A/D 转换电路
A/D 转换的电路如图2 所示。 RV1 为滑动变阻器,通过调节该滑动变阻器可以改变模拟量输入电压的值。 该模拟量电压值经A/D 转换电路转换为数字量(OUT1 ~OUT8 为数字量输出端)输出,最后在数码管上显示。
图2 A/D 转换电路图Fig.2 A/D converting circuit diagram
需要注意的是,ADDC、ADDB、ADDA 为3 位地址输入线,ADDC 为最高位,ADDA 为最低位。 通过该3位地址输入线,可以在8 路模拟量输入通道(IN0~IN7)中选择正确的输入通道。 选择规则为:让上述3 位地址输入线上的二进制编码值对应模拟量输入通道的下标值。 如,3 位地址输入线分别取0、0、1 时(注意:0、1代表数字电路中对应的低电位,高电位。 可自行设定一个范围,然后划分),所对应的十进制值为1,故接通IN1 通道。 此外,在图2 中,还需注意以下问题:
(1)给START 引脚(即A/D 转换开始脉冲输入引脚)加一个100 ns 宽的起动正脉冲,以确保AD 正常复位与启动。 其中,脉冲上升沿使AD 转换器复位,下降沿启动A/D 转换。
(2)ALE 为地址锁存允许信号,高电平有效。 当此信号有效时,ADDC、ADDB、ADDA 3 位地址信号被锁存,译码选通对应模拟通道。
2.2 单片机最小系统电路
单片机的最小系统是使单片机能满足单片机基本应用的最简单,且又是必不可少的基本电路。 单片机最小系统电路由51 单片机、时钟振荡电路、复位电路、电源电路、程序加载口组成。 其电路如图3 所示。
根据硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式与外部时钟方式。 时钟振荡电路的本质就相当于一个振荡器,其作用是使单片机内部触发器的状态发生改变。 因此,单片机内部的所有电路,在完成一个任务后将进入下一个状态,确保系统正常运行。
如图3 所示,左上角为时钟振荡电路(属于内部时钟电路),晶振1 的取值将决定程序运行的时钟周期。 左下角的电路为复位电路,与单片机的9 引脚(复位引脚)相连。 当单片机的9 引脚输入连续两个机器周期(一个机器周期等于十二个时钟周期)以上高电平时为有效,用来完成单片机的复位初始化操作,使单片机从头开始执行程序。 对于本文所设计的复位电路,通电时9 引脚为高电平,程序从头开始执行。 在运行的过程中,如果需要再次复位,再次按下复位电路的按键,可再次使程序从头开始执行。
图3 单片机最小系统电路图Fig.3 Circuit diagram of MCU minimum system
2.3 数码管显示电路
数码管显示电路如图4 所示,数码管显示分为静态显示与动态显示。 静态显示方式是由微型机一次输出显示后,保持该显示结果,直到下次接收到新的显示模型为止。 动态显示方式,是指微型机定时地对显示器件扫描。 在这种方式中,显示器件分时工作,每次只能有一个器件显示。 这两种显示方式有着本质的区别,静态显示的特点是占用CPU 时间少,显示便于监测和控制,显示字形稳定,而动态数码管的显示,效果相对静态显示亮度差少许,但成本较低。本文所设计的数码管显示为动态显示方式。
图4 数码管显示电路图Fig.4 Digital tube display circuit diagram
1 是上拉电阻,单片机P0 口内部并无上拉电阻,因此使用时,需加外部上拉电阻,增强输出能力。
3 系统软件设计
本文设计的核心程序为:主程序、A/D 转换子程序、数码管显示子程序。 其中,主程序完成数据的采集与显示;A/D 转换子程序完成数据的转换(即把模拟量转换为数字量输出);数码管显示子程序完成数字电压量的显示。
3.1 主程序
主程序的设计流程如图5 所示。 通过对A/D 转换输出的数字量进行处理、分离等一系列操作,最终显示采集的电压值。 由于定时器在进行计数或定时的过程中会产生溢出,因此要对定时器作初始化处理,同时也便于设置其工作模式。 主程序是系统软件设计的重点,其将决定数字电压表的显示量程、精度、灵敏度等。 因此,在主程序的设计中应注意以下几点:
图5 主程序流程图Fig.5 Main program flow chart
(1)对于程序中使用的变量或者函数应先声明与定义,不然会报错,导致最终电压值无法显示。
(2)定时/计数器的工作方式有4 种(0、1、2、3)。 对于前3 种工作方式,定时器都可以用来定时与计数,但其计算公式并不相同。 本文设置的工作方式为方式1。
(3)需要设置定时器中断处理函数。 当定时器/计数器设置为定时方式时,可以看成是对机器周期信号进行计数,且由于机器周期时间是固定的,所以定时时间等于计数值乘机器周期的值。 当计数产生“溢出”(计数器每位均为“1”时,再计数一次,就会使计数器回0,称为“溢出”)时,则会向CPU 发出中断请求,故需要设置中断处理函数。
3.2 A/D 转换子程序
MCS-51 和ADC 接口通常可以采用查询、中断或延时方法。
(1)查询方式。 采用查询方式传送数据时,先将转换结束信号经三态门送到CPU 数据总线或I/O 接口的某一位上;微型机向AD 转换器发出启动信号后,便开始查询AD 转换是否结束,一旦查询到AD 转换结束,则读出结果数据。
(2)中断方式。 中断方式,是将转换结束标志信号接到微型机系统的中断申请引脚(如IRQ2)或允许中断的I/O 接口的相应引脚上(如8051 的INT0)。 当转换结束时,即提出中断申请,微型机响应后,在中断服务程序中读取数据。
(3)延时方式。 软件延时具体做法是:微型机启动AD 转换后,根据转换芯片完成转换所需要的时间,调用一段软件延时程序(为保险起见,通常延时时间稍大于AD 转换过程所需的时间)。 延时程序执行完以后,AD 转换已完成, 即可读出结果数据。
本系统采用查询方法,一旦转换结束,立即读取结果,并经数码管显示。
3.3 数码管显示子程序
数码管显示子程序流程如图6 所示。 本设计采用数码管的动态显示,故需要引入1 ms 的延时函数。 数码管的连接分为共阳极与共阴极方式。 共阳极是将数码管的八段连接在一起,一般在共阳极加高电平;共阴极与共阳极连接方式相同,只是公共阴极一般接地。 连接在一起的公共端称为段码,其中之一的一个片段称为位码。 对显示的数字(段码显示)进行编码,有助于编程的实现。
图6 数码管显示子程序流程图Fig.6 Flow chart of the digital tube display
需要注意的是,虽然共阳极与共阴极的显示数字(段码显示)编码不同,但可以把这些编码值放在一个寄存器里面。 当需要显示某一特定字型时,取出相应的编码即可。 其次,本文所用数码管是共阳极数码管,也就是位选端高电平时,数码管被选中,然后输入段码(比如数字0 的段码),数码管就有显示(此时显示数字0,简称段码显示)。
4 实验结果及分析
本文设计的数码管显示电压表,能够高精度地显示所测元件的电压值,并且灵敏度较高。 只要稍微滑动变阻器,其数码管显示的电压值便随之变化,基本上没时间间隔误差。 最后的总仿真结果如图7 所示。从图中可以看出,电压表上的电压为2.25 V,而数码管上显示的电压为2.254 V,相对误差为0.17%,能够较好地逼近真实值。 还应注意单片机AT89C51 和AT89C52 是通用的,可以随便替换,但只是AT89C52容量大些,AT89C51 容量小些。 ADC0808 是ADC0809的简化版,是8 位并行的AD 芯片,也就是模拟量转数字量芯片。 8 位AD 转换器输出数据是0~255。
图7 总仿真图Fig.7 Total simulation diagram
5 结束语
通过Proteus 仿真平台、Keil 软件以及单片机相关知识,结合A/D 转换原理,本文设计了一种基于AT89C51 单片机的数码管显示电压表。 该电压表能够在0~5 V 之内显示不同的电压,具有精度高,灵敏度高的特点,同时也克服了传统仪表指针式电压表读数不稳定的缺点。 虽然,显示的范围较小,但是对于一般的电学实验来说,其实用性较好。