欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 395|回復(fù): 8
收起左側(cè)

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

[復(fù)制鏈接]
ID:1147091 發(fā)表于 2025-5-21 17:12 | 顯示全部樓層 |閱讀模式
我的藍牙模塊和避障模塊單獨使用沒有問題,但是兩個結(jié)合一起想要用藍牙切換模式的時候藍牙模塊發(fā)送數(shù)據(jù)就沒有反應(yīng)了,也不能切換模式,請各位大佬指點一下,謝謝謝謝。
藍牙代碼:#include<reg52.h>  
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int                        //宏定義,減少后續(xù)變量類型書寫工作量
sbit IN1=P1^0;                                                 //對應(yīng)L298N        進行變量定義,通過給4個變量賦值來配置不同的電機運行狀態(tài)
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;

uchar received;
bit mode_flag = 0;
// 初始化UART
void UART_Init()
{
                PCON = 0x00;  //關(guān)倍頻
                SCON = 0x50;  // 串口工作模式1,8位數(shù)據(jù),1位停止位,允許接收
    TMOD = 0x20;  // 定時器1模式2(8位自動重裝)
    TH1 = 0xFD;   // 9600波特率(11.0592MHz晶振)
    TL1 = 0xFD;
                ET1 = 0;
    TR1 = 1;      // 啟動定時器1
    EA = 1;       // 開啟總中斷
    ES = 1;       // 開啟串口中斷
                PX1 = 1;      // 設(shè)置串口中斷為高優(yōu)先級
}

void delay(uint ms)                                //延時函數(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()
{
        IN1=1; IN2=0;                                //智能車左輪反轉(zhuǎn)
        IN3=1; IN4=0;                                //智能車右輪反轉(zhuǎn)
}

void motor_left()
{
        IN1=0; IN2=1;                                //智能車左輪正轉(zhuǎn)
        IN3=0; IN4=0;                                //智能車右輪停止
}

void motor_right()
{
        IN1=0; IN2=0;                                //智能車左輪停止
        IN3=0; IN4=1;                                //智能車右輪正轉(zhuǎn)
}

void motor_stop()
{
        IN1=0; IN2=0;                                //智能車左輪處于停止?fàn)顟B(tài)
        IN3=0; IN4=0;                                //智能車右輪處于停止?fàn)顟B(tài)
}

        
void UART_ISR() interrupt 4
{
        
                                RI = 0;                                                //接收中斷標(biāo)志位清零
        received = SBUF;                //從緩沖區(qū)接收數(shù)據(jù)
               
            switch (received)
        {
            case '2':  // 前進
                motor_forward();                                
                break;
            case '8':  // 后退
                motor_back();
                break;
            case '4':  // 左轉(zhuǎn)
                motor_left();
                break;
            case '6':  // 右轉(zhuǎn)
                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; // 自動重裝高字節(jié)(初始值0)
    RCAP2L = 0x00; // 自動重裝低字節(jié)(初始值0)
    TH2 = 0x00;    // 定時器2高字節(jié)初始值(測量時從0開始計數(shù))
    TL2 = 0x00;    // 定時器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;
        
}
舵機代碼:#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) // 假設(shè) 200 個計數(shù)值對應(yīng)一個 PWM 周期
    {
        counter = 0;
    }
    if(counter < angle) // angle 的范圍應(yīng)根據(jù)占空比需求設(shè)置,例如 10~20 對應(yīng) 5%~10% 占空比
    {
        PWM = 1;
    }
    else
    {
        PWM = 0;
    }
}

void control_2()
{
                counter = 0;
    angle = 3; // 舵機歸中°
    Delay500ms();
}

void control()
{
    counter = 0;
    angle = 2; // 舵機轉(zhuǎn)到 45°
    Delay500ms();
    chaoshengbo();
                distance1=sum;
        
    counter = 0;
    angle = 4; // 舵機轉(zhuǎn)到 -45°
    Delay500ms();

    counter = 0;
    angle = 3; // 舵機轉(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)
                {
                        motor_left();
                        Delay20ms();
                        motor_stop();
                        Delay500ms();
                        motor_forward();
                }
                if(distance2==distance1)
                {
                        motor_left();
                        Delay20ms();
                        motor_stop();
                        Delay500ms();
                        motor_forward();
                }
        }
        else
                motor_forward();
}
主函數(shù):
#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) {
            // 藍牙模式,無需額外操作,藍牙中斷服務(wù)函數(shù)處理
        } else {
            // 超聲波測距避障模式
                                                motor_forward();
            chaoshengboduoji();
        }
    }
}
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

好的,好的,解決了,感謝大佬
回復(fù)

使用道具 舉報

ID:1147091 發(fā)表于 2025-5-22 16:39 | 顯示全部樓層
已經(jīng)解決了,感謝大佬
回復(fù)

使用道具 舉報

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

: 大佬,不會意思打擾您了,我改好TMOD后,藍牙和超聲波避障可以正常切換了,于是我就又加了個紅外尋跡模式(沒有使用定時器),然后我的藍牙和紅外尋跡可以正常切換,但是從藍牙切換超聲波模式,藍牙就自己斷聯(lián),請大佬幫我分析一下,謝謝
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)  //中間右側(cè)檢測到黑線,小車偏左,小車向右移動
        {
                motor_right();
                if(D1==0&&D2==0&&D3==0&&D4==0)
                        motor_forward();
        }
        if(D1==0&&D2==0&&D3==1&&D4==0)  //中間左側(cè)檢測到黑線,小車偏右,小車向左移動
        {
                motor_left();
                if(D1==0&&D2==0&&D3==0&&D4==0)
                        motor_forward();
        }
        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)
        {
                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) //銳角左轉(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)
        {
                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();
                                }
    }
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表