📄 sl3010_3.asm
字号:
; /*******************************************/
; /* 广州天河双龙电子公司 */
; /* 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 + -