📄 占空比.asm
字号:
;频率计量程0~16MHZ,当晶振24MHZ外电路16分频时
;作者:汤益军
led1 equ 30h
led2 equ 31h
led3 equ 32h
led4 equ 33h
led5 equ 34h
led6 equ 35h
led7 equ 36h
led8 equ 37h
div1 equ 40h
div2 equ 41h
div3 equ 42h
divc1 equ 43h
divc2 equ 44h
divc3 equ 45h
divy1 equ 46h
divy2 equ 47h
divy3 equ 48h
buff0 equ 49h
buff1 equ 4ah
buff2 equ 4bh
buff3 equ 4ch
buff4 equ 4dh
buff5 equ 4eh
buffth1 equ 3bh
bufftl1 equ 3ch
control equ 3dh ;判断是否需要软件16分频
org 0000h
ajmp main
org 000bh
ajmp cont
org 001bh
ajmp clock
main:
mov sp,#54h
mov led1,#00H ;初始化
mov led2,#00H
mov led3,#00H
mov led4,#00H
mov led5,#00H
mov led6,#00H
mov led7,#00H
mov led8,#00H
mov r5,#32h
mov r3,#10h
mov control,#00h
mov tmod,#15h
mov th0,#00h
mov tl0,#00h
mov buffth1,#63h
mov bufftl1,#0dfh
mov th1,buffth1
mov tl1,bufftl1
clr p2.0
clr p2.1
clr ex1
clr ex0
setb et0
setb tr0
setb et1
setb tr1
setb ea
dis:call display ;重复调用显示子程序
sjmp dis
clock:push psw ;20000u秒定时中断
push acc
clr ea
clr et1
clr tr1
mov th1,buffth1 ;t1初始化
mov tl1,bufftl1
clr ex1
clr ex0
setb et1
setb tr1
djnz r5,over1 ;循环50次为1秒
ajmp goo
over1:
ljmp over
goo:
clr et0
clr tr0
clr c
setb p2.6
jnb p2.6,deal
mov a,th0 ;判断当计数器高位前6位为零频率小于16368时停止16分频
jnz deal
mov buffth1,#63h ;t1初始化
mov bufftl1,#0dfh
mov control,#00h
clr p2.0
clr p2.1
deal:mov a,tl0 ;把频率累加入数据缓冲
addc a,buff0
mov buff0,a
mov a,th0
addc a,buff1
mov buff1,a
mov a,#00h
addc a,buff2
mov buff2,a
mov th0,#00h ;t0初始化
mov tl0,#00h
setb et0
setb tr0
mov r5,#32h
mov a,control
jz divcon
djnz r3,over1
setb p2.6
jnb p2.6,divcon1
MOV R4,#4
loop9:clr c
mov a,buff0
rlc a
mov buff0,a
mov a,buff1
rlc a
mov buff1,a
mov a,buff2
rlc a
mov buff2,a
djnz r4,loop9
ajmp divcon
divcon1:
clr c
mov a,buff2
rrc a
mov buff2,a
mov a,buff1
rrc a
mov buff1,a
mov a,buff0
rrc a
mov buff0,a
divcon:
mov buff5,buff2 ;送数
mov buff4,buff1
mov buff3,buff0
setb p2.5
jb p2.5,clock1 ;判断是否为计算周期否则为计算频率
mov divc1,buff2 ;送数
mov divc2,buff1
mov divc3,buff0
mov div1,#098h ;放入被除数10000000
mov div2,#096h
mov div3,#080h
call BINDIV ;调用除法子程序
mov buff0,div3
mov buff1,div2
mov buff2,div1
clock1:setb p2.6
jb p2.6,bcd1 ;判断是否为计算占空比否则为计算频率或计算周期
mov tmod,#19h
mov buffth1,#0f6h
mov bufftl1,#4ch
mov control,#0ffh
clr p2.0
clr p2.1
ajmp bcd
bcd1:mov tmod,#15h
mov buffth1,#63h ;t1初始化
mov bufftl1,#0dfh
mov control,#000h
clr p2.0
clr p2.1
bcd:call change16bcd
mov r3,#10h
over:setb ea
pop acc
pop psw
reti
BINDIV: ;3位带4舍5入的移位除法
CLR A ;部分余数单元清0
MOV divy1,A
MOV divy2,A
MOV divy3,A
MOV r4,#18H ;除法移位次数(24)
LP: CLR C
MOV A,div3 ;被除数低位字节送到A中
RLC A
MOV div3,A
MOV A,div2
RLC A
MOV div2,A
MOV A,div1
RLC A
MOV div1,A
MOV A,divy3
RLC A
MOV divy3,A
MOV A,divy2
RLC A ;A的内容左移一位(带进位)
MOV divy2,A
MOV A,divy1
RLC A ;A的内容左移一位(带进位)
MOV divy1,A
LP1: MOV A,divy3 ;部分余数减除数
SUBB A,divc3
MOV 38h,A
MOV A,divy2
SUBB A,divc2
MOV 39h,A
MOV A,divy1
SUBB A,divc1
JC SMALL
MOV divy1,A
MOV A,39h
MOV divy2,A
MOV A,38h
MOV divy3,A
INC div3 ;商加1
SJMP LP1
SMALL: DJNZ R4,LP ;除法移位次数完否?未完继续
MOV 20H,divy1 ;四舍五入
JB 07H,ADD1
CLR C
MOV A,divy3
RLC A
MOV divy3,A ;余数低位字节存divy3中
MOV A,divy2
RLC A
mov divy2,a
MOV A,divy1
RLC A
SUBB A,divc1
JC RETURN2
JNZ ADD1
MOV A,divy2
SUBB A,divc2
JC RETURN2
JNZ ADD1
MOV A,divy3
SUBB A,divc3
JC RETURN2
ADD1: MOV A,div3 ;商加1
ADD A,#01H
MOV div3,A ;商的低位字节存div3中
MOV A,div2
ADDC A,#00H
MOV div2,A
MOV A,div1
ADDC A,#00H
MOV div1,A ;商的高位字节存div2中
RETURN2:
ret
change16bcd:
MOV R4,#24 ;16进制转成压缩bcd码
MOV 50H,#00H
MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
LOOP1:CLR C
MOV A,buff0
RLC A
MOV buff0,A
MOV A,buff1
RLC A
MOV buff1,A
MOV A,buff2
RLC A
MOV buff2,A
MOV A,50H
ADDC A,50H
DA A
MOV 50H,A
MOV A ,51H
ADDC A,51H
DA A
MOV 51H,A
MOV A,52H
ADDC A,52H
DA A
MOV 52H,A
MOV A,53H
ADDC A,53H
DA A
MOV 53H,A
DJNZ R4,LOOP1
SWAP A
ANL A,#0FH
MOV DPTR ,#numtab ;译码
MOVC A,@A+DPTR
MOV led8,A
MOV A,53H
ANL A,#0FH
MOVC A,@A+DPTR
MOV led7,A
MOV A,52H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV led6,A
MOV A,52H
ANL A,#0FH
MOVC A,@A+DPTR
MOV led5,A
MOV A,51H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV led4,A
MOV A,51H
ANL A,#0FH
MOVC A,@A+DPTR
MOV led3,A
MOV A,50H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV led2,A
MOV A,50H
ANL A,#0FH
MOVC A,@A+DPTR
MOV led1,A
RET
cont: ;计数器溢出进行16分频
push psw
push acc
clr ea
cont1:
clr et1
clr tr1
clr et0
clr tr0
clr ex1
clr ex0
mov buffth1,#0f6h
mov bufftl1,#4ch
mov control,#0ffh
setb p2.0
setb p2.1
mov r3,#10h
mov th1,buffth1
mov tl1,bufftl1
mov th0,#00h
mov tl0,#00h
setb et0
setb tr0
setb et1
setb tr1
over2:setb ea
pop acc
pop psw
reti
display:
mov r0,#32
dpl1: mov r1,#100
dplop:
mov p0,led8
setb p2.5
jb p2.5,display1
clr p0.6
display1:mov p1,#01h
acall d1ms
mov p0,led7
setb p2.6
jb p2.6,display2
clr p0.6
display2:mov p1,#02h
acall d1ms
mov p0,led6
mov p1,#04h
acall d1ms
mov p0,led5
mov p1,#08h
acall d1ms
mov p0,led4
mov p1,#10h
acall d1ms
mov p0,led3
mov p1,#20h
acall d1ms
mov p0,led2
mov p1,#40h
acall d1ms
mov p0,led1
mov p1,#80h
acall d1ms
djnz r1,dplop
djnz r0,dpl1
ret
D1ms:
MOV R7,#0afh
DJNZ R7,$
RET
numtab: DB 60H, 0fcH, 52H, 58H, 0ccH, 49H,41H, 7cH, 40H, 48H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -