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

📄 sl3010_3.asm

📁 单片机开发资料光盘-双龙-686M.zip
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -