📄 迷宫车源程序.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 + -