📄 xujiejie.asm
字号:
COM EQU 50H
DAT EQU 51H
TC0 EQU 52H ;定时器计数单元
REST0 EQU 54H ;存放通道0转换结果
AIN0 EQU 00H ;通道0
LGAT EQU 33H ;量程转换门限
ADCADD EQU 0F6FFH ;ADC0808 地址
RS EQU P2.1 ;LCD 寄存器选择信号
RW EQU P2.2 ;LCD 读/写选择信号
E EQU P2.3 ;LCD 使能信号
EV EQU 196 ;<5V时每个间隔的电压值数量级为10^-4
MAXV EQU 255 ;最大数字量
;--------------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP BT0
ORG 0030H
MAIN: LCALL WPAD
MOV SP,#60H ;设置堆栈起始位置
LCALL INT ;对显示器进行初始化
MOV 30H,#30h ;显示电压值初始化为 ------
MOV 31H,#0A5H ;-
MOV 32H,#30H ;-
MOV 33H,#30H ;-
MOV 34H,#30h ;-
MOV 35H,#30H ;-
MOV R7 ,#30H ;
LCALL N1 ;显示出"Voltage = "
MOV REST0,#00H ;转换结果为00
;--------------------------------------
;定时器初始化
;**************************************
MOV TMOD,#00H ;T0工作方式0
MOV TH0,#0CH ;定时 5ms ,fosc=12MHz时,为0C78H fosc=6MHz 时为 163CH
MOV TL0,#78H
SETB TR0 ;启动T0
MOV TC0,#14H ;定时 100ms 采样一次 28H=40
MOV IE,#82H ;开定时中断
MOV A,#AIN0
MOV DPTR,#ADCADD
MOVX @DPTR,A
;--------------------------------------
;程序循环等待部分
;**************************************
LP: MOV R7,#30H ;显示缓冲区首地址
LCALL DISPLAY ;调用显示
SJMP LP ;循环显示
;主程序结束
;--------------------------------------
;定时器中断服务程序,读取转换结果并转换为显示值
;**************************************
BT0: MOV TH0,#0CH ;定时 5ms ,fosc=12MHz时,为0C78H fosc=6MHz 时为 163CH
MOV TL0,#78H
PUSH PSW
MOV PSW,#08H ;中断中使用寄存器 1
DEC TC0 ;中断中计数单元都-1
MOV A,TC0 ;如果 0 单元为 0 ,则采集 0 通道数据
CJNE A,#00H,CST0
MOV TC0,#28H ;200ms转换一次
MOV DPTR,#ADCADD ;读取通道0转换结果
MOVX A,@DPTR
MOV REST0,A
;转到数据转换程序
MOV DPTR,#ADCADD ;启动下一次通道0的转换
MOV A,#AIN0
MOVX @DPTR,A
SJMP V2SHOW
CST0: LJMP REI ;前面跳转到此接力
;---转换结果为电压值
V2SHOW: MOV A,REST0
UIN0: MOV B,#EV
MUL AB
MOV R2,B
MOV R3,A
;---------将二进制转换为十进制
B2BCD: CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#24 ;24bit 即 3 字节
LOOP: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R1
RLC A
MOV R1,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP
;------------------------------
;根据转换结果选择量程
MOV A,#LGAT
MOV B,REST0
SUBB A,B
JNC LOWM ;转小量程
;大量程转换程序
SMV: MOV DPTR,#DTAB ;将转换结果放到显示缓冲区
MOV A,R4 ;得到最高位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 30H,A
MOV 31H,#02EH ;小数点
MOV A,R5 ;得到小数点后第1/2位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 33H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 32H,A
MOV A,R6 ;得到小数点后第3位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 34H,A
LJMP DCOUV ;转到启动 A/D 转换程序
;小量程转换程序
LOWM: MOV DPTR,#DTAB ;将转换结果放到显示缓冲区
MOV 30H,#02EH ;最高位显示小数点
MOV A,R5 ;得到小数点后第1/2位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 32H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 31H,A
MOV A,R6 ;得到小数点后第3位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 33H,A
MOV A,R6
ANL A,#0FH
MOVC A,@A+DPTR
MOV 34H,A
DCOUV: MOV A,REST0
MOV A,#AIN0
MOV DPTR,#ADCADD
MOVX @DPTR,A
MOV 35H,#'V' ;单位
REI: POP PSW
RETI
DTAB: DB "0123456789"
;--------二进制转换位十进制
;中断服务程序结果
;--------------------------------------
;LCD 显示相关程序
;**************************************
DISPLAY: ;显示
MOV COM,#08AH ;开始显示的地址
LCALL PR1
MOV R1,#06H ;要显示的数据个数
MOV R0,#30H ;要显示数据的首地址
L: MOV DAT,@R0
LCALL PR2
INC R0 ;指向要显示的下一个数据
DJNZ R1,L ;未显示完,则显示下一个
RET
;--------------------------------------
;逐字输入方式演示程序段
;**************************************
N1: MOV COM,#01H ;清屏
LCALL PR1
MOV COM,#06H ;写入数据后 AC 自动加 1
LCALL PR1
MOV COM,#080H ;开始显示的 LCD RAM 地址
LCALL PR1
MOV DPTR,#TAB
MOV R2,#10H ;要显示的字符数
MOV R3,#00H
WRIN: MOV A,R3
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2
INC R3
DJNZ R2,WRIN
MOV COM,#0C0H ;显示首地址
LCALL PR1
MOV DPTR,#STAB ;显示数据首地址
MOV R2,#10H ;17个数据
MOV R3,#00H ;要显示的数据位
SL:
MOV A,R3
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2
INC R3
DJNZ R2,SL
;以上是固定显示标志
MOV COM,#0C0H ;设置第2行DDRAM地址
LCALL PR1 ;写入
MOV R4,#11H ;第2行共17个字符
LCALL WP1
WPAD: MOV COM,#40H ;设置CGRAM首地址为0
LCALL PR1 ;写入CGRAM首地址
MOV R4,#24 ;3个汉字共24字节子模数据
MOV DPTR,#ZIMO ;指向字模首地址
WP1: CLR A
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2 ;写入1字节字模数据
INC DPTR
DJNZ R4,WP1
RET
ZIMO: DB 08H,0FH,12H,0FH,0AH,1FH,02H,00H;“年”
DB 0FH,09H,0FH,09H,0FH,09H,11H,00H;“月”
DB 0FH,09H,09H,0FH,09H,09H,0FH,00H;“日”
RET
STAB: DB "200500756 ",00H,01H,02H,20H
TAB: DB "Voltage = "
;--------------------------------------
;LCD 间接控制方式下的初始化程序
;**************************************
INT: LCALL DELAY
MOV COM,#38H ;设置功能: 8位数据,5X8字体
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 ;RS=0
SETB E ;E=1
LCALL DELAY
MOV COM,P0 ;读 BF 和 AC6-4 值
CLR E ;E=0
POP ACC
RET
;--------2.写指令代码程序
PR1: PUSH ACC
CLR RS
SETB RW
PR11: MOV P0,#0FFH
SETB E
LCALL DELAY
NOP
MOV A,P0
CLR E
JB ACC.7,PR11
CLR RW
MOV P0,COM
SETB E
CLR E
POP ACC
RET
;--------3.写显示数据程序
PR2: PUSH ACC
CLR RS
SETB RW
PR21: MOV P0,#0FFH
SETB E
LCALL DELAY
MOV A,P0
CLR E
JB ACC.7,PR21
SETB RS
CLR RW
MOV P0,DAT
SETB E
CLR E
POP ACC
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -