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

📄 sl3010_3.asm

📁 单片机开发资料光盘-双龙-686M.zip
💻 ASM
📖 第 1 页 / 共 2 页
字号:
; /*******************************************/
; /*            广州天河双龙电子公司         */
; /*            http://www.sl.com.cn         */
; /*     020-85510191,87578852,87578872      */
; /*              nikko@sl.com.cn            */
; /*******************************************/
; /*          更新日期:2003年 4月10日       */
; //遥控器没有按键或者 pd3,pd2,pd1,pd0 短路块全部不接上,全为高电平
; //机器人运行霓虹灯程序。     
; //将 pd0 接低电平,pd3,pd2,pd1 保持高电平,只连接pd0的短路块
; //       或按下遥控器<A>(保持 0.5s)        进入遥控机器人运行环境 
; //将 pd1 接低电平,pd3,pd2,pd0 保持高电平,只连接pd1的短路块
; //       或按下遥控器<B>(保持 0.5s)        寻迹机器人,探测白底黑线,沿黑线行进 
; //将 pd2 接低电平,pd3,pd1,pd0 保持高电平,只连接pd2的短路块
; //       或按下遥控器<C>(保持 0.5s)        机器人避障碍、避悬崖行进 
; //将 pd3 接低电平,pd2,pd1,pd0 保持高电平,只连接pd3的短路块
; //       或按下遥控器<D>(保持 0.5s)        机器人按程序设定路线行走,走四方形,同时演奏音乐 
; //程序等待声控起动运行。

.include "e:\program\include\8515def.inc";器件配置文件

.equ toneconst		=	$60
;.equ toneconst+1	=	$61
.equ sound_add		=	$62
;.equ sound_add+1	=	$63

.equ delay_time1 	= 	$64     
;.equ delay_time1+1	= 	$65

.equ delay_time2 	= 	$66
;.equ delay_time2+1 	= 	$67

.equ led_delayms	=	$68
;.equ led_delayms	=	$69

.equ sts_temp 		=	$6a
;.equ sts_temp+1	=	$6b

.equ work_status  	= 	$70
.equ gzsl		=	$71
.equ t0_times		=	$72
.equ sw_in		=	$73
.equ remote_in		=	$74
.equ mic_in 	  	= 	$75
.equ timers		=	$76
.equ cny_in	    	= 	$77
.equ cny_times		=	$78
.equ pa           	= 	$79
.equ pb           	= 	$7a
.equ pc           	= 	$7b
.equ pd           	= 	$7c
.equ rst_time		=	$7d
.equ cds		=	$7e
.equ pd_select		=	$7f
.equ remote_select	=	$80
.equ temp		=	$81
.equ temp1		=	$82

;*****************************************************************
.eseg
.org	$001
sound:
;//走进新时代
.db 0x68,0x26,0x25,0x23,0x22,0x13,0x12,0x41,0x41,0x41,0x23,0x25
.db 0x28,0x48,0x28,0x29,0x2a,0x29,0x26,0x45,0x45,0x45,0x45,0x68
.db 0x29,0x29,0x28,0x26,0x25,0x46,0x46,0x46,0x25,0x26
.db 0x29,0x43,0x25,0x22,0x23,0x22,0x21,0x42,0x42,0x42
.db 0x42,0x63,0x25,0x26,0x25,0x26,0x25,0x23,0x22,0x13,0x12,0x41
.db 0x23,0x25,0x28,0x28,0x28,0x28,0x29,0x2a,0x2a,0x29,0x46,0x46,0x46,0x46
.db 0x46,0x29,0x2a,0x28,0x28,0x26,0x25,0x26,0x26,0x25,0x43,0x43
.db 0x22,0x42,0x26,0x25,0x23,0x22,0x13,0x12,0x41,0x41,0x41,0x41
						
;//情非得以 
.db 0x20,0x1c,0x1d,0x4c,0x4c,0x4c,0x4c,0x20,0x2d,0x19,0x1a,0x19,0x18,0x48,0x48,0x48
.db 0x48,0x47,0x47,0x46,0x46,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45

.db 0x23,0x24,0x25,0x44,0x45,0x24,0x23,0x22,0x42,0x40,0x40,0x23,0x22,0x21,0x41,0x28
.db 0x48,0x23,0x25,0x45,0x40,0x40,0x21,0x21,0x42,0x21,0x21,0x41,0x20,0x28,0x47,0x26
.db 0x17,0x16,0x15,0x45,0x40,0x31,0x11,0x21,0x21,0x21,0x22,0x42,0x40,0x20,0x23,0x23
.db 0x24,0x25,0x24,0x23,0x24,0x25,0x26,0x23,0x23,0x42,0x42,0x40,0x23,0x22,0x21,0x41
.db 0x28,0x28,0x28,0x23,0x25,0x45,0x45,0x40,0x20,0x25,0x46,0x28,0x28,0x48,0x20,0x29
.db 0x47,0x26,0x17,0x16,0x15,0x45,0x25,0x25,0x26,0x28,0x18,0x16,0x26,0x28,0x26,0x28
.db 0x19,0x19,0x49,0x49,0x20,0x25,0x2a,0x18,0x19,0x29,0x28,0x16,0x17,0x16,0x15,0x25
.db 0x25,0x28,0x29,0x2a,0x29,0x48,0x28,0x48,0x2c,0x4c,0x4c,0x40,0x2a,0x2c,0x1c,0x1a
.db 0x2a,0x2a,0x29,0x4a,0x2b,0x2a,0x4a,0x4a,0x40,0x2a,0x29,0x29,0x28,0x28,0x26,0x48
.db 0x29,0x26,0x45,0x45,0x40,0x25,0x25,0x26,0x21,0x18,0x16,0x26,0x28,0x26,0x28,0x29
.db 0x49,0x49,0x20,0x25,0x28,0x29,0x2a,0x29,0x49,0x28,0x48,0x2c,0x4c,0x4c,0x40,0x2a
.db 0x2c,0x15,0x1a,0x2a,0x2a,0x29,0x4a,0x2b,0x2a,0x4a,0x4a,0x40,0x2a,0x29,0x29,0x28
.db 0x28,0x26,0x28,0x28,0x29,0x26,0x45,0x45,0x40,0x25,0x25,0x26,0x28,0x28,0x26,0x2a
.db 0x19,0x18,0x28,0x18,0x19,0x48,0x48,0x40,0x40,0x40,0x40,0x28,0x48,0x29,0x28,0x28
.db 0x2a,0x1a,0x1a,0x1a,0x18,0x40,0x20,0x26,0x28,0x28,0x28,0x26,0x28,0x48,0x26,0x25
.db 0x45,0x45,0x40,0x40,0x40,0x28,0x48,0x28,0x28,0x1c,0x1d,0x2d,0x2c,0x28,0x28,0x28
.db 0x20,0x26,0x19,0x1a,0x29,0x19,0x18,0x28,0x28,0x26,0x21,0x29,0x49,0x49,0x40,0x20
.db 0x28,0x29,0x2a,0x4a,0x4a,0x20,0x25,0x28,0x29,0x48,0x48,0x48,0x25,0x25,0x26,0x28
.db 0x28,0x26,0x2a,0x19,0x18,0x28,0x18,0x19,0x49,0x49,0x40,0x40

.db 0x00,0x00

.cseg
.org	$000
	rjmp	main		
.org	$006
	rjmp timer1_ovf_isr
.org	$007
	rjmp timer0_ovf_isr

;******************************************************************
.org	$020
;//void port_init();         //PA,PB,PC,PD 初始化
port_init:	
	ldi r24,255
	out DDRA,r24	;//PA口输出,接8路LED指示灯
	out PORTA,r24
	ldi r24,128
	out DDRB,r24	;//PB7输出口,PB6~PB4输入(轻触开关)PB4~PB0输入(遥控器)
	ldi r24,255
	out PORTB,r24
	ldi r24,1
	out DDRC,r24	;//PC0蜂鸣器输出,PC7~PC1检测信号输入端
	ldi r24,255
	out PORTC,r24
	ldi r24,240
	out DDRD,r24	;//PD7~PD4输出驱动电机,PD3~PD0输入
	ldi r24,255
	out PORTD,r24
sl1:
	ret
;*********************************************************************
;           time -> r16,r17
;//void delay_us(int time)	;//微秒级延时
delay_us:			;延时 time ( r17:r16 ) 微秒
sl3:
	subi r16,1
	sbci r17,0
sl4:
	ldi r24,1
	ldi r25,0
	cp r24,r16
	cpc r25,r17
	brlt sl3
sl2:
	ret
;**********************************************************************
;           time -> r20,r21
;//void delay_ms(unsigned int time);//毫秒级延时
delay_ms:			;延时 time ( r21:r20 ) 毫秒
	push r21
	push r20
	push r17
	push r16
	mov r20,r16
	mov r21,r17
	rjmp sl8
sl7:
	ldi r16,1000
	ldi r17,3
	rcall delay_us
	subi r20,1
	sbci r21,0
sl8:
	cpi r20,0
	cpc r20,r21
	brne sl7
X0:
sl6:
	pop r16
	pop r17
	pop r20
	pop r21
	ret
;************************************************************************

;/*******************************************************************/
;//  电机驱动信号                       led灯指示电机状态 
;//PORTD = 0xA0;//前行//1010 0000        //PORTA = 0xC3;//1100,0011
;//PORTD = 0x90;//左转//1001 0000快速左转//PORTA = 0x33;//0011,0011
;//PORTD = 0x80;//左转//1000 0000慢速左转//PORTA = 0xF3;//1111,0011
;//PORTD = 0x60;//右转//0110 0000快速右转//PORTA = 0xCC;//1100,1100
;//PORTD = 0x20;//右转//0010 0000慢速右转//PORTA = 0xCF;//1100,1111
;//PORTD = 0x50;//后退//0101 0000        //PORTA = 0x3C;//0011,1100
;/*******************************************************************/

;//void turn_right();        //右转
turn_right:
	ldi r24,96
	out PORTD,r24		;//驱动电机//0110 0000
	ldi r24,204
	out PORTA,r24		;//点亮指示灯//1100,1100
sl10:
	ret
;************************************************************************
;//void turn_left();         //左转
turn_left:
	ldi r24,144
	out PORTD,r24
	ldi r24,51
	out PORTA,r24
sl11:
	ret
;*************************************************************************
;//void turn_right_s();      //慢速右转
turn_right_s:
	ldi r24,32
	out PORTD,r24
	ldi r24,207
	out PORTA,r24
sl12:
	ret
;*************************************************************************
;//void turn_left_s();       //慢速左转
turn_left_s:
	ldi r24,128
	out PORTD,r24
	ldi r24,243
	out PORTA,r24
sl13:
	ret
;**************************************************************************
;//void backward();          //后退
backward:
	ldi r24,80
	out PORTD,r24
	ldi r24,60
	out PORTA,r24
sl14:
	ret
;**************************************************************************
;//void forward();           //前行
forward:
	ldi r24,160
	out PORTD,r24
	ldi r24,195
	out PORTA,r24
sl15:
	ret
;**************************************************************************	
;//void stop();              //停止运动
stop:
	ldi r24,255
	out PORTD,r24
	out PORTA,r24
sl16:
	ret
;**************************************************************************

;/***********************************/
;//左边       X PC4 X       右边
;//        X X X X X X X
;//       8 7 6 5 4 3 2 1
;//     PB4  X X X X X  PB6 
;//         | X  X  X | 
;//         | X  X  X | 
;//         | X  X  X |   
;//     |$||- X  X  X -||$|
;//     |$|| XXXXXXXXX ||$|
;//    #|$||XXXXXXXXXXX||$|#
;//     |$||XXX     XXX||$|
;//     |$||___ PB5 ___||$|
;/***********************************/

;      remote_in -> r22
;          sw_in -> r20
;//void sw_touch();		//检测轻触开关
;//首部开关接触: 后退,左转  
;// 0b 0101,0000  尾部开关接触: 前行,左转	
;// 0b 0011,0000  右侧开关接触: 后退,左转
;// 0b 0110,0000  左侧开关接触: 后退,左转
;// 0b 0010,0000  两侧开关同时接触,停止运动 

sw_touch:
	push r20
	push r21
	push r22
	push r24
	push r25
	in r20,PINC		 
	andi r20,16		
	brne sl18
	rcall backward
	ldi r16,250
	ldi r17,0
	rcall delay_ms
	lds r24,work_status
	cpi r24,112		
	brne sl20
	rcall stop
	rjmp sl23
sl22:
	ldi r24,85
	out PORTA,r24
	ldi r16,250
	ldi r17,0
	rcall delay_ms
	ldi r24,170
	out PORTA,r24
	ldi r16,250
	ldi r17,0
	rcall delay_ms
sl23:
	rjmp sl22
X1:
sl20:
	rcall turn_left
	ldi r16,250
	ldi r17,0
	rcall delay_ms
sl18:
	in r20,PINB
	andi r20,112
	cpi r20,80
	brne sl25
	rcall forward
	ldi r16,250
	ldi r17,0
	rcall delay_ms
	rcall turn_left
	ldi r16,250
	ldi r17,0
	rcall delay_ms
sl25:
	cpi r20,48
	brne sl27
	rcall backward
	ldi r16,250
	ldi r17,0
	rcall delay_ms
	rcall turn_left
	ldi r16,250
	ldi r17,0
	rcall delay_ms
sl27:
	cpi r20,96
	brne sl29
	rcall backward
	ldi r16,250
	ldi r17,0
	rcall delay_ms
	rcall turn_left
	ldi r16,250
	ldi r17,0
	rcall delay_ms
sl29:
	cpi r20,32
	brne sl31
	rcall stop
	ldi r16,1000
	ldi r17,3
	rcall delay_ms
	rjmp sl34
sl33:
	in r20,PINC
	andi r20,16
	brne sl36
	rjmp sl35
sl36:
	ldi r24,85
	out PORTA,r24
	ldi r16,250
	ldi r17,0
	rcall delay_ms
	ldi r24,170
	out PORTA,r24
	ldi r16,250
	ldi r17,0
	rcall delay_ms
	in r22,PINB
	andi r22,15
	breq sl38
	rjmp sl35
sl38:
sl34:
	rjmp sl33
sl35:
sl31:
sl17:
	pop r25
	pop r24
	pop r22
	pop r21
	pop r20
	ret
;**********************************************************************
;         mic_in -> r16
;//void mic_startup();       //等待声控启动
;//PC3声控启动
mic_startup:
	rjmp sl42
sl41:
	in r16,PINC
	andi r16,8
	brne sl44
	rjmp sl43
sl44:
sl42:
	rjmp sl41
sl43:
sl40:
	ret
;**********************************************************************

;/********************************************************/
;//                #       
;//                #
;//                #
;//                #
;//                #    //  delay_time1  转弯时间
;//        # # # # #    //  delay_time2  直行时间
;//      # X       #    //<A>  0x04  delay_time2-50
;//      #   B  C  #    //<B>  0x02  delay_time1+50
;//      #  D  A   #    //<C>  0x08  delay_time1-50
;//      #         #    //<D>  0x01  delay_time2+50
;//        # # # #      // max: 2000   min: 200 
;/********************************************************/

;      remote_in -> r16
;//void remote_auto_time();  //遥控器控制直行和转弯时间
remote_auto_time:
	in r16,PINB
	andi r16,15
	clr r17
	cpi r16,0
	cpc r16,r17
	brne X4
	rjmp sl48
X4:
X2:
	cpi r16,1
	ldi r30,0
	cpc r17,r30
	brne X5
	rjmp sl59
X5:
	cpi r16,2
	ldi r30,0
	cpc r17,r30
	breq sl53
	cpi r16,4
	ldi r30,0
	cpc r17,r30
	breq sl50
	cpi r16,8
	ldi r30,0
	cpc r17,r30
	breq sl56
	rjmp sl47
X3:
sl50:
	lds r24,delay_time2
	lds r25,delay_time2+1
	sbiw r24,50
	sts delay_time2+1,r25
	sts delay_time2,r24
	cpi r24,50
	ldi r30,0
	cpc r25,r30
	breq X6
	rjmp sl48
X6:
	ldi r24,100
	ldi r25,0
	sts delay_time2+1,r25
	sts delay_time2,r24
	rjmp sl48
sl53:
	lds r24,delay_time1
	lds r25,delay_time1+1
	adiw r24,50
	sts delay_time1+1,r25
	sts delay_time1,r24
	cpi r24,2
	ldi r30,8
	cpc r25,r30
	brne sl48
	ldi r24,2000
	ldi r25,7
	sts delay_time1+1,r25
	sts delay_time1,r24
	rjmp sl48
sl56:
	lds r24,delay_time1
	lds r25,delay_time1+1
	sbiw r24,50
	sts delay_time1+1,r25
	sts delay_time1,r24
	cpi r24,50
	ldi r30,0
	cpc r25,r30
	brne sl48
	ldi r24,100
	ldi r25,0
	sts delay_time1+1,r25
	sts delay_time1,r24
	rjmp sl48
sl59:
	lds r24,delay_time2
	lds r25,delay_time2+1
	adiw r24,50
	sts delay_time2+1,r25
	sts delay_time2,r24
	cpi r24,2
	ldi r30,8
	cpc r25,r30
	brne sl48
	ldi r24,2000
	ldi r25,7
	sts delay_time2+1,r25
	sts delay_time2,r24
sl47:
sl48:
sl46:
	ret
;**********************************************************	

;//sl3010_3.asm  sl3010综合程序_3

;**********************************************************
;//TIMER0 initialisation - prescale:1024
;// desired value: 25mSec
;// actual value: 24.960mSec (0.2%)
;// 定时器 0 初始化函数
timer0_init:
	clr r2
	out TCCR0,r2
	ldi r24,61
	out TCNT0,r24
	ldi r24,5
	out TCCR0,r24
sl63:
	ret
;***********************************************************	
;// 定时器 0 溢出中断执行函数
timer0_ovf_isr:
	push r24
	push r5
	push r4
	push r3
	push r2
	ldi r24,61
	out TCNT0,r24
	lds r24,t0_times
	subi r24,255    ; addi 1
	sts t0_times,r24
	lds r24,gzsl
	cpi r24,136
	brne sl65
	lds r24,t0_times
	cpi r24,10
	brne sl67
	lds r24,timers
	subi r24,255    ; addi 1
	sts timers,r24
	clr r2
	sts t0_times,r2
sl67:
sl65:
	lds r24,gzsl
	cpi r24,17
	brne sl69
	lds r2,delay_time1
	lds r3,delay_time1+1
	lds r4,t0_times
	clr r5
	cp r4,r2
	cpc r5,r3
	brne sl71
	clr r2
	sts t0_times,r2
	ldi r24,34
	sts gzsl,r24
	rcall forward
sl71:
sl69:
	lds r24,gzsl
	cpi r24,34
	brne sl73
	lds r2,delay_time2
	lds r3,delay_time2+1
	lds r4,t0_times
	clr r5
	cp r4,r2
	cpc r5,r3
	brne sl75
	clr r2
	sts t0_times,r2
	ldi r24,17
	sts gzsl,r24
	rcall turn_right
sl75:
sl73:
sl64:
	pop r2
	pop r3
	pop r4
	pop r5
	pop r24
	reti
;*******************************************************	
;// 停止定时器 0 函数
stop_timer0:
	cli
	clr r2
	out TCCR0,r2
	out MCUCR,r2
	out GIMSK,r2
	out TIMSK,r2
	sei
sl77:
	ret
;*******************************************************	
;//定时器 1 溢出中断执行函数
timer1_ovf_isr:
	push r2
	push r3
	push r24
	in r2,SREG
	push r2
	lds r2,toneconst
	lds r3,toneconst+1
	out TCNT1H,r3
	out TCNT1L,r2
	ldi r24,1
	in r2,PORTC
	eor r2,r24
	out PORTC,r2
sl78:
	pop r2
	out SREG,r2
	pop r24
	pop r3
	pop  r2
	reti
;*********************************************************************	

;/*******************************************/
;/*              电子音乐演示程序           */
;/*******************************************/
;//使用说明:PORTC.0端口输出音乐,音乐数据存放
;//于 芯片内部 的EEPROM存贮器中。
;// 可以用并口下载软件写入新的音乐文件( *.eep 文件)

music_car:
	clr r2
	out TCCR1A,r2
	ldi r24,2
	out TCCR1B,r24		;设置定时器 1 定时溢出中断
	clr r16
	sts sound_add,r16	;令 sound_add = 0;
	sts sound_add+1,r16
	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	;读取EEPROM中的音乐数据
	sts temp1,r16
	rjmp sl81		;如读取得数据为 0x00,乐曲结束标志,停止演奏音乐
sl80:				;不为0x00,乐曲未结束,继续演奏
	lds r2,temp1		;//根据SOUNDTABLE中数据的低四位选择音调频率
	sts temp,r2
	mov r24,r2
	andi r24,15
	sts temp,r24
	mov r2,r24
	tst r24
	breq sl83
	in r24,TIMSK
	ori r24,128
	out TIMSK,r24
	mov r24,r2
	subi r24,1
	sts temp,r24
	ldi r24,low(TONETABLE*2)	
	ldi r25,high(TONETABLE*2)
	lds r16,temp
	clr r17
	lsl r16
	rol r17
	add r16,r24
	adc r17,r25
	rcall lpm16
	sts toneconst+1,r17
	sts toneconst,r16
	mov r2,r16
	mov r3,r17
	out TCNT1H,r3
	out TCNT1L,r2
sl83:
	lds r2,temp1		;//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
	sts temp,r2
	mov r24,r2
	swap r24
	andi r24,15
	sts temp,r24

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -