严 敏
(江苏旅游职业学院信息工程学院,江苏扬州225127)
数字电压表具有测量速度快、测量精度高及测量结果可视化等优点,已用于智能测量控制的某些领域[1-2]。本文设计的基于Proteus和MedWin V3.0直流数字电压表,以AT89C51为主控制器测量单通道模拟电压,在ADC0832模数转换后,输出数字电压值在LCD1602屏幕上实时显示。
该设计使用单片机芯片AT89C51控制ADC0832进行模数转换,ADC0832输入被测0~5 V模拟电压,经模数转换后,输出的数字电压值介于0x00~0xFF之间。单片机读取ADC0832模数转换结果,进行数值量程变换,再送至液晶屏LCD1602实时显示,系统设计的总体结构如图1所示。
图1 系统的总体结构
设计电路时,将引脚VCC接5 V,将GND引脚接地,并将引脚CS(芯片选择使能)连接到微控制器AT89C51的P2.5端口,引脚CLK(时钟输入端子)连接到AT89C51的P2.6端口,引脚DI(数据信号输入)和引脚DO(数据信号输出)在通信期间不同时有效,并且与AT89C51的接口是双向的,所以将它们并联一起连接到AT89C51的P2.7端口,引脚CH0(模拟输入通道0)经过滑动变阻器连接到被测模拟电压,由于只测量一路电压,所以不使用引脚CH1(模拟输入通道1),如图2所示。当然,这里也可以将被测模拟电压连接到引脚CH1,不使用引脚CH0。
图2 ADC0832电路原理
当ADC0832不工作时,CS为高电平;当ADC082处于执行模数转换工作状态时,则将CS设置为低电平,并且保持低电平状态一直到模数转换完成。根据ADC0832的工作时序要求,DI必须在CLK的第1个脉冲的下降沿之前置为高电平,表示启动信号。DI在CLK第2、3个脉冲的下降沿之前分别输入1、0,选择CH0单通道;如果选择CH1单通道,这里DI应分别输入1、1。DI在CLK第3个脉冲的下降沿之后失效,此时DO开始有效。从CLK第4个脉冲下降沿开始一直到第11个脉冲下降沿结束,ADC0832从DO依次输出最高位数据直到最低位数据,完成一个字节8位数据的输出。
LCD1602屏幕可以显示两行字符,每行16个,总共32个字符。在电路设计时,引脚VSS接地,引脚VDD接5 V,引脚VEE接地。引脚RS(数据/指令寄存器选择)、引脚R/W(读/写选择)、引脚E(使能端)分别连接到AT89C51的P2端口的P2.0、P2.1、P2.2。引脚D0~D7(8位数据)直接连接到AT89C51的P0端口的P0.0~P0.7,这里使用上拉电阻RP1的目的是增加驱动能力。
图3 LCD1602电路原理
LCD1602内部有一个80*8位的DDRAM缓冲区,字符显示位与DDRAM地址的对应关系如表1所示。
表1 显示位与DDRAM的对应关系
由表1可知,DDRAM第1行的地址从00H开始到27H结束,第2行的地址从40H开始到67H结束,每行40个地址,而LCD1602每行显示16个字符,因此在编写程序的时候,选用DDRAM的前16个地址即可,需要特别注意的是第2行地址是从40H开始的。如果要在LCD1602屏幕的某行某列显示一个字符,就往某行某列对应的DDRAM地址写入这个字符对应的ASCII码,这时会发现液晶屏幕上并不能正常显示出这个字符,原因就是必须在该地址的基础上还要加上80H。比如,要在第2行第2列显示电压单位伏特的符号V,就要先将第2行第2列对应的DDRAM地址41H加上80H,即C1H,然后在C1H地址写入V字符对应的ASCII码0x56,这样才能正常显示,其他字符的显示依此类推,不再赘述。
根据ADC0832的工作时序要求和LCD1602液晶显示要求,该系统控制程序在MedwinV3.0开发软件中用C51语言编写完成,实现电压表的测量功能。
主程序代码设计如下。
A/D转换子程序代码设计如下。
LCD1602液晶屏的驱动程序编写较复杂,要弄清楚1602各个操作指令的用法和意义,操作指令包括显示模式的设置、显示开关控制、输入模式控制、从DDRAM中读取数据、对DDRAM进行写数据、清屏、光标归位设定、数据地址指针设置及LCD目前忙碌工作标志等[3]。其部分代码设计如下。
为了便于电压测量结果的分析,在RV2两端加一个虚拟电压表,同时观察虚拟电压表和LCD1602显示数值的大小,分别如图4所示。
图4 数字电压表
在Medwin V3.0开发软件中编写程序、修改调试程序、编译后生成十六进制HEX文件,打开Proteus电路设计图,将其加载到AT89C51芯片中并启动仿真按钮以查看系统设计的仿真结果。根据分压原理,改变滑动变阻器RV2的阻值大小,从而改变ADC0832输入通道CH0的被测模拟电压值,此时液晶LCD1602显示的电压值随之改变,并精确到小数点后两位。
经过多次测量可得:被测模拟电压和模数转换后的数字电压之间误差较小,约为10 mV,小于8位分辨率的电压精度5 V/28≈19.53 mV。由此可见,测量精度高,满足本设计要求。
本文基于Proteus和MedWin V3.0设计了直流数字电压表,在MedWin V3.0开发环境中编写、调试单片机C51程序,编译完成后生成HEX文件并将其加载到AT89C51芯片中,以便在Proteus仿真平台上进行验证。Proteus和MedWin V3.0联合使用,不仅对单片机课程有较好的项目演示功能,而且对单片机项目的开发设计具有很大的实际意义。