📄 dianyabiao.asm
字号:
SCLK BIT P1.2;A/D,D/A转换时钟
DIO BIT P1.3;A/D转换数据输出及D/A转换的数字量输出
ADCS BIT P1.4;A/D转换器的使能
ADTEMP EQU 30H
;下面四个地址用于存放测得电压转换后的电压值的四位
VOL0 EQU 31H;整数位
VOL1 EQU 33H;最高小数位
VOL2 EQU 34H
VOL3 EQU 35H
;用36H-45H的存储空间存储AD采样的数据,并且42H存最小值,49H
;存最大值
ADDATAH EQU 46H
ADDATA EQU 47H
ORG 2000H
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 06H,05H,04H,03H,02H,01H,00H,38H
ORG 0000H
LJMP START
START:
MOV SP,#60H
MOV 31H,#00H
MOV 32H,#2EH;小数点对应lcd的字符码
MOV 33H,#00H
MOV 34H,#00H
MOV 35H,#00H
LCALL LCDINI
LCALL WCG
LOOP:
;LCALL AD
LCALL GETAD
LCALL FILTER
LCALL TRANSDATA
LCALL WDD
LCALL DELAY
LCALL DELAY
LJMP LOOP
BF:;检测忙标志BF
CLR A
MOV DPTR,#0A001H
MOVX A,@DPTR
JB ACC.7,BF
RET
;写数据到指令寄存器IR
;R1:暂存指令码
WI:
MOV A,R1
MOV DPTR,#0A000H
MOVX @DPTR,A
RET
;写数据到数据寄存器DR
;R2:暂存字符码或字符字模数据
WD:
MOV A,R2
MOV DPTR,#0A002H
MOVX @DPTR,A
RET
DELAY:
MOV R7,#0FFH
LOOP0:
MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,LOOP0
RET
;写自定义字符字模数据到CGRAM
WCG:
MOV R1,#40H
LCALL BF
LCALL WI
MOV R4,#00H
LOOP4:
MOV DPTR,#TAB
MOV A,R4
MOVC A,@A+DPTR
MOV R2,A
LCALL BF
LCALL WD
INC R4
CJNE R4,#3FH,LOOP4
RET
;指令初始化模块
LCDINI:
MOV R3,#03H
INITO:
MOV R1,#30H; 功能设置
LCALL WI
DJNZ R3,INITO
MOV R1,#01H;清显示
LCALL BF
LCALL WI
MOV R1,#06H; 输入方式设置:AC自动加1
LCALL BF
LCALL WI
MOV R1,#0CH; 开显示
LCALL BF
LCALL WI
RET
WDD:
LOOP2:
MOV R1,#80H
LCALL BF
LCALL WI
MOV R0,#31H
LOOP1:
MOV A,@R0
MOV R2,A
LCALL BF
LCALL WD
INC R0
CJNE R0,#36H,LOOP1
RET
ADDELAY:
MOV R5,#20
ADDELAY1: DJNZ R5,ADDELAY1;延时24个振荡周期
RET
AD:
SETB ADCS
ACALL ADDELAY
CLR ADCS
ACALL ADDELAY
MOV R2,#10
RR0:
SETB SCLK
NOP
CLR SCLK
DJNZ R2,RR0
ACALL ADDELAY
MOV A,#00
MOV C,DIO
RLC A
SETB SCLK
NOP
CLR SCLK
MOV C,DIO
RLC A
MOV ADDATAH,A
MOV R2,#8
MOV A,#00
RR2:
SETB SCLK
NOP
CLR SCLK
MOV C,DIO
RLC A
DJNZ R2,RR2
MOV ADDATA,A
RET
GETAD:;获取八组AD数据,间隔1152个机器周期
LCALL AD
MOV 36H,ADDATA
MOV 37H,ADDATAH
LCALL GETDELAY
LCALL AD
CLR C
MOV A,36H
SUBB A,ADDATA
MOV A,37H
SUBB A,ADDATAH
JNC GETAD00
MOV 44H,ADDATA
MOV 45H,ADDATAH
SJMP GETAD01
GETAD00:
MOV 44H,36H
MOV 45H,37H
MOV 36H,ADDATA
MOV 37H,ADDATAH
GETAD01:
LCALL GETDELAY
MOV R0,#38H
GETONE:
LCALL AD
LOWER:
CLR C
MOV A,36H
SUBB A,ADDATA
MOV A,37H
SUBB A,ADDATAH
JC BIGGER
MOV @R0,36H
INC R0
MOV @R0,37H
INC R0
MOV 36H,ADDATA
MOV 37H,ADDATAH
SJMP CONTINUE
BIGGER:
CLR C
MOV A,44H
SUBB A,ADDATA
MOV A,45H
SUBB A,ADDATAH
JNC MIDDLE
MOV @R0,44H
INC R0
MOV @R0,45H
INC R0
MOV 44H,ADDATA
MOV 45H,ADDATAH
SJMP CONTINUE
MIDDLE:
MOV @R0,ADDATA
INC R0
MOV @R0,ADDATAH
INC R0
CONTINUE:
LCALL GETDELAY
CJNE R0,#44H,GETONE
RET
GETDELAY:
MOV R5,#6FH
GETDELAY0:
NOP
NOP
DJNZ R5,GETDELAY0
RET
FILTER:;滤波子程序
MOV R0,#38H
MOV 48H,#00H;存放中间的余数
MOV ADDATA,#00H
MOV ADDATAH,#00H
CONFIL0:
MOV A,@R0
MOV B,#06H
DIV AB
ADD A,ADDATA
MOV ADDATA,A
MOV A,B
ADD A,48H
MOV 48H,A
INC R0
MOV A,@R0
ADD A,ADDATAH
MOV ADDATAH,A
INC R0
CJNE R0,#44H,CONFIL0
MOV A,48H
MOV B,#06H
DIV AB
ADD A,ADDATA
MOV ADDATA,A
MOV A,ADDATAH
MOV B,#06H
DIV AB
MOV ADDATAH,A
MOV A,B
JZ FILOUT
MOV B,#43
MUL AB
CLR C
ADDC A,ADDATA
MOV ADDATA,A
MOV A,ADDATAH
ADDC A,#00H
MOV ADDATAH,A
FILOUT:
RET
TRANSDATA:;用于将数字量转换为电压值
MOV A,ADDATA
ANL A,#01H
MOV B,#05H
MUL AB
ADD A,#30H;转化为lcd的显示字符码
MOV VOL3,A
MOV VOL0,ADDATAH;本来是addatah*1
MOV A,ADDATAH
MOV B,#02H
MUL AB
MOV VOL1,A
MOV A,ADDATAH
MOV B,#08H
MUL AB
MOV VOL2,A
MOV A,ADDATA
ANL A,#0FEH
RR A
MOV B,#10
DIV AB
ADD A,VOL1
MOV VOL1,A
MOV A,B
ADD A,VOL2
MOV B,#10
DIV AB
ADD A,VOL1
MOV VOL1,A
MOV A,B
ADD A,#30H;转化为lcd的显示字符码
MOV VOL2,A
MOV A,VOL1
MOV B,#10
DIV AB
ADD A,VOL0
ADD A,#30H;转化为lcd的显示字符码
MOV VOL0,A
MOV A,B
ADD A,#30H;转化为lcd的显示字符码
MOV VOL1,A
RET
TAB:
DB 1FH,00H,00H,00H,00H,00H,00H,00H
DB 00H,1FH,00H,00H,00H,00H,00H,00H
DB 00H,00H,1FH,00H,00H,00H,00H,00H
DB 00H,00H,00H,1FH,00H,00H,00H,00H
DB 00H,00H,00H,00H,1FH,00H,00H,00H
DB 00H,00H,00H,00H,00H,1FH,00H,00H
DB 00H,00H,00H,00H,00H,00H,1FH,00H
DB 00H,00H,00H,00H,00H,00H,00H,1FH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -