|
各位好;
这是我搞的一个红外遥控试验。用一个单片机去控制另一个单片机(完成小汽车的前进、后退、左右转的功能)。下面的程序是发射部分和接收部分:功能就是发射38kh的被调至的载波。根据脉冲的个数去实现各种功能。但都组装好后,就是不能实现它的功能。。各位帮我看看:我实在是没有辙了。
有着方面试验经历的仁兄帮帮忙谢谢
*************************************
; * *
; * 遥控编码控制器 *
; * *
; * 采用89s51 *
;*************************************
;
; P1.0口按纽为前进,P1.1口按纽为后退,P1.2口按纽为左转弯,P1.3口按纽为右转弯,
; P1.4口按纽为自动驾驶,P3.5为编码输出
;*************************************
;* *
;* 发射主程序和中断程序入口 *
;* *
;*************************************
ORG 0000H ;程序执行开始地址
AJMP START ;跳至START执行
ORG 0003H ;外中断0中断入口地址
RETI ;中断返回(不开中断)
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回(不开中断)
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
ORG 001BH ;定时器T1中断入口地址
LJMP INTT1 ;跳至INTT1中断服务程序
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
ORG 002BH ;定时器T2中断入口地址
RETI ;中断返回(不开中断)
;
;*************************************
;* *
;* 初 始 化 程 序 *
;* *
;*************************************
CLEARMEMIO: CLR A ;A清0
DEC A ;A为#0FFH
MOV P0,A ;P0-P3口置1
MOV P1,A ;
MOV P2,A ;
MOV P3,A ;
CLR P3.5 ;关遥控输出
CLEARMEM: MOV SP,#70H ;设堆栈基址为70H
MOV IE,#00H ;关所有中断
MOV IP,#01H ;设优先级
MOV TMOD,#22H ;8位自动重装初值模式
MOV TH1,#0F3H ;定时为13微秒初值
MOV TL1,#0F3H ;
SETB EA ;开总中断允许
RET ;返回
;
;
;
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: LCALL CLEARMEMIO ;调用初始化子程序
;
MAIN: LCALL KEYWORK ;主体程序。调用查键子程序
LJMP MAIN ;转MAIN循环
NOP ;PC值出错处理
NOP
NOP
LJMP START ;重新初始化
;
;*************************************
;* *
;* T1中断服务程序 *
;* *
;*************************************
INTT1: CPL P3.5 ;40kHZ红外线遥控信号产生
RETI ;中断返回
;
;
;*************************************
;* *
;* 键盘工作子程序 *
;* 出口为各键工作程序入口 *
;*************************************
KEYWORK: MOV P1,#0FFH ;置输入状态
JNB P1.0,KEY0 ; 读P1.0口,为0转KEY0
JNB P1.1,KEY1 ; 读P1.1口,为0转KEY1
JNB P1.4,KEY4 ; 读P1.4口,为0转KEY4
KEYOUT: RET ;没键按下,退出
;
KEY0: LCALL DL10MS ;延时10毫秒消抖
JB P1.0,KEYOUT ;干扰,退出
LJMP KEYFUN00 ;转KEYFUN00
KEY1: LCALL DL10MS ;
JB P1.1,KEYOUT ; 干扰,退出
LJMP KEYFUN01 ; 转KEYFUN01
KEY2: LCALL DL10MS ; 延时10毫秒消抖
JB P1.2,KEYOUT ; 干扰,退出
LJMP KEYFUN02 ; 转KEYFUN02
KEY3: LCALL DL10MS ; 延时10毫秒消抖
JB P1.3,KEYOUT ; 干扰,退出
LJMP KEYFUN03 ; 转KEYFUN03
KEY4: LCALL DL10MS ; 延时10毫秒消抖
JB P1.4,KEYOUT ; 干扰,退出
LJMP KEYFUN04 ; 转KEYFUN04
KEYWORK1: JNB P1.2,KEY2 ;P1.2口为0转KEY2
JNB P1.3,KEY3 ; P1.3口为0转KEY3
LCALL KEYFUN05 ;调转弯复位子程序
RET ;返回
;
KEYFUN00: MOV A,#02H ;发2个脉冲赋值
LCALL REMOTE ;发射2个脉冲(前进)
WAIT0: LCALL KEYWORK1 ;调一次转弯查键子程序
JNB P1.0,WAIT0 ;等待按键释放
LCALL KEYFUN06 ;释放时发8个脉冲(停止)
RET ;返回
;
KEYFUN01: MOV A,#03H ;发3个脉冲赋值
LCALL REMOTE ;发射3个脉冲(前进)
WAIT1: LCALL KEYWORK1 ;调一次转弯查键子程序
JNB P1.1,WAIT1 ;等待按键释放
LCALL KEYFUN06 ;释放时发8个脉冲(停止)
RET ;
;
KEYFUN02: MOV A,#04H ;发4个脉冲赋值
LCALL REMOTE ;发射4个脉冲(左转)
JNB P1.2,KEYOUT1 ;键按下不放,转KEYOUT1返回
LCALL DL10MS ;左转键放开,延时10毫秒
JNB P1.2,KEYOUT1 ;为0(干扰),转KEYOUT1返回
LCALL KEYFUN05 ;左转键放开发7个脉冲(转弯复位)
RET ;返回
;
KEYFUN03: MOV A,#05H ;发5个脉冲赋值
LCALL REMOTE ;发射5个脉冲(右转)
JNB P1.3,KEYOUT1 ;键按下不放,转KEYOUT1返回
LCALL DL10MS ;右转键放开,延时10毫秒
JNB P1.3,KEYOUT1 ;为0(干扰),转KEYOUT1返回
LCALL KEYFUN05 ;右转键放开发7个脉冲(转弯复位)
RET ;返回
KEYOUT1: LJMP KEYOUT ;跳至KEYOUT返回
;
KEYFUN04: JNB P1.4,KEYFUN04 ;等待按键释放
LCALL DL10MS ;延时消抖动
JNB P1.4,KEYFUN04 ;P1.4为0,系干扰,转KEYFUN04再等待
MOV A,#06H ;按键释放,发6个脉冲(进入自动驾驶)
LCALL REMOTE ;发射一次
RET ;返回
;
KEYFUN05: MOV A,#07H ;发7个脉冲程序(转弯复位)
LCALL REMOTE ;发射一次
RET ;返回
KEYFUN06: MOV A,#08H ;发8个脉冲程序(停车)
LCALL REMOTE ;发射一次
RET ;返回
;
;
;*************************************
;* *
;* 编 码 发 射 程 序 *
;* *
;*************************************
;
REMOTE: MOV R1,A ;装入发射脉冲个数
LJMP OUT3 ;转第一个码发射处理
OUT: MOV R0,#55H ;1MS宽低电平发射控制数据
OUT1: SETB ET1 ;开T1中断
SETB TR1 ;开启定时器T1
NOP ;延时
NOP
NOP
NOP
NOP
DJNZ R0,OUT1 ;时间不到转OUT1再循环
MOV R0,#32H ;1MS高电平间隙控制数据
OUT2: CLR TR1 ;关定时器T1
CLR ET1 ;关T1中断
CLR P3.5 ;关脉冲输出
NOP ;空操作延时
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R0,OUT2 ;时间不到转OUT2再循环
DJNZ R1,OUT ;脉冲未发完,转OUT再循环发射
LCALL DL500MS ;
RET ;
OUT3: MOV R0,#0FFH ;装发谢3MS宽控制数据
LJMP OUT1 ;转OUT1
;
;*************************************
;* *
;* 延时513 us *
;* *
;*************************************
;
;513微秒延时程序
DELAY: MOV R2,#0FFH
DELAY1: DJNZ R2,DELAY1
RET
;
;
;
;*************************************
;* *
;* 延时10ms *
;* *
;*************************************
;
;10毫秒延时程序
DL10MS: MOV R3,#14H
DL10MS1: LCALL DELAY
DJNZ R3,DL10MS1
RET
;500毫秒延时程序
DL500MS: MOV R4,#32H
DL500MS1: LCALL DL10MS
DJNZ R4,DL500MS1
RET
;
END
; *************************************
; * *
; * 遥 控 接 收 解 码 *
; * 采用AT89s51 *
; * *
; *************************************
;
; 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 ;程序结束 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|