項目小實戰:51單片機控制的手機藍牙遙控小車設計(程序 元件清單 實物圖)

這幾天有時間做了一個手機控制的藍牙遙控小車車,終於今天實現了,把過程和心得跟大家分享一下。
廢話不多說,先上實物圖
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
一、項目元件清單
1、某寶購買一個智能小車底盤(本人車是四驅的,因此有四個電機,兩塊亞克力板和一些配件螺絲)
2、L298n模塊 兩個(一個298控制兩個電機)
3、HC-06藍牙模塊
4、電池盒跟18650電池3個
5、單片機最小系統
6、杜邦線至少12根,當然越多越好
7、若干根導線(連接電機用的,以及電池盒連到L298N跟單片機)

二、製作過程
首先,先去了解一下L298N的接線,我當時也是懵逼了好久,反正摸索着也會了,一般店家都有資料。然後是藍牙模塊的使用,拿到藍牙模塊後,有開發板的話(沒有就用單片機的燒錄器),先按照TXD接TXD,RXD接RXD,打開電腦的串口助手與藍牙構建通信,打開AT,發送AT指令集,比如設設波特率,改個名字,改個配對的密碼。但通過藍牙與單片機連接通信的時候,就是TXD接RXD了。最後一個就是,本人在接線的時候經常碰壁。比如,你以爲接好的線他其實沒接好,根本沒通,還是拿萬用表B了才知道。
因爲本人忘了買電池盒,所以我是用12V的直流電接着的,導致遙控車拖着跟電線。
三、實物圖
(拖着跟電線以及充電寶供電的車 不過我沒通電)

資料內包括L298N的部分資料,以及藍牙的說明書(看AT指令集就好)和源程序。

/手機藍牙遙控小車 APP可以在應用市場搜 藍牙串口助手
左轉右轉大概是90度 我的是四驅的,如果是隻有一個l298N的話就把帶2的刪了
pwm有十級變速
/

#include <reg52.h>

#define Left_moto2_pwm P0_4 //接驅動模塊ENA 使能端,輸入PWM信號調節速度 左後輪
#define Right_moto2_pwm P0_5 //接驅動模塊ENB 右後輪
#define Left_moto_pwm P1_4 //接驅動模塊ENA 使能端,輸入PWM信號調節速度 左前輪
#define Right_moto_pwm P1_5 //接驅動模塊ENB 右前輪
#define uchar unsigned char
#define uint unsigned int

sbit P0_4=P0^4; //定義P0_4
sbit P0_5=P0^5; //定義P0_5
sbit P1_4=P1^4; //定義P1_4
sbit P1_5=P1^5; //定義P1_5

/電機驅動IO定義/
sbit IN1 = P1^2; //爲1 左電機反轉 前輪
sbit IN2 = P1^3; //爲1 左電機正轉 前輪
sbit IN3 = P1^6; //爲1 右電機正轉 前輪
sbit IN4 = P1^7; //爲1 右電機反轉 前輪
/*sbit EN1 = P1^4; //爲1 左電機使能
sbit EN2 = P1^5; //爲1 右電機使能 */

sbit IN5 = P0^2; //爲1 左電機反轉 後輪
sbit IN6 = P0^3; //爲1 左電機正轉 後輪
sbit IN7 = P0^6; //爲1 右電機正轉 後輪
sbit IN8 = P0^7; //爲1 右電機反轉 後輪
/*sbit EN3 = P0^4; //爲1 左電機使能 後輪
sbit EN4 = P0^5; //爲1 右電機使能 後輪 */

bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
int pwm=1;

#define left_motor_en EN1 = 1 //左電機使能
#define left_motor_stops EN1 = 0 //左電機停止
#define right_motor_en EN2 = 1 //右電機使能
#define right_motor_stops EN2 = 0 //右電機停止

#define left_motor2_en EN3 = 1 //左電機使能 後
#define left_motor2_stops EN3 = 0 //左電機停止 後
#define right_motor2_en EN4 = 1 //右電機使能 後
#define right_motor2_stops EN4 = 0 //右電機停止 後

#define left_motor_go IN1 = 0, IN2 = 1//左電機正傳
#define left_motor_back IN1 = 1, IN2 = 0//左電機反轉
#define right_motor_go IN3 = 1, IN4 = 0//右電機正傳
#define right_motor_back IN3 = 0, IN4 = 1//右電機反轉

#define left_motor2_go IN5 = 0, IN6 = 1//左電機正傳
#define left_motor2_back IN5 = 1, IN6 = 0//左電機反轉
#define right_motor2_go IN7 = 1, IN8 = 0//右電機正傳
#define right_motor2_back IN7 = 0, IN8 = 1//右電機反轉

unsigned char pwm_val_left =0;//變量定義
unsigned char push_val_left =0;// 左電機佔空比N/10
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右電機佔空比N/10

void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x–)
for(y = 114; y > 0 ; y–);
}

//藍牙初始化
void UART_INIT()
{
SM0 = 0;
SM1 = 1;//串口工作方式1
REN = 1;//允許串口接收
EA = 1;//開總中斷
ES = 1;//開串口中斷
TMOD = 0x20;//8位自動重裝模式
TH1 = 0xfd;
TL1 = 0xfd;//9600波特率
TR1 = 1;//啓動定時器1
}

/************************************************************************/
void run(void) //pwm調速函數
{
push_val_left =pwm; //PWM 調節參數1-10 1爲最慢,10是最快 改這個值可以改變其速度
push_val_right =pwm; //PWM 調節參數1-10 1爲最慢,10是最快 改這個值可以改變其速度
if(pwm10) pwm=0;
if(pwm
0&&pwm<0) pwm=0;

}

/***********************************************************************/
/
PWM調製電機轉速 /
/
***********************************************************************/

/* 左側電機調速 */
/*調節push_val_left的值改變電機轉速,佔空比 */
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
{ Left_moto_pwm=1;
Left_moto2_pwm=1; }
else
{ Left_moto_pwm=0;Left_moto2_pwm=0; }

if(pwm_val_left>=10)
pwm_val_left=0;
}
else { Left_moto_pwm=0;Left_moto2_pwm=0; }
}
/*****************************************************************/
/
右側電機調速 /
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{ Right_moto_pwm=1;
Right_moto2_pwm=1; }
else
{Right_moto_pwm=0;
Right_moto2_pwm=0;}
if(pwm_val_right>=10)
pwm_val_right=0;
}
else {Right_moto_pwm=0;Right_moto2_pwm=0; }
}
/
**************************************************/
///TIMER0中斷服務子函數產生PWM信號/
void timer0()interrupt 1 using 2
{
TH0=0XF8; //1Ms定時
TL0=0X30;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}

//小車前進
void forward()
{
ET0 = 1;
run(); //pwm 程序
left_motor_go; //左電機前進
right_motor_go; //右電機前進
left_motor2_go; //左電機前進 後輪
right_motor2_go; //右電機前進 後輪
}

void left_go() //左轉
{
ET0 = 1;
run();
left_motor_back;
right_motor_go;
left_motor2_back;
right_motor2_go;
delay(700);
forward();
}
//右轉
void right_go()
{
ET0 = 1;
run();
delay(50);
right_motor_back;
left_motor_go;
right_motor2_back;
left_motor2_go;
delay(700);
forward();
}
//小車左轉圈
void left()
{
ET0 = 1;
run();
delay(50);
right_motor_go; // 右電機前進
left_motor_back; // 左電機後退
right_motor2_go; // 右電機前進
left_motor2_back; // 左電機後退
}

//小車右轉圈
void right()
{
ET0 = 1;
run();
left_motor_go;
right_motor_back;
left_motor2_go;
right_motor2_back;
}

//小車後退
void back()
{
ET0 = 1;
run();
left_motor_back;
right_motor_back;
left_motor2_back;
right_motor2_back;
}

//小車停止
void stop()
{
ET0 = 0;
P1=0;
P0=0;
}

//串口中斷
void UART_SER() interrupt 4
{
if(RI)
{
RI = 0;//清除接收標誌
switch(SBUF)
{
case ‘g’: forward(); break;//前進
case ‘b’: back(); break;//後退
case ‘l’: left(); break;//左轉圈
case ‘r’: right(); break;//右轉圈
case ‘s’: stop(); break;//停止
case ‘z’: left_go(); break;//左轉行駛
case ‘y’: right_go(); break;//右轉行駛
case ‘p’: pwm++;break; //加速
case ‘c’: pwm–;break; //減速
}

    }

}

void main()
{
TMOD=0X01;
TH0= 0XF8; //1ms定時
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
UART_INIT();//串口初始化
while(1);
}

附上 程序源代碼和 所有技術文件,藍牙說明書 需要請自行下載,下載地址
鏈接:https://pan.baidu.com/s/1C3n3qPu2gff6Z1tk2LyJbg 密碼:6bah
謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章