標(biāo)題:
請(qǐng)各位大佬幫我看一下單片機(jī)藍(lán)牙小車切換模式,幫幫孩子
[打印本頁]
作者:
xuenai1413
時(shí)間:
2025-5-23 10:25
標(biāo)題:
請(qǐng)各位大佬幫我看一下單片機(jī)藍(lán)牙小車切換模式,幫幫孩子
藍(lán)牙模塊,避障模塊,紅外尋跡模塊單獨(dú)使用沒有問題,但是三個(gè)結(jié)合一起想要用藍(lán)牙切換模式的時(shí)候藍(lán)牙和紅外尋跡可以互相切換模式,但是切換到超聲波避障的時(shí)候發(fā)送數(shù)據(jù)后藍(lán)牙就自己斷聯(lián)了,也不能切換到超聲波避障模式,沒有添加紅外尋跡的時(shí)候藍(lán)牙和超聲波可以正常切換,請(qǐng)各位大佬指點(diǎn)一下,謝謝謝謝
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; //關(guān)倍頻
SCON = 0x50; // 串口工作模式1,8位數(shù)據(jù),1位停止位,允許接收
TMOD &=0x0F;
TMOD |= 0x20; // 定時(shí)器1模式2(8位自動(dòng)重裝)
TH1 = 0xFD; // 9600波特率(11.0592MHz晶振)
TL1 = 0xFD;
ET1 = 0;
TR1 = 1; // 啟動(dòng)定時(shí)器1
EA = 1; // 開啟總中斷
ES = 1; // 開啟串口中斷
PX1 = 1; // 設(shè)置串口中斷為高優(yōu)先級(jí)
}
void delay(uint ms)//延時(shí)函數(shù)
{
uint x,y;
for(x=ms;x>0;x--)
for(y=114; y>0; y--);
}
void motor_forward()
{
IN1=0; IN2=1;//智能車左輪正轉(zhuǎn)
IN3=0; IN4=1;//智能車右輪正轉(zhuǎn)
}
void motor_back()
{
......
}
void motor_left()
{
......
}
void motor_right()
{
......
}
void motor_stop()
{
......
}
void UART_ISR() interrupt 4
{
if(RI){
received = SBUF;//從緩沖區(qū)接收數(shù)據(jù)
RI = 0;//接收中斷標(biāo)志位清零
switch (received)
{
case '5': // 切換到超聲波測(cè)距避障模式
motor_stop();
current_mode = ULTRASONIC_MODE;
break;
case '7': // 切換為紅外尋跡模式
motor_stop();
current_mode = HONGWAIXUN_MODE;
break;
case '9': // 切換回藍(lán)牙模式
motor_stop();
current_mode = BLUETOOTH_MODE;
break;
default:
motor_stop();
break;
}
}
}
void lanya(char receive)
{
switch (receive)
{
case '2': // 前進(jìn)
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; // 配置定時(shí)器2為16位自動(dòng)重裝模式(非捕獲)
RCAP2H = 0x00; // 自動(dòng)重裝高字節(jié)(初始值0)
RCAP2L = 0x00; // 自動(dòng)重裝低字節(jié)(初始值0)
TH2 = 0x00; // 定時(shí)器2高字節(jié)初始值(測(cè)量時(shí)從0開始計(jì)數(shù))
TL2 = 0x00; // 定時(shí)器2低字節(jié)初始值
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;//設(shè)置定時(shí)器模式
TMOD |= 0x01;//設(shè)置定時(shí)器模式
TL0 = 0x33;
TH0 = 0xfe;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x33; // 重裝載定時(shí)初值
TH0 = 0xfe;
counter++;
if(counter >= 40) // 假設(shè) 200 個(gè)計(jì)數(shù)值對(duì)應(yīng)一個(gè) PWM 周期
{
counter = 0;
}
if(counter < angle) // angle 的范圍應(yīng)根據(jù)占空比需求設(shè)置,例如 10~20 對(duì)應(yīng) 5%~10% 占空比
{
PWM = 1;
}
else
{
PWM = 0;
}
}
void control_2()
{
counter = 0;
angle = 3; // 舵機(jī)歸中°
Delay500ms();
}
void control()
{
counter = 0;
angle = 2; // 舵機(jī)轉(zhuǎn)到 45°
Delay500ms();
chaoshengbo();
distance1=sum;
counter = 0;
angle = 4; // 舵機(jī)轉(zhuǎn)到 -45°
Delay500ms();
counter = 0;
angle = 3; // 舵機(jī)轉(zhuǎn)到中間角度
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) //全檢測(cè)黑線
motor_forward();
if(D1==0&&D2==1&&D3==0&&D4==0) //中間右側(cè)檢測(cè)到黑線,小車偏左,小車向右移動(dòng)
{
motor_right();
if(D1==0&&D2==0&&D3==0&&D4==0)
motor_forward();
}
if(D1==0&&D2==0&&D3==1&&D4==0) //中間左側(cè)檢測(cè)到黑線,小車偏右,小車向左移動(dòng)
{
......
}
if(D1==0&&D2==0&&D3==1&&D4==1) //直角左轉(zhuǎn)
{
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) //直角右轉(zhuǎn)
{
......
}
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) //銳角左轉(zhuǎn)
{
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) //銳角右轉(zhuǎn)
{
......
}
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() {
// 初始化各個(gè)模塊
UART_Init(); // 藍(lán)牙串口初始化
Timer0_Init(); // 舵機(jī)PWM定時(shí)器初始化
control_2();
while (1) {
if (current_mode == BLUETOOTH_MODE) {
// 藍(lán)牙模式
lanya(received);
} else if(current_mode ==HONGWAIXUN_MODE){
// 紅外尋跡模式
xunji();
} else {
motor_forward();
chaoshengboduoji();
}
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1