搜索
bottom↓
回复: 5

用单片机红外遥控玩具汽车不能实现、请指点。

[复制链接]

出0入0汤圆

发表于 2007-1-1 01:50:35 | 显示全部楼层 |阅读模式
各位好;

这是我搞的一个红外遥控试验。用一个单片机去控制另一个单片机(完成小汽车的前进、后退、左右转的功能)。下面的程序是发射部分和接收部分:功能就是发射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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-1-1 18:05:28 | 显示全部楼层
我晕,汇编。

你先试试不用红外直接硬线连接。红外接收头有个叉叉的是上升沿有效,接收时会少一个数据
-----此内容被luoyiming1984于2007-01-01,18:07:16编辑过

出0入0汤圆

发表于 2007-1-1 20:56:49 | 显示全部楼层
没有看错的话,楼主的程序是<51系列单片机设计实例> 的实例9,楼然苗\李光飞编著的,北航出的书,



书跟的光盘,程序已经编译好了啊,直接用hex就可以了吧

出0入0汤圆

 楼主| 发表于 2007-1-1 21:03:16 | 显示全部楼层
好的我测试一下,就是不用发射二极管和接收头。把两点连接是吧?

出0入0汤圆

 楼主| 发表于 2007-1-1 22:56:43 | 显示全部楼层
内行阿,我是想加入红外接收头但是书上简化了。所以就自己改了。请指点

出0入0汤圆

 楼主| 发表于 2007-1-1 23:51:56 | 显示全部楼层
可以,用原程序可以,但是我改得有问题吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 06:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表