1、数字电压表设计总体设计1.数字电压表的设计即将连续的模拟电压信号经过 A/D 转换器转换成二进制数值,再经由单片机软件编程转换成十进制数值并通过显示屏显示。 2.按系统实现要求,决定控制系统采用 AT89C51 单片机,A/D 转换由于仿真软件里的 ADC0808.3.采用 ADC0808。数字电压表系统整体框图如下图 1 所示。模拟电 压AT89C51单片机ADC0808转换 数据显 示( 图一)整体设计框图系统通过软件设置单片机的内部定时器 T1 产生中断信号。通过片选选择8 路通道中的一路,将该路电压送入 ADC0808 的 EOC 端口产生高电平,同时将 ADC0808 的 OE 端口
2、置为高电平,单片机将转换后结果存到片内 RAM。系统调出转换显示程序,将转换为二进制的数据在转换成十进制数并输出到 LCD显示电路,将相应电压显示出来。模块分析接口分配电路设计如右图 2 所示:P0 口 : P0 口 为 一 个8 位 漏 级 开 路 双 向 I/O 口 ,每 脚 可 吸 收 8TTL 门 电 流 。当 P1 口 的 管 脚 第 一 次 写1 时 , 被 定 义 为 高 阻 输 入 。P0 能 够 用 于 外 部 程 序 数 据存 储 器 , 它 可 以 被 定 义 为数 据 / 地 址 的 第 八 位 。 在 这 里 P0 口 作 为 输 入 与 输 出 分 别 与 ADC0
3、808 的 输出 端 和 LCD 显 示 的 输 入 端 相 连 , 且 P0 外 部 被 阻 值 为 1K的电阻拉高P2 口 : P2 口 为 一 个 内 部 上 拉 电 阻 的 8 位 双 向 I/O 口 , P2 口 缓 冲 器可 接 收 , 输 出 4 个 TTL 门 电 流 , 当 P2 口 被 写 “1”时 , 其 管 脚 被 内 部 上 拉 电阻 拉 高 , 且 作 为 输 入 。 并 因 此 作 为 输 入 时 , P2 口 的 管 脚 被 外 部 拉 低 , 将 输出 电 流 。 这 是 由 于 内 部 上 拉 的 缘 故 。 P2 口 当 用 于 外 部 程 序 存 储 器
4、 或 16 位地 址 外 部 数 据 存 储 器 进 行 存 取 时 , P2 口 输 出 地 址 的 高 八 位 。 在 给 出 地 址“1”时 , 它 利 用 内 部 上 拉 优 势 , 当 对 外 部 八 位 地 址 数 据 存 储 器 进 行 读 写 时 ,P2 口 输 出 其 特 殊 功 能 寄 存 器 的 内 容 。 这 里 只 用 到 了 P2.0P2.3 四 个 端 口 ,其 中 P2.1P2.3 都 是 作 为 输 出 端 口 控 制 显 示 电 路 的 寄 存 器 选 择 、 读 写 信 号 和使 能 端 口 。P3 口 : P3 口 管 脚 是 8 个 带 内 部 上 拉
5、 电 阻 的 双 向 I/O 口 , 可 接 收 输 出 4个 TTL 门 电 流 。 当 P3 口 写 入 “1”后 , 它 们 被 内 部 上 拉 为 高 电 平 , 并 用 作 输入 。 作 为 输 入 , 由 于 外 部 下 拉 为 低 电 平 , P3 口 将 输 出 电 流 ( ILL) 这 是 由于 上 拉 的 缘 故 。 P3 口 也 可 作 为 AT89C51 的 一 些 特 殊 功 能 口 , 在 这 里 用 到 了 P3.3 /INT1( 外 部 中 断 1) 、 P3.6 /WR( 外 部 数 据 存 储 器 写 选 通 ) 、 P3.7 /RD( 外部 数 据 存 储
6、 器 读 选 通 ) 。A/D 转换接口分配电路设计如图 3 所示:A/D 转 换 电 路 IN0 IN7 为 8 路 模 拟 量 输 入 端 , 这 里 只 接 一 路 电 压 信 号 , 其 输 入信 号 是 由 直 流 电 源 及 可 调 电 阻 提 供 。 OUT1OUT8 为 8 位 二 进 制 数 字 量 输 出 端 , 其 另 一 端 连 接 到AT89C51 单 片 机 进 行 数 值 转 换 。 ADDA、 ADDB、 ADDC 为 3 位 片 选 地 址 输 入 线 , 用 于 选 通 8 路 模拟 输 入 中 的 一 路 。ALE 为 地 址 锁 存 允 许 信 号 ,
7、由 单 片 机 P3.6 口 写 信 号 与 P2.0 口 相 或 取反 输 入 , 高 电 平 有 效 。 START 为 A D 转 换 启 动 脉 冲 输 入 端 , 由 单 片 机 P3.6 口 写 信 号与 P2.0 口 相 或 取 反 输 入 一 个 正 脉 冲 使 其 启 动 ( 脉 冲 上 升 沿 使 0808 复 位 ,下 降 沿 启 动 A/D 转 换 ) 。 EOC 为 A D 转 换 结 束 信 号 , 当 A D 转 换 结 束 时 , 此 端 输 出 一个 高 电 平 取 反 给 P3.3 口 ( 转 换 期 间 一 直 为 低 电 平 ) 。 OE 为 数 据 输
8、 出 允 许 信 号 , 高 电 平 有 效 。 当 A D 转 换 结 束 时 , 此端 由 单 片 机 P3.7 读 信 号 与 P2.0 口 相 或 后 取 反 输 入 一 个 高 电 平 , 才 能 打 开 输出 三 态 门 , 输 出 数 字 量 。1. 显 示 电 路 接 口 分 配 设 计 如 图 4 所 示 :RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。由单片机 P2.1 口控制R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当
9、 RS 为高电平 R/W 为低电平时可以写入数据。由单片机 P2.2 口控制E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。由单片机 P2.3 口控制D0D7 为 8 位双向数据线。由单片机 P0 口输入,经过阻值为 1K的上拉电阻连接。软件设计主程序的内容包括:起始地址、中断服务程序的起始地址、有关内存单元及相关部件的初始化和一些子程序的调用等。根据设计要求,设计出如图所示的主程序流程图。A/D 转换子程序设计: A/D 转换程序的功能是采集数据,在整个系统设计中占有很高的地位。当系统置好后,单片机扫描转换结束管脚 P3.7 的输入电平状态,当输入为高电平则转换完成,将转
10、换的数值显示输出。若输入为低电平,则继续扫描。程序流程图如图所示。A/D 转换子程序流程图程序清单COM EQU 50H ; 指令寄存器DAT EQU 51H ; 数据寄存器RS EQU P2.1 ; LCD 寄存器选择信号RW EQU P2.2 ; LCD 读/写选择信号E EQU P2.3 ; LCD 使能信号ORG 0000HLJMP MAIN ;主程序入口ORG 000BHLJMP BT0 ;T0 中断入口ORG 0030H ;主程序,初始化MAIN: MOV SP,#60HLCALL INTMOV 30H,#30HMOV 31H,#30HMOV 32H,#0A5HMOV 33H,#3
11、0HMOV 34H,#30HMOV R7,#30HLCALL N1 ;显示 Voltage = 00.00MOV TMOD,#00H ;定时器 T0 设为方式 0MOV TH0,#00h ;装入定时常数MOV TL0,#00hSETB TR0 ;启动 T0MOV 24h, #03h ;装入 T0 中断次数MOV IE,#82H ;开中断LP: MOV R7,#30H ;显示缓冲区首地址LCALL DISPLYSJMP LP ;循环显示DISPLY:MOV COM,#0CAH ;设置数据起始地址(第而行第 10 位)LCALL PR1MOV R1,#05HMOV R0,#30Hl: MOV DA
12、T,r0LCALL PR2INC R0DJNZ R1,lRET;1. 逐字依次输入方式演示程序段N1:MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#081H ;设置数据起始地址(第一行地二位)LCALL PR1MOV DPTR,#TAB1MOV R2,#0EHMOV R3,#00HWRIN1:MOV A,R3MOVC A,A+DPTRMOV DAT,ALCALL PR2INC R3DJNZ R2,WRIN1MOV COM,#0C1H ;设置数据起始地址(第二行地二位)LCALL PR1MOV DPTR,#TAB2M
13、OV R2,#9MOV R3,#00HWRIN2:MOV A,R3MOVC A,A+DPTRMOV DAT,ALCALL PR2INC R3DJNZ R2,WRIN2RETTAB1: DB “VOLTAGE= “; LCD 间接控制方式下的初始化子程序INT:LCALL DELAY ; 调延时子程序MOV COM,#38H ; 设置工作方式( 2 行,8 位数据)LCALL PR1MOV COM,#01H ; 清屏LCALL PR1MOV COM,#06H ; 设置输入方式LCALL PR1MOV COM,#0CH ; 设置显示方式LCALL PR1RETDELAY:MOV R6,#0FH ;
14、 延时子程序MOV R7,#00HDELAY1: NOPNOPDJNZ R7,DELAY1DJNZ R6,DELAY1RET;LCD 间接控制方式的驱动子程序如下;1 读 BF 和 AC 值PR0: PUSH ACCMOV P0,#0FFH ; P0 置位, 准备读CLR RS ; RS=0SETB RW; R/W=1SETB E ; E=1LCALL DELAYMOV COM,P0 ; 读 BF 和 AC6-4 值CLR E ; E=0POP ACCRET;2 写指令代码子程序PR1: PUSH ACCCLR RS ; RS=0SETB RW ; R/W=1PR11:MOV P0,#0FFH
15、; P0 置位, 准备读SETB E ; E=1LCALL DELAYNOPMOV A,P0CLR EJB ACC.7,PR11;BF=1?CLR RW; R/W=0MOV P0,COMSETB E ; E=1CLR E ; E=0; E=0POP ACCRET;3 写显示数据子程序PR2:PUSH ACCCLR RS ; RS=0SETB RW; R/W=1PR21:MOV P0,#0FFHSETB E ; E=1LCALL DELAYMOV A,P0 ; 读 BF 和 AC6-4 值CLR E ; E=0JB ACC.7,PR21SETB RSCLR RWMOV P0,DAT; 写入数据S
16、ETB ECLR EPOP ACCRET;4 读显示数据子程序PR3:PUSH ACCCLR RS ; RS=0SETB RW; R/W=1PR31:MOV P0,#0FFH ; P0 置位, 准备读SETB E ; E=1LCALL DELAYMOV A,P0 ; 读 BF 和 AC6-4 值CLR E ; E=0JB ACC.7,PR31SETB RSSETB RW; R/W=1MOV P0,#0FFH ; 读数据SETB E ; E=1MOV DAT,P0CLR E ; E=0POP ACCRET; 定时器 T0 中断服务程序,读取 ADC0809 第 0 通道的 A/D 转换结果并化为
17、显示值BT0: PUSH ACC ;保护现场PUSH PSWMOV PSW,#08HCLR TR0 ;停止 T0MOV TH0,#00h ;重装定时常数MOV TL0,#00hMOV DPTR,#0F6FFH ;0809 端口地址MOV A,#0 ;0 通道MOVX DPTR,A ;启动 0809MOV R7,#0FFH ;等待 A/D 转换完DJNZ R7,$MOVX A,DPTR ;读 0809 转换结果MOV B,#03H ;将转换的值除以 3 再累加,存入 40H 中DIV ABADD A,40HMOV 40H,AMOV A,B ;将除以 3 后的余数累加放入 41H 中ADD A,4
18、1HMOV 41H,ADEC 24h ;3 次中断未到则返回MOV A,24HJNZ RNT1MOV 24h,#03h ;重装中断次数MOV A,41H ;将累加的余数再除 3 后相加DIV ABADD A,40HMOV 40H,#0 ;清零累加数MOV 41H,#0RTN: MOV B,#0fh ;A/D 转换结果化为显示值MUL AB ;(AD*5)/256MOV R0,AMOV A,BMOV B,R0MOV R0,AADD A,#246MOV A,R0MOV 30H,#00HJNC LOOPADD A,#06HMOV 30H,#01HLOOP:MOV 31H,A ;AD*5 的高字节为整数部分MOV A,BMOV B,#0AHMUL AB ;AD*5 的低字节为/256 的结果,为小数部分MOV 33H,B ;二进制小数换为 10 进制数MOV B,#0AHMUL AB MOV 34H,BLJMP RTN1RTN1: SETB TR0ORL 30H,#30HORL 31H,#30HMOV 32H,#0A5H ;小数点ORL 33H,#30HORL 34H,#30HPOP PSWPOP ACCRETIEND