师傅,你的电路图怎么画的?》好漂亮 |
居然用的是 汇编语言 ,真的强啊。顺带一问,汇编和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 |