不得用于商业! 违者必究! ;试验红外遥控小车运行代码 ;2018-4-2修改纠正连发码死机及点动转向 ;AT2051/4051----11.0592MHz晶振 org 0000h ajmp mm org 0013h ajmp tt1 ;主程序********************************************************* org 0100h mm:nop mov p1,#00h ;关闭电机 mov b,#30h ;延时50uS纠错 mov 08h,#38h ;开始转换红外波头 mov 09h,#07h ;转换8位一组波头 mov 10h,#30h ;读红外波头存放首址 mov 11h,#10h ;读红外波头16个 mov 20h,#00h ;所有标志位 mov 21h,#00h ;存放动作指令码 mov th1,#00h mov tl1,#00h mov tmod,#90h ;T0设方式0,T1方式1并打开门控 setb ea ;开INT1和总中断 setb px1 ;INT1中断优先 setb it1 ;T1由外部下降沿触发中断 clr et1 ;T1中断关闭 mov sp,#4fh ;设堆栈入口 acall ccc1 ;初始化相关单元 m0:acall ccc ;动作后初始化相关单元 acall ssd acall zh acall dz sjmp m0 ;双闪灯代码<占用区3的r6和r7两个单元>**************************** ssd:nop clr p3.7 ;Rled双闪发光 acall ys setb p3.7 acall ys acall ys clr p3.7 acall ys setb p3.7 acall ys acall ys acall ys acall ys acall ys acall ys acall ys acall ys acall ys acall ys ret ys:nop mov 1eh,#00h ;延时 mov 1fh,#80h ys1:djnz 1eh,ys1 ys2:djnz 1fh,ys1 ret ;cc动作完成后恢复相关的寄存器<不占区>****************************** ccc:jnb 07h,ccc0 ccc1:setb ex1 ;全部动作完成最后开INT1中断 mov th1,#00h ;清TH1/TL1 mov tl1,#00h mov 08h,#38h ;开始转换红外波头 mov 09h,#07h ;转换8位一组波头 mov 10h,#30h ;读红外波头存放首址 mov 11h,#10h ;读红外波头17个 mov 20h,#00h ;所有标志位 mov 21h,#00h ;存放动作指令码 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 ccc0:ret ;tt1 T1读红外代码子程序<占用区2>******************************** org 0200h tt1:nop push acc ;保护现场 push psw tt2:djnz b,tt2 ;延时50uS纠错 mov b,#30h ;延时50uS jb p3.3,ttwm jb 00h,t2 ;收到遥控引导码则进入接收识别模式 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个红外波头完成否? clr ex1 ;关外部中断1 clr tr1 ;关T1 clr 00h ;恢复接收标致位 setb 01h ;设读取完成与允许转换标志位 mov b,#33h mov 10h,#30h mov 11h,#10h t3:nop pop psw pop acc reti ttwm:nop ;误码处理 mov th1,#00h ;清TH1/TL1 mov tl1,#00h mov 08h,#38h ;开始转换红外波头 mov 09h,#07h ;转换8位一组波头 mov 10h,#30h ;读红外波头存放首址 mov 11h,#10h ;读红外波头17个 mov 20h,#00h ;所有标志位 mov 21h,#00h ;存放动作指令码 setb ex1 pop psw pop acc reti ;zh转换子程序<占用区1>****************************************** org 0280h zh:nop push acc push psw setb psw.3 ;进入区1 clr psw.4 jb 01h,h02 ;若允许转换则继续 h01:nop pop psw pop acc ret h02:nop mov a,30h jnb acc.2,zhwm ;以下8条是判别红外指令的地址码是否正确 mov a,31h ;正确时应为HHHL LLHL(11100010B/E2H) jnb acc.2,zhwm mov a,32h jnb acc.2,zhwm mov a,36h jnb acc.2,zhwm mov a,33h jnb acc.1,zhwm mov a,34h jnb acc.1,zhwm mov a,35h jnb acc.1,zhwm mov a,37h jnb acc.1,zhwm mov 08h,#38h h03:nop 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 ;清除允许转换标志位 mov 08h,#38h mov 09h,#07h ajmp h01 zhwm:acall ccc1 ;误码处理 pop psw pop acc ret ;dz动作子程序<不占区>********************************************** org 0300h dz:nop push acc push psw jb 02h,dz0 ;允许动作否? pop psw pop acc ret dz0:mov a,21h cjne a,#44h,dz1 ;前进? mov p1,#00h nop setb p1.7 setb p1.0 nop setb 07h ;本次动作完成后设置标志 pop psw pop acc ret dz1:mov a,21h ;停止? cjne a,#54h,dz2 mov p1,#00h nop setb 07h ;本次动作完成后设置标志 pop psw pop acc ret dz2:mov a,21h cjne a,#50h,dz3 ;左转? mov p1,#00h nop setb p1.7 acall ys acall ys clr p1.7 setb 07h ;本次动作完成后设置标志 pop psw pop acc ret dz3:mov a,21h cjne a,#48h,dz4 ;右转? mov p1,#00h setb p1.0 acall ys acall ys clr p1.0 dz4:setb 07h ;本次动作完成后设置标志 pop psw pop acc ret end ;p37是双闪灯ssd,(L)点亮 ;p17是左传 ;p10是右转 |
GMT+8, 2024-5-8 09:01 , Processed in 0.842790 second(s), 23 queries .
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.