⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 迷宫车源程序.asm

📁 本智能迷宫小车通过左手摸墙法搜索迷宫的出口。
💻 ASM
字号:
;-----------------------迷宫车-------------------------
;电机驱动端口:P1
;电机驱动代码:
;0x01,0x00,0x21,0x11,右电机急停,停止,正转,反转
;0x04,0x00,0x06,0x0c 左电机急停,停止,正转,反转
;红外发射:P3.4
;红外接收:P2.7空,P2.6右底,P2.5左底,P2.4左后,
;         P2.3右后,P2.2左前,P2.1前,P2.0右前
;蜂鸣器:P3.7
;----------------------------------------------------
SEND      BIT     P3.4    ;红外发射端口
BUZZER    BIT     P3.7    ;蜂鸣器接口
RCV       DATA    2AH     ;红外接收寄存器
RCVP      DATA    2BH     ;接收上升沿
RCVF      DATA    2CH     ;接收下降沿
TMH       DATA    30H     ;计时器
TML       DATA    31H
TMR       BIT     20H.0  ;计时器启动标志位
OUT       DATA    33H    ;电机驱动输出寄存器
RCVBUF    EQU     38H   ;红外接收缓冲区首地址
RBUFSIZE  EQU     5     ;红外接收缓冲区大小
RCVCOUNT  DATA    3FH
ORG     0000H
AJMP    START
ORG     000BH
AJMP    TIME0_INT
ORG     001BH
CPL     SEND
RETI
ORG     0050H
START:  ;MOV     C,P2.5
       ; MOV     BUZZER,C
       ; SJMP    START
        MOV     R0,#5FH
        MOV     @R0,#0
        DJNZ    R0,$-2
        MOV     SP,#5FH
        MOV     RCVCOUNT,#10
        MOV     RCV,#0FFH
        MOV     TMOD,#21H
        MOV     TL0,#LOW(65536-2000)
        MOV     TH0,#HIGH(65536-2000)
        MOV     TH1,#256-13
        SETB    ET0
        SETB    EA
        SETB    TR0
        SETB    TR1
        MOV     TMH,#05H
        MOV     TML,#00H
        SETB    TMR
        JB      TMR,$
        MOV     OUT,#11H
;P2.7空,P2.6左底,P2.5右底,P2.4左后
;P2.3右后,P2.2左前,P2.1前,P2.0右前
LOOP:   
      ;  JNB     RCVP.4,LOOP1
        ACALL   LEFT      ;若左边有通道,向左转90度
        SJMP    LOOP
LOOP1:  MOV     C,RCV.1
        CPL     C
        ANL     C,RCV.3
        JNC     LOOP2
        ACALL   RIGHT
LOOP2:  MOV     C,RCV.1
        ORL     C,RCV.3
        JC      LOOP3
        ACALL   BACK
LOOP3:  JB      RCV.0,LOOP4
        ACALL   ZUOPIAN
LOOP4:  JB      RCV.2,LOOP5
        ACALL   YOUPIAN
LOOP5:  JNB     P2.5,LOOP
        MOV     R5,#1
        ACALL   DELAY
        JNB     P2.5,LOOP
        MOV     OUT,#00H
        SETB    SEND
        CLR     BUZZER
        MOV     R5,#100
        ACALL   DELAY
        SETB    BUZZER
        CLR     EA
        SJMP    $
       ; AJMP    LOOP
;--------------T0中断----------------
TIME0_INT:
        ORL     TL0,#LOW(65536-2000)
        MOV     TH0,#HIGH(65536-2000)
        PUSH    ACC
        PUSH    PSW
        SETB    RS0
        CLR     RS1
        CPL     ET1
        JB      ET1,T0N2
        SETB    SEND
        ACALL   RECEIVE
        ;--------------------
        MOV     C,RCV.4
       ; ANL     C,RCV.1
       ; ANL     C,RCV.2
       ; ANL     C,RCV.0
       ; ANL     C,RCV.3
        MOV     BUZZER,C
T0N2:   ACALL   TIMER
        ACALL   OUTPUT
        POP     PSW
        POP     ACC
        RETI
;-------------双字节BCD码倒计时器---------------
;计时精度:2ms
TIMER:  JB      TMR,TIMER0
        RET
TIMER0: MOV     A,TML
        ORL     A,TMH
        JZ      TIMER2
        MOV     A,TML
        ADD     A,#99H
        DA      A
        MOV     TML,A
        MOV     A,TMH
        ADDC    A,#99H
        DA      A
        MOV     TMH,A
        RET
TIMER2: CLR     TMR
        RET
;--------------------红外接收子程序-----------------
;对连续接收到的10次进行统计,若高电平的次数大于5次,
;则认为是高电平
RECEIVE:MOV     R0,#RCVBUF
        MOV     A,P2
RC0:    RRC     A
        JNC     RC1
        INC     @R0
RC1:    INC     R0
        CJNE    R0,#RCVBUF+RBUFSIZE,RC0
        DJNZ    RCVCOUNT,RC3
        MOV     R7,RCV
        MOV     RCV,#0
        MOV     R0,#RCVBUF+RBUFSIZE-1
RC2:    MOV     A,#5
        CLR     C
        SUBB    A,@R0
        MOV     A,RCV
        RLC     A
        MOV     RCV,A
        MOV     @R0,#0
        DEC     R0
        CJNE    R0,#RCVBUF-1,RC2
        MOV     RCVCOUNT,#10
        MOV     A,R7
        CPL     A
        ANL     A,RCV
        MOV     RCVP,A
        MOV     A,RCV
        CPL     A
        ANL     A,R7
        MOV     RCVF,A
        SETB    C
        RET
RC3:    CLR     C
        RET
;------------------电机驱动子程序----------------
;OUT的高4位=0,1,2时,表示左电机停止,正转,反转
;OUT的低4位=0,1,2时,表示右电机停止,正转,反转
OUTPUT: MOV     DPTR,#OUTDATA
        MOV     A,OUT
        SWAP    A
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     R7,A
        MOV     A,OUT
        ANL     A,#0FH
        ADD     A,#3
        MOVC    A,@A+DPTR
        ORL     A,R7
        MOV     P1,A
        RET
OUTDATA:
DB 04H,06H,0CH      ;左电机停止,正转,反转
DB 01H,21H,11H      ;右电机停止,正转,反转
;---------------------暂停400ms---------------------
STOP:   MOV     OUT,#00H
        MOV     TMH,#02H
        MOV     TML,#50H
        SETB    TMR
        JB      TMR,$
        RET
;-------------------向左转弯90度子程序--------------
LEFT:   MOV     TMH,#01H
        MOV     TML,#30H
        SETB    TMR
        JB      TMR,$
        ACALL   STOP
       ; MOV     OUT,#11H
       ; RET
        MOV     OUT,#21H
        MOV     TMH,#03H
        MOV     TML,#90H
        SETB    TMR
        JB      TMR,$
     ;   ACALL   STOP
     ;   MOV     OUT,#11H
        RET
;-------------------向右转弯90度子程序--------------
RIGHT:  ACALL   STOP
        MOV     OUT,#12H
        MOV     TMH,#03H
        MOV     TML,#46H
        SETB    TMR
        JB      TMR,$
        ACALL   STOP
        MOV     OUT,#11H
        RET
;----------------------向后转子程序-------------------
BACK:   ACALL   STOP
        MOV     OUT,#12H
        MOV     TMH,#07H
        MOV     TML,#63H
        SETB    TMR
        JB      TMR,$
        ACALL   STOP
        MOV     OUT,#11H
        RET
;---------------------向左偏-------------------------
ZUOPIAN:MOV     OUT,#01H        ;向左偏转
        MOV     TMH,#02H        ;设定向左偏转的最大时间
        MOV     TML,#76H
        SETB    TMR
ZP1:    MOV     C, RCVP.4
        CPL     C
        ANL     C,RCV.1
        JC      ZP2
        RET
ZP2:    MOV     C,RCV.0
        CPL     C
        ANL     C,TMR
        JC      ZP1  ;若未到达设定的时间且左前方有信号反射回来
        CLR     TMR
        ACALL   HALFT      ;求偏转时间的一半,返回值在R6R7中
        MOV     OUT,#10H   ;向右偏转
        MOV     TMH,R6
        MOV     TML,R7
        SETB    TMR
        JB      TMR,$
        MOV     OUT,#11H   ;直走
        RET
;---------------------向右偏-------------------------
YOUPIAN:MOV     OUT,#10H     ;向右偏转
        MOV     TMH,#02H     ;设定向左偏转的最大时间
        MOV     TML,#76H
        SETB    TMR
YP1:    MOV     C, RCVP.4
        CPL     C
        ANL     C,RCV.1
        JC      YP2
        RET
YP2:    MOV     C,RCV.2
        CPL     C
        ANL     C,TMR
        JC      YP1   ;若未到达设定的时间且左前方有信号反射回来
        CLR     TMR
        ACALL   HALFT  ;求偏转时间的一半,返回值在R6R7中
        MOV     OUT,#01H   ;向左偏转
        MOV     TMH,R6
        MOV     TML,R7
        SETB    TMR
        JB      TMR,$
        MOV     OUT,#11H   ;直走
        RET
;------------求偏转时间的一半-----------
;出口:R6R7
HALFT:  MOV     R7,TML
        MOV     R6,TMH
        ACALL   DDTOB
        CLR     C
        MOV     A,#78H    ;376BCD=178FH
        SUBB    A,R7
        MOV     R7,A
        MOV     A,#01H
        SUBB    A,R6
        RRC     A
        MOV     R6,A
        MOV     A,R7
        RRC     A
        MOV     R7,A
        ACALL   DBTOD
        MOV     A,R5
        MOV     R7,A
        MOV     A,R4
        MOV     R6,A
        RET
;-------------BCD码转为二进制数----------
;入口A
;出口A
DTOB:   MOV     R3,A
        ANL     A,#0FH
        XCH     A,R3
        SWAP    A
        ANL     A,#0FH
        MOV     B,#10
        MUL     AB
        ADD     A,R3
        RET
;----------双字节BCD码转为二进制--------
;入口R6,R7
;出口R6,R7
DDTOB:  MOV     A,R7
        ACALL   DTOB
        MOV     R7,A
        MOV     A,R6
        ACALL   DTOB
        MOV     B,#100
        MUL     AB
        ADD     A,R7
        MOV     R7,A
        MOV     A,B
        ADDC    A,#0
        MOV     R6,A
        RET
;--------------双字节数带进位循环左移------------
DRLC:   MOV     A,R6
        MOV     C,ACC.7
        MOV     A,R7
        RLC     A
        MOV     R7,A
        MOV     A,R6
        RLC     A
        MOV     R6,A
        RET
;-----------双字节二进制数转为BCD码--------
;入口  R6R7
;出口  R4R5
DBTOD:  MOV     R4,#0
        MOV     R5,#0
        MOV     R2,#16
DBTOD1: ACALL   DRLC
        MOV     A,R5
        ADDC    A,R5
        DA      A
        MOV     R5,A
        MOV     A,R4
        ADDC    A,R4
        DA      A
        MOV     R4,A
DBTOD2: DJNZ    R2,DBTOD1
        RET
;--------------延时子程序------------
DELAY:  MOV     A,R5                     
        MOV     R6,#20
        MOV     R7,#250
        DJNZ    R7,$
        DJNZ    R6,$-4
        DJNZ    R5,DELAY
        MOV     R5,A
        RET                     
;------------------------------------
                 END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -