📄 yuhen.asm
字号:
;##############################################################################################
;signA signB 存放两次过线状态
;ztai 存放传感器状态
;signC 存放上次发送的偏离信号
;rec 接收结果存储器(接收)
;八位(0/1):0位:禁止/使能,1位:向后/向前,2位:直线/转弯,3位:右转/左转
;r19 扫描结果存储器(发送)
;八位(0/1):0位:不偏/偏,1位:右偏/左偏,2位:偏小/偏大,3位:不过线/过线
;###############################################################################################
.INCLUDE "M16DEF.INC"
.equ rec=$0060
.equ state=$0061
.equ sign0=$0062
.equ signa=$0063
.equ signb=$0064
.ORG $0000
JMP RESET
.ORG $0002
JMP inint0
.ORG $0004
JMP inint1
.ORG $0016
JMP USART_Receive
.ORG $0030
RESET: LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
CLR R17
CLR R18
CLR R19
CLR R20
CLR R21
CLR R22
LDI r16,0B00000000
STS REC,R16
STS state,R16
STS sign0,R16
STS signa,R16
STS signb,R16
;******************************************************************************
;初始化成程序开始
Port_Init:
LDI R16,(1<<PUD) ;全局上拉电阻禁止
OUT SFIOR,R16
LDI R16,$0FF
OUT DDRA,R16 ;A口设置为输出
OUT PORTA,R16
OUT DDRC,R16 ;C口设置为输出
OUT PORTC,R16
LDI R16,$00
OUT DDRB,R16
OUT PORTD,R16
LDI R16,0B11110011
OUT DDRD,R16 ;D口设置
ldi r16,0b11111111
OUT PORTD,R16
LDI R16,(0<<PUD) ;开启全局上拉电阻
OUT SFIOR,R16
LDI R16,0B00001010
OUT MCUCR,R16 ;外部低电平中断0与2
LDI R16,0B11000000 ;允许中断
OUT GICR,R16
;调制信号开启,5kHZ,TC2
ldi r16,0
out tcnt2,r16
ldi r16,100
out ocr2,r16
ldi r16,0b00011010
out tccr2,r16
;232通讯初始化
ldi r16,0b10001110
out ucsrc,r16 ;8位数据+1位停止位
ldi r16,0b10011000
out ucsrb,r16 ;允许发送,允许接收,接受完成中断
ldi r16,51 ;波特率为9600bps
out ubrrl,r16
SEI ;全局中断使能
;初始化成程序结束
;******************************************************************************
main:
lds r16,rec
sbrs r16,0
rjmp main
sbrs r16,1
rjmp m1
call scan_a ;扫描a组
rjmp m2
m1:call scan_b ;扫描b组
m2:call sign_test0 ;过线判断子程序
lds r16,rec
sbrc r16,2
rjmp main
;call sign_test1 ;物体探测判断子程序
call sign_test2 ;直线行走判别子程序
cpi r18,0b10000000 ;出错反方向扫描
brne m3
lds r16,rec
sbrs r16,1
rjmp e1
call scan_b
rjmp e2
e1:call scan_a
e2:call sign_test0 ;过线判断子程序
lds r16,rec
sbrc r16,2
rjmp main
;call sign_test1 ;物体探测判断子程序
call sign_test2 ;直线行走判别子程序
m3:rjmp main
;******************************************************************************
;前进方向传感器扫描
scan_a: ldi r16,0b11111010 ;第一次扫描传感器1,3,5,11
out porta,r16
ldi r16,0b01011111
out portc,r16
call delay
in r16,pinb
andi r16,0b00001111
ldi r17,0b00000000
sbrs r16,0
ori r17,0b01000000
sbrs r16,1
ori r17,0b00000100
sbrs r16,2
ori r17,0b00000001
sbrs r16,3
ori r17,0b00010000
ldi r16,0b11110101 ;第二次扫描传感器2,4,6,12
out porta,r16
ldi r16,0b10101111
out porta,r16
call delay
in r16,pinb
andi r16,0b00001111
sbrs r16,0
ori r17,0b10000000
sbrs r16,1
ori r17,0b00001000
sbrs r16,2
ori r17,0b00000010
sbrs r16,3
ori r17,0b00100000
ret
;******************************************************************************
;后退方向传感器扫描
scan_b: ldi r16,0b10101111 ;第一次扫描7,9,5,11
out porta,r16
ldi r16,0b01011111
out portc,r16
call delay
in r16,pinb
andi r16,0b00001111
ldi r17,0b00000000
sbrs r16,0
ori r17,0b01000000
sbrs r16,1
ori r17,0b00000010
sbrs r16,2
ori r17,0b00001000
sbrs r16,3
ori r17,0b00100000
ldi r16,0b01011111 ;第二次扫描8,10,6,12
out porta,r16
ldi r16,0b10101111
out portc,r16
call delay
in r16,pinb
andi r16,0b00001111
sbrs r16,0
ori r17,0b10000000
sbrs r16,1
ori r17,0b00000001
sbrs r16,2
ori r17,0b00000100
sbrs r16,3
ori r17,0b00010000
ret
;*******************************************************************************
;过线判断子程序
sign_test0:
sbrc r17,4
rjmp test0
ldi r16,0
sts sign0,r16
rjmp end0
test0: cpi r16,0b00001000
brne test0_end
rjmp end0
test0_end: ldi r16,0b00001000
sts sign0,r16
out UDR,r16
end0: ret
;********************************************************************************
;物体探测判断子程序
sign_test1: lds r16,rec
sbrs r16,1
rjmp ta
rjmp tb
ta: sbrc r17,6
rjmp testa
ldi r16,0b00000000
sts signa,r16
rjmp enda
testa: cpi r16,0b00001000
brne testa_end
rjmp enda
testa_end: ldi r16,0b00010000
sts signa,r16
out UDR,r16
enda: ret
tb: sbrc r17,7
rjmp testb
ldi r16,0b00000000
sts signb,r16
rjmp endb
testb: cpi r16,0b00001000
brne testb_end
rjmp endb
testb_end: ldi r16,0b00010000
sts signb,r16
out UDR,r16
endb: ret
;*******************************************************************************
;直线行走偏离状态判断程序
sign_test2: call test2
lds r16,state
cp r16,r18
breq end2
out udr,r18
sts state,r18
end2: ret
test2: andi r17,0b00001111
cpi r17,0b00000001 ;右偏大
breq s1
cpi r17,0b00000011 ;右偏大
breq s1
cpi r17,0b00000010 ;右偏小
breq s2
cpi r17,0b00000111 ;右偏小
breq s2
cpi r17,0b00001100 ;左偏大
breq s4
cpi r17,0b00001000 ;左偏大
breq s4
cpi r17,0b00001110 ;左偏小
breq s3
cpi r17,0b00000100 ;左偏小
breq s3
cpi r17,0b00000110 ;正常
breq s5
cpi r17,0b00001111 ;正常
breq s5
jmp error ;错误
s1: ldi r18,0b00000101
ret
s2: ldi r18,0b00000001
ret
s3: ldi r18,0b00000011
ret
s4: ldi r18,0b00000111
ret
s5: ldi r18,0b00000000
ret
error : ldi r18,0b10000000
ret
inint0:LDI R16,0B11111111
OUT UDR,R16
RETI
inint1:LDI R16,0B11110000
OUT UDR,R16
RETI
;*******************************************************************************
;延时子程序
delay: ldi r21,$01
w3:LDI R19,200
W2:LDI R20,$0FF
W1:DEC R20
BRNE W1
DEC R19
BRNE W2
dec r21
brne w3
RET
USART_Receive: in r22,UDR
sts rec,r22 ;存状态
reti
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -