直入主題:
硬件部分:l298n、單片機最小系統(最優選,因為有很多外設的板子會影響輸出電壓大小,導致輸出電壓不夠)、12V直流電源、HC-05藍牙模塊、USB轉TTl模塊、小車底盤一個(帶電機的)、杜邦線若干。
下圖為HC-05藍牙模塊,此模塊有6引腳。
下圖為USB轉 TTL模塊,此模塊有5引腳。
下圖為L298N電機驅動模塊。
下圖為單片機最小系統(單片機下為12V直流電源)
基本介紹完小車各部件,下面講一下各模塊怎么使用。
首先說HC-05藍牙模塊,這個模塊是一個主從一體的藍牙模塊,需要先和USB轉TTL模塊連接VCC-VCC、GND-GND、TXD-RXD、RXD-TXD,然后和電腦相連(注意:連接電腦時需要同時按住HC-05上黑色小按鈕,紅燈雙閃就對了),然后打開串口調試軟件(鏈接:https://pan.baidu.com/s/1O-5b1qmakEjfLp74LzPw0A 提取碼:oxez ),我用的是鏈接中的串口調試軟件V2.4,工具中波特率設置為38400,發送AT,收到OK就對了。
然后發送以下指令:AT+ROLE=0(設置為從機,此時只可以被搜索)
AT+CMODE=1(允許連接)
AT+UART=9600(設置模塊比特率為9600)
AT+NAME=隨意英文(設置模塊名字)
AT+PSWD=1234(設置密碼)
還需要在手機下載藍牙串口app。
然后講一下L298N電機驅動模塊,模塊正對自己(左2藍,右2藍,下3藍),左2藍和右2藍分別連接一個電機,是輸出端,IN1、IN2、IN3、IN4是輸入端,兩兩一對,12左、34右,當1和2分別一個高電平一個低電平時(即in1=0、in2=1),電機轉(in1=1,in2=0反轉)。ENA、ENB為PWM調速端口。下3藍中,最左是12v直流輸入,中間gnd,最右5v輸出,可以給單片機5v供電。
然后再說一下連線部分:電源給L298N供電,L298n給兩個電機以及單片機供電,單片機2.7654分別連接in1234,2.32分別接ena、enb。藍牙模塊TXD、RXD接單片機3.0、3.1。
在本程序中設置31.32.33.34為字符段發送,HC-05接收到通過單片機3.1、3.0輸入給單片機,然后單片機引腳做出反應,使l298n輸入端做出反應,實現電機前后轉,兩輪轉速不同實現轉向。
下面給出全部源代碼,此小車只是做出最簡單的前后左右,其它細節還需要進一步完善。
#include<reg52.h> sbit in1=P2^7; sbit in2=P2^6; sbit in3=P2^5; sbit in4=P2^4; sbit ena=P2^3; sbit enb=P2^2; typedef unsigned int uint; typedef unsigned char uchar; uint pass = 0; //傳遞數據位 void delay(unsigned int z) //延時函數 { unsigned int y; for(;z>0;z--) for(y=0;y<125;y++); } void delay_10um(unsigned int n) { while(n--); } void qianjin() //前進 { in1=1; in2=0; in3=1; in4=0; ena=1; enb=1; delay_10um(40); ena=0; enb=0; delay_10um(60); } void houtui() //后退 { in1=0; in2=1; in3=0; in4=1; ena=1; enb=1; delay_10um(40); ena=0; enb=0; delay_10um(60); } void zuozhuan() //左轉 { in1=1; in2=0; ena=1; delay_10um(60); ena=0; delay_10um(40); in3=1; in4=0; enb=1; delay_10um(40); enb=0; delay_10um(60); } void youzhuan() //右轉 { in1=1; in2=0; ena=1; delay_10um(40); ena=0; delay_10um(60); in3=1; in4=0; enb=1; delay_10um(60); enb=0; delay_10um(40); } void tingzhi() //停止 { in1=0; in2=0; } void UART_init() { TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; //波特率9600 SM0 = 0; SM1 = 1; // 串口工作方式1 10位異步 REN = 1; //串口允許接收 TR1 = 1; EA = 1; ES =1 ; //串口中斷 } int main() { UART_init(); //波特率9600 while(1) { if(pass == 0x31) qianjin(); if(pass == 0x32) zuozhuan(); if(pass == 0x33) youzhuan(); if(pass == 0x34) houtui(); if(pass == 0x35) tingzhi(); } } void UART_INTERRUPT() interrupt 4 { pass = SBUF; RI = 0; SBUF = pass; while(!TI); TI = 0; }