📄 1.asm
字号:
OVERTIME EQU 20
TIMECON DATA 2FH ;1S定时
;---------------------------
LED1 DATA 30H ;显示缓冲区
LED2 DATA 31H
LED3 DATA 32H
LED4 DATA 33H
LED5 DATA 34H
LED6 DATA 35H
;-----------------------------
CLEART DATA 36H ;清零时间
TOVER1L DATA 2AH
TOVER1M DATA 2BH
TOVER1H DATA 2CH
HF_HC DATA 37H ;高频脉冲数存放单元
HF_MC DATA 38H
HF_LC DATA 39H
LC_HT DATA 3AH ;低频脉总时间存放单元
LC_MT DATA 3BH
LC_LT DATA 3CH
L_C_NO DATA 3DH ;低频脉冲个数
H_C_NO DATA 3EH
;------------------------
WEIXUAN DATA 3FH ;数码管位选择
BINADDR EQU 50H ;待转换二进制存放地址指针
BCDADDR EQU 60H ;转换后的BCD码存放地址指针
BYTES EQU 4 ;待转换二进制字节数
HIGHF BIT 20H ;高频标志位
LOWF BIT 21H ;低频标志位
DISP BIT 23H ;显示标志位
FUWEI BIT 24H
SECOND BIT 25H
DLOWF BIT 26H ;等待1S到来后关中断标志位
TOVER BIT 10H
LL BIT 12H ; 已启动低频标志
IPH DATA 0B7H
ORG 0000H
LJMP MAIN
ORG 0003H ;INT0中断
LJMP D_COU
ORG 000BH
LJMP T0_OUT ;T0
ORG 0013H
LJMP START
ORG 001BH ;T1
LJMP C_OUT
ORG 002BH ;T2
LJMP CTC2
ORG 0030H
;--------------------------------
MAIN:
CLR A
MOV R0,#01H
QINGLING:
MOV @R0,A
INC R0
CJNE R0,#00H,QINGLING
MOV SP,#7FH
MOV P1,#0FFH
CLR P3.1 ;关闭低频
SETB P3.6 ;打开高频开关
CLR F0
MOV TIMECON,#OVERTIME
MOV CLEART,#250
MOV TMOD,#01010001B
MOV TL0,#48H
MOV TH0,#0F4H
MOV TH1,#00H
MOV TL1,#00H
SETB IT0 ;下降沿触发
SETB IT1
MOV TH2,#3CH
MOV TL2,#0B0H
MOV RCAP2H,#3CH
MOV RCAP2L,#0B0H
SETB TR0
SETB ET0
SETB ET1
SETB ET2
MOV IPH,#00101001B
MOV IP, #00101001B
CLR IE1
SETB EX1
SETB EA
HERE:
JB FUWEI,MAIN
JB HIGHF,GAO ;有高标志位,转高频处理
JB DISP,DISPLAY ;有显示标志位,转显示处理
there:
JB LOWF,DI ;有低标志位,转低频处理
SJMP HERE
DISPLAY:
CLR DISP
LCALL LED
SJMP there
GAO:
CLR SECOND
CLR DLOWF
CLR FUWEI
CLR LOWF
LCALL SUM_0 ;清不相关的位标志
MOV 50H,HF_LC
MOV 51H,HF_MC
MOV 52H,HF_HC
LCALL F_BCD
LCALL HDP ;处理要显示的内容
SETB P3.6 ;打开高频开关
CLR IE1
SETB EX1
CLR HIGHF
LJMP HERE
DI:
JNB DLOWF,DD ;1s没有到就继续中断
SJMP HERE
DD:
LCALL SUM_0 ;运算区清零
MOV 49H,#0E8H
MOV 48H,#03H ;被乘数1000
MOV 47H,#00H
MOV 4CH,L_C_NO
MOV 4BH,H_C_NO
MOV 4AH,#00H
LCALL MUL3X3
MOV 49H,#80H
MOV 48H,#96H
MOV 47H,#98H ;被乘数10000000
MOV 4CH,45H
MOV 4BH,44H
MOV 4AH,43H ;刚得到的乘数
MOV 43H,#00H
MOV 44H,#00H
MOV 45H,#00H
LCALL MUL3X3
MOV 48H,45H
MOV 47H,44H
MOV 46H,43H
MOV 45H,42H
MOV 44H,41H
MOV 43H,40H ;6字节被除数
MOV 4BH,LC_LT
MOV 4AH,LC_MT
MOV 49H,LC_HT ;实际时间,除数
LCALL DIV6_3
MOV 50H,48H
MOV 51H,47H
MOV 52H,46H
MOV 53H,45H
LCALL SUM_0
LCALL F_BCD
LCALL LDP
CLR LOWF
CLR LL
MOV TH1,#00H
MOV TL1,#00H
MOV TH2,#3CH
MOV TL2,#0B0H
CLR P3.0 ;分频器有效
CLR P3.1 ;关闭低频
ORL TMOD,#01010000B ;T1切回计数方式
SETB P3.6 ;打开高频
CLR IE1 ;计数开始,进入下一轮
SETB EX1
SETB P3.4
LJMP HERE
;---------------------------------
CTC2:
DJNZ TIMECON,JK
SETB SECOND ;1S到标志
JB LOWF,JKK ;正在处理低频部分,跳过
CLR P3.6 ;关高频脉冲开关
CLR TR1
CLR TR2
PUSH PSW
PUSH ACC
MOV A,TH1
MOV HF_HC,A
MOV A,TL1
MOV HF_MC,A
MOV A,P1
MOV HF_LC,A
MOV TH1,#00H
MOV TL1,#00H
SETB P3.0 ; 清分频器
MOV A,HF_HC
JZ ZHELI
SJMP GAOPIN
ZHELI:
MOV A,HF_MC
CLR C
CJNE A,#27H,NEXT1 ;小于9900Hz的为低频
NEXT1:
JC NEXT
SJMP GAOPIN
NEXT:
SJMP DIPIN
GAOPIN:
SETB HIGHF
CLR SECOND
CLR LOWF
SJMP RET3
DIPIN:
ANL TMOD,#10111111B ;T1计数内部脉冲
SETB P3.1 ;打开低频选通开关
CLR FUWEI
CLR HIGHF
SETB LOWF
SETB DLOWF ;标志1S后应关中断标志位
CLR SECOND
CLR IE0
SETB EX0
SJMP RET3
RET3:
POP ACC
POP PSW
JKK:
MOV TIMECON,#OVERTIME
JK:
CLR TF2
RETI
;-----------------------
T0_OUT:
MOV TL0,#48H
MOV TH0,#0F4H
PUSH PSW
PUSH ACC
MOV C,HIGHF
ORL C,TR1
ORL C,TR2
JC MEICUO ;若没有信号输入,则置LED为零
DJNZ CLEART,MEICUO
CLR A
MOV LED1,A
MOV LED2,A
MOV LED3,A
MOV LED4,A
MOV LED5,A
MOV LED6,#10
MOV CLEART,#250
MEICUO:
POP ACC
POP PSW
SETB DISP
RETI
;----------------------------------
C_OUT:
PUSH PSW
PUSH ACC
MOV A,LC_HT
ADD A,#01H
MOV LC_HT,A
CJNE A,#2DH,WRONG ;开启低频单元3s后无信号输入,作错误处理
WRONG:
JC KK
SETB FUWEI
KK:
POP ACC
POP PSW
RETI
;---------------------------
D_COU:
JB LL,TIAO
SETB TR1
SETB TR2
SETB LL
TIAO:
JNB SECOND,JIXU
CLR TR1
CLR TR2
CLR EX0
CLR P3.1 ;关闭低频脉冲开关
CLR DLOWF ;清除1S到后并且INT0 中断响应后的标志,以便中断返回后
;---------------------能处理数
CLR SECOND
PUSH ACC
PUSH PSW
MOV A,TL1
MOV LC_LT,A
MOV A,TH1
MOV LC_MT,A
CLR A
MOV TH1,A
MOV TL1,A
SJMP FANHUI
JIXU: ;脉冲数加一
PUSH ACC
PUSH PSW
CLR A
MOV A,L_C_NO
ADD A,#01H
MOV L_C_NO,A
CLR A
ADDC A,H_C_NO
MOV H_C_NO,A
FANHUI:
JB TOVER,CT01
MOV TOVER1L,TL1
MOV TOVER1M,TH1
MOV TOVER1H,LC_HT
SETB TOVER
SJMP FANHUI1
CT01:
CLR TOVER
MOV A,LC_HT
CJNE A,TOVER1H,FANHUI1
MOV A,TH1
CJNE A,TOVER1M,FANHUI1
MOV A,TL1
SUBB A,TOVER1L
CJNE A,#100,CT02
CT02:
JNC FANHUI1
;CLR TR1
;CLR TR2
CLR EX0
SETB FUWEI ;低频单元如出现频率大于10K的信号,作出错处理
;CLR P3.1
;CLR DLOWF
;SETB P3.6
;SETB P3.4
;CLR IE1
;SETB EX1
FANHUI1:
POP PSW
POP ACC
RETI
START:
SETB P3.0 ;清分频器
NOP
CLR P3.0 ;分频器有效
SETB TR2
SETB TR1
CLR EX1
RETI
;--------------------------------------
LED:
MOV R0,#2FH
INC WEIXUAN
MOV A,WEIXUAN
CLR C
CJNE A,#7,D1
D1:
JC D2
MOV WEIXUAN,#00H
MOV R0,#2FH
SJMP LED
D2:
CLR C
MOV P2,#0FFH
MOV A,WEIXUAN
ADD A,R0
MOV R0,A
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,WEIXUAN
DEC A
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
RET
;---------------------------------
F_BCD:
MOV R1,#BCDADDR
MOV R2,#BYTES
INC R2
CLR A
B0:
MOV @R1,A
INC R1
DJNZ R2,B0
MOV A,#BYTES
MOV B,#8
MUL AB
MOV R3,A
BB1:
MOV R0,#BINADDR
MOV R2,#BYTES
CLR C
B1:
MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R2,B1
BB3:
MOV R2,#BYTES
INC R2
MOV R1,#BCDADDR
B3:
MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
INC R1
DJNZ R2,B3
DJNZ R3,BB1
;----------------------压缩的BCD码放在60H-64H单元
MOV A,60H
ANL A,#0FH
MOV 40H,A
MOV A,60H
ANL A,#0F0H
SWAP A
MOV 41H,A
MOV A,61H
ANL A,#0FH
MOV 42H,A
MOV A,61H
ANL A,#0F0H
SWAP A
MOV 43H,A
MOV A,62H
ANL A,#0FH
MOV 44H,A
MOV A,62H
ANL A,#0F0H
SWAP A
MOV 45H,A
MOV A,63H
ANL A,#0FH
MOV 46H,A
MOV A,63H
ANL A,#0F0H
SWAP A
MOV 47H,A
;--------------拆分后的单个BCD码由高到低放在49H-40H单元,因为要计算的数不会太大
;--------------故省去高二位
RET
;------------------------------------------
HDP: ;高频显示预处理
F107:
MOV A,47H
JZ F106
MOV LED1,#07H
MOV LED2,43H
MOV LED3,44H
MOV LED4,45H
MOV LED5,46H
MOV A,#10
ADD A,47H
MOV LED6,A
LJMP HERER
F106:
MOV A,46H
JZ F105
MOV LED1,#06H
MOV LED2,42H
MOV LED3,43H
MOV LED4,44H
MOV LED5,45H
MOV A,#10
ADD A,46H
MOV LED6,A
LJMP HERER
F105:
MOV A,45H
JZ F104
MOV LED1,#05H
MOV LED2,40H
MOV LED2,41H
MOV LED3,42H
MOV LED4,43H
MOV LED5,44H
MOV A,#10
ADD A,45H
MOV LED6,A
LJMP HERER
F104:
MOV A,44H
JZ F103
MOV A,#10
ADD A,44H
MOV LED6,A
MOV LED5,43H
MOV LED4,42H
MOV LED3,41H
MOV LED2,40H
MOV LED1,#04H
LJMP HERER
F103:
MOV A,#10
ADD A,43H
MOV LED6,A
MOV LED5,42H
MOV LED4,41H
MOV LED3,40H
MOV LED2,#00H
MOV LED1,#3
HERER:
LCALL SUM_00
RET
;----------------------------
LDP: ;低频显示预处理
LF103:
MOV A,47H
JZ LF102
MOV LED1,#03H
MOV LED2,43H
MOV LED3,44H
MOV LED4,45H
MOV LED5,46H
MOV A,#10
ADD A,47H
MOV LED6,A
LJMP LHERER
LF102:
MOV A,46H
JZ LF101
MOV LED1,#02H
MOV LED2,42H
MOV LED3,43H
MOV LED4,44H
MOV LED5,45H
MOV A,#10
ADD A,46H
MOV LED6,A
LJMP LHERER
LF101:
MOV A,45H
JZ LF100
MOV LED1,#01H
MOV LED2,40H
MOV LED2,41H
MOV LED3,42H
MOV LED4,43H
MOV LED5,44H
MOV A,#10
ADD A,45H
MOV LED6,A
LJMP LHERER
LF100:
MOV A,#10
ADD A,44H
MOV LED6,A
MOV LED5,43H
MOV LED4,42H
MOV LED3,41H
MOV LED2,40H
MOV LED1,#00H
LJMP LHERER
LHERER:
LCALL SUM_00
RET
;---------------------------
MUL3X3: ;24位X24位,被乘数由高到低放在47H,48H,49H,乘数放在4AH,4BH,4CH,
;--------积放在40H,41H,42H,43H,44H,45H
;--------乘数低8位乘被乘数低8位
MOV A,4CH
MOV B,49H
MUL AB
MOV 45H,A
MOV 44H,B
;低8X次高8
MOV A,4CH
MOV B,48H
MUL AB
ADD A,44H
MOV 44H,A
CLR A
ADDC A,B
MOV 43H,A
CLR A
ADDC A,#0
MOV 42H,A
;低8X高8
MOV A,4CH
MOV B,47H
MUL AB
ADD A,43H
MOV 43H,A
MOV A,42H
ADDC A,B
MOV 42H,A
CLR A
ADDC A,#0
MOV 41H,A
;次高8X低8
MOV A,4BH
MOV B,49H
MUL AB
ADD A,44H
MOV 44H,A
MOV A,43H
ADDC A,B
MOV 43H,A
CLR A
ADDC A,42H
MOV 42H,A
CLR A
ADDC A,41H
MOV 41H,A
CLR A
ADDC A,#0
MOV 40H,A
;次高8X次高8
MOV A,4BH
MOV B,48H
MUL AB
ADD A,43H
MOV 43H,A
MOV A,42H
ADDC A,B
MOV 42H,A
CLR A
ADDC A,41H
MOV 41H,A
CLR A
ADDC A,40H
MOV 40H,A
;次高8X高8
MOV A,4BH
MOV B,47H
MUL AB
ADD A,42H
MOV 42H,A
MOV A,41H
ADDC A,B
MOV 41H,A
CLR A
ADDC A,40H
MOV 40H,A
;高8X低8
MOV A,4AH
MOV B,49H
MUL AB
ADD A,43H
MOV 43H,A
MOV A,42H
ADDC A,B
MOV 42H,A
CLR A
ADDC A,41H
MOV 41H,A
CLR A
ADDC A,40H
MOV 40H,A
;高8X次高8
MOV A,4AH
MOV B,48H
MUL AB
ADD A,42H
MOV 42H,A
MOV A,41H
ADDC A,B
MOV 41H,A
CLR A
ADDC A,40H
MOV 40H,A
;高8X高8
MOV A,4AH
MOV B,47H
MUL AB
ADD A,41H
MOV 41H,A
MOV A,40H
ADDC A,B
MOV 40H,A
RET
;------------------------
;除法运算,6字节数除以3字节数,被除数由高到低放在43H,44H,45H,46H,47H,48H
;除数由高到低放在49H,4AH,4BH,商放回43H到48H单元中,余数放在40H,41H,42H中
DIV6_3:
;扩展被除数为48+24位
CLR F0
CLR A
MOV 40H,A
MOV 41H,A
MOV 42H,A
MOV R7,#48
LOOP1: ;整体左移一位
CLR C
MOV R1,#9 ;移动9字节
MOV R0,#48H
LOOP2:
MOV A,@R0
ADDC A,@R0
MOV @R0,A
DEC R0
DJNZ R1,LOOP2
MOV F0,C
;相减
CLR C
MOV A,42H
SUBB A,4BH
MOV R4,A
MOV A,41H
SUBB A,4AH
MOV R3,A
MOV A,40H
SUBB A,49H
MOV R2,A
;根据差结果设置商
ANL C,/F0
JC HAO
MOV 42H,R4
MOV 41H,R3
MOV 40H,R2
ORL 48H,#01H
HAO:
DJNZ R7,LOOP1
RET
;---------运算区清零
SUM_00:
MOV R0,#36H
MOV R1,#45
ZAILAI:
CLR A
MOV @R0,A
INC R0
DJNZ R1,ZAILAI
RET
SUM_0:
CLR A
MOV R0,#40H
MOV R1,#15
CHONGFU:
MOV @R0,A
DJNZ R1,CHONGFU
RET
;--------------------------------
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
TAB:
DB 0FBH,0F7H,0EFH,0DFH,0BFH,7FH,
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -