串口控制小车电机转动+蓝牙长按控制
程序
1.main.c:调用串口初始化函数,循环里调用Stop函数让小车停止
2.Motor.c:小车前进、后退、左转、右转和停止的函数
3.Delay.c:延时函数
4.Uart.c:串口初始化函数,发送一个字节函数,发送一个字符串函数,中断处理函数接收串口指令,从而控制小车启动
长按模式:蓝牙助手按钮一直按着,小车就一直启动,松手就停止
1.在main函数的while循环中添加让小车停止的函数,如果没有串口中断时就一直是停止状态,当有中断信号过来时就控制小车启动,
void main()
{
UartInit();
while(1)
{
/*1.要实现点动,就要让main函数里一直是停止,串口有控制信号过来后,
跟main函数争夺控制权,要在串口控制信号后加适当延时,让动起来一小会后再自动停止
2.要实现长按启动松手停止也是要在main函数中一直停止*/
Stop();
}
}
2.中断处理函数中也要相应修改,在控制信号后加适当的延时,延时越小,就越接近点动模式,太小的话小车轮子会抽搐,适当加大点就有点动的现象;
若要长按模式的话,延时就要适当大点,经实验延时400ms效果挺好,同时手机蓝牙助手也要修改为长按一直发送串口信号才能实现
/**
* @brief 串口中断处理函数
* @param 无
* @retval无
*/
void Uart_Rountine() interrupt 4
{
static unsigned int i = 0;
unsigned char temp;
if(RI)
{
RI = 0;
temp = SBUF;
if(temp == 'F' || temp == 'B' || temp == 'L' || temp == 'R' || temp == 'S')
{
i = 0;
}
rec[i++] = temp;
if(rec[0] == 'F' && rec[1] == 'o')
{
GoForward();
//收到前进信号后延时400ms,再被main函数停止,延时时间越小,就越接近点动模式
Delay1ms(400);
i = 0;
memset(rec,'\0',SIZE);
}
if(rec[0] == 'B' && rec[1] == 'a')
{
GoBack();
Delay1ms(400); //延时
i = 0;
memset(rec,'\0',SIZE);
}
if(rec[0] == 'L' && rec[1] == 'e')
{
GoLeft();
/*左转的延时少一点,可通过点动方式一点一点地调方向,
如果延时大的话,按一下就转动很大,不便调方向*/
Delay1ms(200);
i = 0;
memset(rec,'\0',SIZE);
}
if(rec[0] == 'R' && rec[1] == 'i')
{
GoRight();
Delay1ms(200); //右转的延时跟左转同理
i = 0;
memset(rec,'\0',SIZE);
}
if(rec[0] == 'S' && rec[1] == 't')
{
Stop();
i = 0;
memset(rec,'\0',SIZE);
}
if(i == SIZE){i = 0;}
}
}
3.修改蓝牙助手
连上HC-08蓝牙后再去自定义按钮界面修改点击属性
点击后设置按钮,选择长按发送,持续发送时间间隔为50ms,间隔越小,说明一直按着按钮的话串口发送数据的频率就越高
修改完后下载程序,独立给小车供电就能用手机蓝牙助手长按控制小车前进后退左转和右转了,跟遥控车一样