文章目錄
- 前言
- 一、功能
-
二、主要模塊
- 1.L298N模塊
- 2.循跡模塊
- 3.紅外避障模塊
- 4.超聲波避障模塊
- 5..藍牙模塊
- 代碼
- 三、其余模塊
- 四、總結(jié)
?
前言
本項目可實現(xiàn)小車紅外循跡,L298N電機驅(qū)動,紅外避障,超聲波避障,藍牙控制等功能的切換。
?
一、功能
紅外循跡,L298N電機驅(qū)動,PWM電機調(diào)速,紅外避障,超聲波避障,藍牙控制,
二、模塊簡介
1.L298N
L298N是比較常用的直流電機驅(qū)動板,OUT1~4接入四個電機博主使用的是將兩個電機并聯(lián)的方法,
左右兩個電機進行并聯(lián)),IN1~4接入單片機的I/O口,在IN1~4的兩側(cè)有使能ENA、ENB接口,用于PWM變速。
?代碼:
#include <REGX52.H>
sbit M1A=P0^6; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//定義左側(cè)電機驅(qū)動A端
sbit M1B=P0^5; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//定義左側(cè)電機驅(qū)動B端
sbit M2A=P0^4; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//定義右側(cè)電機驅(qū)動A端
sbit M2B=P0^3; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//定義右側(cè)電機驅(qū)動B端
sbit M3A=P3^6; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//定義后左側(cè)電機驅(qū)動A端
sbit M3B=P3^5; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//定義后左側(cè)電機驅(qū)動B端
sbit M4A=P3^4; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//定義后右側(cè)電機驅(qū)動A端
sbit M4B=P3^3;?? ??? ??? ??? ??? ??? ??? ? //定義后右側(cè)電機驅(qū)動B端
sbit EN1A = P0^7;
sbit EN1B = P0^2;
sbit EN2A = P3^7;
sbit EN2B = P3^2;
unsigned char coutern,compare;
void yundong() ?// ?
{
?? ?M1A = 0;
?? ?M1B = 1;
?? ?M2A = 0;
?? ?M2B = 1;
?? ?
?? ?M3A = 1;
?? ?M3B = 0;
?? ?M4A = 1;
?? ?M4B = 0;
?? ?
}
void Timer0_Init(void)?? ??? ?//100微秒@11.0592MHz
{
//?? ?AUXR &= 0x7F;?? ??? ??? ?//定時器時鐘12T模式
?? ?TMOD &= 0xF0;?? ??? ??? ?//設置定時器模式
?? ?TMOD |= 0x01;?? ??? ??? ?//設置定時器模式
?? ?TL0 = 0xA4;?? ??? ??? ??? ?//設置定時初始值
?? ?TH0 = 0xFF;?? ??? ??? ??? ?//設置定時初始值
?? ?TF0 = 0;?? ??? ??? ??? ?//清除TF0標志
?? ?TR0 = 1;?? ??? ??? ?//定時器0開始計時
?? ?ET0 = 1;
?? ?EA = 1;?? ?
?? ?PT0=0;
}
void Timer0_Serve() interrupt 1
{
?? ?TL0 = 0xA4;?? ??? ??? ??? ?//設置定時初始值
?? ?TH0 = 0xFF;?? ? ? ?? ?//設置定時初始值?
?? ?compare = 10;
?? ?coutern ++;
?? ?if(coutern > 100)
?? ?{
?? ??? ?coutern = 0;
?? ?
?? ?}
?? ?if(coutern < compare)
?? ?{
?? ??? ?EN1A = 1;
?? ??? ?EN1B = 1;
?? ??? ?EN2A = 1;
?? ??? ?EN2B = 1;
?? ?}
?? ?else
?? ?{
?? ??? ?EN1A = 0;
?? ??? ?EN1B = 0;
?? ??? ?EN2A = 0;
?? ??? ?EN2B = 0;
?? ??? ?
?? ?}
}
void main()
{
?? ?
?? ?Timer0_Init();
?? ?while(1)
?? ?{
?? ??? ?yundong();
?? ?}?? ??? ?
}
?
2.?.循跡模塊
?這里使用的四路循跡模塊
部分端口介紹:主板的OUT1-4端分別連接單片機的IO口,用于檢測輸出電平主板另一排針側(cè)的VCC GND IN1-4端分別和探頭部分對應連接IN端連接OUT端。
模塊原理:當探頭的紅外發(fā)射管發(fā)射光線經(jīng)地面反射進入接收管。輸出端輸出低電平,主板對應的led燈不亮。如果地面有黑色區(qū)域?qū)⑽展饩€,接收管接收不到光線輸出端就會輸出高
電平,主板的led燈會被點亮。?
?
?
代碼:?
#include <REGX52.H>
#include <intrins.H>
#include <Delay.h>
#include <xingshi.h>
sbit ?D1 = P2^7; ?//D1,D2為右邊循跡模塊 ? ? ? ? ? ? ? ? ? ?
sbit ?D2 = P2^6;?
sbit ?D3 = P2^5; ?//D3,D4為左邊循跡模塊
sbit ?D4 = P2^4;?
void xunji() ? ? ? ? //高電平檢測到,低電平為檢測
{
?? ?if(D1==1&&D2==1&&D3==1&&D4==1) ?//檢測到黑線,無返回
?? ?{
?? ??? ?qianji();
?? ?}
//*****************************************
?? ?
?? ?if(D1==0&&D2==1&&D3==0&&D4==0) ? //右邊檢測到黑線,小車偏左,讓車向右移動
?? ?{?? ??? ?
?? ??? ?youzhuan();
?? ??? ??? ?if(D1==0&&D2==0&&D3==0&&D4==0) ? //無黑線,檢測到白線
?? ??? ??? ?{?? ??? ??? ?
?? ??? ??? ??? ??? ?qianji();
?? ??? ??? ?}
?? ?}
?? ?
//******************************************
?? ?
?? ?if(D1==0&&D2==0&&D3==1&&D4==0) ? //左邊檢測到黑線,小車偏右,讓車向左移動
?? ?{?? ??? ?
?? ??? ?zuozhuan();
?? ??? ??? ?if(D1==0&&D2==0&&D3==0&&D4==0) ? //無黑線,檢測到白線
?? ??? ??? ?{?? ??? ??? ?
?? ??? ??? ??? ??? ?qianji();
?? ??? ??? ?}
?? ?}?? ?
?? ?
//***********************************************
?? ?
? if(D1==0&&D2==0&&D3==1&&D4==1) ? ?//左邊檢測到黑線,直角左拐
?? ?{?? ??? ?
?? ??? ?qianji();
?? ??? ?Delay(50); ? //直角左拐前延時50ms
?? ??? ??? ?if(D1==0&&D2==0&&D3==0&&D4==0) ? //無黑線,檢測到白線
?? ??? ??? ?{?? ??? ??? ?
?? ??? ??? ??? ??? ?tingzhi();
?? ??? ??? ??? ??? ?Delay(50);
?? ??? ??? ??? ? ?zuozhuan();
?? ??? ??? ?}
?? ?}?? ?
//*********************************************
?? ? if(D1==0&&D2==0&&D3==1&&D4==1) ? //右邊檢測到黑線,直角右拐
?? ?{?? ??? ?
?? ??? ?qianji();
?? ??? ?Delay(50); ? //直角右拐前延時50ms
?? ??? ??? ?if(D1==0&&D2==0&&D3==0&&D4==0) ? //無黑線,檢測到白線
?? ??? ??? ?{?? ??? ??? ?
?? ??? ??? ??? ??? ?tingzhi();
?? ??? ??? ??? ??? ?Delay(50);
?? ??? ??? ??? ? ?youzhuan();
?? ??? ??? ?}
?? ?}?? ?
?? ?
//***************************************************? ??
}
?
3.?紅外避障模塊
該傳感器模塊對環(huán)境光線適應能力強,其具有一對紅外線發(fā)射與接收管,發(fā)射管發(fā)射出一定頻率的紅外線,當檢測方向遇到障礙物(反射面)時,紅外線反射回來被接收管接收,經(jīng)過比較器電路處理之后,綠色指示燈會亮起,同時信號輸出接回輸出數(shù)字信號(一個低電平信號),可通過電位器旋鈕調(diào)節(jié)檢測距離,有效距離范圍2~30cm,工作電壓為3.3v-5v。該傳感器的探測距離可以通過電位器調(diào)節(jié)、具有干擾小、便于裝配、使用方便等特點,可以廣泛應用于機器人避障、避障小車、流水線計數(shù)及黑白線循跡等眾多場合。\n\n模塊參數(shù)\n當模塊檢測到前方障礙物信號時,電路板上綠色指示燈點亮,同時OUT端口持續(xù)輸出低電平信號\n\n該模塊測距離2~~30cm,檢測角度35°,檢測距離可以通過電位器進行調(diào)節(jié),順時針調(diào)電位器,檢測距離增加;逆時針調(diào)電位器,檢測距離減少。\n\n傳感器主動紅外線反射探測,因此目標的反射率和形狀是探測距離的關(guān)鍵。其中黑色探測距離小,白色大;小面積物體距離小,大面積距離大。\n\n傳感器模塊輸出端口OUT可直接與單片機IO口連接即可,也可以直接驅(qū)動一個5v繼電器\n\n比較器采用LM393,工作穩(wěn)定;\n\n可采用3-5v直流電源對模塊進行供電。當電源接通時,紅色電源指示燈點亮;\n\n具有3mm的螺絲孔,便于固定、安裝;\n\n電路板尺寸:3.2CM*1.4CM\n\n每個模塊在發(fā)貨已經(jīng)將閾值比較電壓通過電位器調(diào)節(jié)好,非特殊情況,請勿隨意調(diào)節(jié)電位器。\n\n接口說明\n1.VCC外接3.3v-5v電壓(可以直接與5v單片機和3.3v單片機相連)\n\n2、GND 外接GND\n\n3、OUT小板數(shù)字量輸出接口(0和1)。
?
?代碼:
?
#include <REGX52.H>
#include <Delay.H>
#include <xingshi.H>
sbit out1 = P1^1; ?//左邊的紅外探頭
sbit out2 = P1^2; ?//右邊的紅外探頭
? ?
void HWbizhang()
{
?? ?if(out1 == 0) ? ? //左邊檢測到障礙物
?? ?{
?? ??? ?tingzhi() ; ? ? //小車停止
?? ??? ?Delay(500);?? ??? ??? ?//停止500ms
? ? houtui();?? ??? ??? ? ?//小車后退
?? ??? ?Delay(1000); ? ?//后退1000ms
?? ??? ?youzhuan(); ? ? //小車右轉(zhuǎn)
?? ??? ?Delay(2000);
? ? qianji(); ?? ??? ?
?? ?}
?? ?
?? ?if(out2 == 0) ? ? //右邊檢測到障礙物
?? ?{
?? ??? ?tingzhi() ; ? ? //小車停止
?? ??? ?Delay(500);?? ??? ??? ?//停止500ms
? ? houtui();?? ??? ??? ? ?//小車后退
?? ??? ?Delay(1000); ? ?//后退1000ms
?? ??? ?zuozhuan(); ? ? //小車左轉(zhuǎn)
?? ??? ?Delay(2000);
? ? qianji(); ?? ??? ?
?? ?}
?? ?
?? ?if((out1 == 1)&&(out2 == 1))
?? ?{
?? ??? ?qianji(); ?? ?
?? ?}
?? ?
?? ?if((out1 == 0)&&(out1 == 0))
?? ?{
?? ??? ?tingzhi() ; ? ? //小車停止
?? ??? ?Delay(500);?? ??? ??? ?//停止500ms
? ? houtui();?? ??? ??? ? ?//小車后退
?? ??? ?Delay(1000); ? ?//后退1000ms
?? ??? ?youzhuan(); ? ? //小車右轉(zhuǎn)
?? ??? ?Delay(2000);
? ? qianji(); ?? ??? ?
?? ?}
}
?4.超聲波避障模塊
(1)給超聲波模塊接入電源和地
(2)給脈沖觸發(fā)引腳(trig)輸入一個長為20us的高電平方波
(3)輸入方波后,模塊會自動發(fā)射8個40KHz的聲波,與此同時回波引腳echo端的電平會由0變?yōu)?;(此時應該啟動定時器計時)
(4)當超聲波返回被模塊接收到時,回波引腳端的電平會由1變?yōu)?;(此時應該停止定時器計數(shù)),定時器記下的這個時間即為超聲波由發(fā)射到返回的總時長
根據(jù)聲音在空氣中的速度為344米/秒,即可計算出所測的距離。
?
?
代碼?
#include <REGX52.H>
#include <intrins.H>
#include <xingshi.H>
#include <Timer.H>
sbit Trig = P2^1;
sbit Echo = P2^2;
unsigned char sum; //超聲波測距
unsigned char stence; //與障礙物的限制距離
//***************************************************
void Delay1000ms() //@11.0592MHz 延時一秒
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//**********************************************
void Delay20us() //@11.0592MHz 延時20us
{
unsigned char i;
_nop_();
i = 6;
while (--i);
}
//******************************************
void chaoshengbo()
{
TMOD &= 0x0F; //設置定時器模式
TL1 = 0; //設置定時初始值
TH1 = 0; //設置定時初始值
Trig = 1; //發(fā)射20US的脈沖
Delay20us();
Trig = 0; //關(guān)閉
while(!Echo);//等待返回脈沖
TR1 = 1; //打開定時器1
while(!Echo);//返回脈沖結(jié)束
TR1 = 0; //關(guān)閉定時器1
sum = ((TH1*256+TL1)*0.034)/2+1; //計算距離公式
if( stence > sum)
{
tingzhi();
Delay1000ms();
}
}
?
5. 藍牙模塊
藍牙模塊的介紹:
????????藍牙模塊可通過與單片機的串口相連,借助電腦或手機的藍牙與單片機實現(xiàn)異步全雙工通信。常見的藍牙模塊有HC-05主從一體藍牙模塊、HC-06從機藍牙模塊、低功耗BLE藍牙模塊(cc2540或cc2541)。不同的藍牙模塊的AT指令集不完全相同。
????????工作模式:AT模式,這時我們可以給模塊發(fā)AT指令,從而可以查詢模塊的參數(shù)或者對模塊進行設置。此時指示燈為慢閃狀態(tài)。\n透傳模式,就是當藍牙模塊連接上之后,我們可以直接發(fā)送數(shù)據(jù)給藍牙模塊,而藍牙模塊不管我們發(fā)的是什么,都直接傳給對方。(這時發(fā)AT命令是無效的。)
????????藍牙模塊的使用:設置使用藍牙模塊的第一步為設置參數(shù),如波特率等。方法為將USB轉(zhuǎn)TTL模塊與藍牙模塊連接,連接方法為\n\n并將USB轉(zhuǎn)TTL模塊插入電腦,檢查設備管理器是否顯示串口。然后使用串口調(diào)試助手寫入AT指令進行查詢或操作指令。藍牙模塊的響應將在串口調(diào)試助手的接收區(qū)顯示。
?
?
?
代碼:?
#include <REGX52.H>
#include <intrins.H>
#include <xingshi.H>
#define left ? ? 'C'
#define right ? ?'D'
#define up ? ? ? 'A'
#define down ? ? 'B'
#define stop ? ? 'F'
unsigned char U_data; ? ? //接受數(shù)據(jù)存放
unsigned char Way;?
void UartInit(void)?? ??? ?//9600bps@11.0592MHz
{
?? ?PCON &= 0x7F;?? ??? ??? ?//波特率不倍速
?? ?SCON = 0x50;?? ??? ??? ?//8位數(shù)據(jù),可變波特率
//AUXR &= 0xBF;?? ??? ??? ?//定時器時鐘12T模式
//AUXR &= 0xFE;?? ??? ??? ?//串口1選擇定時器1為波特率發(fā)生器
?? ?TMOD &= 0x0F;?? ??? ? ?? ?//設置定時器模式
?? ?TMOD |= 0x20;?? ??? ? ?? ?//設置定時器模式
?? ?TL1 = 0xFD;?? ??? ??? ??? ?//設置定時初始值
?? ?TH1 = 0xFD;?? ??? ??? ??? ?//設置定時重載值
?? ?ET1 = 0;?? ??? ??? ? ?? ??? ?//禁止定時器中斷
?? ?TR1 = 1;?? ??? ? ??? ??? ?//定時器1開始計時
?? ?EA ?= 1;
?? ?ES ?= 1;
}
void receive(unsigned char m)
{
?? ?
?? ?switch(m)
?? ?{
?? ??? ?
?? ??? ?case ?'A': ? ? ?//前進
?? ??? ??? ?qianji();
?? ??? ?break;
?? ??? ?
?? ??? ?case ?'C':
?? ??? ??? ?zuozhuan(); ? ?// 左轉(zhuǎn)
?? ??? ?break;
?? ??? ?
?? ??? ?case ?'D':
?? ??? ??? ?youzhuan(); ?? ?// 右轉(zhuǎn)
?? ??? ?break;
?? ??? ?
?? ??? ?case 'B':
?? ??? ??? ?houtui(); ? // ?后退
?? ??? ?break;
?? ??? ?
?? ??? ?case 'F': ? ? ?// 停止
?? ??? ??? ? tingzhi();
?? ??? ?break;
?? ??? ?
?? ?}
?? ??? ?
}
//***************************************************************************
?? ?
void UartInit_seve() interrupt 4
{
?? ?
?? ?tingzhi();
?? ?RI = 0; ? ? ? ? ? ? ? ? ?//清除接受中斷標志位
?? ?U_data = SBUF; ? ??? ??? ??? ??? ?//接受數(shù)據(jù)
?? ?receive(U_data);
?? ?
}
?
三、其余模塊?
1.sg90舵機
SG90舵機簡介
? ? ? ?SG90舵機是一種位置(角度)伺服的驅(qū)動器,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。在機器人機電控制系統(tǒng)中,舵機控制效果是性能的重要影響因素。舵機可以在微機電系統(tǒng)和航模中作為基本的輸出執(zhí)行機構(gòu),其簡單的控制和輸出使得單片機系統(tǒng)非常容易與之接口。
SG90舵機應用
? ? ? SG90舵機目前在高檔遙控玩具,如航模、包括飛機模型、潛艇模型、遙控機器人中已經(jīng)使用得比較普遍。
SG90舵機導線
? ? ? SG90舵機上有三根線,分別是GND(棕色線)、VCC(紅色線)和SIG(黃色線),也就是地線、電源線和信號線。
SG90舵機工作原理
? ? ? 控制信號由接收機的通道進入信號調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個基準電路,產(chǎn)生周期為20ms,寬度為1.5ms 的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負輸出到電機驅(qū)動芯片決定電機的正反轉(zhuǎn)。當電機轉(zhuǎn)速一定時,通過級聯(lián)減速齒輪帶動電位器旋轉(zhuǎn),使得電壓差為0,電機停止轉(zhuǎn)動。當然我們可以不用去了解它的具體工作原理,知道它的控制原理就夠了。就象我們使用晶體管一樣,知道可以拿它來做開關(guān)管或放大管就行了,至于管內(nèi)的電子具體怎么流動是可以完全不用去考慮的。
?
?
#include <REGX52.H>
#include <intrins.H>
#include <Delay.h>
#include <xingshi.h>
#include <Timer1.h>
sbit PWM = P1^0; //型號輸入點
unsigned char counter,angle; //計數(shù)值和旋轉(zhuǎn)角度
void Timer1_Init() //500微秒@11.0592MHz
{
// AUXR &= 0xBF; //定時器時鐘12T模式
TMOD &= 0x0F; //設置定時器模式
TL1 = 0x33; //設置定時初始值
TH1 = 0xFE; //設置定時初始值
TF1 = 0; //清除TF1標志
TR1 = 1;
ET1 = 1;
EA = 1;
PT1 = 1;
}
//**************************************************
void Timer1_Sever() interrupt 3
{
TL1 = 0x33; //設置定時初始值
TH1 = 0xFE; //設置定時初始值
counter++;
if(counter >= 40) //設置周期為2毫秒
{
counter=0;
}
if(counter < angle)
{
PWM = 1;
}
else
{
PWM = 0;
}
}
//************************************************************
void Duoji() //定時器定時500微妙
{
counter = 0;
angle = 1; // 0度
Delay(500);
counter = 0;
angle = 2; // 45度 (-45)
Delay(500);
counter = 0;
angle = 3; // 90度(正)歸中
Delay(500);
Delay(500);
counter = 0; // 135度 (+45)
angle = 4;
Delay(500);
counter = 0;
angle = 5; // 180度
Delay(500);
}
2.穩(wěn)壓模塊
LM2596屬于常用的開關(guān)電源芯片,其最高輸入電壓為40V,最高輸出電壓為37V,LM2596有4個版本,3個固定輸出版本3.3V、5V、 12V,以及一個ADJ可調(diào)版本,最大輸出電流3A,轉(zhuǎn)換效率可達80%~90%左右,使用DCDC模塊1205模塊實現(xiàn)12V轉(zhuǎn)5V輸出,使用1205模塊進行電壓轉(zhuǎn)換原理也簡單,還有一個優(yōu)點就是輸入與輸出隔離,該芯片輸 出功率2W,最大輸出電流400mA。文章來源:http://www.zghlxwxcb.cn/news/detail-442665.html
?四、總結(jié)
基于51單片機的智能小車種類很多,博主也是初學者,文中右錯誤的地方請大家指正,希望本片文章對大家右?guī)椭?,大家一起加油?。。?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-442665.html
到了這里,關(guān)于基于51單片機的智能小車(循跡、避障、藍牙控制)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!