?? sl3010.c
字號:
//sl3010.c sl3010機器人常用函數庫
//#include <io8515v.h>
// 更新日期: 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
/* 音階常數=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;
unsigned char sw_in,remote_in;
unsigned char mic_in;
unsigned int delay_time1,delay_time2;
unsigned char remote_in;
void port_init(void)
{//PA,PB,PC,PD 初始化
DDRA = 0xFF;PORTA = 0xFF; //PA口輸出,接8路LED指示燈
DDRB = 0x80;PORTB = 0xFF; //PB7輸出口,PB6~PB4輸入(輕觸開關)PB4~PB0輸入(遙控器)
DDRC = 0x01;PORTC = 0xFF; //PC0蜂鳴器輸出,PC7~PC1檢測信號輸入端
DDRD = 0xF0;PORTD = 0xFF; //PD7~PD4輸出驅動電機,PD3~PD0輸入
}
void delay_us(int time)
{//微秒級延時程序
do
{
time--;
}
while (time>1);
}
void delay_ms(unsigned int time)
{//毫秒級延時程序
while(time!=0)
{
delay_us(1000);
time--;
}
}
void turn_right()//右轉
{
PORTD = 0x60; //右轉//0110 0000
PORTA = 0xCC; //1100,1100 指示燈
}
void turn_left()//左轉
{
PORTD = 0x90; //左轉//1001 0000
PORTA = 0x33; //0011,0011 指示燈
}
void turn_right_s() //慢速右轉
{
PORTD = 0x20; //慢速右轉//0010 0000
PORTA = 0xCF; //1100,1111
}
void turn_left_s() //慢速左轉
{
PORTD = 0x80; //慢速左轉//1000 0000
PORTA = 0xF3; //1111,0011
}
void backward()//后退
{
PORTD = 0x50; //后退//0101 0000
PORTA = 0x3C; //0011,1100 指示燈
}
void forward()//前行
{
PORTD = 0xA0; //前行//1010 0000
PORTA = 0xC3; //1100,0011
}
void stop()//停止運動
{
PORTD = 0xff; //停止
PORTA = 0xff; //
}
//左邊 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()
{
sw_in = PINC & 0x10;
if(sw_in == 0x00)
{//后退,左轉 首部開關接觸
backward(); //后退
delay_ms(touch_time);
if(work_status == 0x70)
{//追光機器人,首部開關接觸,停止運動,PA 口led 流動閃爍
stop();
while(1)
{
PORTA = 0x55;
delay_ms(250);
PORTA = 0xAA;
delay_ms(250);
}
}
turn_left(); //左轉
delay_ms(touch_time);
}
sw_in = PINB & 0x70;
if(sw_in == 0x50)// 0b 0101,0000 尾部開關接觸
{//前行,左轉
forward(); //前行
delay_ms(touch_time);
turn_left(); //左轉
delay_ms(touch_time);
}
if(sw_in == 0x30)// 0b 0011,0000 右側開關接觸
{//后退,左轉
backward(); //后退
delay_ms(touch_time);
turn_left(); //左轉
delay_ms(touch_time);
}
if(sw_in == 0x60)// 0b 0110,0000 左側開關接觸
{//后退,左轉
backward(); //后退
delay_ms(touch_time);
turn_left(); //左轉
delay_ms(touch_time);
}
if(sw_in == 0x20)// 0b 0010,0000 兩側開關同時接觸,停止運動
{
stop(); //停止運動,熄滅指示燈
delay_ms(touch_time*4);
while(1)
{
sw_in = PINC & 0x10;
if(sw_in == 0x00)
{break;}
PORTA = 0x55;
delay_ms(250);
PORTA = 0xAA;
delay_ms(250);
remote_in = PINB & 0x0f;
if(remote_in != 0x00)
{break;}
}
}
}
void mic_startup()
{//聲控啟動程序運行
while(1)//等待pc3(聲控鍵)按鍵按下
{ //無鍵按下等待
mic_in = PINC & 0x08; //pc2=0
if(mic_in == 0){break;}
}//有鍵按下運行下面的程序
}
// #
// #
// #
// #
// # // 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
void remote_auto_time()
{
remote_in = PINB & 0x0F;
switch (remote_in)
{//檢測遙控器是否有鍵按下
case 0x04: // < A >
delay_time2 = delay_time2 - 50;
if(delay_time2 == 50)
{delay_time2 = 100;}
break;
case 0x02: // < B >
delay_time1 = delay_time1 + 50;
if(delay_time1 == 2050)
{delay_time1 = 2000;}
break;
case 0x08: // < C >
delay_time1 = delay_time1 - 50;
if(delay_time1 == 50)
{delay_time1 = 100;}
break;
case 0x01: // < D >
delay_time2 = delay_time2 + 50;
if(delay_time2 == 2050)
{delay_time2 = 2000;}
break;
case 0x00: // 無按鍵
break;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -