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

📄 wo_de_road.asm

📁 基于STC单片机的自动寻轨和避障玩具小车
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;MOV		C,R_BEIZHAN
;NOP
;MOV		C,R_BEIZHAN
;NOP
MOV		C,R_BEIZHAN
NOP
NOP
NOP
MOV		R_STORE,C
;NOP
;MOV		R_STORE,C
NOP
NOP
;MOV		C,L_BEIZHAN
;NOP
;MOV		C,L_BEIZHAN
;NOP
MOV		C,L_BEIZHAN
NOP
NOP
NOP
MOV		L_STORE,C
;NOP
;MOV		L_STORE,C
NOP
NOP

;MOV		C,M_BEIZHAN
;NOP
;MOV		C,M_BEIZHAN
;NOP
MOV		C,M_BEIZHAN
NOP
NOP
NOP
MOV		M_STORE,C
;NOP
;MOV		M_STORE,C
NOP
NOP

;MOV		C,B_BACK
;NOP
;MOV		C,B_BACK
;NOP
MOV		C,B_BACK
NOP
NOP
NOP
;MOV		B_STORE,C
;NOP
MOV		B_STORE,C
NOP
NOP
SETB	BEIZHAN_CRTL;关红外发射
JB		FIND_WAY,RL_CHECK
JNB		B_STORE,RL_CHECK
LCALL	GO_BACK
LJMP	BEIZHAN_EXIT

RL_CHECK:
JNB		R_STORE,L_SIDE ;若右边没有障碍,则跳转判别左边,有则向下执行
JNB		L_STORE,R_SIDE ;若左边没有障碍,则跳转判别右边,有则向下执行
BOTH_SIDE:   ;两边都有障碍
LCALL GO_BACK   ;后退
LCALL DELAY882
BOTH_SIDE1:
;CLR		BEIZHAN_CRTL
LCALL 	BRAPID_TURN_RIGHT;
LCALL  DELAY500MS
;JB	L_BEIZHAN,BOTH_SIDE1
;CLR		IN3
;CLR		IN4
LJMP	BEIZHAN_EXIT
M_SIDE:
LCALL GO_BACK
LCALL DELAY200
LCALL  DELAY200
M_SIDE1:
CLR		BEIZHAN_CRTL
LCALL 	BRAPID_TURN_RIGHT;
;JB	L_BEIZHAN,M_SIDE1
CLR		IN3
CLR		IN4
LJMP	BEIZHAN_EXIT
R_SIDE:
R_SIDE1:
;CLR	BEIZHAN_CRTL
LCALL GO_BACK
LCALL  DELAY200
LCALL  DELAY200
LCALL  DELAY200
LCALL	BRAPID_TURN_LEFT
;JB	R_BEIZHAN,R_SIDE1
;CLR		IN1
;CLR		IN2
LJMP	BEIZHAN_EXIT
L_SIDE:
L_SIDE1:
JNB		L_STORE,BEIZHAN_UP;两边都无障碍物,前进
;CLR		BEIZHAN_CRTL
LCALL GO_BACK
LCALL  DELAY200
LCALL  DELAY200
LCALL  DELAY200
LCALL	BRAPID_TURN_RIGHT;左边有障碍物,右转
;JB	L_BEIZHAN,L_SIDE1
;CLR		IN3
;CLR		IN4
LJMP	BEIZHAN_EXIT
BEIZHAN_UP:   ;前进
JB		M_STORE,M_SIDE
LCALL	BGO_AHEAD

BEIZHAN_EXIT:
CLR		BEIZHAN_CHECK
SETB		BEIZHAN_CRTL
RET
;===============================
YHMAIN:	   ;遥控执行主程序
;=====================================
;CPL	IN1
;CPL	IN2
;MOV P2,datma ;将按键的键值通过P2口的8个LED显示出来!
MOV	A,DATMA
CJNE	A,#2,YH_EXIT1	;遥控进前
LCALL	RAPID_AHEAD
LJMP	YH_EXIT
YH_EXIT1:
CJNE	A,#8,YH_EXIT2;遥控后退
LCALL	GO_BACK
LJMP	YH_EXIT
YH_EXIT2:
CJNE	A,#4,YH_EXIT3 ;遥控右转
LCALL	RAPID_TURN_RIGHT
LJMP	YH_EXIT
YH_EXIT3:
CJNE	A,#6,YH_EXIT4 ;遥控左转
LCALL	RAPID_TURN_LEFT
LJMP	YH_EXIT
YH_EXIT4:
CJNE	A,#5,YH_EXIT5 ;遥控停止
LCALL	STOP
LJMP	YH_EXIT
YH_EXIT5:
CLR		C
CJNE	A,#1,YH_EXIT6 ;设为寻轨状态
CLR		KEEP_OUT
SETB	FIND_WAY
;加速=================================
;MOV		A,SET_V
;SUBB	A,#1
;CJNE	A,#HIGH_V,YH_EXIT
;JC		YH_EXIT;速度最大时跳转
;MOV		SET_V,A
;======================================
LJMP	YH_EXIT
YH_EXIT6:
CLR		C
CJNE	A,#3,YH_EXIT7 ;设为避障状态
SETB	KEEP_OUT
CLR		FIND_WAY
;减速==================================
;MOV		A,SET_V
;ADD		A,#1
;CJNE	A,#LOWER_V,YH_EXIT
;JC		YH_EXIT	;速度最小时跳转
;MOV		SET_V,A
;========================================
LJMP	YH_EXIT
YH_EXIT7:
CLR		C
CJNE	A,#3,YH_EXIT ;设为寻轨和避障状态
SETB	KEEP_OUT
SETB	FIND_WAY
LJMP	YH_EXIT

YH_EXIT:
CLR		YAOHONG
RET
;==========================================
;==============================
;测速计算子程序
;==============================
CHECK_V:
MOV		A,CCAP1L
SUBB	A,V_DATA1
MOV		SU1,A
MOV		V_DATA1,CCAP1L

MOV		A,CCAP1H
SUBB	A,V_DATA2
MOV		SU2,A
MOV		V_DATA2,CCAP1H

MOV		A,V_DATACF
SUBB	A,V_DATA3
MOV		SU3,A
MOV		V_DATA3,V_DATACF
LCALL	V_CTRL
CLR		V_FLAG
RET
;==========================================
;速度控制子程序
;==========================================
V_CTRL:
MOV		A,SU2
CJNE	A,SET_V,V_CTRL_NEXT1
LJMP	V_CTRL_EXIT
V_CTRL_NEXT1:
CLR		C
SUBB	A,SET_V
JC		V_CTRL_NEXT2
MOV		A,CCAP2H
SUBB	A,#5
JC		V_CTRL_EXIT	;当A小于FFH时跳转
MOV		CCAP2H,A
MOV		CCAP0H,A
LJMP	V_CTRL_EXIT
V_CTRL_NEXT2:
MOV		A,CCAP2H
ADD		A,#5
JC		V_CTRL_EXIT;当A大于FFH时跳转
MOV		CCAP2H,A
MOV		CCAP0H,A

V_CTRL_EXIT:
MOV		A,CCAP2H
MOV		P0,SU2

RET
;==========================================


;系统初始化================================
SYSTEN_INIT:
LCALL	T0_INIT
;LCALL	YAO_INIT
LCALL	PWM_INIT
SETB	EA
RET
;===============================
;定时初始化
;===============================
T0_INIT:
MOV		ROADSTATE,#0FFH
;CLR		ONE_OR_TWO;================
;CLR		ONELAY ;==============
;SETB	TWOLAY;首先检查第一层======
;================================
ANL		TMOD,#0F0H
ORL		TMOD,#01H
MOV		TL0,#78H
MOV		TH0,#0ecH
SETB	ET0
SETB	TR0
RET

;PWM初始化 ====================================
PWM_INIT:
MOV		CMOD,#03H  ;PCA计数来源
MOV		CL,#00H
MOV		CH,#00H
;PCA0初始化(PWM0)
MOV		CCAP0L,#33H
MOV		CCAP0H,#33H
MOV		CCAPM0,#42H
;PCA2初始化(PWM2)
MOV		CCAP2L,#30H
MOV		CCAP2H,#30H
MOV		CCAPM2,#42H

MOV		CCAP1L,#00H
MOV		CCAP1H,#00H
MOV		CCAPM1,#11H

MOV		SET_V,#MID_V;初始化速度大小

MOV		V_DATACF,#0
MOV		CCON,#00H

SETB	EPCA_LVD
SETB	EA
SETB	CR
RET

;;;中断0初始化=======================================
YAO_INIT:
SETB	IT1
SETB	EX1
CPL	IN1
CPL	IN2
RET
;=====================================================


;=====================================================
 ;定时中断
;=======================================================
T0TC:

PUSH	PSW
MOV		TL0,#78H
MOV		TH0,#0ecH
JNB P2.5,YAOLU
CLR     BEIZHAN_CHECK
SETB	ROAD_CHECK    ;定时时间到检查键盘状态
LJMP TO_EXIT;
YAOLU:
CLR     ROAD_CHECK
SETB    BEIZHAN_CHECK		;置检查避障标志
TO_EXIT:

POP		PSW
RETI
;==============================
;PCA中断
;==============================
PCA_interrupt:
PUSH	ACC
PUSH	PSW
CLR		C
JNB		CF,PCA1
INC		V_DATACF
CLR		CF
JNB		CCF1,PCA_INIT_EXIT
PCA1:
JNB		CCF1,PCA_INIT_EXIT
MOV		SU1,CCAP1L
MOV		SU2,CCAP1H
MOV		SU3,V_DATACF
SETB	V_FLAG
CLR		CCF1
PCA_INIT_EXIT:
POP		PSW
POP		ACC
RETI
;===========================================================================================
					; 用外中数0解码程序
IR_INT1:
PUSH	PSW
CLR		EA
clr p2.6					;以下对遥控信号的9000微秒的初始低电平信号的识别,波形见图5。
MOV 	R6,#10
IR_SB:
ACALL 	DELAY882	 ;调用882微秒延时子程序
JB		 P3.3,IR_ERROR ;延时882微秒后判断P3.3脚是否出现高电平如果有
					;;就退出解码程序
DJNZ	 R6,IR_SB 	;重复10次,目的是检测在8820微秒内如果出现高电
					;平就退出解码程序
					;识别连发码,和跳过4.5ma的高电平。
JNB 	P3.3, $ 	;等待高电平避开9毫秒低电平引导脉冲
ACALL 	DELAY2400
JNB		P3.3,IR_Rp 	;这里为低电平,认为是连发码信号,见图6。
ACALL 	DELAY2400 	;延时4.74毫秒避开4.5毫秒的结果码
					;以下32数据码的读取 ,0和1的识别 请看图2
MOV 	R1,#1AH 	;设定1AH为起始RAM区
MOV 	R2,#4
IR_4BYTE:
MOV 	R3,#8

MOV 	R3,#8
IR_8BIT:
JNB 	P3.3,$ ;等待地址码第一位的高电平信号
LCALL 	DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此
				 ;时的高低电平状态
MOV 	C,P3.3 ;将P3.3引脚此时的电平状态0或1存入C中
JNC 	IR_8BIT_0 ;如果为0就跳转到IR_8BIT_0
LCALL 	DELAY1000
IR_8BIT_0:
MOV 	A,@R1 		;将R1中地址的给A
RRC 	A 			;将C中的值0或1移入A中的最低位
MOV 	@R1,A 		;将A中的数暂时存放在R1中
DJNZ 	R3,IR_8BIT ;接收地址码的高8位
INC 	R1 			;对R1中的值加1,换下一个RAM
DJNZ 	R2,IR_4BYTE ;接收完16位地址码和8位数据码和8位数据,
					;存放在1AH/1BH/1CH/1DH的RAM中
					;解码成功
JMP 	IR_GOTO
IR_Rp:
					;这里为重复码执行处
					;按住遥控按键时,每过108ms就到这里来
JMP 	IR_GOTO
IR_ERROR:
					;错语退出
LJMP EXIT 			;退出解码子程序
;=================================================
;遥控执行部份
IR_GOTO:
;这里还要判断1AH和1BH 两个系统码或用户码,用于识别不同的遥控
;器
;MOV A,1AH
;CJNE A,#xxH,IR_ERROR ;用户码1不对则退出
;MOV A,1BH
;CJNE A,#xxH,IR_ERROR ;用户码2不对则退出
;判断两个数据码是否相反
MOV 	A,1CH
CPL 	A
CJNE 	A,1DH,IR_ERROR ;两个数据码不相反则退出
;遥控执行部份
;MOV A,1DH ;判断对应按键
;CJNE A,#xxH,$+6
;LJMP -à跳到对应按键执行处
;CJNE A,#xxH,$+6
;LJMP -à跳到对应按键执行处

;CLR P3.5 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
;LCALL DELAY2400
;LCALL DELAY2400
;LCALL DELAY2400
;SETB P3.5 ;蜂鸣器停止
;清除遥控值使连按失效
MOV		A,1CH
MOV		DATMA,a
SETB	YAOHONG
EXIT:

MOV 	1AH,#00H
MOV 	1BH,#00H
MOV 	1CH,#00H
MOV 	1DH,#00H

SETB	EA
POP		PSW
RETI
;================================================================================================

;===============================================
; 延时子程序
DELAY100: ;1.085x ((229x4)+5)=999.285
MOV		R6,#1
MOV 	R7,#190
DELAY_STC100:
DELAY100_A:
DJNZ 	R7,DELAY100_A
DJNZ 	R6,DELAY_STC100
RET

DELAY200: ;1.085x ((229x4)+5)=999.285
MOV		R6,#2
MOV 	R7,#190
DELAY_STC200:
DELAY200_A:
DJNZ 	R7,DELAY200_A
DJNZ 	R6,DELAY_STC200
RET
;=============================882
DELAY882: ;1.085x ((202x4)+5)=882
MOV		R6,#12
MOV 	R7,#167
DELAY_STC882:
DELAY882_A:
DJNZ 	R7,DELAY882_A
DJNZ 	R6,DELAY_STC882
RET
;=============================1000
DELAY1000: ;1.085x ((229x4)+5)=999.285
MOV		R6,#12
MOV 	R7,#190
DELAY_STC1000:
DELAY1000_A:
DJNZ 	R7,DELAY1000_A
DJNZ 	R6,DELAY_STC1000
RET
;=============================2400
DELAY2400: ;1.085x ((245x9)+5)=2397.85
MOV		R6,#12
MOV 	R7,#225
DELAY_STC2400:
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
DJNZ 	R7,DELAY2400_A
DJNZ 	R6,DELAY_STC2400
RET
DELAY500MS:
MOV	R0,#0FEH
D500MS:
LCALL	DELAY2400
DJNZ	R0,D500MS
RET
END

⌨️ 快捷键说明

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