![]() |
師傅,你的電路圖怎么畫的?》好漂亮 |
居然用的是 匯編語言 ,真的強啊。順帶一問,匯編和C語言那個更好(學了C之后只會用C,看需不需要下功夫好好學匯編) |
昨天把轉向改為點動 并糾正了接收紅外連碼時的錯誤 代碼暫時不發了 有需要的壇友可以和我聯系 |
666666666666666666666666666666666666666 |
參考原代碼: 僅供參考 不得用于商業! 違者必究! ;試驗紅外遙控小車匯編代碼 ;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 |