📄 dyb.asm
字号:
ADCS BIT P1.4 ;A/D转换数据输出使能
ADDATA BIT P1.3 ;A/D转换输出数据
ADCLK BIT P1.2 ;A/D转换时钟,即串行时钟
ADTEMP EQU 30H ;A/D转换输出数据暂存单元
DATA1L EQU 31H ;第一次采样数据低位
DATA1H EQU 32H ;第一次采样数据高2位
DATA2L EQU 33H ;第二次采样数据低位
DATA2H EQU 34H ;第二次采样数据高2位
DATA3L EQU 35H ;第三次采样数据低位
DATA3H EQU 36H ;第三次采样数据高2位
VOLT1 EQU 37H ;电压值千分位
VOLT2 EQU 38H ;电压值百分位
VOLT3 EQU 39H ;电压值十分位
VOLT4 EQU 3AH ;电压值个位
DISP0 EQU 40H ;显示区
DISP1 EQU 41H
DISP2 EQU 42H
DISP3 EQU 43H
DISP4 EQU 44H
DISP5 EQU 45H
DISP6 EQU 46H
DISP7 EQU 47H
DISP8 EQU 48H
DISP9 EQU 49H
DISPA EQU 4AH
DISPB EQU 4BH
DISPC EQU 4CH
DISPD EQU 4DH
DISPE EQU 4EH
DISPF EQU 4FH
;===========================================================================================================
ORG 0000H
LJMP START
ORG 3000H
START: MOV SP,#60H
LCALL INIT
LOOP: LCALL FILT
LCALL DTV
LCALL DISP
SJMP LOOP
;===========================================================================================================
FILT: LCALL AD ;软件滤波子程序
MOV DATA1L,R6
MOV DATA1H,R7
ACALL DL ;延时约2ms
LCALL AD
MOV DATA2L,R6
MOV DATA2H,R7
ACALL DL
LCALL AD
MOV DATA3L,R6
MOV DATA3H,R7
ACALL MFILT3
RET
DL: MOV R2,#00H
DL1: NOP
NOP
DJNZ R2,DL1
RET
MFILT3: ;3次采样中值滤波子程序
CLR C
MOV A,DATA1L ;DATA1<DATA2?
SUBB A,DATA2L
MOV A,DATA1H
SUBB A,DATA2H
JC M1
MOV A,DATA1H ;DATA1>=DATA2,则交换DATA1和DATA2
XCH A,DATA2H
MOV DATA1H,A
MOV A,DATA1L
XCH A,DATA2L
MOV DATA1L,A
M1: CLR C
MOV A,DATA2L ;DATA2<DATA3?
SUBB A,DATA3L
MOV A,DATA2H
SUBB A,DATA3H
JC M2 ;DATA2<DATA3,排序结束
MOV A,DATA2H ;DATA2>=DATA3,则交换DATA2和DATA3
XCH A,DATA3H
MOV DATA2H,A
MOV A,DATA2L
XCH A,DATA3L
MOV DATA2L,A
CLR C
MOV A,DATA1L ;DATA1<DATA2?
SUBB A,DATA2L
MOV A,DATA1H
SUBB A,DATA2H
JC M2 ;DATA1<DATA2,排序结束
MOV A,DATA1H ;DATA1>=DATA2,以DATA1为中值,将中值存放于DATA2中
MOV DATA2H,A
MOV A,DATA1L
MOV DATA2L,A
M2: RET
;===========================================================================================================
AD: MOV R7,#00 ;A/D转换子程序
MOV R6,#00
MOV R5,#00
SETB ADCS
ACALL ADDL ;ADCS处于高电平,延时以便进入稳定状态
CLR ADCS
ACALL ADDL ;ADCS处于低电平,延时以便进入稳定状态
MOV R5,#10
RR0: SETB ADCLK
NOP
CLR ADCLK
DJNZ R5,RR0 ;产生10个ADCLK周期,从第3个ADCLK周期开始采样,一直持续到第10个周期
ACALL ADDL ;模拟量转化为数字量过程
MOV ADTEMP,R7 ;A/D转换的高两位保存在R7中,数字量传输过程
ACALL CIR
MOV R7,ADTEMP
SETB ADCLK
NOP
CLR ADCLK
MOV ADTEMP,R7
ACALL CIR
MOV R7,ADTEMP
MOV R5,#8 ;A/D转换的低位保存在R6中,数字量传输过程
RR2: SETB ADCLK
NOP
CLR ADCLK
MOV ADTEMP,R6
ACALL CIR
MOV R6,ADTEMP
DJNZ R5,RR2
RET
CIR: CLR C ;将A/D转换的数字量高位存入C中
MOV C,ADDATA
MOV A,ADTEMP
RLC A ;将A/D转换的数字量高位左移
MOV ADTEMP,A
RET
ADDL: MOV R2,#24 ;延时子程序
ADDL1: DJNZ R2,$
RET
;===========================================================================================================
DTV: MOV A,DATA2L ;软件滤波结果转化为电压值子程序
MOV B,#5
MUL AB
MOV R5,A
MOV R4,B
MOV A,DATA2H
MOV B,#5
MUL AB
ADD A,R4
MOV R4,A
MOV R0,#VOLT1
LCALL IBTD
LCALL MODF
RET
IBTD: MOV B,#5 ;双字节二进制整数转换成BCD码子程序
MOV R6,#0
MOV R7,#10
IBTL1: MOV R2,#0
MOV R3,#0
PUSH B
ACALL NDIV
POP B
MOV A,R3
MOV @R0,A
INC R0
DJNZ B,IBTL1
RET
NDIV: MOV A,R3
CLR C
SUBB A,R7
MOV A,R2
SUBB A,R6
JNC NDVE1
MOV B,#16
NDVL1: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV C,F0
CLR C
SUBB A,R7
MOV R1,A
MOV A,R2
SUBB A,R6
JB F0,NDVM1
JC NDVD1
NDVM1: MOV R2,A
MOV A,R1
MOV R3,A
INC R5
NDVD1: DJNZ B,NDVL1
CLR F0
RET
NDVE1: SETB F0
RET
MODF: MOV A,VOLT4
MOV B,#2
MUL AB
MOV B,A
CLR C
MOV A,VOLT2
SUBB A,B
MOV VOLT2,A
JNC EXIT
ADD A,#10
MOV VOLT2,A
CLR C
MOV A,VOLT3
SUBB A,#1
MOV VOLT3,A
JNC EXIT
MOV A,VOLT3
ADD A,#10
MOV VOLT3,A
DEC VOLT4
EXIT: RET
;===========================================================================================================
INIT: ;液晶显示初始化子程序
MOV R1,#30H ;功能设置,显示一行,字符点阵字体5×8
LCALL WI
MOV R1,#01H ;清显示
LCALL BF
LCALL WI
MOV R1,#06H ;设置输入模式,完成一个字符码传送后,DDRAM地址指针AC自动加1
LCALL BF
LCALL WI
MOV R1,#0CH ;开显示
LCALL BF
LCALL WI
MOV R7,#16
MOV R0,#DISP0
INIT1: MOV A,#0CH
MOV @R0,A
INC R0
DJNZ R7,INIT1
RET
DISP: MOV DISP5,VOLT4 ;液晶显示子程序
MOV DISP6,#0AH
MOV DISP7,VOLT3
MOV DISP8,VOLT2
MOV DISP9,VOLT1
MOV DISPA,#0BH
LCALL WDD
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
RET
WDD: MOV R5,#16
MOV R1,#80H ;DDRAM地址设置,显示字符码首地址为80H
MOV R0,#DISP0
ACALL BF
ACALL WI
WDD1: MOV A,@R0
ACALL GETSEG
MOV R2,A
ACALL BF
ACALL WD
INC R0
DJNZ R5,WDD1
RET
BF: CLR A ;检测忙
MOV DPTR,#0A001H
MOVX A,@DPTR
JB ACC.7,BF
RET
WI: MOV DPTR,#0A000H ;写指令到指令寄存器
MOV A,R1
MOVX @DPTR,A
RET
WD: MOV DPTR,#0A002H ;写数据到数据寄存器
MOV A,R2
MOVX @DPTR,A
RET
GETSEG: MOV DPTR,#TAB
MOVC A,@A+DPTR
RET
DELAY: MOV R7,#00H
MOV R6,#00H
DELAY1: DJNZ R6,DELAY1
NOP
NOP
DJNZ R7,DELAY1
RET
ORG 2000H
TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 2EH,56H,20H
;===========================================================================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -