參考原代碼:
僅供參考
不得用于商業!
違者必究!
;試驗紅外遙控小車匯編代碼
;2018-3-8晚修改完成
;at89c2051--11.0592MHz晶振
;p17與p10分別驅動左右電機,p37驅動led燈
org 0000h
ajmp mm
org 0013h
ajmp tt1
;主程序*********************************************************
org 0100h
mm:nop
mov p1,#00h
mov p1,#00h
mov th1,#00h
mov tl1,#00h
mov tmod,#90h ;T0設方式0,T1方式1并打開門控
mov tcon,#04h ;T1由外部下降沿觸發中斷
mov ie,#84h ;開INT1和總中斷
mov ip,#04h ;INT1外部中斷優先
mov sp,#4fh ;設堆棧入口
mov 08h,#38h ;開始轉換紅外波頭
mov 09h,#07h ;轉換8位一組波頭
mov 10h,#30h ;讀紅外波頭存放首址
mov 11h,#10h ;讀紅外波頭16個
mov 20h,#00h ;所有標志位
mov 21h,#00h ;存放動作指令碼
clr p3.7
m0:acall zh
acall dz
acall ccc
sjmp m0
;cc動作完成后恢復相關的寄存器<不占區>******************************
ccc:jnb 07h,ccc0
mov 30h,#00h
mov 31h,#00h
mov 32h,#00h
mov 33h,#00h
mov 34h,#00h
mov 35h,#00h
mov 36h,#00h
mov 37h,#00h
mov 38h,#00h
mov 39h,#00h
mov 3ah,#00h
mov 3bh,#00h
mov 3ch,#00h
mov 3dh,#00h
mov 3eh,#00h
mov 3fh,#00h
mov 20h,#00h ;然后恢復相關單元
mov 21h,#00h
setb ex1 ;全部動作完成最后開INT1中斷
ccc0:ret
;tt1 T1讀紅外代碼子程序<占用區2>********************************
org 0200h
tt1:push dph ;保護現場
push dpl
push acc
push psw
jb 01h,t3 ;若正在轉換則返回
jb 02h,t3 ;若正在動作則返回
jb 00h,t2 ;收到遙控引導碼則進入接收識別模式
mov th1,#00h ;清T1,為接收做準備
mov tl1,#00h
setb 00h ;設接收遙控波頭準備好標志位
setb tr1 ;啟動T1
sjmp t3
t2:setb psw.4 ;進入區2
clr psw.3
mov @r0,th1 ;從30h存放讀進的紅外波頭
mov th1,#00h ;清T1,準備讀下一位
mov tl1,#00h
inc r0
djnz r1,t3 ;接收0fh個紅外波頭完成否?
mov 10h,#30h ;存放波頭首地址
mov 11h,#10h ;存放波頭數量
setb 01h ;設讀取完成與允許轉換標志位
clr tr1 ;關T1
clr ex1 ;關外部中斷1
clr 00h ;恢復接收標致位
t3:pop psw
pop acc
pop dpl
pop dph
reti
;zh轉換子程序<占用區1>******************************************
org 0280h
zh:push dph ;將識別后的遙控信號轉換成16位動作代碼
push dpl
push acc
push psw
setb psw.3 ;進入區1
clr psw.4
jb 00h,h01 ;若正在接收則返回
jb 02h,h01 ;若正在動作則返回
jb 01h,h02 ;若允許轉換則繼續
h01:mov 08h,#38h
mov 09h,#07h
pop psw
pop acc
pop dpl
pop dph
ret
h02:mov a,30h
jnb acc.2,h01 ;以下8條是判別紅外指令的地址碼是否正確
mov a,31h ;正確時應為HHHL LLHL(11100010B)
jnb acc.2,h01
mov a,32h
jnb acc.2,h01
mov a,36h
jnb acc.2,h01
mov a,33h
jnb acc.1,h01
mov a,34h
jnb acc.1,h01
mov a,35h
jnb acc.1,h01
mov a,37h
jnb acc.1,h01
mov 08h,#38h ;從38h單元開始轉換指令碼
h03:mov a,@r0 ;地址碼正確開始轉換指令碼
jb acc.2,h04
clr 08h ;21h的最低位置0
sjmp h05
h04: setb 08h ;21h的最低位置1
h05: mov a,21h
rl a
mov 21h,a
inc 08h
djnz r1,h03 ;8位指令碼轉換完否?
setb 02h ;設置允許執行動作標志位
clr 01h ;清除允許轉換標志位
ljmp h01
;dz動作子程序<不占區>**********************************************
org 0300h
dz:push dph
push dpl
push acc
push psw
jb 00h,d01 ;若正在接收則返回
jb 01h,d01 ;若正在轉換則返回
jnb 02h,d01 ;允許動作否?
mov a,21h
cjne a,#50h,dz2 ;左轉?
mov p1,#00h
nop
setb p1.7
nop
sjmp d00a
dz2:mov a,21h ;右轉?
cjne a,#48h,dz3
mov p1,#00h
nop
setb p1.0
nop
sjmp d00a
dz3:mov a,21h ;前進?
cjne a,#44h,dz4
mov p1,#00h
nop
mov p1,#0ffh
nop
sjmp d00a
dz4:mov a,21h
cjne a,#54h,d00a ;停止?
mov p1,#00h
mov p1,#00h
d00a:nop
mov 20h,#00h ;清除全部標志
mov 21h,#00h ;清除已完成的動作代碼
setb 07h ;本次動作完成后設置標志
d01:pop psw
pop acc
pop dpl
pop dph
ret
end
|