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

📄 新建 文本文档.txt

📁 基于单片机的机器人避障程序,实现机器人的自动转向
💻 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 + -