📄 120240 .asm
字号:
;该程序是为了得到相移为120,240的,占空比为50%的方波.我们将信号接到INTO上,当信号下降沿来的时候,就产生int0中断,我们用T0来计数,转下行
; 因为要相移120 ,所以要延时T/3,延时之后,翻转P1.4口,再之后赋T/2,这个是在T1中断中产生.
;当产生120相移之后,我们将P1.4产生的波形再传输给int1,即连接P1.4口和int1.再通过T2中断再次相移120,即可得到240的相移波形.
et2 equ ie.5 ;编译环境没有定义T2定时/计数器,在这里定义
pt2 equ ip.5
TL2 EQU 0CCH
TH2 EQU 0CDH
T2CON EQU 0C8H
T2MOD EQU 0C9H
tr2 EQU t2con.2
tf2 equ t2con.7
org 0000h
sjmp main
org 0003h
ajmp intt0
org 000bh
ajmp tt0
org 0013h
ajmp intt1
org 001bh
ajmp tt1
org 002bh
ajmp tt2
org 0030h
main: mov 20h,#00h ;清零20H的单元,这些单元用作标志位。
mov 43h,#00h
mov 44h,#00h
mov 47h,#00h
mov 48h,#00h
setb p1.5 ;P1.5输出120 的波形,先设定为高电平。
setb p1.4 ;P1.4输出240 的波形,先设定为高电平。
mov sp, #70h
mov tmod,#11h ;T1,T0定义为16计数
mov t2con,#00h
MOV DPL,#00H ;清DPTR,DPTR主要用于当定时器0计满65536之后,在定时器0中断中INC DPTR的
MOV DPH,#00H
mov th0,#00h
mov tl0,#00h
mov th1,#00h
mov tl1,#00h
mov th2,#00h
mov tl2,#00h
setb it0 ;int0下降沿有效
setb it1 ;int1下降沿有效
setb ex0 ;开中断源
setb ex1
setb et0
setb et1
setb et2
setb pt1 ;设定优先级
setb pt2
;setb tr1
;setb tr2
;setb px0
setb ea ;开总中断源。
HERE: JNB 04H, RELA ;主循环
CLR 04H
ACALL DIVII
mov a, 40h ;40存放低位
cpl a
mov 43h, a ;tl1=t/2 43h 取反设定初值
mov a, 41h ;次高位放在41H中, 最高位放在 42H中 最高位加一是为了用到DJNZ 的时候。 42h+1=51h=60H=38H
cpl a
mov 44h, a ;th1=t/2 44h ,取反
mov a, 34h
cpl a
mov 47h, a ;tl1=t/3 47h
mov a, 35h ;最高位是 36h+1=49h
cpl a ;最高位加一是为了用到DJNZ 的时候。 36h+1=49h=61H=37H
mov 48h, a ;th1=t/3 48h
RELA: sjmp HERE
TT0: clr tr0
inc dptr ;DPTR主要用于当定时器0计满65536之后,在定时器0中断中INC DPTR的
setb tr0
reti
tt1: clr tr1
jb 02h,relyidong ;为了先延时T/3所要设定的标志位
;;;;;;;;;;;;;;;;;;;;
;新加的一句
mov 51h, 60h
djnz 49h, reltt11 ;最高位36H+1=49h
mov 49h,61h
clr p1.4
setb 02h
mov tl1,43h ;送入T/2初值
mov th1,44h
setb tr1
reti
relyidong:
;;;;;;;;;;;;;;;;;;;;;;;;;;;
djnz 51h,reltt11 ;T/3延时完了之后再延时T/2
setb p1.4
mov 51h, 60h
mov th1, 44h
mov tl1, 43h
setb tr1
reti
reltt11: mov tl1,#00h
mov th1,#00h
setb tr1 ;47H,48H里存放的T/3的值放在中断int0中进行.
reti
tt2: clr tf2 ;定时器2 同定时器1完全一样,
clr tr2
jb 03h,relyidongggg
mov 38h, 60h
djnz 37h, reltt1111
mov 37h,61h
setb 03h
clr p1.5
mov tl2,43h
mov th2,44h
setb tr2
reti
relyidongggg: djnz 38h,reltt1111
setb p1.5
mov 38h, 60h
mov th2, 44h
mov tl2, 43h
setb tr2
reti
reltt1111: mov tl2,#00h
mov th2,#00h
setb tr2
reti
intt1: clr tr2 ;上面介绍了将P1.5引脚产生的波形用于连接int1,还是下降沿中断.延时T/3 ,就相当于240度了
clr 03h ;中断int0开始,每当有信号发生中断了的时候,就把47H,48H里的数据传给TL2,TH2。
mov tl2, 47h ;47H,48H存放的是T/3的余量,即除去DPTR之后的剩余的数。
mov th2,48h
setb tr2
reti
intt0: clr tr1 ;中断int0开始,每当有信号发生中断了的时候,就把47H,48H里的数据传给TL1,TH1。
clr 02h ;47H,48H存放的是T/3的余量,即除去DPTR之后的剩余的数。
mov tl1,47h
mov th1,48h
setb tr1
jb 00h, rel ;第一次中断时开T0计数
setb tr0
setb 00h
reti
rel: clr tr0 ;第二次中断关T0
clr 00h
setb 04h ; 设置标志位04H用于控制主循环
push acc
push psw
jb 06h, relgaijin ;这个是为第一次存储数据而设定的。以后就都为1,然后将第二次,第三次......的数据跟上一次比较,如果之差大于某一值,就重新取代原值。
setb 06h
MOV 30H, TL0
MOV 31H, TH0
MOV 32H, DPL
MOV 33H,DPH ;存储数据在33H,32H,31H, 30H,由于相移要求频率最小是5HZ,所以我在后面的除法33H省略了。
ajmp texture
relgaijin:
mov 52h,tL0 ; 这个是第二次存储的值,跟上一次进行比较。
mov 53h,th0
mov 54h,dpl
mov 55h,dph
clr c
mov a, 55h ;最高位进行比较
cjne a,33h,relaa
sjmp relbb
relaa: jc relcc
sjmp reldd
relbb: mov a, 54h ; 2位进行比较
cjne a, 32h,relee
sjmp relff
relee: jc relcc
sjmp reldd
relff: mov a, 53h ;第三位进行比较
cjne a, 31h,relgg
sjmp relhh
relgg:jc relcc
sjmp reldd
relhh:mov a, 52h ;第四位进行比较
cjne a, 30h,reljj
clr 04h ;如果相等,就不用重新计算,直接输出元波形
ajmp texture
reljj: jc relcc
sjmp reldd
relcc: clr c ; 如果第二次的值小于第一次的值,就比较
mov a,30h
subb a, 52h
mov 56h, a
mov a, 31h
subb a, 53h
mov 57h, a
mov a, 32h
subb a, 54h
mov 58h, a
mov a, 33h
subb a, 55h
mov 59h, a
jnz relkk
mov a, 58h
jnz relkk
mov a, 57h
jnz relkk
mov a, 56h
clr c
subb a, #20
jnc relkk
clr 04h ;如果它们俩之间的差值小于20,就清04,不改变波形所设定的TL,TH值。如果大于则取代,转向relkk
ajmp texture
reldd: mov a, 52h ; 如果第二次的值大于第一次的值,就比较
subb a, 30h
mov 56h, a
mov a, 53h
subb a, 31h
mov 57h, a
mov a, 54h
subb a, 32h
mov 58h, a
mov a, 55h
subb a, 33h
mov 59h, a
jnz relkk
mov a, 58h
jnz relkk
mov a, 57h
jnz relkk
mov a, 56h
clr c
subb a, #20
jnc relkk
clr 04h ;如果它们俩之间的差值小于20,就清04,不改变波形所设定的TL,TH值。如果大于则取代,转向texture.
ajmp texture
relkk: mov 33h,55h
mov 32h,54h
mov 31h,53h
mov 30h,52h
texture:
MOV TH0,#00H
MOV TL0,#00H
MOV DPL,#00H
MOV DPH,#00H
pop psw
pop acc
RETI
DIVII: CLR C ;T/2 ,数据存储在42H,41H,40H
MOV A, 32H
RRC A
MOV 42H, A
MOV A, 31H
RRC A
MOV 41H, A
MOV A, 30H
RRC A
MOV 40H, A ;42h+1 ------51h
mov a, 42h
inc a
mov 51h, a ;38H=60h=51h
mov 38h, a
mov 60h, a
MOV R4,#03H ;除以3,得到T/3 ,数据存储在36H,35H,34H
MOV R7, 31H
MOV R6, 30H
MOV R3, 32H
CLR A
MOV R5, A
MOV R1,#24
DIV1: CLR C
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV A, R3
RLC A
MOV R3,A
MOV A, R5
RLC A
MOV R5, A
SUBB A, R4
JC NEXT1
INC R6
MOV R5, A
NEXT1: DJNZ R1,DIV1
MOV A, R5
JB ACC.7, ADD1
CLR C
MOV A, R5
RLC A
MOV R5, A
SUBB A, R4
JC NEXT2
ADD1: MOV A, R6
ADD A, #01H
MOV R6, A
MOV A, R7
ADDC A, #00H
MOV R7, A
MOV A,R3
ADDC A,#00H
MOV R3,A
NEXT2: MOV A, R6
MOV 34H, A
MOV A, R7
MOV 35H, A
MOV A, R3
MOV 36H,A
inc a
mov 49h, a ;36h+1 -------49h
mov 37h, a
mov 61h,a ;61h=49h
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -