实验准备:
- cc2530开发板,hc-05蓝牙模块
- diy小车一台(包括直流电机、亚克力车版、L298驱动模块等)
- 手机端下载 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; }
}
}
}