📄 sl3010_2.c
字号:
/*******************************************/
/* 广州天河双龙电子公司 */
/* http://www.sl.com.cn */
/* 020-85510191,87578852,87578872 */
/* nikko@sl.com.cn */
/*******************************************/
//pd3,pd2,pd1,pd0 短路块全部接上
// 按下遥控器<A>(保持 0.5s) 进入遥控机器人运行环境
// 按下遥控器<B>(保持 0.5s) 进入悬崖车机器人运行环境
// 按下遥控器<C>(保持 0.5s) 进入音乐车机器人运行环境
// 按下遥控器<D>(保持 0.5s) 进入霓虹灯机器人运行环境
//pd3,pd2,pd1,pd0 短路块没有全部接上
// 按下遥控器<A>(保持 0.5s) 机器人走四方形
// 按下遥控器<B>(保持 0.5s) 机器人走“8”字
// 按下遥控器<C>(保持 0.5s) 寻迹机器人运行环境
// 按下遥控器<D>(保持 0.5s) 追光机器人运行环境
//将 sl3010.c 文件拷贝到 icc avr 安装目录的<include>文件夹
//sl3010.c 是sl3010机器人的子函数库
//程序中调用此文件后 #include <sl3010.c>
//可直接调用里面的函数和变量
#include <io8515v.h>
#include <macros.h>
#include <sl3010.c>
#include <eeprom.h>
static unsigned char led_data[]=
{//设置LED广告灯数据表
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,
0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18,
0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18,
0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1,
0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,
0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,
0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,
0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,
0x0a,0x0a
};
unsigned char pa,timers;
unsigned int led_delayms=600;
//定义为字符型变量
void led_car(void)
{
PORTA = 0x24;//0010,0100
work_status = 0x40;//置对应的工作状态标志
mic_startup(); //等待声控启动
while (1)
{
pa = 0x00;
for(timers=0;timers<4;timers++)
{//8 LED 整体亮灭闪烁
PORTA=pa;
delay_ms(led_delayms*2);
pa=~pa;
}
pa = 0x01;
for(timers=0;timers<8;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa<<1;
}
pa = 0x80;
for(timers=0;timers<8;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa>>1;
}
pa = 0x01;
for(timers=0;timers<8;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa|(pa<<1);
}
pa = 0x7f;
for(timers=0;timers<8;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa & (pa>>1);
}
pa = 0x80;
for(timers=0;timers<8;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa|(pa>>1);
}
pa = 0xfe;
for(timers=0;timers<8;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa & (pa<<1);
}
pa = 0x03;
for(timers=0;timers<4;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa<<2;
}
pa = 0xc0;
for(timers=0;timers<4;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa>>2;
}
pa = 0x03;
for(timers=0;timers<4;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa | (pa<<2);
}
pa = 0x3f;
for(timers=0;timers<4;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa & (pa>>2);
}
pa = 0xc0;
for(timers=0;timers<4;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa | (pa>>2);
}
pa = 0xfc;
for(timers=0;timers<4;timers++)
{
PORTA=~pa;
delay_ms(led_delayms/2);
pa=pa & (pa<<2);
}
for(timers=0;;timers++)
{
pa = led_data[timers];
if(pa == 0x0a){break;}
PORTA = pa;
delay_ms(led_delayms/2);
}
pa = 0x55;
for(timers=0;timers<16;timers++)
{//8 LED 流水灯
PORTA=pa;
delay_ms(led_delayms);
pa=~pa;
}
led_delayms = led_delayms - 200;
if(led_delayms == 200)
{
led_delayms = 800;
}
}
}
/*******************************************/
/* 电子音乐演示程序 */
/*******************************************/
// 在 icc avr 所在目录的 <include>文件夹中有 "sl3010.c" 文件
//使用说明:音乐输出端口:PORTC.0,音乐数据存放
//于AT90S8515 的EEPROM存贮器中。
// 可以用并口下载软件写入新的音乐文件
//PA口为音乐灯,当不同的音乐节奏,点亮不同的灯。
/* 音乐数据 */
/* 四分之一拍为0x10, 二分之一拍为0x20, 一拍为0x40*/
/* 低1-1 2-2 3-3 4-4 5-5 6-6 7-7 */
/* 中1-8 2-9 3-A 4-B 5-C 6-D 7-E */
/* 高1-F*/
#pragma data:eeprom
unsigned char sound[]={ 0x2a,0x2a,0x4a,0x2a,0x2a,0x4a,0x2a,0x2c,0x28,0x29,
0x4a,0x4a,0x2b,0x2b,0x2b,0x2b,0x2b,0x2a,0x2a,0x2a,
0x2a,0x29,0x29,0x28,0x49,0x4c,0x2a,0x2a,0x4a,0x2a,
0x2a,0x4a,0x2a,0x2c,0x28,0x29,0x4a,0x4a,0x2b,0x2b,
0x2b,0x2b,0x2b,0x2a,0x2a,0x2a,0x2c,0x2c,0x2b,0x29,
0x48,0x48,
0x4a,0x2a,0x29,0x28,0x29,0x28,0x27,0x46,0x46,0x46,
0x46,0x4b,0x2b,0x2a,0x29,0x28,0x29,0x2b,0x4a,0x4a,
0x4a,0x4b,0x2b,0x2a,0x49,0x29,0x2b,0x4a,0x2a,0x28,
0x46,0x48,0x47,0x4a,0x29,0x28,0x27,0x28,0x46,0x46,
0x46,0x46,0x4a,0x2a,0x29,0x28,0x29,0x28,0x27,0x46,
0x46,0x46,0x46,0x4b,0x2b,0x2a,0x29,0x28,0x29,0x2b,
0x4a,0x4a,0x4a,0x4b,0x2b,0x2a,0x49,0x29,0x2b,0x4a,
0x2a,0x28,0x46,0x48,0x47,0x4a,0x29,0x28,0x27,0x28,
0x46,0x46,0x46,0x46,0x00
};
#pragma data:data
/* 音阶表 */
const unsigned int TONETABLE[15]={DO,RE,MI,FA,SO,LA,TI,DO_H,
RE_H,MI_H,FA_H,SO_H,LA_H,TI_H,DO_HH};
/* 音阶重装常数 */
unsigned int toneconst;
#pragma interrupt_handler timer1_ovf_isr:iv_TIMER1_OVF
void timer1_ovf_isr(void)
{
TCNT1=toneconst;
PORTC^=1;
}
void music_car(void)
{
unsigned char temp,temp1;
unsigned int sound_add=0;
PORTA = 0x18; //0001,1000
work_status = 0x30; //置对应的工作状态标志
SEI();
mic_startup(); //等待声控启动
TCCR1A = 0x00;
TCCR1B =(1<<CS11);//8分频
temp1=EEPROMread((int)&sound[sound_add]);
while(temp1!=0)
{
temp=temp1;
temp&=0x0f;
//PA口为音乐灯
if(temp==1 || temp==2 || temp==3 || temp==4){PORTA = 0xfe;}
if(temp==5 || temp==6){PORTA = 0xfc;}
if(temp==7 || temp==8 ){PORTA = 0xf8;}
if(temp==9){PORTA = 0xf0;}
if(temp==10){PORTA = 0xe0;}
if(temp==11){PORTA = 0xc0;}
if(temp==12){PORTA = 0x80;}
if(temp==13||temp==14 || temp==15){PORTA = 0x00;}
if(temp!=0)
{
TIMSK|=(1<<TOIE1);//根据SOUNDTABLE中数据的低四位选择音调频率
temp--;
toneconst=TONETABLE[temp];
TCNT1=toneconst;
}
temp=temp1;
temp>>=4;
temp&=0x0f;
delay_ms(temp*129);//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
TIMSK&=~(1<<TOIE1);
sound_add++;
temp1=EEPROMread((int)&sound[sound_add]);
}
delay_ms(1000);
}
//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
//PC3声控启动
// 用PD7~PD4来作为电机驱动端
#define xuanya_delayms 300
unsigned char pa,pb,pc,pd;
void xuanya_car(void)
{
PORTA = 0xa5;//1010,0101
work_status = 0x20;//置对应的工作状态标志
mic_startup(); //等待声控启动
while(1)
{//左(pc7) 中(pc6) 右(pc5)
sw_touch(); //检测轻触开关
pc = PINC & 0x10;
if(pc == 0x00)
{//后退//左转
backward();//后退
delay_ms(xuanya_delayms);
turn_right();//左转
delay_ms(xuanya_delayms/2);
}
pc = PINC & 0xE0;
if(pc == 0x40)
{//后退//左转
backward();//后退
delay_ms(xuanya_delayms);
turn_right();//左转
delay_ms(xuanya_delayms/2);
}
if(pc == 0x80)
{//后退//左转
backward();//后退
delay_ms(xuanya_delayms);
turn_right();//左转
delay_ms(xuanya_delayms/2);
}
if(pc == 0x20)
{//后退//左转
backward();//后退
delay_ms(xuanya_delayms);
turn_right();//左转
delay_ms(xuanya_delayms/2);
}
if(pc == 0xc0)
{//后退//左转
backward();//后退
delay_ms(xuanya_delayms);
turn_right();//左转
delay_ms(xuanya_delayms/2);
}
if(pc == 0x60)
{//后退//左转
backward();//后退
delay_ms(xuanya_delayms);
turn_right();//左转
delay_ms(xuanya_delayms/2);
}
if(pc == 0xE0)
{
//刹车 //led灯为流水灯
stop();
PORTA = 0x3C;
delay_ms(xuanya_delayms);
PORTA = 0xC3;
delay_ms(xuanya_delayms);
}
else
{
forward();//前行
}
}
}
void remote_car()
{//遥控车程序
unsigned char remote_in;
PORTA = 0x0f;
work_status = 0x60;//置对应的工作状态标志
mic_startup();//等待声控启动函数
while(1)
{
sw_touch();//检测轻触开关
remote_in = PINB & 0x0F;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -