📄 sl3010.s
字号:
.module sl3010.c
.area text(rom, con, rel)
.dbfile E:\icc\include\sl3010.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 81
; //sl3010.c sl3010机器人常用函数库
;
; // 更新日期: 2003.03.18
;
; /*
; void port_init(); //PA,PB,PC,PD 初始化
; void delay_us(int time); //微妙级延时
; void delay_ms(unsigned int time);//毫秒级延时
; void sw_touch(); //检测轻触开关
; void mic_startup(); //等待声控启动
; void remote_auto_time(); //遥控器控制直行和转弯时间
; void turn_right(); //右转
; void turn_left(); //左转
; void turn_right_s(); //慢速右转
; void turn_left_s(); //慢速左转
; void backward(); //后退
; void forward(); //前行
; void stop(); //停止运动
; */
; /*
; sl-3010 运行不同的程序其对应的工作状态由 work_status 变量指示
; 对应数据表如下:
; 程序名 程序功能简介 work_status 值
; cny_car 程序 白底黑线,探黑线行走 0x10
; xuanya_car 走悬崖,避障碍 0x20
; music_car 音乐车 0x30
; led_car 霓虹灯 0x40
; auto_car1 自走车 0x51
; auto_car8 走<8>字 0x50
; remote_car 智能遥控机器人 0x60
; trace_light 追光行进机器人 0x70
; remote_light 遥控和追光 0x67
; ……
; */
; // 电机驱动信号 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
;
; //#define A 0x04 //0b0000,0100
; //#define B 0x02 //0b0000,0010
; //#define C 0x08 //0b0000,1000
; //#define D 0x01 //0b0000,0001
;
;
; #include <io8515v.h>
;
; /* 音阶常数=65536-8000000/8/2/f */
; #define DO 64580 //523
; #define RE 64684 //587
; #define MI 64777 //659
; #define FA 64820 //698
; #define SO 64898 //784
; #define LA 64968 //880
; #define TI 65030 //988
; #define DO_H 65058 //1046
; #define RE_H 65110 //1174
; #define MI_H 65157 //1318
; #define FA_H 65178 //1397
; #define SO_H 65217 //1568
; #define LA_H 65252 //1760
; #define TI_H 65283 //1976
; #define DO_HH 65297 //2093
; /* 位操作宏 */
; #define set_bit(x,y) (x|=(1<<y))
; #define clr_bit(x,y) (x&=~(1<<y))
; #define get_bit(x,y) (x&(1<<y))
;
; #define fosc 8000000
; #define baud 19200
; #define device 0x38
;
; #define touch_time 250
;
; unsigned char work_status;
;
; void port_init(void)
; {//PA,PB,PC,PD 初始化
.dbline 82
; DDRA = 0xFF;PORTA = 0xFF; //PA口输出,接8路LED指示灯
ldi R24,255
out 0x1a,R24
.dbline 82
out 0x1b,R24
.dbline 83
; DDRB = 0x80;PORTB = 0xFF; //PB7输出口,PB6~PB4输入(轻触开关)PB4~PB0输入(遥控器)
ldi R24,128
out 0x17,R24
.dbline 83
ldi R24,255
out 0x18,R24
.dbline 84
; DDRC = 0x01;PORTC = 0xFF; //PC0蜂鸣器输出,PC7~PC1检测信号输入端
ldi R24,1
out 0x14,R24
.dbline 84
ldi R24,255
out 0x15,R24
.dbline 85
; DDRD = 0xF0;PORTD = 0xFF; //PD7~PD4输出驱动电机,PD3~PD0输入
ldi R24,240
out 0x11,R24
.dbline 85
ldi R24,255
out 0x12,R24
.dbline -2
.dbline 86
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_us _delay_us fV
; time -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 89
;
; void delay_us(int time)
; {//微秒级延时程序
L3:
.dbline 91
; do
; {
.dbline 92
; time--;
subi R16,1
sbci R17,0
.dbline 93
; }
L4:
.dbline 94
; while (time>1);
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L3
.dbline -2
.dbline 95
; }
L2:
.dbline 0 ; func end
ret
.dbsym r time 16 I
.dbend
.dbfunc e delay_ms _delay_ms fV
; time -> R20,R21
.even
_delay_ms::
rcall push_gset1
mov R20,R16
mov R21,R17
.dbline -1
.dbline 98
;
; void delay_ms(unsigned int time)
; {//毫秒级延时程序
rjmp L8
L7:
.dbline 100
.dbline 101
ldi R16,1000
ldi R17,3
rcall _delay_us
.dbline 102
subi R20,1
sbci R21,0
.dbline 103
L8:
.dbline 99
; while(time!=0)
cpi R20,0
cpc R20,R21
brne L7
X0:
.dbline -2
.dbline 104
; {
; delay_us(1000);
; time--;
; }
; }
L6:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 i
.dbend
.dbfunc e turn_right _turn_right fV
.even
_turn_right::
.dbline -1
.dbline 107
;
; void turn_right()//右转
; {
.dbline 108
; PORTD = 0x60; //右转//0110 0000
ldi R24,96
out 0x12,R24
.dbline 109
; PORTA = 0xCC; //1100,1100 指示灯
ldi R24,204
out 0x1b,R24
.dbline -2
.dbline 110
; }
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e turn_left _turn_left fV
.even
_turn_left::
.dbline -1
.dbline 113
;
; void turn_left()//左转
; {
.dbline 114
; PORTD = 0x90; //左转//1001 0000
ldi R24,144
out 0x12,R24
.dbline 115
; PORTA = 0x33; //0011,0011 指示灯
ldi R24,51
out 0x1b,R24
.dbline -2
.dbline 116
; }
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e turn_right_s _turn_right_s fV
.even
_turn_right_s::
.dbline -1
.dbline 118
; void turn_right_s() //慢速右转
; {
.dbline 119
; PORTD = 0x20; //慢速右转//0010 0000
ldi R24,32
out 0x12,R24
.dbline 120
; PORTA = 0xCF; //1100,1111
ldi R24,207
out 0x1b,R24
.dbline -2
.dbline 121
; }
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e turn_left_s _turn_left_s fV
.even
_turn_left_s::
.dbline -1
.dbline 124
;
; void turn_left_s() //慢速左转
; {
.dbline 125
; PORTD = 0x80; //慢速左转//1000 0000
ldi R24,128
out 0x12,R24
.dbline 126
; PORTA = 0xF3; //1111,0011
ldi R24,243
out 0x1b,R24
.dbline -2
.dbline 127
; }
L13:
.dbline 0 ; func end
ret
.dbend
.dbfunc e backward _backward fV
.even
_backward::
.dbline -1
.dbline 130
;
; void backward()//后退
; {
.dbline 131
; PORTD = 0x50; //后退//0101 0000
ldi R24,80
out 0x12,R24
.dbline 132
; PORTA = 0x3C; //0011,1100 指示灯
ldi R24,60
out 0x1b,R24
.dbline -2
.dbline 133
; }
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e forward _forward fV
.even
_forward::
.dbline -1
.dbline 136
;
; void forward()//前行
; {
.dbline 137
; PORTD = 0xA0; //前行//1010 0000
ldi R24,160
out 0x12,R24
.dbline 138
; PORTA = 0xC3; //1100,0011
ldi R24,195
out 0x1b,R24
.dbline -2
.dbline 139
; }
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e stop _stop fV
.even
_stop::
.dbline -1
.dbline 142
;
; void stop()//停止运动
; {
.dbline 143
; PORTD = 0xff; //停止
ldi R24,255
out 0x12,R24
.dbline 144
; PORTA = 0xff; //
out 0x1b,R24
.dbline -2
.dbline 145
; }
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e sw_touch _sw_touch fV
; remote_in -> R22
; sw_in -> R20
.even
_sw_touch::
rcall push_gset2
.dbline -1
.dbline 161
;
; //左边 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 ___||$|
;
; void sw_touch()
; {
.dbline 163
; unsigned char sw_in,remote_in;
; DDRC = 0x01;PORTC = 0xFF;//PC4
ldi R24,1
out 0x14,R24
.dbline 163
ldi R24,255
out 0x15,R24
.dbline 164
; DDRB = 0x80;PORTB = 0xFF;//PB4,PB5,PB6
ldi R24,128
out 0x17,R24
.dbline 164
ldi R24,255
out 0x18,R24
.dbline 166
;
; sw_in = PINC & 0x10;
in R20,0x13
andi R20,16
.dbline 167
; if(sw_in == 0x00)
brne L18
.dbline 168
; {//后退,左转 首部开关接触
.dbline 169
; backward(); //后退
rcall _backward
.dbline 170
; delay_ms(touch_time);
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 172
;
; if(work_status == 0x70)
lds R24,_work_status
cpi R24,112
brne L20
.dbline 173
; {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
.dbline 174
; stop();
rcall _stop
rjmp L23
L22:
.dbline 176
.dbline 177
ldi R24,85
out 0x1b,R24
.dbline 178
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 179
ldi R24,170
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -