📄 tlc549cp.asm
字号:
;***************************************************************************
; TLC549CP 采样16次取平均值输出
; 30H : 中断次数
; 31H : 采样平均值
; 32H : 采样值十分位百分位*100寄存器
; 33H : 采样值个位显缓
; 34H : 采样值十分位显缓
; 35H : 采样值百分位显缓
; 40H-4FH : 采样值寄存器
; R0 : 显缓地址寄存器
; R1 : 采样存放地址(40H-4FH)
; R2 : 移位计数器
; R4 : 累加和高位
; R5 : 累加和低位 (最终平均值)
;***************************************************************************
RS BIT P3.4
R_W BIT P3.5
ENABLE BIT P3.3
DB0_DB7 DATA P1
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP SAMPLE
ORG 0040H
MAIN:
MOV SP,#6fh
MOV IE,#82H
MOV TH0,#4CH
MOV TL0,#0H
MOV TMOD,#1
MOV 30H,#0AH ; 0.5秒中断
MOV 31H,#0
MOV 32H,#0
MOV 33H,#20H
MOV 34H,#20H
MOV 35H,#20H
SETB TR0
HERE:
LCALL DISP
SJMP HERE
;*****************************************************************
SAMPLE:
ORL TL0,#0
MOV TH0,#4CH
DJNZ 30H,RETS
MOV 30H,#0AH
PUSH ACC
LCALL AD
LCALL DATA_PRO
LCALL DIS_BUF
POP ACC
RETS:
RETI
;*****************************************************************
AD:
MOV R1,#40H
SETB P1.2 ; 置CS为1
CLR P1.0
LOOP:
MOV R2,#0 ; 移位计数器置零
CLR P1.2
NOP
NXT:
SETB P1.0
MOV C, P1.1
RLC A
CLR P1.0
INC R2
CJNE R2,#8,NXT
MOV R2,#0
SETB P1.2
MOV @R1,A
INC R1
CJNE R1,#50H,LOOP
RET
;*****************************************************************
DATA_PRO: ; 十六数据累加求平均 放R5
MOV R1,#40H
MOV R4,#0
MOV R5,#0
LOP: MOV A,R5
ADD A,@R1
MOV R5,A
CLR A
ADDC A,R4
MOV R4,A
INC R1
CJNE R1,#50H,LOP
AVR: MOV A,R5
SWAP A
ANL A,#0FH
MOV R5,A
MOV A,R4
ANL A,#0FH
SWAP A
ORL A,R5
MOV R5,A
RET
;*****************************************************************
DIS_BUF: ; 对数字信号处理,转换为实际电压值存显缓
MOV A,R5
SUBB A,#33H
JNC L1
MOV 33H,#30H
MOV A,R5
LCALL TH
LJMP RETDB
L1:
SUBB A,#33H
JNC L2
MOV 33H,#31H
LCALL TH
LJMP RETDB
L2:
SUBB A,#33H
JNC L3
MOV 33H,#32H
LCALL TH
LJMP RETDB
L3:
SUBB A,#33H
JNC L4
MOV 33H,#33H
LCALL TH
LJMP RETDB
L4:
SUBB A,#33H
JNC E5
MOV 33H,#34H
LCALL TH
LJMP RETDB
E5:
MOV 33H,#35H
RETDB:
MOV A,32H
ADD A,#1EH ; 模入:0.3--Vcc+0.3
MOV 32H,A ; 以十六进制存储完毕
CONV: ; 十六进制转十进制 送显缓
MOV R0,#35H
LOOP1: MOV A,32H
MOV B,#10
DIV AB
MOV 32H,A
MOV A,B
ADD A,#30H
MOV @R0,A
DEC R0
CJNE R0,#33H,LOOP1
RET
;*****************************************************************
TH: ; 最小分辨电压:0.02V * 100 = 2
JZ RETT
INC 32H
INC 32H
DEC A
SJMP TH
RETT:
RET
;*****************************************************************
DISP:
LCALL Initial
LCALL CLS
MOV A,#10000000B
LCALL Write_instruction
MOV DPTR,#LINE1
LCALL PR_STRING
MOV A,#11000110B
LCALL Write_instruction
MOV A,33H
LCALL WriteLCDData
MOV A,#2EH
LCALL WriteLCDData
MOV A,34H
LCALL WriteLCDData
MOV A,35H
LCALL WriteLCDData
MOV A,#56H
LCALL WriteLCDData
RET
LINE1: DB 'Voltage:',00H
;*****************************************************************
Initial:
MOV A,#00111000B
LCALL Write_instruction
MOV A,#00001100B
LCALL Write_instruction
MOV A,#00000110B
LCALL Write_instruction
RET
;*****************************************************************
CheckBusy:
PUSH ACC
CheckBusyLoop:
CLR RS
SETB R_W
CLR ENABLE
SETB ENABLE
MOV A,DB0_DB7
CLR ENABLE
JB ACC.7,CheckBusyLoop
POP ACC
LCALL DELAY
RET
;*****************************************************************
Write_instruction:
LCALL CheckBusy
CLR ENABLE
CLR RS
CLR R_W
SETB ENABLE
MOV DB0_DB7,A
CLR ENABLE
RET
;*****************************************************************
WriteLCDData:
LCALL CheckBusy
CLR ENABLE
SETB RS
CLR R_W
SETB ENABLE
MOV DB0_DB7,A
CLR ENABLE
RET
;*****************************************************************
CLS:
MOV A,#01H
LCALL Write_instruction
RET
;*****************************************************************
PR_STRING:
PUSH ACC
PR_LOOP:
CLR A
MOVC A,@A+DPTR
JZ END_PR
LCALL WriteLCDData
INC DPTR
JMP PR_LOOP
END_PR:
POP ACC
RET
;*****************************************************************
DELAY:
MOV R6,#5
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -