久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 280|回復: 8
收起左側

請各位大佬幫我看下我的51單片機藍牙小車代碼

[復制鏈接]
ID:1147091 發表于 2025-5-21 17:12 | 顯示全部樓層 |閱讀模式
我的藍牙模塊和避障模塊單獨使用沒有問題,但是兩個結合一起想要用藍牙切換模式的時候藍牙模塊發送數據就沒有反應了,也不能切換模式,請各位大佬指點一下,謝謝謝謝。
藍牙代碼:#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();
        }
    }
}
回復

使用道具 舉報

ID:844772 發表于 2025-5-27 08:19 | 顯示全部樓層
這是藍牙連接斷了,不是軟件問題啊,因為車藍牙模塊連接的舵機,我覺的還是電源問題,能否先試用雙電源供電,或使用18650電池。或你先屏蔽掉舵機工作程序,看看藍牙是否掉線。
回復

使用道具 舉報

ID:1147091 發表于 2025-5-23 12:12 | 顯示全部樓層
glinfei 發表于 2025-5-23 10:39
藍牙就自己斷聯,是指從狀態燈看出,藍牙斷開連接了,而不是按鍵沒反應?
如果就是一進入,就斷開連接,那 ...

斷聯是,我發送切換超聲波的數據,差不多一兩秒左右,藍牙調試器就顯示未連接設備,我的車跑的確實慢,因為我只用了四節干電池給整個小車供電。但是我切換紅外他就可以正常切換
回復

使用道具 舉報

ID:844772 發表于 2025-5-23 10:39 | 顯示全部樓層
藍牙就自己斷聯,是指從狀態燈看出,藍牙斷開連接了,而不是按鍵沒反應?
如果就是一進入,就斷開連接,那跟程序關系不大,基本是電源的問題,建議測試時使用雙電源,臨時拿個小充電寶給控制部分供電。
另外,覺得這個在中間跑偏,以及走直角彎的考慮不周全啊,難道車很慢嗎?
回復

使用道具 舉報

ID:1147091 發表于 2025-5-22 23:21 | 顯示全部樓層
glinfei 發表于 2025-5-22 15:18
TMOD = 0x01; // 定時器 0 工作在模式 2(8 位自動重裝)
改為:  TMOD |= 0x01;

: 大佬,不會意思打擾您了,我改好TMOD后,藍牙和超聲波避障可以正常切換了,于是我就又加了個紅外尋跡模式(沒有使用定時器),然后我的藍牙和紅外尋跡可以正常切換,但是從藍牙切換超聲波模式,藍牙就自己斷聯,請大佬幫我分析一下,謝謝
typedef enum {
    ULTRASONIC_MODE = 1,
                HONGWAIXUN_MODE,
                BLUETOOTH_MODE
}Mode;
#include<reg52.h>  
#include<intrins.h>
#include "lanya.h"

sbit D1 = P1^7;
sbit D2 = P1^6;
sbit D3 = P1^5;
sbit D4 = P1^4;

void Delay50ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 3;
        j = 26;
        k = 223;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

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)  //中間左側檢測到黑線,小車偏右,小車向左移動
        {
                motor_left();
                if(D1==0&&D2==0&&D3==0&&D4==0)
                        motor_forward();
        }
        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)  //直角右轉
        {
                motor_forward();
                Delay50ms();
                if(D1==0&&D2==0&&D3==0&&D4==0)
                {
                        motor_stop();
                        Delay50ms();
                        motor_right();
                }
        }
        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) //銳角右轉
        {
                motor_forward();
                Delay50ms();
                Delay50ms();
                if(D1==0&&D2==0&&D3==0&&D4==0)
                {
                        motor_stop();
                        Delay50ms();
                        motor_right();
                }
        }
        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();
                                }
    }
回復

使用道具 舉報

ID:1147091 發表于 2025-5-22 16:39 | 顯示全部樓層
已經解決了,感謝大佬
回復

使用道具 舉報

ID:1147091 發表于 2025-5-22 16:38 | 顯示全部樓層
glinfei 發表于 2025-5-22 15:18
TMOD = 0x01; // 定時器 0 工作在模式 2(8 位自動重裝)
改為:  TMOD |= 0x01;

好的,好的,解決了,感謝大佬
回復

使用道具 舉報

ID:844772 發表于 2025-5-22 15:18 | 顯示全部樓層
TMOD = 0x01; // 定時器 0 工作在模式 2(8 位自動重裝)
改為:  TMOD |= 0x01;
回復

使用道具 舉報

ID:1147091 發表于 2025-5-21 17:15 | 顯示全部樓層
不好意思各位,Echo被論壇自動識別為回聲了,三角是Trig;
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色偷偷人人澡人人爽人人模 | 538在线精品| 欧美精品一区二区三区蜜桃视频 | 日韩一区二区三区在线观看视频 | 国产在线小视频 | 欧美高清性xxxxhd | 欧美freesex黑人又粗又大 | 91九色视频 | 日韩在线不卡 | 91精品国产高清一区二区三区 | 亚洲美女一区二区三区 | 欧美日韩不卡合集视频 | 五十女人一级毛片 | 青青草网站在线观看 | 亚洲国产一区二区三区, | 青青草av | 亚洲视频中文 | 成人国产在线视频 | 拍真实国产伦偷精品 | 在线观看免费高清av | 日本免费在线观看视频 | 国产高清一区二区三区 | 国外成人在线视频 | 黑人精品欧美一区二区蜜桃 | 欧美性吧 | 亚洲欧美成人影院 | 久久中文字幕一区 | 久久久久久高潮国产精品视 | 91在线看 | 欧美精品一区二区三区在线 | 国产清纯白嫩初高生在线播放视频 | 国产超碰人人爽人人做人人爱 | 日韩精品在线网站 | 亚洲风情在线观看 | 国产亚洲精品美女久久久久久久久久 | 久久综合九九 | 一区二区视频在线观看 | 国产视频中文字幕 | 亚洲一区二区三区免费在线观看 | 国产精品a一区二区三区网址 | 亚洲最新在线视频 |