版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【51】基于51單片機(jī)的藍(lán)牙控制小車(chē)的簡(jiǎn)單實(shí)現(xiàn)(有源代碼,無(wú)圖)原文地址:?mod=viewthread&tid=544143此帖子現(xiàn)在有一個(gè)后續(xù)版本,實(shí)現(xiàn)了手機(jī)端的藍(lán)牙程序控制小車(chē)運(yùn)動(dòng)以及接收小車(chē)狀態(tài)并展示,鏈接地址:...d&tid=544299&page=1
最初的想法是做一個(gè)紅外遙控的裝置,鏈接地址:
...d&tid=540165&extra=
我只需要前進(jìn)和停止,二路遙控,想使用模擬電路搭建,但最后也沒(méi)能完成,這個(gè)想法依然在,現(xiàn)在只能留帶以后是否有想法再做了。
第二個(gè)想法是想做一個(gè)小車(chē),小車(chē)的功能如下:前進(jìn),后退,轉(zhuǎn)彎,遙控控制,自主智能運(yùn)轉(zhuǎn)。上某寶買(mǎi)了一個(gè)小車(chē)的底座(4驅(qū)動(dòng)的,帶電機(jī)),買(mǎi)了兩個(gè)L298N驅(qū)動(dòng)模塊用來(lái)驅(qū)動(dòng)小車(chē),買(mǎi)了藍(lán)牙模塊(HC05)用來(lái)充當(dāng)遙控。
實(shí)踐篇:
1,首先根據(jù)51單片機(jī)的最小系統(tǒng)的電路圖,焊接了一個(gè)最小系統(tǒng)板,使用的STC89c52的單片機(jī)(晶振6Mhz,帶復(fù)位電路,復(fù)位指示燈顯示),為了便于測(cè)試,又焊接了一個(gè)發(fā)光二極管連接一個(gè)I/O口,用于測(cè)試最小系統(tǒng)。
2,然后開(kāi)始測(cè)試最小系統(tǒng),不過(guò)我很多年沒(méi)有用過(guò)keil和下載器了,就上網(wǎng)尋找了一下關(guān)于這方面的帖子,過(guò)程總結(jié)如下:
最小系統(tǒng)測(cè)試篇:
要測(cè)試最小系統(tǒng),首先需要編譯代碼的工具(我用的keil),下載代碼到單片機(jī)的工具(stc-isp),usb轉(zhuǎn)ttl硬件設(shè)備(某寶上2塊多錢(qián)買(mǎi)的),串口調(diào)試助手(使用的是單片機(jī)多功能調(diào)試助手PortHelper.exe),于是從網(wǎng)上下載了keil4破解版本,stc-isp下載軟件,單片機(jī)多功能調(diào)試助手三個(gè)軟件。
第一步:測(cè)試usb轉(zhuǎn)ttl是否可用(就4個(gè)引腳,5v,GND,TX,RX)
打開(kāi)串口調(diào)試助手,設(shè)置波特率,打開(kāi),發(fā)現(xiàn)打開(kāi)失敗,比較郁悶,為何呢?極有可能是串口號(hào)不對(duì),于是打開(kāi)我的電腦-》管理-》設(shè)備管理器,找到串口的條目,查看它的串口號(hào),我的竟然是串口號(hào)12.于是設(shè)置串口號(hào),重新打開(kāi),OK。如何測(cè)試usb轉(zhuǎn)ttl呢?我的想法是如果發(fā)送數(shù)據(jù)的話,對(duì)應(yīng)的tx引腳應(yīng)該有信號(hào),如果將TX和RX連接到一起,那么發(fā)送出去的應(yīng)該自己可以接收到。我沒(méi)有示波器,就簡(jiǎn)單的使用萬(wàn)用表量它的TX引腳的電壓,點(diǎn)擊發(fā)送按鈕,發(fā)現(xiàn)TX引腳的電壓有波動(dòng)即可。
第二步:將usb轉(zhuǎn)ttl的四個(gè)引腳接入到單片機(jī)的對(duì)應(yīng)引腳即可(其實(shí)就是VCC接VCC,GND接GND,TX接RX,RX接TX)。沒(méi)有采用外部供電,直接利用usb轉(zhuǎn)ttl進(jìn)行的5v供電
第三步:在keil中寫(xiě)代碼,對(duì)單片機(jī)的某一個(gè)I/O進(jìn)行翻轉(zhuǎn)電平的操作,代碼如下
sbitLED=P0^0;
while(1){
LED=!LED
Delay10ms(100);
}
第四步:編譯程序,生成HEX文件
第五步:打開(kāi)stc-isp下載工具,選擇單片機(jī)型號(hào),hex程序位置,點(diǎn)擊下載即可,如果識(shí)別了單片機(jī)的話,會(huì)出現(xiàn)給MCU重新上電的字樣,這個(gè)時(shí)候只需要關(guān)閉再打開(kāi)MCU的電源開(kāi)關(guān)即可,就會(huì)出現(xiàn)燒寫(xiě)程序的過(guò)程。
最小系統(tǒng)測(cè)試篇遇到的問(wèn)題,回憶篇:
51單片機(jī)的電源供電問(wèn)題,忘了接單片機(jī)的VCC引腳了(如果是這方面的問(wèn)題,就檢查幾個(gè)關(guān)鍵地方,vcc和地接好了嗎,tx和rx接好了嗎,晶振接好了嗎,復(fù)位電路先不用管,我是使用的萬(wàn)用表一個(gè)個(gè)的量的)
晶振的電路沒(méi)焊好(萬(wàn)用表搞定)
usb轉(zhuǎn)ttl找不到串口(軟件問(wèn)題的話,容易解決,也有可能是usb轉(zhuǎn)ttl硬件有問(wèn)題,驅(qū)動(dòng)沒(méi)有安裝成功,導(dǎo)致識(shí)別不了硬件)
第六步:用萬(wàn)用表量P0^0口,查看電壓是否1秒一次變化即可。
3,藍(lán)牙模塊工作篇
從某寶上花了17大洋買(mǎi)了一個(gè)HC05藍(lán)牙主從模塊,有6個(gè)引腳(VCC,GND,TX,RX,AT,STATUS),前4個(gè)引腳與usb轉(zhuǎn)ttl的接法相同(注意RX,TX交叉接線接入到單片機(jī)),AT和STatus引腳是我自己命的名字。AT引腳高電平有效,用于藍(lán)牙模塊進(jìn)入AT狀態(tài)(所謂AT狀態(tài),即是其他程序可以通過(guò)它的引腳向藍(lán)牙模塊發(fā)送AT控制命令,例如設(shè)置波特率,查看版本號(hào),設(shè)置主從模式),AT引腳懸空默認(rèn)為低電平。Status引腳用于顯示配對(duì)的狀態(tài)(配對(duì)成功輸出高電平,未配對(duì)輸出低電平)
藍(lán)牙模塊測(cè)試篇:
第一步:藍(lán)牙模塊既然包含串口,那么它應(yīng)該可以跟usb轉(zhuǎn)ttl直接連接,使用電腦向藍(lán)牙模塊發(fā)送命令。于是連接藍(lán)牙模塊與usb轉(zhuǎn)ttl的對(duì)應(yīng)引腳。
第二步:將AT引腳懸空,使用手機(jī)搜索周?chē)乃{(lán)牙設(shè)備,發(fā)現(xiàn)有HC05的藍(lán)牙(因?yàn)檫@個(gè)藍(lán)牙模塊默認(rèn)是從模塊,可以被收到)
第三步:將AT引腳拉高電平,使其進(jìn)入AT狀態(tài)(按照文檔描述,如果上電之后再置位AT,指示燈無(wú)變化,依舊是,如果上電之前拉高AT,指示燈轉(zhuǎn)為1秒一次),然后通過(guò)電腦串口發(fā)送AT+VERSION?(注意需要換行)查看版本號(hào),使用AT+UART?查看波特率(默認(rèn)9600,不帶校驗(yàn))
此文檔有用:ATK-HC05-V11用戶手冊(cè)_V1.0.pdf
第四步:實(shí)驗(yàn)了一下,我的模塊有問(wèn)題,就是上電之前拉高AT,模塊不接受AT命令,只有上電后拉高AT才有用,不過(guò)不影響使用。
第五步:將藍(lán)牙模塊和usb轉(zhuǎn)ttl連接后,AT保持懸空,即藍(lán)牙模塊為從模塊,手機(jī)安裝藍(lán)牙串口助手,打開(kāi)手機(jī)藍(lán)牙,然后搜索HC05,配對(duì),然后打開(kāi)手機(jī)端的藍(lán)牙串口助手軟件,向HC05發(fā)送消息,如果藍(lán)牙模塊工作正常,那么電腦端的串口調(diào)試助手應(yīng)該收到手機(jī)發(fā)送的消息。同樣的也可以通過(guò)電腦端發(fā)送消息,到手機(jī)端。
消息傳遞流程如下:手機(jī)端藍(lán)牙串口助手->手機(jī)藍(lán)牙->空氣
->HC05藍(lán)牙模塊->USB轉(zhuǎn)ttl模塊->電腦的串口調(diào)試助手,反過(guò)來(lái)也是可行的(注意線路連接方式都是RX與TX交叉連接)
藍(lán)牙模塊與單片機(jī)集成調(diào)試篇:
上面的測(cè)試已經(jīng)證明了藍(lán)牙模塊是可以發(fā)送接收手機(jī)端消息的,現(xiàn)在開(kāi)始將藍(lán)牙模塊與單片機(jī)的TX,RX接口連接起來(lái),通過(guò)程序控制藍(lán)牙模塊與手機(jī)藍(lán)牙進(jìn)行溝通,從而達(dá)到利用手機(jī)藍(lán)牙進(jìn)行遙控的目的。
main函數(shù)如下,主要設(shè)置串口波特率,以及開(kāi)啟串口中斷
//PCON:SMOD位默認(rèn)為0,串行口波特率加倍位
PCON=0x80;
//SMOD=1;
TMOD=0x20;
//8位自動(dòng)加載計(jì)數(shù)器
//TH1=0xfd;
TL1=0xfd;
for11.0592MHZandSMOD=0,
TH1=0xf3;//2400bps
TL1=0xf3;
TR1=1;
//T1
//SCON:0x50=SM0=0,SM1=1,REN=1
REN=1;
SM0=0;
SM1=1;//串口
EA=1;//中斷
ES=1;
串口中斷函數(shù)
voidserial()interrupt4
{
charsbuf;
sbuf=SBUF;
switch(sbuf)
{
case'f':direc=4;break;
case'b':direc=5;break;
case'l':direc=6;break;
case'r':direc=7;break;
case's':direc=-1;break;
default:LED=!LED;//LED為一個(gè)I/O引腳,控制發(fā)光二極管
}
RI=0;
}
遇到的問(wèn)題:
利用手機(jī)給藍(lán)牙HC05發(fā)送消息,如果不是switch中的幾個(gè)case的話,那么LED燈會(huì)明暗變化,但是剛開(kāi)始的測(cè)試卻始終不如意。而后仔細(xì)查看了代碼,并沒(méi)有發(fā)現(xiàn)什么錯(cuò)誤,后來(lái)懷疑是波特率的問(wèn)題,因?yàn)槲业木д袷?Mhz的,藍(lán)牙模塊的波特率是9600.我手動(dòng)計(jì)算了一下:
采用波特率倍頻,那么計(jì)算如下6*1000000*2/12/32/9600=3.255,取整為3.然后使用3反代入到此式子中
6*1000000*2/12/32/3=10416.7與9600相差1000多,這個(gè)似乎差距太大了。我又嘗試了其他幾個(gè)參數(shù),像4800,19200,38400都相差挺大的,估計(jì)就是這個(gè)原因。于是繼續(xù)嘗試,發(fā)現(xiàn)2400的話,相差不多。6*1000000*2/12/32/2400=13.02,然后使用13代入進(jìn)去結(jié)果為2403.8,與2400的波特率相差很小,估計(jì)是可以用的。但是看藍(lán)牙模塊的文檔,發(fā)現(xiàn)它說(shuō)不支持2400的,我不甘心,就使用usb轉(zhuǎn)ttl模塊設(shè)置了一下2400,沒(méi)想到AT命令還真的返回OK了,單片機(jī)程序也可以正常工作了。
4,小車(chē)驅(qū)動(dòng)篇:
將兩個(gè)L298N模塊與單片機(jī)的P2口直接相連(小車(chē)4輪驅(qū)動(dòng),每個(gè)電機(jī)需要兩個(gè)輸入引腳,以及一個(gè)使能引腳,那就是12個(gè)引腳,我剛開(kāi)始并不想支持調(diào)速的功能,因此使能引腳直接高電平了,就連接了8個(gè)I/O口)。注意L298N的GND引腳一定要和單片機(jī)的GND共地。
關(guān)于L298N:它的EN引腳用于使能,EN為高電平,才使能。另外兩個(gè)輸入引腳IN1,IN2根據(jù)電平的組合變化會(huì)有4種情況(00,10,01,11),電機(jī)相應(yīng)的在00和11停止(這個(gè)停止是帶電的,類(lèi)似于鎖死的感覺(jué)),在10正轉(zhuǎn),01反轉(zhuǎn)??梢灾苯邮褂脝纹瑱C(jī)的VCC和GND連接L298N的IN1和IN2,同時(shí)將EN端接VCC,看電機(jī)轉(zhuǎn)不轉(zhuǎn)就可以測(cè)試L298N模塊了。
編寫(xiě)程序,控制輪子的正轉(zhuǎn),翻轉(zhuǎn),停止等。基本上就是以下的這種代碼
voidwheelForward(ucharwhich)
{
switch(which)
{
case1:
{
wheel_1_1=0;
wheel_1_2=1;
break;
}
case2:
{
wheel_2_1=0;
wheel_2_2=1;
break;
}
case3:
{
wheel_3_1=0;
wheel_3_2=1;
break;
}
case4:
{
wheel_4_1=0;
wheel_4_2=1;
break;
}
}
}
遇到的問(wèn)題:
問(wèn)題1:剛開(kāi)始L298N直接連接P0口,死活不轉(zhuǎn),而直接引出高低電平到某一個(gè)電機(jī)的IN1,IN2口,電機(jī)正常運(yùn)轉(zhuǎn)。于是猜測(cè)是I/O有問(wèn)題,使用萬(wàn)用表測(cè)量,發(fā)現(xiàn)P0的I/O在輸出高電平的時(shí)候,根本不是高電平,而后發(fā)了帖子,詢(xún)問(wèn)了一下才知道P0口在高電平是呈現(xiàn)高阻態(tài)的,需要外部焊接電路加上拉電阻才可工作。我不想焊接過(guò)多的電路,就將其I/O換到P2口,可以正常工作
帖子鏈接地址:
...8&page=1#pid4108114
問(wèn)題2:我使用的是路由器的9v直流電源,使用其帶動(dòng)兩個(gè)L298N,同時(shí)將L298N的輸出的一個(gè)5V高電平接到單片機(jī)上給單片機(jī)供電,啟動(dòng)4輪驅(qū)動(dòng),電機(jī)只會(huì)翁的一聲,然后啥也沒(méi)有,二輪驅(qū)動(dòng)也不轉(zhuǎn)。上網(wǎng)查看了不少資料,基本上都是電源功率過(guò)低,需要將單片機(jī)與L298N分別供電才可以。于是使用筆記本的usb口給單片機(jī)供電,使用9v直流電源給電機(jī)供電,比剛才好了一些,兩輪可以轉(zhuǎn),但是4個(gè)輪子還是轉(zhuǎn)不了。沒(méi)辦法,想到自己有一個(gè)小的卡片相機(jī),有鎳氫電池8節(jié),然后上網(wǎng)買(mǎi)了一個(gè)電池盒,裝上去,電機(jī)轉(zhuǎn)的吼吼叫,同時(shí)L298N給單片機(jī)供電也沒(méi)問(wèn)題。
問(wèn)題3:
關(guān)于L298N同時(shí)給單片機(jī)供電的問(wèn)題,大家可以在啟動(dòng)輪子轉(zhuǎn)動(dòng)的時(shí)候量一量單片機(jī)的電源電壓,會(huì)發(fā)現(xiàn)在電機(jī)啟動(dòng)的一剎那,單片機(jī)的電壓有一個(gè)瞬時(shí)的拉低,這樣單片機(jī)就會(huì)復(fù)位了。
5,藍(lán)牙遙控小車(chē)匯總篇
第一步:部署小車(chē),L298N,鎳氫電池盒,藍(lán)牙模塊組裝到一起
第二步:編寫(xiě)代碼,本來(lái)可以使用EN口進(jìn)行調(diào)速控制的,但是考慮到還需要使用額外的I/O口,就先不打算做了。
代碼完成的功能:
小車(chē)前進(jìn),后退,停止,左轉(zhuǎn),右轉(zhuǎn)
小車(chē)單個(gè)輪子的轉(zhuǎn)動(dòng)(用于測(cè)試)
小車(chē)當(dāng)前狀態(tài)的獲取(用于后期給小車(chē)增加其他模塊的時(shí)候,例如溫度模塊,就可以讀取溫度了)
小車(chē)命令幫助
代碼思路:
首先完成單個(gè)輪子的控制
再完成小車(chē)的控制
再加入串口接收中斷,收到不同命令,設(shè)置方向變量
main程序讀取方向變量控制不同的方向
6,思路篇
一些比較有特點(diǎn)的思路:
思路1:一個(gè)棘手的問(wèn)題想實(shí)現(xiàn)這樣的功能:用戶按鍵,小車(chē)才走,用戶松開(kāi)按鍵,小車(chē)停止。
我的想法如下:小車(chē)使用一個(gè)定時(shí)器T0,控制定時(shí)器的延時(shí)時(shí)間為100ms,用戶每發(fā)送一個(gè)前進(jìn)信號(hào),小車(chē)會(huì)前進(jìn)100ms,但是這100ms內(nèi)小車(chē)還需要能夠響應(yīng)外部的命令。例如如果用戶在t=0ms發(fā)送前進(jìn)命令,然后在t=50ms發(fā)送左轉(zhuǎn)命令,小車(chē)能夠立刻左轉(zhuǎn),而不是繼續(xù)前進(jìn)100ms,然后才執(zhí)行左轉(zhuǎn)的命令?;镜拇a思路是用戶的每一個(gè)命令,都會(huì)重置timer0,timer0的超時(shí)中斷函數(shù)會(huì)將小車(chē)停止。這樣用戶只要以連續(xù)的小于100ms間隔發(fā)送前進(jìn)命令,小車(chē)就會(huì)一直前進(jìn),也就是說(shuō)timer0的中斷沒(méi)有執(zhí)行,如果用戶間隔100ms還沒(méi)有發(fā)送命令,那么小車(chē)停止。當(dāng)前我使用的藍(lán)牙串口助手它的按鍵不支持連續(xù)發(fā)送,只能按下松開(kāi)手,才會(huì)發(fā)送消息,這樣我現(xiàn)在就把時(shí)間間隔設(shè)置為1000ms,用戶只要以小于1000ms的間隔連續(xù)按鍵,小車(chē)就會(huì)一直前進(jìn),如果不按鍵,小車(chē)會(huì)繼續(xù)前進(jìn)1000ms才會(huì)停止。后期打算找到藍(lán)牙串口調(diào)試助手的源代碼,修改它的源代碼,設(shè)置成如果用戶按下不丟,小車(chē)前進(jìn)命令能夠一直發(fā)送。
思路2:
既然有
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年長(zhǎng)春市東北師范大學(xué)醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024年長(zhǎng)興縣人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024年鎮(zhèn)寧布依族苗族自治縣人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024年金溪縣中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2023-2024學(xué)年七年級(jí)下冊(cè)道德與法治期末模擬卷02(解析版)
- 城市基礎(chǔ)設(shè)施資產(chǎn)管理合同
- 醫(yī)療器械公司總裁招聘合同樣本
- 辦公區(qū)休閑區(qū)域施工合同模板
- 機(jī)場(chǎng)航站樓廊架施工合同
- 保安公司人事經(jīng)理聘用合同樣本
- 《濟(jì)南聯(lián)通公司成本管理問(wèn)題及解決策略7000字論文》
- 給志愿者培訓(xùn)
- 191118-鋰離子電池專(zhuān)業(yè)術(shù)語(yǔ)英語(yǔ)對(duì)照大全
- 2024全新網(wǎng)絡(luò)與數(shù)據(jù)安全培訓(xùn)
- 2023年貴州黔東南州州直機(jī)關(guān)遴選公務(wù)員筆試真題
- 心腦血管疾病預(yù)防課件
- DB35T 1036-2023 10kV及以下電力用戶業(yè)擴(kuò)工程技術(shù)規(guī)范
- 中國(guó)移動(dòng)自智網(wǎng)絡(luò)白皮書(shū)(2024) 強(qiáng)化自智網(wǎng)絡(luò)價(jià)值引領(lǐng)加速邁進(jìn)L4級(jí)新階段
- 2024-2030年中國(guó)牛仔服裝行業(yè)市場(chǎng)深度調(diào)研及發(fā)展策略研究報(bào)告
- 數(shù)據(jù)中心災(zāi)難恢復(fù)預(yù)案
- 《電氣檢測(cè)技術(shù)》教學(xué)大綱
評(píng)論
0/150
提交評(píng)論