📄 sl3010_3.asm
字号:
mov r18,r24
clr r19
ldi r16,129
ldi r17,0
rcall mpy16u8
rcall delay_ms
in r24,TIMSK
andi r24,127
out TIMSK,r24
lds r24,sound_add
lds r25,sound_add+1
adiw r24,1
sts sound_add+1,r25
sts sound_add,r24
ldi r24,low(sound)
ldi r25,high(sound)
lds r16,sound_add
lds r17,sound_add+1
add r16,r24
adc r17,r25
rcall EEPROMread
sts temp1,r16
sl81:
lds r2,temp1
tst r2
breq X7
rjmp sl80
X7:
ldi r16,$ff
out PORTC,r16
ldi r16,1000
ldi r17,3
sl79:
rcall delay_ms
rjmp music_car ;//重新开始演奏
;***********************************************************************
;/****************************************************/
;//xuanya_car 声控启动, 悬崖车机器人程序
;//悬崖车机器人 在白底区域内行走,能够探测到边界,
;//不会走出边界,检测到障碍物,能避开障碍物前进。
;/****************************************************/
xuanya_car:
ldi r24,165
out PORTA,r24
ldi r24,32
sts work_status,r24
rcall mic_startup
rjmp sl87
sl86:
rcall sw_touch
in r24,PINC
andi r24,16
sts pc,r24
tst r24
brne sl89
rcall backward
ldi r16,300
ldi r17,1
rcall delay_ms
rcall turn_right
ldi r16,150
ldi r17,0
rcall delay_ms
sl89:
in r24,PINC
andi r24,224
sts pc,r24
cpi r24,64
brne sl91
rcall backward
ldi r16,300
ldi r17,1
rcall delay_ms
rcall turn_right
ldi r16,150
ldi r17,0
rcall delay_ms
sl91:
lds r24,pc
cpi r24,128
brne sl93
rcall backward
ldi r16,300
ldi r17,1
rcall delay_ms
rcall turn_right
ldi r16,150
ldi r17,0
rcall delay_ms
sl93:
lds r24,pc
cpi r24,32
brne sl95
rcall backward
ldi r16,300
ldi r17,1
rcall delay_ms
rcall turn_right
ldi r16,150
ldi r17,0
rcall delay_ms
sl95:
lds r24,pc
cpi r24,192
brne sl97
rcall backward
ldi r16,300
ldi r17,1
rcall delay_ms
rcall turn_right
ldi r16,150
ldi r17,0
rcall delay_ms
sl97:
lds r24,pc
cpi r24,96
brne sl99
rcall backward
ldi r16,300
ldi r17,1
rcall delay_ms
rcall turn_right
ldi r16,150
ldi r17,0
rcall delay_ms
sl99:
lds r24,pc
cpi r24,224
brne sl101
rcall stop
ldi r24,60
out PORTA,r24
ldi r16,300
ldi r17,1
rcall delay_ms
ldi r24,195
out PORTA,r24
ldi r16,300
ldi r17,1
rcall delay_ms
rjmp sl102
sl101:
rcall forward
sl102:
sl87:
rjmp sl86
X8:
sl85:
ret
;****************************************************************************
;/*********************************************************************/
;//remote_car遥控车程序
;//遥控机器人(键按住有效):
;// < A > 右转 turn_right ; < B > 后退 backward;
;// < C > 停止 stop; < D > 左转 turn_left;
;// 无键按下 前行 forward。
;// < C > 持续按住此键超过 10s ,机器人停止待命,
;// 等待声控重新起动进入遥控状态。
;/*********************************************************************/
remote_car:
push r30
push r24
push r21
push r20
push r17
push r16
push r2
rcall port_init
ldi r24,96
sts work_status,r24
sl104:
ldi r24,15
out PORTA,r24
rcall mic_startup
rjmp sl106
sl105:
rcall sw_touch
in r24,PINB
andi r24,15
sts remote_in,r24
mov r20,r24
clr r21
cpi r20,0
cpc r20,r21
breq sl111
X9:
cpi r20,1
ldi r30,0
cpc r21,r30
breq sl115
cpi r20,2
ldi r30,0
cpc r21,r30
breq sl113
cpi r20,4
ldi r30,0
cpc r21,r30
breq sl112
cpi r20,8
ldi r30,0
cpc r21,r30
breq sl114
rjmp sl108
X10:
sl111:
rcall forward
clr r2
sts rst_time,r2
rjmp sl109
sl112:
rcall turn_right
clr r2
sts rst_time,r2
rjmp sl109
sl113:
rcall backward
clr r2
sts rst_time,r2
rjmp sl109
sl114:
rcall stop
lds r24,rst_time
subi r24,255 ; addi 1
sts rst_time,r24
rjmp sl109
sl115:
rcall turn_left
clr r2
sts rst_time,r2
sl108:
sl109:
ldi r16,200
ldi r17,0
rcall delay_ms
lds r24,rst_time
cpi r24,50
brne sl116
clr r2
sts rst_time,r2
rjmp sl104
sl116:
sl106:
rjmp sl105
X11:
sl103:
pop r2
pop r16
pop r17
pop r20
pop r21
pop r24
pop r30
ret
;*******************************************************************************
;/*********************************************************************/
;//机器人走四方形路线,遥控器调节行走路线程序
;//机器人行走的同时演奏音乐
;//声控启动运行
;//转弯时间 22*25ms = 550ms
;//前行时间 48*25ms = 1200ms
;/*********************************************************************/
auto_car:
rcall PORT_init
ldi r24,81
sts work_status,r24
ldi r24,68
out PORTA,r24
ldi r24,22
ldi r25,0
sts delay_time1+1,r25 ;//转弯时间 22*25ms = 550ms
sts delay_time1,r24
ldi r24,48
sts delay_time2+1,r25 ;//前行时间 48*25ms = 1200ms
sts delay_time2,r24
rcall mic_startup ;//等待声控启动
ldi r24,17
sts gzsl,r24
clr r2
sts t0_times,r2
cli
rcall timer0_init ;起动定时器 0 溢出中断
clr r2
out MCUCR,r2
out GIMSK,r2
ldi r24,2
out TIMSK,r24
sei
rcall forward
ldi r16,200
ldi r17,0
rcall delay_ms
rjmp sl120
sl119:
clr r16
sts sound_add,r16
sts sound_add+1,r16
rcall music_car ;演奏音乐
sl120:
rjmp sl119
X12:
sl118:
ret
;***********************************************************************
;/*********************************************************************/
;//cny_car 探测白底黑线,沿着黑线行走程序。
;//在白底黑线的场地,能够探测到黑线,沿着黑线运动。
;/*********************************************************************/
cny_car:
rcall PORT_init
ldi r24,195
out PORTA,r24
sl123:
rcall mic_startup
rjmp sl125
sl124:
rcall sw_touch
in r24,PINC
andi r24,224
sts cny_in,r24
tst r24
breq sl130
cpi r24,64
breq sl130
cpi r24,160
brne sl127
sl130:
rcall forward
clr r2
sts cny_times,r2
sl127:
lds r24,cny_in
cpi r24,32
breq sl133
cpi r24,96
brne sl131
sl133:
rcall turn_right_s
ldi r16,50
ldi r17,0
rcall delay_ms
clr r2
sts cny_times,r2
sl131:
lds r24,cny_in
cpi r24,128
breq sl136
cpi r24,192
brne sl134
sl136:
rcall turn_left_s
ldi r16,50
ldi r17,0
rcall delay_ms
clr r2
sts cny_times,r2
sl134:
lds r24,cny_in
cpi r24,224
brne sl137
rcall forward
lds r24,cny_times
subi r24,255 ; addi 1
sts cny_times,r24
ldi r16,10
ldi r17,0
rcall delay_ms
lds r24,cny_times
cpi r24,100
brne sl139
rcall stop
rjmp sl123
sl139:
sl137:
sl125:
rjmp sl124
X13:
sl122:
ret
;*******************************************************************
;主函数
.cseg
.org $500
main:
ldi r17,$02 ;置栈指针 $025f
ldi r16,$5f ;栈指针初始化
out spl,r16
out sph,r17
rcall PORT_init ;//PA,PB,PC,PD 初始化
ldi r24,103
sts work_status,r24 ;//置对应的工作状态标志
ldi r24,136
sts gzsl,r24 ;//令 gzsl = 0x88
clr r2
sts timers,r2 ;//令 timers = 0
ldi r24,126
out PORTA,r24
cli
rcall timer0_init ;//定时器 0 初始化
clr r2
out MCUCR,r2
out GIMSK,r2
ldi r24,2
out TIMSK,r24 ;//允许定时器 0 溢出中断
sei
rjmp sl143
sl142:
ldi r24,136
sts gzsl,r24
ldi r24,low(led_data*2) ;//取 LED广告灯数据表 中的数据,由 PORTA 输出
ldi r25,high(led_data*2)
lds r2,timers
clr r3
add r2,r24
adc r3,r25
mov r30,r2
mov r31,r3
lpm
sts pa,r0
mov r24,r0
cpi r24,10
brne sl145
clr r2
sts timers,r2
sl145:
lds r2,pa
out PORTA,r2
in r24,PIND
andi r24,1
sts pd_select,r24
tst r24
brne sl147
rjmp sl150 ;//pd0=0,其它为高电平
sl149:
ldi r16,500
ldi r17,1
rcall delay_ms ;//消除抖动
in r24,PIND
andi r24,15
sts pd_select,r24
cpi r24,14
brne sl151
rcall stop_timer0 ;//停止定时器 0
rcall remote_car ;//运行遥控车程序
sl153:
sl150:
rjmp sl149
sl151:
sl147:
in r24,PIND
andi r24,2
sts pd_select,r24
tst r24
brne sl154
rjmp sl157 ;//pd1=0,其它为高电平
sl156:
ldi r16,500
ldi r17,1
rcall delay_ms ;//消除抖动
in r24,PIND
andi r24,15
sts pd_select,r24
cpi r24,13
brne sl158
rcall stop_timer0 ;//停止定时器 0
rcall cny_car ;//寻迹机器人,探测白底黑线,沿黑线行进
sl160:
sl157:
rjmp sl156
sl158:
sl154:
in r24,PIND
andi r24,4
sts pd_select,r24
tst r24
brne sl161
rjmp sl164 ;//pd2=0,其它为高电平
sl163:
ldi r16,500
ldi r17,1
rcall delay_ms ;//消除抖动
in r24,PIND
andi r24,15
sts pd_select,r24
cpi r24,11
brne sl165
rcall stop_timer0 ;//停止定时器 0
rcall xuanya_car ;//机器人避障碍、避悬崖行进
sl167:
sl164:
rjmp sl163
sl165:
sl161:
in r24,PIND
andi r24,8
sts pd_select,r24
tst r24
brne sl168
rjmp sl171 ;//pd3=0,其它为高电平
sl170:
ldi r16,500
ldi r17,1
rcall delay_ms ;//消除抖动
in r24,PIND
andi r24,15
sts pd_select,r24
cpi r24,7
brne sl172
rcall stop_timer0 ;//停止定时器 0
rcall auto_car ;//机器人按程序设定路线行走,同时演奏音乐
sl174:
sl171:
rjmp sl170
sl172:
sl168: ;//检测遥控器
in r24,PINB
andi r24,15
sts remote_select,r24
cpi r24,4 ;//按下遥控器<A>(保持 0.5s) 进入遥控机器人运行环境
brne sl175
rjmp sl178
sl177:
ldi r16,500
ldi r17,1
rcall delay_ms
in r24,PINB
andi r24,15
sts remote_select,r24
cpi r24,4
brne sl179
rcall stop_timer0
rcall remote_car
sl181:
sl178:
rjmp sl177
sl179:
sl175:
lds r24,remote_select
cpi r24,2 ;//按下遥控器<B>(保持 0.5s) 寻迹机器人,探测白底黑线,沿黑线行进
brne sl182
rjmp sl185
sl184:
ldi r16,500
ldi r17,1
rcall delay_ms
in r24,PINB
andi r24,15
sts remote_select,r24
cpi r24,2
brne sl186
rcall stop_timer0
rcall cny_car
sl188:
sl185:
rjmp sl184
sl186:
sl182:
lds r24,remote_select
cpi r24,8 ;按下遥控器<C>(保持 0.5s) 机器人避障碍、避悬崖行进
brne sl189
rjmp sl192
sl191:
ldi r16,500
ldi r17,1
rcall delay_ms
in r24,PINB
andi r24,15
sts remote_select,r24
cpi r24,8
brne sl193
rcall stop_timer0
rcall xuanya_car
sl195:
sl192:
rjmp sl191
sl193:
sl189:
lds r24,remote_select
cpi r24,1 ;按下遥控器<D>(保持 0.5s) 机器人按程序设定路线行走,同时演奏音乐
brne sl196
rjmp sl199
sl198:
ldi r16,500
ldi r17,1
rcall delay_ms
in r24,PINB
andi r24,15
sts remote_select,r24
cpi r24,1
brne sl200
rcall stop_timer0
rcall auto_car
sl202:
sl199:
rjmp sl198
sl200:
sl196:
sl143:
rjmp sl142
X14:
sl141:
ret
;*******************************************************************************
;读取 EEPROM 中 r17:r16 地址的数据,存放于 r16 内
EEPROMread:
sbic eecr,eewe
rjmp eepromread
out eearh,r17
out eearl,r16
sbi eecr,eere
in r16,eedr
ret
;*********************************************************************************
;16位查表子程,高位->r17,低位->r16
lpm16:
mov r30,r16
mov r31,r17
lpm
mov r16,r0
adiw r30,1
lpm
mov r17,r0
ret
;**********************************************************************************
;16位无符号乘法 r19:r18 * r17:r16 -> r21:r20:r19:r18 取 r19:r18 -> r17:r16
mpy16u8:
clr r21
clr r20
ldi r22,16
lsr r19
ror r18
m16u8_1:
brcc m16u8_2
add r20,r16
adc r21,r17
m16u8_2:
ror r21
ror r20
ror r19
ror r18
dec r22
brne m16u8_1
mov r17,r19
mov r16,r18
ret
;**********************************************************************
;设置音乐节奏表
TONETABLE:
.dw 64580
.dw 64684
.dw 64777
.dw 64820
.dw 64898
.dw 64968
.dw 65030
.dw 65058
.dw 65110
.dw 65157
.dw 65178
.dw 65217
.dw 65252
.dw 65283
.dw 65297
;**************************************************************************
;设置LED广告灯数据表
led_data:
.db 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd
.db 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd
.db 0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18
.db 0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18
.db 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1
.db 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1
.db 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc
.db 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc
.db 0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7
.db 0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7
.db 0xff,0x00
.db 0xff,0x00
.db 0xff,0x00
.db 0xff,0x00
.db 0x0a,0x0a
;***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -