📄 新建 文本文档.txt
字号:
实验7. 避障
;*********************************************************
;mega48 晶振:内部8m
;北京双龙电子
;刘成利 2005\4
;mail:lcl@sl.com.cn
;*****************************************************
.include "m48def.inc" ;器件配置文件
.equ sw_in = $73
.equ remote_in = $74
.equ mic_in = $75
.equ timers = $76
.equ temp = $80
.equ temp1 = $81
;*****************************************************************
.org $000
rjmp main ;跳转主程序
.org $020
;******************************************************************
main:
ldi r16,low(ramend) ;栈指针初始化,SP 指向片内SRAM的末地址
ldi r17,high(ramend)
out spl,r16
out sph,r17
rcall port_init ;调用芯片端口初始化子程序
ldi R24,7
out PORTB,R24
clr R2
out MCUCR,R2 ;
rcall mic_startup ;调用声控起动子程序,等待声控起动
loop:
rcall forward
sw_touch: ;轻触开关检测程序
in R24,PINC
andi R24,$11
sts sw_in,R24
tst R24
brne sw_touch04
rcall stop ;sw_in = 0x00 ,首,尾部开关接触,后退
ldi R16,250
ldi R17,0
rcall delay_ms ;延时
rjmp loop
sw_touch04:
in R24,PINC
andi R24,$1 ;0b0001,0001 pb4,pb0
sts sw_in,R24
cpi R24,0 ;0b 0000,0001 判断尾部开关是否接触
brne sw_touch05 ;没有接触,跳转
rcall forward ;接触,前行
ldi R16,250
ldi R17,0
rcall delay_ms ;延时
rcall turn_left ;左转
ldi R16,250
ldi R17,0
rcall delay_ms ;延时
rjmp loop
sw_touch05:
in R24,PINC
andi r24,$10
cpi R24,$10 ;0b 0001,0000 判断前侧开关是否接触
breq sw_touch06 ;没有接触,跳转
rcall backward ;接触,后退
ldi R16,250
ldi R17,0
rcall delay_ms ;延时
rcall turn_left ;左转
ldi R16,250
ldi R17,0
rcall delay_ms ;延时
rjmp loop
sw_touch06:
rcall forward ;
ldi R16,250
ldi R17,0
rcall delay_ms ;延时
;延时
rjmp loop
;**********************************************************************
;******************************************************************
port_init: ;芯片端口初始化程序
LDI R24,$F8
out DDRB,R2 ;PB0、PB1、PB2输出(led控制信号)
LDI R24,$FF
out PORTB,R24 ;PB2~PB0口输入,内部上拉,
ldi R24,0
out DDRC,R24 ;PC0~PC4 CNY70探测信号输入端,PC5 声控开关信号输入口
ldi R24,255
out PORTC,R24 ;PC1~PC5带内部上拉输入
ldi R24,255
out DDRD,R24 ;PD7~PD4输出驱动电机,PD3~PD0输出
ldi R24,255
out PORTD,R24 ;PD0~PD3带输出,PD4~PD7输出驱动电机
ret
;******************************************************************
mic_startup: ;检测声音输入启动程序
in R24,PINC ;读入PC口管脚的状态
andi R24,0x20 ;分离出PC5脚(声音输入管脚)的状态 -> mic_in
sts mic_in,R24
tst R24 ;
brne mic_startup ;mic_in = 1 没有声音信号输入,循环检测
ret ;mic_in = 0 有声音信号输入,启动执行后面的程序
;******************************************************************
; time -> R16,R17
delay_us: ;微秒级延时程序,延时时间为 (R17:R16)
subi R16,1
sbci R17,0 ;(R17:R16) = (R17:R16) - 1
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlt delay_us
ret
;******************************************************************
; time -> R20,R21
delay_ms: ;毫秒级延时程序,延时时间为 (R21:R20)
push r21
push r20
push r17
push r16
mov R20,R16 ;装入延时时间常数 (R21:R20) = (R17:R16)
mov R21,R17
rjmp delay_ms2
delay_ms1:
ldi R16,100
ldi R17,3
rcall delay_us ;1ms延时
subi R20,1
sbci R21,0 ;(R21:R20) = (R21:R20) - 1
delay_ms2:
cpi R20,0 ;(R21:R20) = 0 延时时间到,延时子程返回
cpc R20,R21
brne delay_ms1 ;(R21:R20) != 0 延时时间未到,继续延时
pop r16
pop r17
pop r20
pop r21
ret ;子程序返回
;******************************************************************
turn_right: ;机器人右转子程
ldi R24,$60
out PORTD,R24 ;输出电机控制信号,使机器人右转
LDI R24,$FA ;设置机器人右转时对应的指示灯状态
OUT PORTB,R24
ret
;******************************************************************
turn_left: ;机器人左转子程
ldi R24,$90
out PORTD,R24 ;输出电机控制信号,使机器人左转
LDI R24,$FC ;设置机器人左转时对应的指示灯状态
OUT PORTB,R24
ret
;******************************************************************
turn_right_s: ;机器人慢速右转子程
ldi R24,$20
out PORTD,R24 ;输出电机控制信号,使机器人慢速右转
LDI R24,$FB
OUT PORTB,R24 ;设置机器人慢速右转时对应的指示灯状态
ret
;******************************************************************
turn_left_s: ;机器人慢速左转子程
ldi R24,$80
out PORTD,R24 ;输出电机控制信号,使机器人慢速左转
LDI R24,$FD
OUT PORTB,R24 ;设置机器人慢速左转时对应的指示灯状态
ret
;******************************************************************
backward: ;机器人向后倒退子程
ldi R24,$50
out PORTD,R24 ;输出电机控制信号,使机器人向后倒退
ldi R24,$F8
out PORTB,R24 ;设置机器人向后倒退时对应的指示灯状态
ret
;******************************************************************
forward: ;机器人向前行进子程
ldi R24,160
out PORTD,R24 ;输出电机控制信号,使机器人向前行进
ldi R24,$F9
out PORTB,R24 ;设置机器人向前行进时对应的指示灯状态
ret
;******************************************************************
stop: ;机器人停止待命子程
ldi R24,255
out PORTD,R24 ;输出电机控制信号,使机器人停止待命
out PORTB,R24 ;设置机器人停止待命时对应的指示灯状态
ret
;******************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -