作者:未知 来源:89s52.cn
; *************************************
; * *
; * 遥 控 接 收 解 码 *
; * 采用AT89C2051 *
; * *
; *************************************
;
; P1.0-P1.1为电机前后驱动,P1.2-P1.3为左右转弯驱动,P1.4为自动驾驶指示,
; 编码输入从P3.1和p3.2(int0)口,P3.0和P3.5分别为前后红外线探头,在自动
; 驾驶时以控制小汔车前进倒退。
;*************************************
;* *
;* 主程序和中断程序入口 *
;* *
;*************************************
ORG 0000H ;程序执行开始地址
LJMP START ;跳至START执行
ORG 0003H ;外中断0中断入口地址
LJMP INTEX0 ;跳至INTEX0中断服务程序
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回(不开中断)
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
ORG 001BH ;定时器T1中断入口地址
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
ORG 002BH ;定时器T2中断入口地址
RETI ;中断返回(不开中断)
;
;***************************
;* *
;* 初始化程序 *
;* *
;****************************
CLEARMEMIO: CLR A ;清A
MOV P1,A ;P1口置0
DEC A ;A为#0FFH
MOV P3,A ;P3口置1
SETB P1.4 ;关自动驾驶指示灯
CLR 00H ;自动驾驶标志位清0
CLEARMEM: MOV IE,#00H ;关所有中断
SETB EX0 ;开外中断
SETB EA ;开总中断允许
RET ;返回
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: LCALL CLEARMEMIO ;上电初始化
MAIN: JB 00H,AUTO2 ;00H位标志为1转自动驾驶
LJMP MAIN ;主程序循环
NOP ;PC值出错处理
NOP
LJMP START ;重新上电启动
AUTO2: LJMP AUTO ;至自动驾驶程序
;******************************
; ;
; 中断接收程序 ;
; ;
;******************************
INTEX0: CLR EX0 ;关中断
JNB P3.1,READ1 ;P3.1为0转READ1
READOUTT0: SETB EX0 ;干扰,中断退出
RETI ;中断返回
;
READ1: CLR A ;清A
MOV DPH,A ;清DPTR
MOV DPL,A ;
HARD1: JB P3.1,HARD11 ;P3.1为高电平时转HARD11
INC DPTR ;低电平脉冲宽度时间计数
NOP ;空操作延时
NOP
AJMP HARD1 ;跳回循环(周期约为8微秒)
HARD11: MOV A,DPH ;取DPTR高8位计数值
JZ READOUTT0 ;若为0,则脉宽不足3毫秒退出中断
CLR A ;脉宽大于2MS,是第一个肪冲
READ11: INC A ;脉冲计数加1
READ12: JNB P3.1,READ12 ;低电平等待,
MOV R1,#06H ;高电平脉宽判断用
READ13: JNB P3.1,READ11 ;低电平转READ11(脉冲计数)
LCALL DELAY ;延时512微秒
DJNZ R1,READ13 ;高电平脉宽小于3MS,转READ13循环
DEC A ;高电平脉宽大于3MS,计数结束,A减1
DEC A ;再减1
JZ FUN0 ;收到2个肪冲,执行前进功能
DEC A
JZ FUN1 ;收到3个肪冲,执行后退功能
DEC A
JZ FUN2 ;收到4个肪冲,执行左转功能
DEC A
JZ FUN3 ;收到5个肪冲,执行右转功能
DEC A
JZ FUN4 ;收到6个肪冲,执行自动驾驶功能
DEC A
JZ FUN5 ;收到7个肪冲,执行转弯复位功能
DEC A
JZ FUN6 ;收到8个肪冲,执行停车功能
NOP ;出错处理
NOP ;
LJMP READOUTT0 ;退出
FUN0: SETB P1.0 ;前进状态
LJMP READOUTT0 ;
FUN1: SETB P1.1 ;后退状态
LJMP READOUTT0 ;
FUN2: SETB P1.2 ;左转弯状态
LJMP READOUTT0 ;
FUN3: SETB P1.3 ;右转弯状态
LJMP READOUTT0 ;
FUN4: CPL 00H ;自动驾驶标志取反
JB 00H,AUTO1 ;00H=1进入自动驾驶
CLR P1.0 ;00H=0时进入遥控驾驶,停车操作
CLR P1.1 ;停车操作
CLR P1.2 ;停车操作
CLR P1.3 ;停车操作
SETB P1.4 ;关自动驾驶灯
LJMP READOUTT0 ;中断退出
AUTO1: CLR P1.4 ;进入自动驾驶,开自动驾驶指示灯
SETB EX0 ;开中断
RETI ;中断返回
AUTO: JNB P3.0,BL ;自动驾驶控制程序,前有障碍转BL
SETB P1.0 ;前面无障碍,前进状态
CLR P1.1 ;前面无障碍,前进状态
CLR P1.2 ;前面无障碍,前进状态
CLR P1.3 ;前面无障碍,前进状态
JNB 00H,OUT1 ;标志为0转OUT1(转遥控)
AJMP AUTO ;为1转AUTO循环
BL: CLR P1.0 ;前面有障碍,后退并左转处理
SETB P1.1 ;置后退状态
SETB P1.2 ;左转状态
CLR P1.3 ;
JNB 00H,OUT1 ;标志为0转OUT1(转遥控)
JNB P3.5,AUTO ;后面有障碍物转AUTO(前进处理)
AJMP BL ;后无障碍转BL继续后退循环
OUT1: CLR P1.0 ;自动驾驶退出程序,关闭驱动及转向电机
CLR P1.1 ;
CLR P1.2 ;
CLR P1.3 ;
SETB P1.4 ;关自动驾驶指示灯
LJMP MAIN ;转回主程序
FUN5: CLR P1.2 ;转弯停止程序
CLR P1.3 ;
LJMP READOUTT0 ;退出中断
FUN6: CLR P1.0 ;遥控停车程序,关闭驱动及转向电机
CLR P1.1 ;
CLR P1.2 ;
CLR P1.3 ;
LJMP READOUTT0 ;中断退出
;*************************************
;* *
;* 延时程序( 255 X 2 = 513 us) *
;* *
;*************************************
DELAY: MOV R0,#0FFH ;
DELAY1: DJNZ R0,DELAY1 ;
RET ;
;
;
END ;程序结束