📄 主程序.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; COUNT1: 脉冲间隔记数值
; COUNT2: 脉冲计数器
; COUNT3: 脉冲计数器
; COUNT4: 状态计数器
; COMP1: 左轮PWM脉冲信号宽度值
; COMP2: 右轮PWM脉冲信号宽度值
; COMP: PWM脉冲信号周期值
; EN1: 左轮使能端
; EN2: 右轮使能端
; IN1/IN2: 左轮正反控制位
; IN3/IN4: 右轮正反转控制位
; IRC: 红外信号发射控制端
; FLAG0: 产生红外脉冲间隔信号标志位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COUNT1 EQU 40H
COUNT2 EQU 41H
COUNT3 EQU 42H
COUNT4 EQU 46H
COMP1 EQU 43H
COMP2 EQU 44H
COMP EQU 45H
EN1 BIT P2.0
EN2 BIT P2.3
IN1 BIT P2.1
IN2 BIT P2.2
IN3 BIT P2.4
IN4 BIT P2.5
IRC BIT P2.7
FLAG0 BIT 25H.0
;;;;;;;;;;;;主程序入口;;;;;;;;;;;;;;;;;;
ORG 00H ;
JMP START ;
;;;;;;;;;;;;T0中断入口;;;;;;;;;;;;;;;;;;
ORG 0BH ;
JMP TIMER0 ;
;;;;;;;;;;;;T1中断入口;;;;;;;;;;;;;;;;;;
ORG 1BH ;
JMP TIMER1 ;
;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;
START: MOV SP,#70H ;堆栈指针
MOV TMOD,#00010001B ;T0/T1定时器用,16位定时器
MOV IE,#10001010B ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; EN=1 开中断 ;
; ET1=1 定时器1中断开 ;
; ET0=0 定时器0中断开 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV IP,#00010000B
MOV TH0,#high(65536-1000) ;1ms
MOV TL0,#low(65536-1000)
MOV TH1,#0FFH
MOV TL1,#0ecH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; TIMER0 预留
; TIMER1 产生26US脉冲
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETB EN1 ;左轮使能开启
SETB EN2 ;右轮使能开启
MOV P2,#11101101B ;初始化P2口,小车直走
MOV P0,#0FFH ;P1口为输入
NOP
NOP
NOP
SETB FLAG0 ;置位标志位发射红外载波
MOV COUNT1,#00H ;脉冲间隔初始值
MOV COUNT2,#00
MOV COUNT3,#00
MOV COUNT4,#00
MOV COMP,#60 ;PWM脉冲周期初始值40X1MS=40MS
SETB TR0
SETB TR1 ;定时器1开
MOV COMP1,#30 ;
MOV COMP2,#30 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;寻线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RUN:
JNB P0.4,SENT1
JNB P0.5,SENT2
JNB P0.6,SENT3
AJMP RUN
SENT1: CALL DELAY4
JB P0.4,EXIT ;延时消除误差
CALL DELAY4
JB P0.5,TEST
CALL DELAY4
JB P0.6,TEST ;检查是否通过一条横线
CALL DELAY3
INC COUNT4 ;每通过一条黑线计数器加1
MOV A,COUNT4
CJNE A,#02h,TEST ;计数器值为2时转入避障程序
JMP BIZHANG
TEST: MOV COMP,#60
MOV COMP1,#35 ;左转
MOV COMP2,#3
AJMP RUN
SENT2:
MOV COMP,#40
MOV COMP1,#15 ;直线走
MOV COMP2,#15
AJMP RUN
SENT3: CALL DELAY4 ;右转
JB P0.6,EXIT
MOV COMP,#60
MOV COMP1,#3
MOV COMP2,#35
AJMP RUN
EXIT: AJMP RUN
;;;;;;;;;;;;;;;;;;;;;;;;;避障;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BIZHANG:
JNB P0.0,SENT4
JNB P0.3,SENT5
;JNB P0.1,SENT7
MOV COMP,#30 ;直线慢速前进
MOV COMP1,#22
MOV COMP2,#22
AJMP BIZHANG
SENT4:
MOV COMP,#30 ;TURN RIGHT
MOV COMP1,#2
MOV COMP2,#20
CALL DELAY3
MOV A,P0
ORL A,#10001111B ;检查P0.4,P0.5,P0.6是否都在一条线上
CJNE A,#8FH,MM2 ;MM2再次检查是否通过一条横线
MM0: MOV COMP,#30
MOV COMP1,#22
MOV COMP2,#22
MOV R6,#1
CALL DELAY2
CLR TR0 ;延时后关闭左右电机使能
CLR EN1
CLR EN2
JMP $ ;结束
MM2: MOV A,P0
ORL A,#10001111B
CJNE A,#8FH,MM3
AJMP MM0
MM3: AJMP BIZHANG
SENT5: MOV COMP,#30 ;TURN LEFT
MOV COMP1,#20
MOV COMP2,#2
CALL DELAY3
MOV A,P0
ORL A,#10001111B ;P0.4,P0.5,P0.6
CJNE A,#8FH,MM5
MM4: MOV COMP,#30
MOV COMP1,#22
MOV COMP2,#22
MOV R6,#1
CALL DELAY2
CLR TR0
CLR EN1
CLR EN2
JMP $
MM5: MOV A,P0
ORL A,#10001111B
CJNE A,#8FH,MM6
AJMP MM4
MM6: AJMP BIZHANG
;************************************************
; 定时器0中断服务程序 ;
;************************************************
TIMER0: PUSH PSW
PUSH ACC
CLR TR0
MOV TH0,#high(65536-1000) ;1ms
MOV TL0,#low(65536-1000)
INC COUNT2
INC COUNT3
MOV A,COUNT2
CJNE A,COMP1,AA1
CLR EN1 ;---------------_____
AJMP AA2
AA1: CJNE A,COMP,AA2 ;周期40MS
SETB EN1
MOV COUNT2,#00H ;清除计数器
AA2: MOV A,COUNT3
CJNE A,COMP2,AA3 ;-----_______________
CLR EN2
AJMP AA4
AA3: CJNE A,COMP,AA4
SETB EN2
MOV COUNT3,#00H ;清除计数器
AA4: SETB TR0
CPL IRC
POP ACC
POP PSW
RETI
;************************************************
; 定时器1中断服务程序 ;
;************************************************
TIMER1: PUSH PSW
PUSH ACC
MOV TH1,#0FFH
MOV TL1,#0ecH
INC COUNT1
MOV A,COUNT1
CJNE A,#13H,OUT1
MOV COUNT1,#00H
CPL FLAG0
AJMP OUT
OUT1: JNB FLAG0,OUT
CPL IRC
OUT: POP ACC
POP PSW
RETI
;************************************************
; 基本延时程序
;************************************************
DELAY: MOV R4,#50
D2: DJNZ R4,$
RET
DELAY2: NOP
D3: MOV R5,#200 ;0.1S
D4: MOV R4,#245
D5: DJNZ R4,$
DJNZ R5,D4
DJNZ R6,D3
RET
DELAY3: MOV R5,#100
D6: MOV R4,#245
D7: DJNZ R4,$
DJNZ R5,D6
RET
DELAY4:
MOV R4,#245
DJNZ R4,$
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -