新闻  |   论坛  |   博客  |   在线研讨会
十五路遥控发送控制器遥控接收解码------采用AT89C2051
tvb2058 | 2007-09-10 14:07:05    阅读:1528   发布文章

;                 *************************************
;                 *                                   *
;                 *       遥 控 接 收 解 码           *
;                 *       采用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                                 ;程序结束

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客