基于Proteus和MedWin V3.0的直流数字电压表的设计

2019-10-08 05:23:14
张家口职业技术学院学报 2019年2期
关键词:电压表字符端口

严 敏

(江苏旅游职业学院 信息工程学院,江苏 扬州 225127)

数字电压表由于具有测量速度快、测量精度高、测量结果可视化显示等优点,已广泛应用于智能测量控制的某些领域[1-2]。本文设计了一个基于Proteus和MedWin V3.0的直流数字电压表,以微控制器芯片AT89C51为主控制器测量单通道模拟电压,在ADC0832模数转换后,输出数字电压值在LCD1602屏幕上实时显示。

1 系统硬件设计

1.1 设计总体结构

该设计使用单片机芯片AT89C51控制ADC0832进行模数转换,ADC0832输入被测0~5V模拟电压,经模数转换后,输出的数字电压值介于0x00~0xFF之间。单片机读取ADC0832模数转换结果,进行数值量程变换,再送液晶屏LCD1602实时显示,系统设计的总体结构如图1所示。

图1 系统的总体结构

1.2 A/D转换器ADC0832

设计电路时,将引脚VCC接5 V,将GND引脚接地,并将引脚 (芯片选择使能)连接到微控制器AT89C51的P2.5端口,引脚CLK(时钟输入端子)连接到AT89C51的P2.6端口,引脚DI(数据信号输入)和引脚DO(数据信号输出)在通信期间不同时有效,并且与AT89C51的接口是双向的,所以将它们并联一起连接到AT89C51的P2.7端口,引脚CH0(模拟输入通道0)经过滑动变阻器连接到被测模拟电压,由于只测量一路电压,所以不使用引脚CH1(模拟输入通道1),如图2所示。当然,这里也可以将被测模拟电压连接到引脚CH1,不使用引脚CH0。

图2 ADC0832电路原理图

1.3 LCD1602液晶显示模块

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所示,DDRAM第一行的地址从00H开始到27H结束,第二行的地址从40H开始到67H结束,每行40个地址,而LCD1602每行显示16个字符,因此在编写程序的时候,选用DDRAM的前16个地址即可,需要特别注意的是第二行地址是从40H开始的。如果要在LCD1602屏幕的某行某列显示一个字符,就往某行某列对应的DDRAM地址写入这个字符对应的ASCII码,这时会发现液晶屏幕上并不能正常显示出这个字符,原因就是必须在该地址的基础上还要加上80H。比如,要在第二行第二列显示电压单位伏特的符号“V”,就要先将第二行第二列对应的DDRAM地址41H加上80H,即C1H,然后在C1H地址写入“V”字符对应的ASCII码0x56,这样才能正常显示,其它字符的显示依此类推,不再赘述。

表1 显示位与DDRAM的对应关系

2 系统软件设计

根据ADC0832的工作时序要求和LCD1602液晶显示要求,该系统控制程序在MedwinV3.0开发软件中用C51语言编写完成,实现电压表的测量功能。

2.1 主程序设计

void main()

{ unsigned int val; //定义变量

……

while(1)

{val=ADC(); //进行A/D转换

int=(val)/51; //计算整数部分

dec=(val%51)*100/51; //计算小数部分

Display1(int); //显示整数部分

Display2(dec); //显示小数部分 ……}

2.2 A/D转换子程序设计

unsigned char ADC()//模数转换子程序

{ ……

CS=0; //片选有效

CLK=1; CLK=0; //第一个脉冲的下降沿

DIO=1;

CLK=1; CLK=0; //第二个脉冲下降沿

DIO=0; //选择通道CH0

CLK=1; CLK=0; //第三个脉冲下降沿

DIO=1; //DI失去作用

CLK=1; //第四个脉冲

for(i=0;i<8;i++)//一个字节8位数据

{CLK=1; CLK=0;

data<<=1;

data|=(unsigned char)DIO; }

CS=1; //片选无效

return data; } //将读取的数据返回

2.3 LCD1602液晶显示子程序设计

LCD1602液晶屏的驱动程序编写相对复杂,一定要弄清楚1602的各个操作指令的用法和意义,主要包括显示模式的设置、显示开关控制、输入模式控制、从DDRAM中读取数据、对DDRAM进行写数据、清屏、光标归位设定、数据地址指针设置、LCD目前的忙碌工作标志等[3],其部分代码设计如下所示:

……

void Lcd_initial()//初始化LCD

{ E=0;

Lcd_writecmd(0x38); //16*2显示,5*7点阵

msdelay (1);

Lcd_writecmd(0x08); //显示关闭

msdelay (2);

Lcd_writecmd(0x01); //显示清屏

msdelay (2);

Lcd_writecmd(0x06); //设置光标,读写一个字符后,光标加1

msdelay (1);

Lcd_writecmd (0x0c); //显示打开,不显示光标

msdelay (1); }

3 仿真与结果分析

在Medwin V3.0开发软件中编写程序、修改调试程序、编译后生成十六进制HEX文件,打开Proteus电路设计图,将其加载到AT89C51芯片中并启动仿真按钮以查看系统设计的仿真结果。根据分压原理,改变滑动变阻器RV2的阻值大小,从而改变ADC0832输入通道CH0的被测模拟电压值,此时液晶 LCD1602显示的电压值随之改变,并精确到小数点后两位。为了便于电压测量结果的分析,在RV2两端加一个虚拟电压表,同时观察虚拟电压表和LCD1602显示数值的大小,分别如图4和图5所示。经过多次测量,得出如下结论:被测模拟电压和模数转换后的数字电压这两者的电压数值误差较小,基本上约为10mV,小于8位分辨率的电压精度5V/28≈19.53mV,可见测量精度高,满足本设计要求。

图4 虚拟电压表

图5 数字电压表

4 结束语

本文基于Proteus和MedWin V3.0设计了直流数字电压表,在MedWin V3.0开发环境中编写、调试单片机C51程序,编译完成后生产HEX文件并将其加载到AT89C51芯片中,以便在Proteus仿真平台上进行验证。Proteus和MedWin V3.0的联合使用,不仅对单片机课程的课堂教学有较好的项目演示功能,而且对单片机项目的开发设计有很大的实际意义。

猜你喜欢
电压表字符端口
寻找更强的字符映射管理器
如何判断电压表的测量对象
一种端口故障的解决方案
科学家(2021年24期)2021-04-25 13:25:34
判断电压表测量对象有妙招
字符代表几
一种USB接口字符液晶控制器设计
电子制作(2019年19期)2019-11-23 08:41:50
消失的殖民村庄和神秘字符
端口阻塞与优先级
电压表的妙用
再探电压表内阻的测量方法