基于单片机的数字电压表设计毕业设计论文 下载本文

内容发布更新时间 : 2024/5/11 3:58:01星期一 下面是文章的全部内容请认真阅读。

攀枝花学院本科毕业设计(论文) 3 硬件设计方案 系统中的主CPU 之间的数据交换可以使用串口, STC89C52作为从器件; 工作时, 系统的主CPU 只需将要显示的数据通过串口, 以某种格式发送到单片机即可。另外STC89C52使用一根I/ O线作为向系统主CPU 发送中断申请的信号线, 当有按键按下时, STC89C52分析识别后向系统主CPU 发出中断申请, 系统主CPU 响应中断后, 向STC89C52发送显示数据, 本设计的硬件电路如图3.9所示。

图3.9 档位控制按键电路图

3.4 输出显示模块设计

3.4.1 输出显示模块选型

在电子产品设计中,人机交互显示界面是必不可少的工作,目前可以选择的显示模块类型有:点阵显示、单个LED显示、LED数码管显示、LCD显示等。其中LCD智能型显示模块则是一种低功耗、低损耗、低价值的显示器件,它不但可以显示各式各样的字符、汉字和图形,同时具有可编程能力,且与单片机接口方便,基于以上优点,LCD智能显示模块获得了广泛的应用。在本设计中所选LCD型号为8位的1602 LCD液晶显示器。1602 LCD如图3.10所示。

18

攀枝花学院本科毕业设计(论文) 3 硬件设计方案

图3.10 1602 LCD示意图

3.4.2 1602 LCD引脚功能

1602LCD引脚功能如下表所示:

表3.2 1602引脚功能

引脚 1 2 3 符号 VSS VDD V0 功能说明 一般接地 接电源(+5V) 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 E(或EN)端为使能(enable)端,下降沿使能。 低4位三态、 双向数据总线 0位(最低位) 低4位三态、 双向数据总线 1位 19

4 5 6 7 8

RS R/W E DB0 DB1

9 16 15 14 13 12 11 10

BLK BLA DB7 DB6 DB5 DB4 DB3 DB2

背光电源正极 背光 电源负极

口电路原理图如图3-11所示。

3.4.3 输出显示模块电路设计

高4位三态、 双向数据总线 6位 高4位三态、 双向数据总线 5位 高4位三态、 双向数据总线 4位 低4位三态、 双向数据总线 3位 低4位三态、 双向数据总线 2位 只有建立在此基础之上的编程才能实现设计的要求。输出显示模块与单片机的接

在设计数字电压表显示模块电路原理图时,得充分考虑显示模块与档位按键

模块的相互联系。对于显示器与MCU还有独立按键的读写关系得有充分的认识,

攀枝花学院本科毕业设计(论文) 3 硬件设计方案 高4位三态、 双向数据总线 7位(最高位)(也是busy flag) 图3.11 输出显示模块电路图

20

攀枝花学院本科毕业设计(论文) 4 软件设计方案

4 软件设计

4.1 程序流程图

本设计的软件部分主要完成系统的初始化内部数据计算,数据线显示输出等

功能。如图4.1所示是其主程序流程图和中断服务程序流程图。

开始对液晶,定时器初始化A/D转换数据转换档位按键判断Y平均电压值显示五秒的N三秒后清屏显示瞬时的电压值 图4.1 程序流程图

在启动CS5460A之前,必须先对它复位,只要对他的复位脚发复位脉冲,脉宽不少于10ms即可。对CS5460A写OXE8控制命令,即开始进行AD转换,并输出计算结果,这个命令一般在复位操作完成后输入,使其进入正常工作状态。在校准前必须使CS5460A处于活动状态,同时准备接收有效命令,并清除状态寄存器的DRDY位。有事串口与SCK会不同步,这时可向串口发初始化序列,包括至少3个时钟周期的STNC1命令字0XFF,以及紧跟着一个时钟周期的SYNC0命令字0XFE,这样才能使CS5460A能够正确的解释输入的命令字。

CS5460A,每次复位时会将偏移寄存器清0和增益寄存器置1,将校准得到的偏移寄存器值、增益寄存器值保存在EEPROM,初始化时再将这些值重新装入对应的寄存器中。

21

攀枝花学院本科毕业设计(论文) 4 软件设计方案

4.2 子程序设计

4.2.1 CS5460A端口初始化程序

void InitPort(void) {

DDRB |= _BV(1)+_BV(3)+_BV(5); PORTB &= ~_BV(4); DDRB &= ~_BV(4); }

4.2.2 CS5460A SPI读写程序

void Write_CS5460A(u08 *ptr,u08 n) {

s08 i=0,j=0; SCLK_L(); EN_CS();

for(j=n;j>=1;j--) {

for(i=7;i>=0;i--) {

SCLK_L();

if( ((*ptr)&(1<

if(j==0) UN_CS(); }

void Read_CS5460A(u08 reg,u08 *ptr) {

22