📄 jiyi.asm
字号:
K1 EQU P3.0 ;左
K2 EQU P3.2 ;中
K3 EQU P3.1 ;右
HUOER EQU P3.4 ;车底霍尔原件
WLED EQU P1.2;工作灯
RWLED EQU P1.3 ;右转灯
LWLED EQU P1.1 ;左转灯
PULF EQU P1.7 ;左轮前进
PULB EQU P1.6 ;左轮后退
PURF EQU P1.4 ;右轮前进
PURB EQU P1.5 ;右轮后退
Q0 EQU 30H
Q1 EQU 31H
Q2 EQU 32H
Q3 EQU 33H
Q4 EQU 34H
Q5 EQU 35H
Q6 EQU 36H
Q7 EQU 37H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INTT0
ORG 0013H
LJMP INT1
ORG 001BH
LJMP INTT1
;;;;;;;;;;;;;;;;;;;;;;;;;
INT1: CPL WLED
CLR EA ;暂时关闭CPU的所有中断请求
MOV Q6,#10
SB: ACALL YS1;调用882微秒延时子程序
JB P3.3,EXIT;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ Q6, SB;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P3.3, $ ;等待高电平避开9毫秒低电平引导脉冲
ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码
JB P3.3,EXIT
MOV Q7,#16;忽略前26位系统识别码
JJJJA:JNB P3.3,$;等待地址码第一位的高电平信号
LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.3;将P3.2引脚此时的电平状态0或1存入C中
JNC UUUA;如果为0就跳转到UUUA
LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUUA: DJNZ Q7,JJJJA
MOV R1,#1AH ;设定1AH为起始RAM区
MOV Q2,#2;接收从1AH到1BH的2个内存,用于存放操作码和操作反码
PP: MOV Q3,#8;每组数据为8位
JJJJ: JNB P3.3,$;等待地址码第一位的高电平信号
LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.3;将P3.2引脚此时的电平状态0或1存入C中
JNC UUU;如果为0就跳转到UUU
LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUU: MOV A,@R1;将R1中地址的给A
RRC A;将C中的值0或1移入A中的最低位
MOV @R1,A;将A中的数暂时存放在R1数值的内存中
DJNZ Q3,JJJJ;接收满8位换一个内存
INC R1;对R1中的值加1,换下一个RAM
DJNZ Q2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH中
MOV A,1AH
CPL A;对1AH取反后和1BH比较
CJNE A,1BH,EXIT;如果不等表示接收数据发生错误,放弃
EXIT: SETB EA ;允许中断
RETI ;退出解码子程序
YS1: MOV Q4,#20 ;延时子程序1,精确延时882微秒
D1: MOV Q5,#20;=863
DJNZ Q5,$
DJNZ Q4,D1
RET
YS2: MOV Q4,#10 ;延时子程序2,精确延时4740微秒
D2: MOV Q5,#235;1+(1+235*2+2)*10+2=4733
DJNZ Q5,$
DJNZ Q4,D2
RET
YS3: MOV Q4,#2;延时程序3,精确延时1000微秒
D3:MOV Q5,#248;1+(1+248*2+2)*2+2=1001
DJNZ Q5,$
DJNZ Q4,D3
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT0:MOV TL0,#00H
MOV TH0,#0FCH
CPL P1.0
RETI
INTT1:JB 25H.4,ZZZ
JNB 25H.4,JJJ
ZZZ: INC R2
MOV TL1,#00H
MOV TH1,#00H
JMP ZJ
JJJ: DEC R2
MOV TL1,#00H
MOV TH1,#00H
ZJ: RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN:MOV DPTR,#0200H
MOV R0,#0000H
MOV A,#00H
SETB PULF
SETB PULB
SETB PURF
SETB PURB
SETB EA
SETB EX1
SETB IT1
SETB ET0
SETB ET1
MOV TMOD,#11H
MOV TL0,#00H
MOV TH0,#0FCH
SETB TR0
LJMP PD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;路径重复;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SSS:SETB PULF
SETB PULB
SETB PURF
SETB PURB
LCALL DELAY1
CLR EX1
CLR P3.5
CLR 25H.4
SETB TR1
MOV R0,#0000H
MOV DPTR,#0200H
JMP CCC
EER:INC DPTR
CCC:CPL WLED
MOVX A,@R0
LCALL DELAY1
INC R0
CJNE A,#0,CCC1
LJMP PD
CCC1:CJNE A,#0FFH,CCC2
LJMP PD
CCC2:CJNE A,#1,J1
LJMP GO_R
J1:
CJNE A,#4,J2
LJMP GO_L
J2:
CJNE A,#2,EER
MOVX A,@DPTR
LCALL DELAY1
INC DPTR
MOV R2,A
CLR PURB
CLR PULB
;SETB TR1
HH1:CJNE R2,#0,HH1
;CLR TR1
LJMP CCC
GO_R:SETB RWLED
SETB PURB
MOVX A,@DPTR
LCALL DELAY1
LCALL DELAY1
INC DPTR
MOV R2,A
;SETB TR1
HH2: CJNE R2,#0,HH2
;CLR TR1
CLR PURB
CLR RWLED
LJMP CCC
GO_L:SETB LWLED
SETB PULB
MOVX A,@DPTR
LCALL DELAY1
LCALL DELAY1
INC DPTR
MOV R2,A
;SETB PULB
;SETB TR1
HH3: CJNE R2,#0,HH3
;CLR TR1
CLR PULB
CLR LWLED
LJMP CCC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;开头判断;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;PX:SETB PULF
;; SETB PULB
; SETB PURF
; SETB PURB
; SETB EX1
; LCALL DELAY1
; MOV 1AH,#00H
;PX1: MOV A,1AH
;CJNE A,#01000110B,PX1 ;上
;LJMP W_FORWARD
PD:MOV 1AH,#00H
SETB EX1
SETB PULF
SETB PULB
SETB PURF
SETB PURB
LCALL DELAY1
PDD:
MOV A,1AH
CJNE A,#01000111B,PD1 ;左
LJMP W_LEFT
PD1:CJNE A,#00010101B,PD2 ;右
LJMP W_RIGHT
PD2:CJNE A,#01000110B,PD3 ;上
LJMP W_FORWARD
PD3:CJNE A,#00000011B,PD4 ;播放,暂停
LJMP SSS
PD4:CJNE A,#00010110B,PD5 ;下
LJMP W_STOP
PD5:CJNE A,#01010101B,PD6 ;确认
LJMP START1
PD6:AJMP PDD
W_LEFT:CLR RWLED
SETB LWLED
SETB PULB
LJMP PDD
W_RIGHT:CLR LWLED
SETB RWLED
SETB PURB
LJMP PDD
W_FORWARD:SETB RWLED
SETB LWLED
CLR PULB
CLR PURB
LJMP PDD
W_STOP:CLR RWLED
CLR LWLED
SETB PULF
SETB PULB
SETB PURF
SETB PURB
LJMP PDD
;PW_LEFT1:SETB LWLED
;SETB PULB
;LJMP ZHONG1
;W_RIGHT1:SETB RWLED
;SETB PURB
;LJMP ZHONG1
;W_FORWARD1:CLR PULB
;CLR PURB
;LJMP ZHONG1
;W_STOP1:SETB PULF
; SETB PULB
; SETB PURF
; SETB PURB
;LJMP ZHONG1
;ZHONG:SETB EX1
; SETB PULF
; SETB PULB
;SETB PURF
;SETB PURB
;LCALL DELAY1
;LZHONG1:MOV A,1AH
;CJNE A,#01000111B,PD11 ;左
;LJMP W_LEFT1
;PD11:CJNE A,#00010101B,PD22 ;右
;LJMP W_RIGHT1
;PD22:CJNE A,#01000110B,PD33 ;上
;LJMP W_FORWARD1
;PD33:CJNE A,#00000011B,PD44 ;播放,暂停
;LJMP SSS
;PD44:CJNE A,#00010110B,PD55 ;下
;LJMP W_STOP1
;PD55:JMP ZHONG1
ZHONG:LJMP PD
;;;;;;;;;;;;;;;;;;;;;;
;;;;;;寻线;;;;;
;;;;;;;;;;;;;;;;;
START1:CLR EX1
SETB PULF
SETB PULB
SETB PURF
SETB PURB
CACHU1:
CPL P1.2
mov a,#00H
MOVX @DPTR,A
LCALL DELAY1
INC DPTR
MOVX @R0,A
LCALL DELAY1
INC R0
CJNE R0,#00FFH,CACHU1
MOV IP,#02H
MOV DPTR,#0200H
MOV R0,#0000H
CLR WLED
CLR RWLED
CLR LWLED
SETB 25H.4
SETB WLED
MOV TL1,#00H
MOV TH1,#00H
MOV R2,#00H
MOV A,#2
MOVX @R0,A
INC R0
SETB TR1
CLR PURB
CLR PULB
LOOP:
CPL WLED
; JNB HUOER,ZHONG
JNB HUOER,ZHONG
LCALL DELAY1
JB K1,X1
JNB K1,X2
JMP LOOP
X1:
JB K2,X3
JNB K2,X4
JMP LOOP
X2:
JB K2,X5
JNB K2,X6
JMP LOOP
X3:
;JB K3,CH1
JNB K3,GO_RIGHT ;001右转
JMP LOOP
X4:
JNB K3,GO_RIGHT ;011右转
JMP LOOP
X5:
JB K3,GO_LEFT ;100左转
JMP LOOP ;101不可能
X6:
JB K3,GO_LEFT ;110,左转
JMP LOOP
CH1:
MOV A,R3
CJNE A,#1,JMP1
LJMP GO_RIGHT
JMP1:
MOV A,R3
CJNE A,#4,JMP2
LJMP GO_LEFT
JMP2:
JMP LOOP
GO_RIGHT:
MOV R3,#1
MOV A,#1
MOVX @R0,A
LCALL DELAY1
INC R0
MOV A,R2
MOVX @DPTR,A
LCALL DELAY1
INC DPTR
MOV R2,#0
SETB RWLED
SETB PURB
MOV R4,#5
H1:LCALL DELAY1
DJNZ R4,H1
JNB K3,$
JB K2,$
MOV A,#2
MOVX @R0,A
LCALL DELAY1
INC R0
MOV A,R2
;ADD A,R2
MOVX @DPTR,A
LCALL DELAY1
INC DPTR
MOV R2,#0
CLR PURB
CLR RWLED
JMP LOOP
GO_LEFT:
MOV R3,#4
MOV A,#4
MOVX @R0,A
LCALL DELAY1
INC R0
MOV A,R2
MOVX @DPTR,A
LCALL DELAY1
INC DPTR
MOV R2,#0
SETB LWLED
SETB PULB
MOV R4,#5
G1:LCALL DELAY1
DJNZ R4,G1
JNB K1,$
JB K2,$
MOV A,#2
MOVX @R0,A
LCALL DELAY1
INC R0
MOV A,R2
;ADD A,R2
MOVX @DPTR,A
LCALL DELAY1
INC DPTR
MOV R2,#0
CLR PULB
CLR LWLED
JMP LOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY1: ;延迟
MOV R6,#100
E2:MOV R7,#140
DJNZ R7,$
DJNZ R6,E2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -