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

📄 sl3010.c

📁 单片机开发资料光盘-双龙-686M.zip
💻 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 + -