找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 187|回复: 0
打印 上一主题 下一主题
收起左侧

请各位大佬帮我看一下单片机蓝牙小车切换模式,帮帮孩子

[复制链接]
跳转到指定楼层
楼主
ID:1147091 发表于 2025-5-23 10:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
蓝牙模块,避障模块,红外寻迹模块单独使用没有问题,但是三个结合一起想要用蓝牙切换模式的时候蓝牙和红外寻迹可以互相切换模式,但是切换到超声波避障的时候发送数据后蓝牙就自己断联了,也不能切换到超声波避障模式,没有添加红外寻迹的时候蓝牙和超声波可以正常切换,请各位大佬指点一下,谢谢谢谢
typedef enum {
ULTRASONIC_MODE = 1,
HONGWAIXUN_MODE,
BLUETOOTH_MODE
}Mode;
extern volatile Mode current_mode;
extern volatile char received;
#include<reg52.h>
#include<intrins.h>
#include<lanya.h>
#define uchar unsigned char
volatile Mode current_mode = BLUETOOTH_MODE;
volatile char received;
// 初始化UART
void UART_Init()
{
PCON = 0x00; //关倍频
SCON = 0x50; // 串口工作模式1,8位数据,1位停止位,允许接收
TMOD &=0x0F;
TMOD |= 0x20; // 定时器1模式2(8位自动重装)
TH1 = 0xFD; // 9600波特率(11.0592MHz晶振)
TL1 = 0xFD;
ET1 = 0;
TR1 = 1; // 启动定时器1
EA = 1; // 开启总中断
ES = 1; // 开启串口中断
PX1 = 1; // 设置串口中断为高优先级
}
void delay(uint ms)//延时函数
{
uint x,y;
for(x=ms;x>0;x--)
for(y=114; y>0; y--);
}
void motor_forward()
{
IN1=0; IN2=1;//智能车左轮正转
IN3=0; IN4=1;//智能车右轮正转
}
void motor_back()
{
......
}
void motor_left()
{
......
}
void motor_right()
{
......
}
void motor_stop()
{
......
}
void UART_ISR() interrupt 4
{
if(RI){
received = SBUF;//从缓冲区接收数据
RI = 0;//接收中断标志位清零
switch (received)
{
case '5': // 切换到超声波测距避障模式
motor_stop();
current_mode = ULTRASONIC_MODE;
break;
case '7': // 切换为红外寻迹模式
motor_stop();
current_mode = HONGWAIXUN_MODE;
break;
case '9': // 切换回蓝牙模式
motor_stop();
current_mode = BLUETOOTH_MODE;
break;
default:
motor_stop();
break;
}
}
}
void lanya(char receive)
{
switch (receive)
{
case '2': // 前进
motor_forward();
break;
case '8': // 后退
motor_back();
break;
......
default:
motor_stop();
break;
}
}
sbit Trig = P2^0;
sbit Echo = P2^1;
extern int sum;
extern int mindistance;
void chaoshengbo()
{
unsigned char timeout = 0;
T2CON = 0x00; // 配置定时器2为16位自动重装模式(非捕获)
RCAP2H = 0x00; // 自动重装高字节(初始值0)
RCAP2L = 0x00; // 自动重装低字节(初始值0)
TH2 = 0x00; // 定时器2高字节初始值(测量时从0开始计数)
TL2 = 0x00; // 定时器2低字节初始值
PT2 = 0;
Trig = 1;
Delay20us();
Trig = 0;
while (!Echo) {
if (++timeout > 200) {
sum = 65535;
return;
}
}
TL2 = 0;
TH2 = 0;
TR2 = 1;
while (Echo);
TR2 = 0;
sum = ((TH2 * 256 + TL2) * 17) / 1000;
}
sbit PWM = P2^6;
unsigned char counter,angle;
unsigned int sum,distance1,distance2,distance3;
unsigned int mindistance = 20;
void Timer0_Init()
{
TMOD &= 0xF0;//设置定时器模式
TMOD |= 0x01;//设置定时器模式
TL0 = 0x33;
TH0 = 0xfe;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x33; // 重装载定时初值
TH0 = 0xfe;
counter++;
if(counter >= 40) // 假设 200 个计数值对应一个 PWM 周期
{
counter = 0;
}
if(counter < angle) // angle 的范围应根据占空比需求设置,例如 10~20 对应 5%~10% 占空比
{
PWM = 1;
}
else
{
PWM = 0;
}
}
void control_2()
{
counter = 0;
angle = 3; // 舵机归中°
Delay500ms();
}
void control()
{
counter = 0;
angle = 2; // 舵机转到 45°
Delay500ms();
chaoshengbo();
distance1=sum;
counter = 0;
angle = 4; // 舵机转到 -45°
Delay500ms();
counter = 0;
angle = 3; // 舵机转到中间角度
Delay500ms();
chaoshengbo();
distance2=sum;
}
void chaoshengboduoji()
{
chaoshengbo();
distance3 = sum;
if(distance3<mindistance)
{
motor_stop();
Delay500ms();
control();
if(distance1<distance2 && distance1 > mindistance)
{
motor_right();
Delay20ms();
motor_stop();
Delay500ms();
motor_forward();
}
if(distance2<distance1 && distance2 > mindistance)
{
......
}
if(distance2==distance1)
{
......
}
}
else
motor_forward();
}
sbit D1 = P1^7;
sbit D2 = P1^6;
sbit D3 = P1^5;
sbit D4 = P1^4;
void xunji()
{
if(D1==1&&D2==1&&D3==1&&D4==1) //全检测黑线
motor_forward();
if(D1==0&&D2==1&&D3==0&&D4==0) //中间右侧检测到黑线,小车偏左,小车向右移动
{
motor_right();
if(D1==0&&D2==0&&D3==0&&D4==0)
motor_forward();
}
if(D1==0&&D2==0&&D3==1&&D4==0) //中间左侧检测到黑线,小车偏右,小车向左移动
{
......
}
if(D1==0&&D2==0&&D3==1&&D4==1) //直角左转
{
motor_forward();
Delay50ms();
if(D1==0&&D2==0&&D3==0&&D4==0)
{
motor_stop();
Delay50ms();
motor_left();
}
}
if(D1==1&&D2==1&&D3==0&&D4==0) //直角右转
{
......
}
if((D1==0&&D2==0&&D3==0&&D4==1)||(D1==0&&D2==1&&D3==0&&D4==1)||D1==0&&D2==1&&D3==1&&D4==1) //锐角左转
{
motor_forward();
Delay50ms();
Delay50ms();
if(D1==0&&D2==0&&D3==0&&D4==0)
{
motor_stop();
Delay50ms();
motor_left();
}
}
if((D1==1&&D2==0&&D3==0&&D4==0)||(D1==1&&D2==1&&D3==1&&D4==0)||D1==1&&D2==1&&D3==1&&D4==0) //锐角右转
{
......
}
if(D1==0&&D2==1&&D3==1&&D4==0)
{
if(D1==1)
motor_right();
}
if(D1==0&&D2==1&&D3==1&&D4==0)
{
if(D4==1)
motor_right();
}
}
void main() {
// 初始化各个模块
UART_Init(); // 蓝牙串口初始化
Timer0_Init(); // 舵机PWM定时器初始化
control_2();
while (1) {
if (current_mode == BLUETOOTH_MODE) {
// 蓝牙模式
lanya(received);
} else if(current_mode ==HONGWAIXUN_MODE){
// 红外寻迹模式
xunji();
} else {
motor_forward();
chaoshengboduoji();
}
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表