51单片机蓝牙舵机正反转代码
时间: 2023-07-02 07:05:25 浏览: 144
以下是基于51单片机的蓝牙舵机正反转代码,需要使用到定时器和串口通信。代码中使用了AT指令控制蓝牙模块发送和接收数据。
```
#include <reg51.h>
sbit L1=P1^0; //定义L298N电机驱动模块引脚
sbit L2=P1^1;
sbit R1=P1^2;
sbit R2=P1^3;
unsigned char buf;
unsigned char flag=0;
unsigned char head,tail;
unsigned char buffer[16];
void delay(unsigned int xms); //延时函数
void init(); //初始化函数
void send(unsigned char dat); //串口发送函数
void forward(); //前进函数
void backward(); //后退函数
void turn_left(); //左转函数
void turn_right(); //右转函数
void stop(); //停止函数
void main()
{
init();
while(1)
{
if(flag==1) //标志位为1时执行
{
flag=0; //标志位清零
switch(buffer[0]) //根据接收到的数据执行相应操作
{
case 'F': forward(); break;
case 'B': backward(); break;
case 'L': turn_left(); break;
case 'R': turn_right(); break;
case 'S': stop(); break;
default: break;
}
}
}
}
void init()
{
TMOD=0x20; //定时器1工作在方式2,8位自动重装载
TH1=0xfd; //设置波特率为9600
TL1=0xfd;
TR1=1; //启动定时器1
SM0=0; //设置串口工作在模式1,8位数据,无校验位
SM1=1;
REN=1; //允许接收
EA=1; //开启总中断
ES=1; //开启串口中断
}
void send(unsigned char dat)
{
SBUF=dat;
while(!TI); //等待发送完成
TI=0;
}
void forward()
{
L1=1; L2=0; R1=1; R2=0; //左右轮正转
}
void backward()
{
L1=0; L2=1; R1=0; R2=1; //左右轮反转
}
void turn_left()
{
L1=0; L2=1; R1=1; R2=0; //左轮反转,右轮正转
}
void turn_right()
{
L1=1; L2=0; R1=0; R2=1; //左轮正转,右轮反转
}
void stop()
{
L1=0; L2=0; R1=0; R2=0; //左右轮停止
}
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
{
for(j=112;j>0;j--);
}
}
void ser() interrupt 4
{
if(RI) //接收中断
{
RI=0; //清除接收标志位
buf=SBUF; //读取接收到的数据
if(buf=='A') //收到'A'则清空缓冲区
{
head=tail=0;
}
buffer[tail++]=buf; //将数据存入缓冲区
if(tail>=16) tail=0; //循环队列
if(buf=='#') //收到'#'表示一条指令结束
{
flag=1; //设置标志位,执行操作
}
}
if(TI) //发送中断
{
TI=0; //清除发送标志位
}
}
```
注意:以上代码仅供参考,具体实现还需根据具体的硬件环境和蓝牙模块型号进行调整。
阅读全文