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

📄 wo_de_road.asm

📁 基于STC单片机的自动寻轨和避障玩具小车
💻 ASM
📖 第 1 页 / 共 2 页
字号:

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 + -