标题:
单片机蓝牙控制小车程序
[打印本页]
作者:
8266
时间:
2018-10-6 21:43
标题:
单片机蓝牙控制小车程序
51单片机蓝牙控制小车程序
单片机源程序如下:
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit PWM_L=P2^6;
sbit PWM_R=P2^7;
#define CAR_SPEED_MAX 10
#define up 'A'
#define down 'B'
#define left 'C'
#define right 'D'
#define stop 'E'
#define ALL 'F'
#define speed5 '2'
#define speed10 '8'
#define L_go IN1=0;IN2=1 //左轮前进
#define L_back IN1=1;IN2=0 //左轮后退
#define L_stop IN1=0;IN2=0 //左轮停止,两个输出1也可以
#define R_go IN3=0;IN4=1 //右轮前进
#define R_back IN3=1;IN4=0 //右轮后退
#define R_stop IN3=0;IN4=0 //右轮停止,两个输出1也可以
#define car_go L_go;R_go //小车前进
#define car_back L_back;R_back //小车后退
#define car_left R_go;L_stop //小车左转弯
#define car_right L_go;R_stop //小车右转弯
#define car_stop L_stop;R_stop //小车停车
#define car_left_360 R_go;L_back //小车向左360度转,是大转弯
#define car_right_360 L_go;R_back //小车向右360度转,是大转弯
u8 HighRH = 0;
u8 HighRL = 0;
u8 LowRH = 0;
u8 LowRL = 0;
bit flag_REC=0;
bit flag=0;
u8 i=0;
u8 dat=0;
u8 buff[5]=0; //接收缓冲字节
/*******************************************************************************
* 函数名 :UsartInit()
* 函数功能 :设置串口
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X00; //波特率加倍
TH1=0XFd; //计数器初始值设置,注意波特率是9600的
TL1=0XFd;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void ConfigPWM(unsigned int fr, unsigned char dc)
{
unsigned long tmp;
unsigned int high, low;
tmp = 11059200/12/fr;
high = (tmp*dc)/100;
low = tmp - high;
high = 65536 - high + 12;
low = 65536 - low + 12;
HighRH = (unsigned char)(high >>8);
HighRL = (unsigned char)high;
LowRH = (unsigned char)(low >> 8);
LowRL = (unsigned char)low;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = HighRH;
TL0 = HighRL;
ET0 = 1;
TR0 = 1;
PWM_L = 1;
PWM_R = 1;
EA = 1;
}
void ControlCar()
{
if(flag_REC==1) //
{
flag_REC=0;
if(buff[0]=='O'&&buff[1]=='N') //第一个字节为O,第二个字节为N,第三个字节为控制码
switch(buff[2])
{
case up: // 前进
car_go;
break;
case down: // 后退
car_back;
break;
case left: // 左转
car_left;
break;
case right: // 右转
car_right;
break;
case stop: // 停止
car_stop;
break;
case speed5:
ConfigPWM(100,30);
break;
case speed10:
ConfigPWM(100,60);
break;
case ALL: // 停止
car_stop;
break;
}
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
UsartInit(); // 串口初始化
ConfigPWM(100,40);
while(1)
{
ControlCar();
}
}
void InterruptTimer0() interrupt 1
{
if (PWM_L == 1&&PWM_R == 1) //当前输出为高电平时,装载低电平值并输出低电平
{
TH0 = LowRH;
TL0 = LowRL;
PWM_L = 0;
PWM_R = 0;
}
else //当前输出为低电平时,装载高电平值并输出高电平
{
TH0 = HighRH;
TL0 = HighRL;
PWM_L = 1;
PWM_R = 1;
}
}
/*******************************************************************************
* 函数名 : Usart() interrupt 4
* 函数功能 : 串口通信中断函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void sint() interrupt 4 //中断接收3个字节
{
if(RI) //是否接收中断
{
RI=0;
dat=SBUF;
if(dat=='O'&&(i==0)) //接收数据第一帧
{
buff[i]=dat;
flag=1; //开始接收数据
}
else
if(flag==1)
{
i++;
buff[i]=dat;
if(i>=2)
{
i=0;
flag=0;
flag_REC=1;
} // 停止接收
}
}
}
复制代码
所有资料51hei提供下载:
蓝牙程序-小车.rar
(29.35 KB, 下载次数: 28)
2018-10-6 21:42 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
a1419105564
时间:
2019-4-10 17:35
谢谢楼主分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1