📄 wo_de_road.asm
字号:
ROAD_CHECK BIT 20H ;线路检测标志
;ONE_OR_TWO BIT 21H ;第一层或第二层传感器标志
;ONELAY BIT 25H;第一层传感器开关(硬件改变,不再起作用)
;TWOLAY BIT 26H ;第二层传感器开关(硬件改变,不再起作用)
ROADSTATE EQU 30H
;===============================================
BEIZHAN_CHECK BIT 22H;避障检测标志
R_STORE BIT 23H;
L_STORE BIT 24H;
M_STORE BIT 29H;
B_STORE BIT 2AH;
R_BEIZHAN BIT P2.1;右边避障检测器
L_BEIZHAN BIT P2.3 ;左边叫障检测器
M_BEIZHAN BIT P2.2;中间
B_BACK BIT P3.0;后退
KEEP_OUT BIT 27H ;
FIND_WAY BIT 28H ;
BEIZHAN_CRTL BIT P3.1;**************
;================================================
DATA1 EQU 32H
DATA2 EQU 33H
PORT EQU P1
NOWDATA DATA 3DH
BACKDATA DATA 3EH
;=====================================
IN1 BIT P1.7
IN2 BIT P1.6 ;左轮驱动
IN3 BIT P2.7
IN4 BIT P1.5 ;右轮驱动
DATMA EQU 34h
YAOHONG BIT 23H
;=======================================
V_DATACF EQU 38H ;;测速数据高位计数器
V_DATA3 EQU 37H ;上一次测速数据高位
V_DATA2 EQU 36H ;上一次测速数据中位
V_DATA1 EQU 35H ;上一次测速数据低位
SU1 EQU 39H ;测速数据低位
SU2 EQU 3AH ;测速数据中位XXX
SU3 EQU 3BH ;测速数据高位
SET_V EQU 3CH
V_FLAG BIT 24H ;速度计算标志位
LOWER_V EQU 0C3H
MID_V EQU 61H
HIGH_V EQU 19H
HL_PWM EQU 09H
HR_PWM EQU 07H
ML_PWM EQU 33H
MR_PWM EQU 30H
LOW_PWM EQU 42H
;=============================================
#include<stc12_pca_sfr.asm>
ORG 0000H
LJMP MAIN
ORG 00013H
LJMP IR_INT1
ORG 000BH
LJMP T0TC
ORG 0033H
LJMP PCA_interrupt
ORG 0040H
;=============================
;主程序
;==============================
MAIN:
MOV SP,#0CFH
LCALL SYSTEN_INIT
;SETB FIND_WAY
MAIN_LOOP:
JNB YAOHONG,ROAD_CHECK_NEXT;遥控检测标志是否为0,为0跳转
LCALL YHMAIN
ROAD_CHECK_NEXT:
JNB ROAD_CHECK,BEIZHAN_NEXT ;是否到了线路检测时间
;SETB FIND_WAY
;JNB FIND_WAY,BEIZHAN_NEXT
LCALL CHECKROAD ;检测线路
LCALL CTRL_MOTER ;控制小车的运动
BEIZHAN_NEXT:
JNB BEIZHAN_CHECK,ADC_NEXT
;JNB KEEP_OUT,ADC_NEXT
LCALL BEIZHAN_PRO ;避障检测及控制
ADC_NEXT:
PCA_NEXT:
JNB V_FLAG,SPI_NEXT
;LCALL CHECK_V ;测速
SPI_NEXT:
LJMP MAIN_LOOP
;===============================
;线路检测程序
;=============================
CHECKROAD:
;LCALL DELAY200
ORL PORT,#0FH
NOP
NOP
NOP
NOP
NOP
MOV C,PORT.3
MOV ACC.0,C
MOV C,PORT.2
MOV ACC.1,C
MOV C,PORT.1
MOV ACC.2,C
MOV C,PORT.0
MOV ACC.3,C
NOP
NOP
NOP
NOP
ANL A,#0FH ;屏蔽高位
MOV DATA1,A
ORL PORT,#0FH
NOP
NOP
NOP
NOP
NOP
MOV C,PORT.3
MOV ACC.0,C
MOV C,PORT.2
MOV ACC.1,C
MOV C,PORT.1
MOV ACC.2,C
MOV C,PORT.0
MOV ACC.3,C
NOP
NOP
NOP
NOP
ANL A,#0FH ;屏蔽高位
MOV DATA2,A
CHECK_EIXT:
CLR ROAD_CHECK
RET
;=============================
;===============================
;小车运动程序
;=============================
CTRL_MOTER:
MOV A,DATA2
SWAP A
ORL A,DATA1
MOV NOWDATA,A
ANL A,#0FH
CJNE A,#0FH,S_NEXT1
CJNE A,#0FH,S_NEXT1
MOV A,BACKDATA
ANL A,#0FH
CJNE A,#00H,TU_NEXT
LCALL GO_BACK
LCALL DELAY200
LCALL CHECKROAD
LJMP CTRL_MOTER
TU_NEXT:
LJMP TURN1
S_NEXT1:
MOV A,NOWDATA
CJNE A,BACKDATA,S_NEXT
SETB C
LJMP Deal_state
S_NEXT:
CLR C
Deal_state:
MOV A,ROADSTATE
RLC A
ANL A,#07H
MOV ROADSTATE,A
;CJNE A,#07H,POINT
LJMP UPDATA1
POINT:
MOV BACKDATA,NOWDATA
LJMP CTRL_EIXT
UPDATA1:
MOV BACKDATA,NOWDATA
MOV A,NOWDATA
LJMP TURN2
;XRL A,#0FFH
;======传感器分布及ACC定义==========
; ACC.4 ACC.7
; ==== =====
;
; =====
; ACC.6
; ACC.0 ACC.1 ACC.2 ACC.3
; === === === ===
;
;
;
; ====
; ACC.5
;=========================================
TURN1:
MOV A,BACKDATA
TURN2:
JNB ACC.0,RIG;等于1向下执行,为0跳转
JB ACC.1,LNEXT1;等于0向下执行,为1跳转
LCALL TURN_RIGHT ;右转
LJMP CTRL_EIXT ;退出
LNEXT1:
JB ACC.2,LNEXT2
LCALL RAPID_TURN_RIGHT
LJMP CTRL_EIXT
LNEXT2:
JB ACC.3,LNEXT3
LCALL RR_TURN_RIGHT
LJMP CTRL_EIXT
LNEXT3:
JB ACC.4,LNEXT4 ;前左传感器
LCALL GO_AHEAD
LJMP CTRL_EIXT
LNEXT4:
JB ACC.7,LNEXT5 ;前右传感器
LCALL GO_AHEAD
LJMP CTRL_EIXT
LNEXT5:
JB ACC.5,CTRL_EIXT
LCALL GO_BACK;后退
LJMP CTRL_EIXT
;===========================================
RIG:
JB ACC.3,RNEXT1
JB ACC.5,RNEXT0
LCALL RAPID_AHEAD;急前进
LJMP CTRL_EIXT
RNEXT0:
LCALL GO_AHEAD
LJMP CTRL_EIXT ;前进
RNEXT1:
JB ACC.2,RNEXT2
LCALL TURN_LEFT
LJMP CTRL_EIXT;左转
RNEXT2:
JB ACC.1,RNEXT3
LCALL RAPID_TURN_LEFT
LJMP CTRL_EIXT
RNEXT3:
JB ACC.0,RNEXT4
LCALL RR_TURN_LEFT
LJMP CTRL_EIXT
RNEXT4:
JB ACC.4,RNEXT5 ;前左传感器
LCALL GO_AHEAD
LJMP CTRL_EIXT
RNEXT5:
JB ACC.7,RNEXT6 ;前右传感器
LCALL GO_AHEAD
LJMP CTRL_EIXT
RNEXT6:
JB ACC.5,CTRL_EIXT
LCALL GO_BACK;后退
LJMP CTRL_EIXT
CTRL_EIXT:
RET
;============================
;==================================
;左转
TURN_LEFT:
MOV CCAP2H,#HL_PWM
MOV CCAP0H,#HR_PWM
SETB IN1
CLR IN2
LCALL DELAY100
LCALL DELAY200
;LCALL DELAY882
;LCALL DELAY882
;LCALL DELAY2400
CLR IN1
CLR IN2
CLR IN3
SETB IN4
RET
;快左转
RAPID_TURN_LEFT:
MOV CCAP2H,#HL_PWM
MOV CCAP0H,#HR_PWM
SETB IN1
CLR IN2
;LCALL DELAY100
LCALL DELAY200
LCALL DELAY200
;LCALL DELAY2400
CLR IN1
CLR IN2
CLR IN3
SETB IN4
RET
;急左转
RR_TURN_LEFT:
MOV CCAP2H,#HL_PWM
MOV CCAP0H,#HR_PWM
SETB IN1
CLR IN2
CLR IN3
SETB IN4
LCALL DELAY200
LCALL DELAY200
LCALL DELAY200
;LCALL DELAY2400
;LCALL DELAY2400
CLR IN1
CLR IN2
RET
;右转
TURN_RIGHT:
MOV CCAP2H,#HL_PWM
MOV CCAP0H,#HR_PWM
CLR IN1
SETB IN2
SETB IN3
CLR IN4
LCALL DELAY100
LCALL DELAY200
;LCALL DELAY882
;LCALL DELAY2400
CLR IN3
CLR IN4
RET
;快右转
RAPID_TURN_RIGHT:
MOV CCAP2H,#HL_PWM
MOV CCAP0H,#HR_PWM
CLR IN1
SETB IN2
SETB IN3
CLR IN4
;LCALL DELAY100
LCALL DELAY200
LCALL DELAY200
;LCALL DELAY2400
CLR IN3
CLR IN4
RET
;急右转
RR_TURN_RIGHT:
MOV CCAP2H,#HL_PWM
MOV CCAP0H,#HR_PWM
CLR IN1
SETB IN2
SETB IN3
CLR IN4
LCALL DELAY200
LCALL DELAY882
;LCALL DELAY2400
;LCALL DELAY2400
CLR IN3
CLR IN4
RET
;向前
GO_AHEAD:
MOV CCAP2H,#ML_PWM
MOV CCAP0H,#MR_PWM
CLR IN1
SETB IN2
CLR IN3
SETB IN4
RET
;急前进
RAPID_AHEAD:
MOV SET_V,#HIGH_V
MOV CCAP2H,#HL_PWM
MOV CCAP0H,#HR_PWM
CLR IN1
SETB IN2
CLR IN3
SETB IN4
;提高PWM占空比
;
RET
;后退
GO_BACK:
MOV CCAP2H,#03H;HL_PWM
MOV CCAP0H,#03H;HR_PWM
SETB IN1
CLR IN2
SETB IN3
CLR IN4
RET
STOP:
CLR IN1
CLR IN2
CLR IN3
CLR IN4
RET
;====================================================
BRAPID_TURN_LEFT:
MOV CCAP2H,#3
MOV CCAP0H,#3
SETB IN1
CLR IN2
CLR IN3
SETB IN4;;;;;;
;LCALL DELAY500MS
;LCALL DELAY2400
;LCALL DELAY2400
RET
BRAPID_TURN_RIGHT:
MOV CCAP2H,#3
MOV CCAP0H,#3
CLR IN1
SETB IN2;;;;;;;
SETB IN3
CLR IN4
;LCALL DELAY500MS
;LCALL DELAY2400
;LCALL DELAY2400
RET
BGO_AHEAD:
MOV CCAP2H,#2BH
MOV CCAP0H,#26H
CLR IN1
SETB IN2
CLR IN3
SETB IN4
RET
;=========================================================
;避障检测子程序
;===============================
BEIZHAN_PRO:
CLR BEIZHAN_CRTL ;(硬件上开关红外发射,用来减少功耗,
SETB R_BEIZHAN ;用8550来控制,故低电平开,高电平关)
SETB L_BEIZHAN
SETB M_BEIZHAN
SETB B_BACK
LCALL DELAY200
LCALL DELAY200
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -