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

📄 主程序.asm

📁 想做一个电动小车会自动避障
💻 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 + -