cc2530 PWM 蓝牙 小车

实验准备:

  1. cc2530开发板,hc-05蓝牙模块
  2. diy小车一台(包括直流电机、亚克力车版、L298驱动模块等)
  3. 手机端下载 SPP蓝牙串口助手

源代码:


#include <ioCC2530.h>
	
#define LED P1_1 //该管脚为TIMER1的1通道
#define in1 P1_2
#define in2 P1_3
#define in3 P1_4
#define in4 P1_5

extern void timer1_init(void);
extern void change_duty(unsigned char duty);

//延时函数   *****************************/   
void Delayms(int xms)   //i=xms 即延时i毫秒  
{  
int i,j;   
for(i=xms;i>0;i--)  
     for(j=587;j>0;j--);   
} 

void up (void)         
{
  in1=1;
in2=0;
in3=1;
in4=0;
} //小车向前

void down (void) 
{
in1=0;
in2=1;
in3=0;
in4=1;
}
//小车向后
void stop (void)   
{
in1=1;
in2=1;
in3=1;
in4=1;
} //小车停止
void turn_right (void) {
in1=1;
in2=0;
in3=1;
in4=1;
} //小车原地向右
void turn_left (void)  {
in1=1;
in2=1;
in3=1;
in4=0;
}
//小车原地向左 


 void initUARTtest()
 {
  CLKCONCMD &= ~0x40;//设置时钟晶振为32MHZ
  while(!(SLEEPSTA & (1<<6))); /*等待晶振稳定*/  
  CLKCONCMD &= ~0x07;/*时钟不分频*/    
    PERCFG = 0x00;//使用备用位置1 P0口    
    P0SEL = 0x0C;//P0用作外设:串口?
    P2DIR &= ~0XC0; //串口0优先级最高?
    U0CSR |= 0xC0;   //UART方式   
    U0GCR = 8;       
    U0BAUD |=59; //设置波特率9600
      UTX0IF = 0; //串口0发送中断标志清零?
URX0IE=1;
}


void PortInit()
{
  P1DIR |=(1<<2);    //P1_2为输出            
  P1DIR |=(1<<3);         //P1_3为输出 
  P1DIR |=(1<<4);         //P1_4为输出 
  P1DIR |=(1<<5);         //P15为输出 
  
  P1SEL &=~(1<<2);    //p1_2为普通io                    
  P1SEL &=~(1<<3);        //p1_3为普通io 
  P1SEL &=~(1<<4);        //p1_4为普通io  
  P1SEL &=~(1<<5);        //p1_5为普通io 
 
}

char uart0_receive_byte(void) //接受蓝牙指令  
{
  while(URX0IF == 0);
  URX0IF = 0;
  return U0DBUF;
}



void timer1_init(void)
{  
  //timer1的计数频率为1000000Hz
  //在正/倒计数模式下,初始化计数值以产生1/72 秒的定时周期:T=(T1CC0+1)*2*(1/计数频率)
  //T1CC0=6943;
  
  T1CC0L=6943&0XFF;
  T1CC0H=6943>>8;  
  
  PERCFG|=1<<6;
  P2SEL|=1<<3;
  
 P1SEL|=1<<1;  
  
   P0SEL|=1<<7;
    P0SEL|=1<<6;
    P0DIR|=1<<7;
    P0DIR|=1<<6;
  
  T1CCTL1&=~(1<<3);
  T1CCTL1|=((1<<2)|(1<<4)|(1<<5));
  
   T1CCTL4&=~(1<<3);
  T1CCTL4|=((1<<2)|(1<<4)|(1<<5));
    
   T1CCTL3&=~(1<<3);
  T1CCTL3|=((1<<2)|(1<<4)|(1<<5));
   
  T1CTL|=0X3;
}


void change_duty(unsigned char duty)
{ 
  unsigned int t1cc1;
  unsigned int maxvalue;
  int low,high;
  low=T1CC0L;
  high=T1CC0H;
  maxvalue=low|(high<<8);
  t1cc1=maxvalue-(int)((float)duty*(maxvalue+1)/5.0);
  T1CC1L=t1cc1&0xff;
  T1CC1H=t1cc1>>8;
  
}

void change_duty2(unsigned char duty)
{ 
  unsigned int t1cc1;
  unsigned int maxvalue;
  int low,high;
  low=T1CC0L;
  high=T1CC0H;
  maxvalue=low|(high<<8);
  t1cc1=maxvalue-(int)((float)duty*(maxvalue+1)/5.0);
  T1CC4L=t1cc1&0xff;        //通道4 P0_6
  T1CC4H=t1cc1>>8;
  
}

void change_duty3(unsigned char duty)
{ 
  unsigned int t1cc1;
  unsigned int maxvalue;
  int low,high;
  low=T1CC0L;
  high=T1CC0H;
  maxvalue=low|(high<<8);
  t1cc1=maxvalue-(int)((float)duty*(maxvalue+1)/5.0);
  T1CC3L=t1cc1&0xff;        //通道3 P0_7
  T1CC3H=t1cc1>>8;
  
}
void InitLed(void)  
{  

LED = 0;       //LED2灯熄灭  
P0_7=0;
P0_6=0;

}  


void main()
{
initUARTtest();
 InitLed();   
timer1_init();
  PortInit();  
/*  
  while(1)  
  {
    char buf=uart0_receive_byte();
     if(buf=='A')
    up();
  
  }    */
  
 while(1)
  {
     char buf=uart0_receive_byte();
      if(buf>='0'&&buf<='9')
      {
      change_duty(buf-'0');
      change_duty2(buf-'0');
        change_duty3(buf-'0');
      }
      
      
     // if(buf=='A'||buf=='B'||buf=='C'||buf=='D'||buf=='E')
     
     else {
      
    switch(buf)
    {
      
      case 'A': 
        up();
        break;
      case 'B':  
        down();
        break;
      case 'C':
        turn_left();
        break;
      case 'D':
        turn_right();
        break;
      case 'E':
        stop();
        break;  }
    
      }
      
  }  
}

猜你喜欢

转载自blog.csdn.net/qq_41204464/article/details/87975976