藍牙模塊,避障模塊,紅外尋跡模塊單獨使用沒有問題,但是三個結合一起想要用藍牙切換模式的時候藍牙和紅外尋跡可以互相切換模式,但是切換到超聲波避障的時候發送數據后藍牙就自己斷聯了,也不能切換到超聲波避障模式,沒有添加紅外尋跡的時候藍牙和超聲波可以正常切換,請各位大佬指點一下,謝謝謝謝
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();
}
}
}
|