我的蓝牙模块和避障模块单独使用没有问题,但是两个结合一起想要用蓝牙切换模式的时候蓝牙模块发送数据就没有反应了,也不能切换模式,请各位大佬指点一下,谢谢谢谢。
蓝牙代码:#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int //宏定义,减少后续变量类型书写工作量
sbit IN1=P1^0; //对应L298N 进行变量定义,通过给4个变量赋值来配置不同的电机运行状态
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
uchar received;
bit mode_flag = 0;
// 初始化UART
void UART_Init()
{
PCON = 0x00; //关倍频
SCON = 0x50; // 串口工作模式1,8位数据,1位停止位,允许接收
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()
{
IN1=1; IN2=0; //智能车左轮反转
IN3=1; IN4=0; //智能车右轮反转
}
void motor_left()
{
IN1=0; IN2=1; //智能车左轮正转
IN3=0; IN4=0; //智能车右轮停止
}
void motor_right()
{
IN1=0; IN2=0; //智能车左轮停止
IN3=0; IN4=1; //智能车右轮正转
}
void motor_stop()
{
IN1=0; IN2=0; //智能车左轮处于停止状态
IN3=0; IN4=0; //智能车右轮处于停止状态
}
void UART_ISR() interrupt 4
{
RI = 0; //接收中断标志位清零
received = SBUF; //从缓冲区接收数据
switch (received)
{
case '2': // 前进
motor_forward();
break;
case '8': // 后退
motor_back();
break;
case '4': // 左转
motor_left();
break;
case '6': // 右转
motor_right();
break;
case '0': // 停止
motor_stop();
break;
case 'A': // 切换到超声波测距避障模式
mode_flag = 1;
motor_stop();
break;
case 'B': // 切换回蓝牙模式
mode_flag = 0;
motor_stop();
break;
default:
motor_stop();
break;
}
}
超声波代码:#include <reg52.h>
#include <intrins.h>
#include "lanya.h"
sbit Trig = P2^0;
sbit Echo = P2^1;
extern int sum;
extern int mindistance;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay20us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 22;
while (--i);
}
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;
}
舵机代码:#include<reg52.h>
#include<intrins.h>
#include "lanya.h"
#include "chaoshengbo.h"
sbit PWM = P2^6;
unsigned char counter,angle;
unsigned int sum,distance1,distance2,distance3;
unsigned int mindistance = 20;
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay20ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer0_Init()
{
TMOD = 0x01; // 定时器 0 工作在模式 2(8 位自动重装)
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)
{
motor_left();
Delay20ms();
motor_stop();
Delay500ms();
motor_forward();
}
if(distance2==distance1)
{
motor_left();
Delay20ms();
motor_stop();
Delay500ms();
motor_forward();
}
}
else
motor_forward();
}
主函数:
#include<reg52.h>
#include"chaoshengbo.h"
#include"lanya.h"
#include"duoji.h"
extern bit mode_flag;
void main() {
// 初始化各个模块
UART_Init(); // 蓝牙串口初始化
Timer0_Init(); // 舵机PWM定时器初始化
while (1) {
if (mode_flag == 0) {
// 蓝牙模式,无需额外操作,蓝牙中断服务函数处理
} else {
// 超声波测距避障模式
motor_forward();
chaoshengboduoji();
}
}
}
|