|
藍(lán)牙模塊通過usb-ttl可以和電腦正常通信,波特率設(shè)置9600,晶振為11.0562。
藍(lán)牙模塊的RXD接51單片機(jī)的TXD,藍(lán)牙模塊的TXD接51單片機(jī)的RXD。
幫忙看看程序有沒有問題。
程序如下:
#include<AT89X52.H>
#define Left_moto_Stop {P1_1=0,P1_2=0;} //左電機(jī)停轉(zhuǎn)
#define Left_moto_go {P1_1=1,P1_2=0;} //左電機(jī)正轉(zhuǎn)
#define Left_moto_back {P1_1=0,P1_2=1;} //左電機(jī)反轉(zhuǎn)
#define Right_moto_Stop {P1_4=0,P1_5=0;} //右電機(jī)停轉(zhuǎn)
#define Right_moto_go {P1_4=1,P1_5=0;} //右電機(jī)正轉(zhuǎn)
#define Right_moto_back {P1_4=0,P1_5=1;} //右電機(jī)反轉(zhuǎn)
#define Left_moto_pwm P1_0 //PWM信號端
#define Right_moto_pwm P1_3 //PWM信號端
unsigned char bluetoothdata;
//pwm調(diào)速
unsigned char pwm_val_left =0; //變量定義
unsigned char push_val_left =0; //左電機(jī)占空比N/20
unsigned char pwm_val_right =0;
unsigned char push_val_right=0; //右電機(jī)占空比N/20
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
//延時(shí)函數(shù)
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
//小車前進(jìn)
void front_run(void)
{
push_val_left=12;
push_val_right=12;
Left_moto_go;
Right_moto_go;
}
//小車后退
void back_run(void)
{
push_val_left=12;
push_val_right=12;
Left_moto_back;
Right_moto_back;
}
//小車左轉(zhuǎn)
void left_run(void)
{
push_val_left=5;
push_val_right=15;
Right_moto_go;
Left_moto_back;
}
//小車右轉(zhuǎn)
void right_run(void)
{
push_val_left=16;
push_val_right=8;
Left_moto_go;
Right_moto_back;
}
//小車停止
void stop(void)
{
Left_moto_Stop
Right_moto_Stop;
}
//左電機(jī)調(diào)速
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
{
Left_moto_pwm=1;
}
else
{
Left_moto_pwm=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
Left_moto_pwm=0;
}
}
//右電機(jī)調(diào)速
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1;
}
else
{
Right_moto_pwm=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
Right_moto_pwm=0;
}
}
//定時(shí)器0初始化
void timer0_Init(void)
{
TMOD=0X01;
TH0= 0XFc; //1ms定時(shí)
TL0= 0X18;
TR0= 1;
ET0= 1;
EA = 1; //開總中斷
}
//定時(shí)器0中斷服務(wù)子程序
void timer0()interrupt 1 using 2
{
TH0=0XFc;
TL0=0X18;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void usart_t1() //計(jì)數(shù)器1的初始化
{
TH1=0xFD;
TL1=0xFD;//設(shè)置波特率9600
PCON=0X00; //波特率不加倍
SCON=0x50;//方式一10位異步收發(fā)器8位數(shù)據(jù),允許串行接收。
TMOD|=0X20;//計(jì)數(shù)器工作方式2 8位自動(dòng)重裝載
IP=0x10;//設(shè)置串口中斷位高優(yōu)先級
ES=1;//開串口中斷
EA=1;
TR1=1; //開計(jì)數(shù)器1
TI=0;
RI=0;
}
void usart_receive(void) interrupt 4 //串口中斷服務(wù)子程序
{
if(RI==1)
{
RI=0; //接受中斷標(biāo)志位清零
bluetoothdata=SBUF;//讀取數(shù)據(jù)
SBUF=bluetoothdata; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志
}
}
void usart_service()
{
switch(bluetoothdata)
{
case'1':front_run();
break;
case'2':back_run();
break;
case'3':left_run();
break;
case'4':right_run();
break;
case'5':stop();
break;
default:stop();
break;
}
}
void main()
{
stop();
timer0_Init(void);//定時(shí)器0初始化
usart_t1() ;//計(jì)數(shù)器1的初始化
while(1)
{
usart_service();
}
}
|
|