下面是基于单片机的数字电压表设计,星号之间为需要添加的程序,定时我自己加了,还有一个添加不出来,
就是对adc0808输出的信号采样这段做不出来,它要实现一个算法,即,将adc0808输出的
二进制数转换成相应的电压值,并且写成“*.***”的形式,将这几位分别放在30h,31h,32h
33h,34h单元里。中断次数的设置是为了能在很短的时间里采样几次,然后去平均值(“*.***”形式)放在相应
的单元里,这样可以消除抖动,是测量值更精确。
麻烦各位大侠帮忙一下,
COM EQU 50H ;指令寄存器
DAT EQU 51H ;数据寄存器
RS EQU P2.1 ;LCD寄存器选择信号
RW EQU P2.2 ;LCD读/写选择信号
E EQU P2.3 ;LCD使能信号
ORG 0000H
LJMP MAIN ;主程序入口
ORG 000BH
LJMP BT0 ;T0中断入口
ORG 0030H ;主程序,初始化
MAIN: MOV SP,#60H
LCALL INT ;调LCD简介控制方式下的初始化子程序
MOV 30H,#30H ;8051片内30H-34H为显示缓冲区,用于存放A/D转换数据
MOV 31H,#0A5H ;初始化数据设为0.000
MOV 32H,#30H
MOV 33H,#30H
MOV 34H,#30H
MOV R7,#30H
LCALL N1 ;显示 Voltage=0.000
;*********************** 定时器初始化程序 ***********************************
MOV TMOD,#00H ;定时器T0设为方式0
MOV TL0,#0FH ;装入定时常数
MOV TH0,#00H
SETB TR0 ;启动T0
MOV R6,#03H ;装入T0中断次数
SETB EA
SETB ET0 ;开中断
;******************************************************************************
LP: MOV R7,#30H ;显示缓冲区首地址
LCALL DISPLY
SJMP LP ;循环显示
;********************** 定时器中断服务程序 **********************************
BT0:
;读取0809第0通道的转换结果
;重新启动0809
;将读得的2进制数据转换为10进制数
;将数据送往显示缓冲区30H-34H
RETI
;******************************************************************************
DISPLY: ;LCD显示子程序
MOV COM,#8AH
LCALL PR1
MOV R1,#05H
MOV R0,#30H
L: MOV DAT,@R0
LCALL PR2
INC R0
DJNZ R1,L
RET
;1.逐字一次输入方式演示程序段
N1: MOV COM,#01H
LCALL PR1
MOV COM,#06H
LCALL PR1
MOV COM,#080H
LCALL PR1
MOV DPTR,#TAB
MOV R2,#10
MOV R3,#00H
WRIN: MOV A,R3
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2
INC R3
DJNZ R2,WRIN
RET
TAB: DB"Voltage=";
;LCD间接控制方式下的初始化子程序
INT: LCALL DELAY ;调延时子程序
MOV COM,#38H ;设置工作方式
LCALL PR1
MOV COM,#01H ;清屏
LCALL PR1
MOV COM,#06H ;设置输入方式
LCALL PR1
MOV COM,#0EH ;设置显示方式
LCALL PR1
RET
DELAY:MOV R6,#0FH ;延时子程序
MOV R7,#00H
DELAY1:
NOP
DJNZ R7,DELAY1
DJNZ R6,DELAY1
RET
;LCD间接控制方式的驱动子程序
;1 读BF和AC值
PR0: PUSH ACC
MOV P0,#0FFH ;P0置位,准备读
CLR RS
SETB RW
SETB E
LCALL DELAY
MOV COM,P0
CLR E
POP ACC
RET
;2 写指令代码子程序 ;读BF和AC6-4值
PR1: PUSH ACC
CLR RS
SETB RW
PR11: MOV P0,#0FFH ;P0置位,准备读
SETB E
LCALL DELAY
NOP
MOV A,P0