自動(dòng)避障小車課程設(shè)計(jì)

上傳人:仙*** 文檔編號(hào):29578936 上傳時(shí)間:2021-10-07 格式:DOC 頁(yè)數(shù):45 大?。?5.62MB
收藏 版權(quán)申訴 舉報(bào) 下載
自動(dòng)避障小車課程設(shè)計(jì)_第1頁(yè)
第1頁(yè) / 共45頁(yè)
自動(dòng)避障小車課程設(shè)計(jì)_第2頁(yè)
第2頁(yè) / 共45頁(yè)
自動(dòng)避障小車課程設(shè)計(jì)_第3頁(yè)
第3頁(yè) / 共45頁(yè)

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《自動(dòng)避障小車課程設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《自動(dòng)避障小車課程設(shè)計(jì)(45頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、. 單片機(jī)系統(tǒng) 課 程 設(shè) 計(jì) 成績(jī)?cè)u(píng)定表 設(shè)計(jì)課題 : 自動(dòng)避障小車 學(xué)院名稱 : 電氣工程學(xué)院 專業(yè)班級(jí) : 自動(dòng)1105 學(xué)生姓名 : 學(xué) 號(hào) : 指導(dǎo)教師 :

2、 設(shè)計(jì)地點(diǎn) : 31-630 設(shè)計(jì)時(shí)間 : 指導(dǎo)教師意見: 成績(jī): 簽名: 年 月 日 . 單片機(jī)系統(tǒng) 課 程 設(shè) 計(jì) 課程設(shè)計(jì)名稱: 自動(dòng)避障小車 專 業(yè) 班 級(jí) : 自動(dòng)1105

3、 學(xué) 生 姓 名 : 學(xué) 號(hào) : 指 導(dǎo) 教 師 : 課程設(shè)計(jì)地點(diǎn): 31-630 課程設(shè)計(jì)時(shí)間: 單片機(jī)系統(tǒng) 課程設(shè)計(jì)任務(wù)書 學(xué)生姓名 專業(yè)班級(jí) 學(xué)號(hào)

4、 題 目 自動(dòng)避障小車 課題性質(zhì) 產(chǎn)品設(shè)計(jì) 課題來(lái)源 自擬 指導(dǎo)教師 主要內(nèi)容 (參數(shù)) 利用增強(qiáng)版51MCU設(shè)計(jì)一個(gè)自動(dòng)避障小車,實(shí)現(xiàn)以下功能: 1、自主判別障礙,自動(dòng)避開障礙; 2、識(shí)別出多障礙區(qū)和空曠區(qū); 3、能在空曠區(qū)快速行進(jìn),在多障礙區(qū)適當(dāng)速度行進(jìn)。 任務(wù)要求 (進(jìn)度) 第1天:熟悉課程設(shè)計(jì)任務(wù)及要求,查閱技術(shù)資料,確定設(shè)計(jì)方案。 第2-5天:按照確定的方案設(shè)計(jì)電路。畫出總體電路圖,而且選好各個(gè)元件的參數(shù)、數(shù)量類型。然后由原理圖生成PCB,用熱轉(zhuǎn)印法腐蝕這個(gè)電路板。 第6-7天:構(gòu)建硬件系統(tǒng),并且測(cè)試確認(rèn)都可以正常工作。之后完成機(jī)械部分和

5、硬件部分的搭建。 第8-11天:編寫程序,設(shè)計(jì)軟件,并且開始撰寫課程設(shè)計(jì)報(bào)告。 第12-13天:整體調(diào)試,逐步完善。 第14天:完成課程設(shè)計(jì)報(bào)告。 主要參考 資料 【1】張迎新.單片微型計(jì)算機(jī)原理、應(yīng)用及接口技術(shù)(第2版)[M].北京:國(guó)防工業(yè)出版社,2004 【2】《單片機(jī)程序設(shè)計(jì)實(shí)例》清華大學(xué)出版社 【3】《 單片機(jī)應(yīng)用設(shè)計(jì)200例》 【4】《單片機(jī)程序設(shè)計(jì)及應(yīng)用》李華軍,電子工業(yè)出版社 審查意見 系(教研室)主任簽字: 年 月 日 目 錄 1概述 4

6、 1.1研究背景 4 1.2設(shè)計(jì)思想及基本功能 4 2總體方案設(shè)計(jì) 4 2.1方案論證 4 2.2系統(tǒng)框圖 5 2.3總體方案設(shè)計(jì) 6 3硬件電路設(shè)計(jì) 7 3.1電源電路 8 3.2晶振電路 9 3.3復(fù)位電路 10 3.4鍵盤電路 10 3.5顯示電路 11 3.6超聲波測(cè)距電路 12 3.7舵機(jī)電路 13 3.8電機(jī)驅(qū)動(dòng)電路 14 3.9電機(jī)轉(zhuǎn)速測(cè)量電路 13 3.10設(shè)計(jì)PCB和腐蝕電路板 14 4系統(tǒng)軟件設(shè)計(jì) 16 4.1分模塊程序設(shè)計(jì) 17 4.2主程序設(shè)計(jì) 20 5系統(tǒng)調(diào)試 22 6總結(jié) 22 參考文獻(xiàn): 23 附錄A硬件電路圖 24

7、 附錄B 源程序 25 1概述 1.1研究背景 科技的發(fā)展趨勢(shì)之一就是讓幾乎所有的東西具有一定的智能。這樣的智能一方面可以避免人的復(fù)雜性帶來(lái)的錯(cuò)誤,另一方面,作為人的能力的延伸,快速、便捷地適應(yīng)環(huán)境。本文研究的超聲波自動(dòng)避障小車,就是讓小車具有一定的智能,可以作為有人駕駛車輛的一部分,幫助司機(jī)及早發(fā)現(xiàn)司機(jī)還未覺察的危險(xiǎn)。另外,可以應(yīng)用在無(wú)人控制系統(tǒng)里,代替人類完成信息接收、處理和判斷。那么這樣它還有更廣闊的應(yīng)用和發(fā)展空間。這個(gè)月我國(guó)嫦娥三號(hào)載著玉兔號(hào)月球車踏上了月球,已經(jīng)開始探索活動(dòng)。玉兔號(hào)月球車可以自動(dòng)尋找有價(jià)值的目標(biāo),自動(dòng)避開障礙物,自動(dòng)尋找最優(yōu)路徑等等,這些功能在原理上都差不多

8、,只是所用儀器以及控制算法的不同。 1.2設(shè)計(jì)思想及基本功能 小車設(shè)計(jì)的基本思路是:不斷掃描前方180左右的水平面內(nèi)的物體,根據(jù)反饋的距離和方位信息確定前方的地形是開闊還是多障礙。然后根據(jù)這些信息通過(guò)路徑最優(yōu)算法選擇前進(jìn)方向。 小車的基本功能是識(shí)別空曠區(qū)和多障區(qū);自動(dòng)避開障礙物;能夠在空曠區(qū)快速行駛。 2總體方案設(shè)計(jì) 2.1方案論證 首先是測(cè)距方案: 方案一:激光測(cè)距 優(yōu)點(diǎn):測(cè)速快,適應(yīng)范圍廣,精確;不過(guò)相對(duì)于自動(dòng)避障小車系統(tǒng),有點(diǎn)大材小用。激光測(cè)距是點(diǎn)對(duì)點(diǎn)的測(cè)距,一般進(jìn)行遠(yuǎn)距離測(cè)距比較精確。如是近距離激光測(cè)距,必須要涉及到微小時(shí)間測(cè)量,51MCU無(wú)法勝任。因此激光測(cè)距方案否定

9、。 方案二:超聲波測(cè)距 優(yōu)點(diǎn):結(jié)構(gòu)簡(jiǎn)單,成本低,便于與MCU聯(lián)機(jī)工作。測(cè)量范圍從5CM到幾百米的距離內(nèi)精度在毫米級(jí)。盡管它測(cè)量的是點(diǎn)到面的距離,但是定向性滿足本小車系統(tǒng)的要求。而且,數(shù)據(jù)處理簡(jiǎn)單??梢钥紤]。 方案三:雷達(dá)測(cè)距 不太現(xiàn)實(shí),受到本人技術(shù)水平限制,無(wú)法駕馭雷達(dá)測(cè)距系統(tǒng),此外,雷達(dá)應(yīng)用于較大范圍的測(cè)量和監(jiān)控,如果用于本小車,同樣涉及到微小時(shí)間測(cè)量,以及雷達(dá)數(shù)據(jù)處理,51MCU難以勝任。否定! 方案四:紅外線測(cè)距 優(yōu)點(diǎn):技術(shù)難度低,數(shù)據(jù)處理簡(jiǎn)單,但是測(cè)量開關(guān)信號(hào)比較好,測(cè)量連續(xù)信號(hào)不夠準(zhǔn)確。測(cè)量的精度有點(diǎn)低。因此不是一種較好的測(cè)距方法。 綜合各因素,選用超聲波測(cè)距。 其次

10、是微控制器的選擇: 可選的微控制器有:51系列的STC89C52RC、STC12C5A60S2;TI公司的MSP430G2553;飛思卡爾的MC9S12XS128MAL;意法的STM32F407-Discovery;(這些玩兒過(guò)一點(diǎn),而且最小系統(tǒng)板手邊都有) 根據(jù)本系統(tǒng)的需求,需要兩路同頻率(50hz)的PWM控制兩個(gè)舵機(jī)、一路PWM頻率約幾千赫茲控制電機(jī)、三個(gè)個(gè)定時(shí)器做脈沖捕捉、至少兩個(gè)外部中斷輸入、一個(gè)并行6800總線接口。除了51系列的兩款,其他一片足以勝任。而且對(duì)于意法的F407顯得大材小用。飛思卡爾的S12比較合適;TI的G2553的引腳有點(diǎn)少(20個(gè)),外圍電路設(shè)計(jì)的會(huì)復(fù)雜一點(diǎn)

11、,成本也會(huì)高一點(diǎn)。60S2用兩片比較合適; 用89C52比較麻煩,兩片也不夠。根據(jù)個(gè)人能力,以及時(shí)間和進(jìn)度方面考慮選用60S2,60S2呢,它的資源有:完全兼容51 的兩個(gè)定時(shí)器T0、T1和兩個(gè)外部中斷;兩路擁有獨(dú)立波特率的串行口;一個(gè)PCA定時(shí)器,可產(chǎn)生兩路同頻的PWM;八個(gè)10位精度的AD 轉(zhuǎn)換通道; 一個(gè)硬件SPI接口。 2.2系統(tǒng)框圖 系統(tǒng)框圖如圖2.2所示 圖2.2系統(tǒng)框圖 2.3 總體方案設(shè)計(jì) 兩片60S2一個(gè)做主機(jī),一個(gè)做從機(jī),通過(guò)串行口通信,傳遞數(shù)據(jù)。 主機(jī)用到的功能有: (1)、定時(shí)器T1和外部中斷INT1,作用是:測(cè)脈寬,用到的IO是P3^3

12、;P2^0作為超聲波測(cè)距模塊的觸發(fā)功能引腳; (2)、定時(shí)器T0和PCA產(chǎn)生兩路同頻率的PWM,作用是:T0的溢出率作為PCA的計(jì)數(shù)脈沖產(chǎn)生50HZ的PWM控制兩路舵機(jī)。使用T0作為PCA的時(shí)鐘源,可以通過(guò)改變T0的溢出率改變輸出的頻率。用到的IO是P1^3和P1^4; (3)、外部中斷INT0接一個(gè)按鍵。 (4)、串口一使用獨(dú)立波特率發(fā)生器,與從機(jī)通P3^0和P3^1; (5)、并行數(shù)據(jù)接口:P0口作為6800并行總線的數(shù)據(jù)總線P2^7、P2^6和P2^5作為控制總線,分別為:EN(總使能)、R\W(讀寫控制)、C\D(命令數(shù)據(jù)控制);地址總線CS接地,一直處于選通狀態(tài)。 從機(jī)用到

13、的功能: (1)、串行口一使用獨(dú)立波特率發(fā)生器P3^0和P3^1與主機(jī)通訊; (2)、PCA產(chǎn)生一路PWM,P1^2共同控制電機(jī)速度。 (3)、定時(shí)器T0和T1作為編碼器脈沖計(jì)數(shù)和測(cè)脈寬使用,測(cè)量電機(jī)的轉(zhuǎn)速。 3硬件電路設(shè)計(jì) 首先是單片機(jī)的最小系統(tǒng)如圖3.1、3.2所示 圖3.1 單片機(jī)的最小系統(tǒng) 圖3.2 單片機(jī)的最小系統(tǒng) 然后是各個(gè)模塊電路: 3.1電源電路 本系統(tǒng)由7.5V可充電電池供電,由開關(guān)電源LM2596轉(zhuǎn)換成5V電壓給單片機(jī)和測(cè)距模塊供電。出于對(duì)系統(tǒng)的穩(wěn)定性、可靠性和成本的考慮,選用了開關(guān)電源模塊作為轉(zhuǎn)換電

14、路。電源部分電路如圖3.3 圖3.3 電源部分電路 圖3.4 電源模塊實(shí)物 3.2晶振電路 雖然60S2內(nèi)部有RC振蕩電路作為時(shí)鐘電路的輸入源,但是外部連接一個(gè)無(wú)源晶振電路,可以使單片機(jī)的時(shí)鐘頻率更穩(wěn)定,因而工作更可靠。電路參數(shù):四個(gè)電容均為22PF,作為石英晶振頻率的微調(diào)。石英晶振的頻率為12MHZ。 3.3復(fù)位電路 復(fù)位電路是單片機(jī)必不可少的基本電路,在調(diào)試階段,可以按下復(fù)位按鍵,使復(fù)位引腳保持兩個(gè)機(jī)器周期的低電平,就可以使單片機(jī)內(nèi)部所有電路初始化。電路參數(shù)

15、:電容1UF只要保證電容的時(shí)間常數(shù)大于兩個(gè)機(jī)器周期即可。電阻值為1K歐。 3.4鍵盤電路 鍵盤電路如圖3.5所示 圖3.5鍵盤電路 可以利用外部中斷法或查詢法檢測(cè)按鍵是否按下。這里都采用外部中斷的方法檢測(cè)。 3.5顯示電路 顯示電路如圖3.6所示 圖3.6顯示電路 采用1603液晶屏顯示數(shù)字和字符。1603與1602的硬件接口完全一樣。不同之處在于1603的RAM區(qū)的內(nèi)容可以全部同時(shí)顯示在屏幕上,沒(méi)有屏幕內(nèi)容的位移切換??梢燥@示四行。狀態(tài)指示燈如圖3.7所示 圖3.7 狀態(tài)指示燈 這幾個(gè)LED燈是作為狀態(tài)指示用的,方便調(diào)試。 3.6超聲波

16、測(cè)距電路 超聲波測(cè)距模塊如圖3.8所示 圖3.8超聲波測(cè)距模塊 這是超聲波模塊的接口電路。這個(gè)超聲波的工作原理是: (1)采用 IO 觸發(fā)測(cè)距,給至少 10us 的高電平信號(hào); (2)模塊自動(dòng)發(fā)送 8 個(gè) 40khz 的方波,自動(dòng)檢測(cè)是否有信號(hào)返回; (3)有信號(hào)返回,通過(guò) IO 輸出一高電平,高電平持續(xù)的時(shí)間就是 (4)超聲波從發(fā)射到返回的時(shí)間.測(cè)試距離=(高電平時(shí)間*聲速(340M/S))/2; 超聲波模塊測(cè)距工作時(shí)序圖: 觸發(fā)信號(hào)(由單片機(jī)產(chǎn)生一個(gè)寬度大于10US的高脈沖,觸發(fā)模塊工作一次): _||__________

17、_____________________________________| 模塊內(nèi)部發(fā)出的信號(hào)(循環(huán)發(fā)出8個(gè)40KHZ的脈沖): ______||_||_||_||_||_||_||_||___________________ 輸出回響信號(hào)(回響信號(hào)的高電平持續(xù)時(shí)間正比于檢測(cè)的距離): ____________________________________||____ 3.7舵機(jī)電路 舵機(jī)電路如圖3.9所示 圖3.9舵機(jī)電路 舵機(jī)驅(qū)動(dòng)電路。舵機(jī)接口是信號(hào)線、電源正、地。信號(hào)線一般可以直接接到單片機(jī)的IO上,但是接多了就不行了,電流太大。這里用了一級(jí)三極管驅(qū)

18、動(dòng)。通常用的這種舵機(jī),控制信號(hào)是一個(gè)周期為20ms占空比在2.5%—12.5%之間的PWM信號(hào),分別對(duì)應(yīng)舵機(jī)的控制角為0—180之間。舵機(jī)本身有反饋調(diào)節(jié),因此,單片機(jī)給出一個(gè)占空比,舵機(jī)就到某一個(gè)角度。 3.8電機(jī)驅(qū)動(dòng)電路 電機(jī)驅(qū)動(dòng)電路如圖3.10所示 圖3.10電機(jī)驅(qū)動(dòng)模塊 電機(jī)的控制采用的是L298N全橋驅(qū)動(dòng)電路。 驅(qū)動(dòng)電路如圖3.11所示 圖3.11 驅(qū)動(dòng)電路 電機(jī)正反轉(zhuǎn)原理: IO: _____________________| 電流流向:↑↑↑↑↑ ↓↓↓↓↓↓ PWM: |_||_||_||_||_||_||_||_|

19、|_||_||_||_ |←假設(shè)此時(shí)電機(jī)正轉(zhuǎn)→|←‐ 該時(shí)刻電機(jī)反轉(zhuǎn)‐→| 3.9電機(jī)轉(zhuǎn)速測(cè)量電路 電機(jī)轉(zhuǎn)速測(cè)量電路如圖3.12所示 圖3.12電機(jī)轉(zhuǎn)速測(cè)量電路 編碼器輸出信號(hào):AB兩相輸出矩形正交脈沖,電路輸出為NPN集電極開路輸出型,此種輸出類型可以和帶內(nèi)部上拉電阻的單片機(jī)。 接線方式:黃=A相,藍(lán)=B相,紅=Vcc正電源,黑=V0地。 編碼器輸出信號(hào)圖如圖3.13所示 圖3.13信號(hào)圖 3.10設(shè)計(jì)PCB和腐蝕電路板 這是原始的PCB圖和單面的腐蝕電路板,紅色的TOPLAYER層作為跳線。PCB如圖3.14所示 圖3.

20、14 PCB圖 圖3.15 打印PCB負(fù)片圖 圖3.16 腐蝕效果圖 4系統(tǒng)軟件設(shè)計(jì) 主程序的流程圖如圖4.1所示。 圖4.1主程序流程圖 主程序流程說(shuō)明: 電路主要分為以下幾個(gè)部分,分別是電源部分、顯示部分、按鍵部分、步進(jìn)電機(jī)控制部分、超聲波檢測(cè)模塊、舵機(jī)模塊、單片機(jī)主控器件部分,各部分具有不同的子程序。 系統(tǒng)初始化流程如圖4.2所示: 圖4.2 系統(tǒng)初始化流程圖 4.1分模塊程序設(shè)計(jì) 4.1.1鍵盤程序 小車系統(tǒng)需要的按鍵不多,有兩個(gè),采用中斷法。在系統(tǒng)中的作用是啟動(dòng)小車。 4.1.2舵機(jī)驅(qū)動(dòng)程序和電機(jī)驅(qū)動(dòng)程序 控制原理部分在敘述硬件時(shí)

21、已介紹。這里說(shuō)說(shuō)具體怎么實(shí)現(xiàn)。 產(chǎn)生50HZ的PWM控制舵機(jī):時(shí)鐘頻率Fosc=11059200HZ,定時(shí)器T0的溢出率Ft0作為PCA定時(shí)器的時(shí)鐘輸入。60S2工作在51模式下。設(shè)TO的初值為X,自動(dòng)重裝模式,T0、PCA均無(wú)中斷。計(jì)算方法為: X*(12/Fosc)*256=0.02s 可以得出X=72,TH0=0xB7。 再計(jì)算占空比:PCA的中心計(jì)數(shù)器每(72*12/Fosc)秒記一個(gè)數(shù),記256個(gè)數(shù)(即一個(gè)八位計(jì)數(shù)器)溢出再?gòu)牧汩_始。比較寄存器的取值是:256*0.025和256*0.125之間,對(duì)應(yīng)的轉(zhuǎn)角在0到180度。在實(shí)際情況下,舵機(jī)不夠精密,最大旋轉(zhuǎn)角沒(méi)有180度,而

22、且比較寄存器只能比較寫入整數(shù)。實(shí)際的取值為7—29,控制方向的舵機(jī)取值為17——21(分級(jí)明顯,轉(zhuǎn)向不夠舒暢啊)。 電機(jī)的頻率沒(méi)有嚴(yán)格的要求,因此,選用簡(jiǎn)單的處理:對(duì)時(shí)鐘進(jìn)行 256*12分頻,是3.6KHZ。 4.1.3超聲波測(cè)距程序 超聲波測(cè)距實(shí)現(xiàn)原理就是測(cè)量高電平脈沖持續(xù)的時(shí)間。用到了51定時(shí)器啟停由外部控制的功能。GATE=1,TRn=1,定時(shí)器由外部中斷引腳電平控制,上升沿之后開始計(jì)數(shù),下降沿之后停止計(jì)數(shù)。同時(shí)打開相應(yīng)的外部中斷,在下降沿到來(lái)后進(jìn)入外部中斷服務(wù)程序,記錄停止計(jì)數(shù)時(shí)的數(shù)值。 這里應(yīng)當(dāng)注意一個(gè)問(wèn)題是:如果測(cè)量的距離較遠(yuǎn),定時(shí)器可能就溢出了,對(duì)這個(gè)不處理,結(jié)果將是

23、錯(cuò)誤的。因此同時(shí)開啟定時(shí)器中斷,在溢出時(shí),記下溢出的次數(shù)。距離的計(jì)算方法是: 距離=【Number*(12/Fosc)+N*65536*(12/Fosc)】/2 void Int1_Routine(void) interrupt 2 { T=(TH1*256+TL1); TH1=0; TL1=0; juli=((float)T1_Count)*11141.12+0.1844618*((float)T); LCD_Write_Number(0,2,juli,5); T1_Count=0; T1_F=1; } 4.2主程序設(shè)計(jì) 主程序里主要是避障程序。我的思

24、路是,把區(qū)域三部分:近距離20CM以內(nèi),適中區(qū)域(20CM—150CM),遠(yuǎn)距離(150CM以外)。得到22組數(shù)據(jù)后首先是根據(jù)區(qū)域分類,然后記各區(qū)域的角度大小,當(dāng)遠(yuǎn)距離的角度范圍最大時(shí),判斷為空曠區(qū),其他是多障礙區(qū)。然后根據(jù)角度大小排序,當(dāng)適中區(qū)最大時(shí),走的方向?yàn)檫m中區(qū)集中的方向。當(dāng)最大區(qū)域?yàn)榻嚯x或遠(yuǎn)距離時(shí),走遠(yuǎn)距離區(qū),具體方向?yàn)樽钸h(yuǎn)點(diǎn)方向。 速度總是由最近的障礙物距離計(jì)算得出。 5系統(tǒng)調(diào)試 首先是分模塊調(diào)試。把各個(gè)模塊的功能分開實(shí)現(xiàn)。然后是部分的組合到一起使用,如超聲波測(cè)距和1603顯示、兩路舵機(jī)同時(shí)控制。 在軟件調(diào)試的時(shí)候,出現(xiàn)了RAM區(qū)不夠用。原因出在避障算法上。定義的數(shù)組多,

25、而且長(zhǎng)。用戶128RAM不夠用。可以有兩個(gè)解決辦法:一是改進(jìn)代碼,使用指針;二是擴(kuò)展RAM區(qū)??紤]到代碼優(yōu)化不是一天兩天就弄好的,而且我的C語(yǔ)言編程水平實(shí)在淺薄,指針依然是用不好,一用就報(bào)錯(cuò)。那只好擴(kuò)展RAM。查查60S2的數(shù)據(jù)手冊(cè),它取消了外部擴(kuò)展RAM和ROM的功能,但是內(nèi)部增加了1KB的RAM,用法是在定義變量時(shí),加前綴“XDATA”,告訴編譯器把后面的變量定義在擴(kuò)展RAM區(qū)。此外我還了解到“DATA”、“PDATA”、“IDATA”都是51系統(tǒng)編譯器允許的關(guān)鍵字,具體的解釋是: dATa: 固定指前面0x00-0x7f的128個(gè)RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最

26、小。 idATa: 固定指前面0x00-0xff的256個(gè)RAM,其中前128和dATa的128完全相同,只是因?yàn)樵L問(wèn)的方式不同。idATa是用類似C中的指針?lè)绞?訪問(wèn)的。匯編中的語(yǔ)句為:mox ACC,@Rx.(不重要的補(bǔ)充:c中idATa做指針式的訪問(wèn)效果很好) xdATa: 外部擴(kuò)展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問(wèn)。 pdATa: 外部擴(kuò)展RAM的低256個(gè)字節(jié),地址出現(xiàn)在A0-A7的上時(shí)讀寫,用movx ACC,@Rx讀寫。 硬件方面的調(diào)試主要在模塊調(diào)試方面。因?yàn)榛旧隙加玫默F(xiàn)有的模塊電路,自己設(shè)計(jì)的電路基本沒(méi)有(自己還差的很遠(yuǎn)唉!),沒(méi)有什么難的。

27、 小車主板: 圖5.1 小車主板 整車圖片: 圖5.2 整車?guó)B瞰圖 6總結(jié) 兩周的單片機(jī)課程設(shè)計(jì)很快就結(jié)束了,但是在進(jìn)軍單片機(jī)領(lǐng)域,這僅僅是個(gè)開始。學(xué)習(xí)單片機(jī)最重要的是實(shí)踐。要投入必要的成本。一塊開發(fā)板必不可少,還有一大堆配套的硬件軟件。 作為有志于今后繼續(xù)在單片機(jī)方面發(fā)展的我,學(xué)會(huì)使用51單片機(jī),遠(yuǎn)遠(yuǎn)不夠,世界上51系列占的市場(chǎng)份額并不多。流行的單片機(jī),其功能遠(yuǎn)遠(yuǎn)好于51,因此,學(xué)習(xí)51單片機(jī)重點(diǎn)在于利用它簡(jiǎn)單易學(xué)的特點(diǎn)掌握單片機(jī)的各種通用性的東西,深刻理解和掌握它的工作原理和使用方式,這樣可以快捷的掌握其他單片機(jī)的使用。把單片機(jī)作為改變生活的萬(wàn)能工具。 學(xué)習(xí)單片機(jī),

28、離不開編程,離不開軟件。C語(yǔ)言作為一種高級(jí)語(yǔ)言,與硬件聯(lián)系緊密。因此在單片機(jī)領(lǐng)域,基本都用的是C語(yǔ)言。靈活運(yùn)用C語(yǔ)言,對(duì)單片機(jī)學(xué)習(xí)帶來(lái)極大的便利。今后還得繼續(xù)深入學(xué)習(xí)C語(yǔ)言。還有一點(diǎn),非常重要,把軟件工程的思想融入到單片機(jī)的編程中。比如分層和封裝思想。這個(gè)課程設(shè)計(jì)中所有的程序,并不是都在這兩周寫的,有一些以前玩過(guò)類似的模塊,當(dāng)然有可靠地例程,在這里,修改一下硬件接口,修改一下工作方式,就可以用了。由此看出,單片機(jī)學(xué)習(xí)是可以積累的。除了掌握大量的知識(shí),還有個(gè)人的單片機(jī)例程、軟件、電路設(shè)計(jì)庫(kù),這樣會(huì)越來(lái)越容易。 參考文獻(xiàn): 【1】《單片微型計(jì)算機(jī)原理、應(yīng)用及接口

29、技術(shù)》(第2版)張迎新.[M].北京:國(guó)防工業(yè)出版社,2004 【2】 夏路易 石宗義.Protel 99se電路原理圖與電路板設(shè)計(jì)教程.北京:北京希望電子出版社,2004 【3】《單片微型計(jì)算機(jī)原理、應(yīng)用及接口技術(shù)》(第2版)張迎新.[M].北京:國(guó)防工業(yè)出版社,2004 【4】宏晶STC12單片機(jī)技術(shù)手冊(cè) 附錄A硬件電路圖 圖A.1 整車?guó)B瞰圖 附錄B 源程序 工程文件結(jié)構(gòu): 圖B.1 整車?guó)B瞰圖 STC12C5A60S2增加的特殊功能

30、寄存器與地址的映射: #ifndef __REG52_H__ #define __REG52_H__ /* BYTE Registers */ sfr AUXR = 0x8E;/*stc12c5a60s2*/ sfr WAKE_CLK0=0x8F;/*stc12c5a60s2*/ sfr P1M1 = 0x91;/*stc12c5a60s2*/ sfr P1M0 = 0x92;/*stc12c5a60s2*/ sfr P0M1 = 0x93;/*stc12c5a60s2*/ sfr P0M0 = 0x94;/*stc12c5a60s2*/ sfr P2M1

31、= 0x95;/*stc12c5a60s2*/ sfr P2M0 = 0x96;/*stc12c5a60s2*/ sfr CLK_DIV=0x97;/*stc12c5a60s2*///Clock Divder sfr S2CON = 0x9A;/*stc12c5a60s2*/ sfr S2BUF = 0x9B;/*stc12c5a60s2*/ sfr BRT = 0x9C;/*stc12c5a60s2*/ sfr BUS_SPEED=0xA1;/*stc12c5a60s2*/ sfr AUXR1 = 0xA2;/*stc12c5a60s2*/ sfr IE2 = 0x

32、AF;/*stc12c5a60s2*/ sfr P3M1 = 0xB1;/*stc12c5a60s2*/ sfr P3M0 = 0xB2;/*stc12c5a60s2*/ sfr P4M1 = 0xB3;/*stc12c5a60s2*/ sfr P4M0 = 0xB4;/*stc12c5a60s2*/ sfr IP2 = 0xB5;/*stc12c5a60s2*/ sfr IP2H = 0xB6;/*stc12c5a60s2*/ sfr IPH = 0xB7;/*stc12c5a60s2*///Interrupt Priority High sfr P4SW

33、 = 0xBB;/*stc12c5a60s2*///P4 I/O Switch sfr ADC_CONTR=0xBC;/*stc12c5a60s2*/ sfr ADC_RES=0xBD;/*stc12c5a60s2*/ sfr ADC_RESL=0xBE;/*stc12c5a60s2*///A/D Result Low sfr P4 = 0xC0;/*stc12c5a60s2*///P4 I/O sfr WDT_CONTR=0xC1;/*stc12c5a60s2*///Watch-Dog-Timer Cotrol Register sfr IAP_DATA=0xC2;/*st

34、c12c5a60s2*///ISP/IAP Flash Data Register sfr IAP_ADDRH=0xC3;/*stc12c5a60s2*///ISP/IAP Flash Address High sfr IAP_ADDRL=0xC4;/*stc12c5a60s2*///ISP/IAP Flash Address Low sfr IAP_CMD= 0xC5;/*stc12c5a60s2*///ISP/IAP Flash Command Register sfr IAP_TRIG=0xC6;/*stc12c5a60s2*///ISP/IAP Flash Command Tr

35、igger sfr IAP_CONTR=0xC7;/*stc12c5a60s2*///ISP/IAP Control Register sfr P5 = 0xC8;/*stc12c5a60s2*///P5 I/O sfr P5M1 = 0xC9;/*stc12c5a60s2*/ sfr P5M0 = 0xCA;/*stc12c5a60s2*/ sfr TL2 = 0xCC; /*8052*/ sfr SPSTAT= 0xCD;/*stc12c5a60s2*///SPI Control Register sfr SPCTL = 0xCE;/*stc12c5a60s2*

36、///SPI Status Register sfr SPDAT = 0xCF;/*stc12c5a60s2*///SPI Data Register sfr CCON = 0xD8;/*stc12c5a60s2*///PCA sfr CMOD = 0xD9;/*stc12c5a60s2*///PCA sfr CCAPM0= 0xDA;/*stc12c5a60s2*///PCA sfr CCAPM1= 0xDB;/*stc12c5a60s2*///PCA sfr CL = 0xE9;/*stc12c5a60s2*/ sfr CCAP0L= 0xEA;/*stc12c5a

37、60s2*/ sfr CCAP1L= 0xEB;/*stc12c5a60s2*/ sfr PAC_PWM0=0xF2;/*stc12c5a60s2*///PCA PWM sfr PAC_PWM1=0xF3;/*stc12c5a60s2*///PCA PWM sfr CH = 0xF9;/*stc12c5a60s2*/ sfr CCAP0H= 0xFA;/*stc12c5a60s2*/ sfr CCAP1H= 0xFB;/*stc12c5a60s2*/ /* BIT Registers */ /*CCON*/ sbit CF =CCON^7; sbit CR

38、 =CCON^6; sbit CCF1 =CCON^1; sbit CCF0 =CCON^0; #endif LCD1603顯示程序文件: #include"reg52.h" #include"define.h" #include"delay.h" #include"1603.h" bit LCD_Check_Busy(void) { u8 result; EN=0; DataPort= 0xFF; D_C=0; R_W=1; delay_ms(1); EN=1; result=(DataPort & 0x80);

39、 EN=0; return result; } void LCD_Write_Comm(u8 comm) { while(LCD_Check_Busy()); EN=0; D_C=0; R_W=0; EN=1; delay_ms(1); DataPort=comm; EN=0; } void LCD_Write_Data(u8 dat) { while(LCD_Check_Busy()); EN=0; D_C=1; R_W=0; EN=1; delay_ms(1); DataPort=dat

40、; EN=0; } void LCD_Write_Char(u8 x,u8 y,u8 Data) { switch(y) { case 1:LCD_Write_Comm(0x80+x); break; case 2:LCD_Write_Comm(0xC0+x); break; case 3:LCD_Write_Comm(0x90+x); break; case 4:LCD_Write_Comm(0xD0+x); break; } LCD_Write_Data(Da

41、ta); } void LCD_Write_String(u8 x,u8 y,u8 *s) { switch(y) { case 1:LCD_Write_Comm(0x80+x); break; case 2:LCD_Write_Comm(0xC0+x); break; case 3:LCD_Write_Comm(0x90+x); break; case 4:LCD_Write_Comm(0xD0+x); break; } while(*s) {

42、 LCD_Write_Data(*s); s++; } } void LCD_Write_Number(u8 x,u8 y,u32 number,u8 Nbit) { u8 dat,ten,hun,thu,tenthu,hunthu; hunthu=48+(number/100000); tenthu=48+(number%100000/10000); thu=48+(number%10000/1000); hun=48+(number%1000/100); ten=48+(number%100/10); dat

43、=48+(number%10); switch(y) { case 1:LCD_Write_Comm(0x80+x); break; case 2:LCD_Write_Comm(0xC0+x); break; case 3:LCD_Write_Comm(0x90+x); break; case 4:LCD_Write_Comm(0xD0+x); break; } switch (Nbit) { case 6: LCD_Write_Data(hunthu); L

44、CD_Write_Data(tenthu); LCD_Write_Data(thu); LCD_Write_Data(hun); LCD_Write_Data(ten); LCD_Write_Data(dat); break; case 5: LCD_Write_Data(tenthu); LCD_Write_Data(thu); LCD_Write_Data(hun); LCD_Write_Data(ten); LCD_Write_Data(dat); b

45、reak; case 4: LCD_Write_Data(thu); LCD_Write_Data(hun); LCD_Write_Data(ten); LCD_Write_Data(dat); break; case 3: LCD_Write_Data(hun); LCD_Write_Data(ten); LCD_Write_Data(dat); break; case 2: LCD_Write_Data(ten); LCD_Write_Dat

46、a(dat); break; case 1: LCD_Write_Data(dat); break; } } void LCD_Clear(void) { LCD_Write_Comm(0x01); delay_ms(1); } void LCD_Init(void) { LCD_Write_Comm(0x01); delay_ms(1); LCD_Write_Comm(0x02); delay_ms(1); LCD_Write_Comm(0x38); delay_ms(1); LC

47、D_Write_Comm(0x0C); delay_ms(1); LCD_Write_Comm(0x06); delay_ms(1); LCD_Write_Comm(0x80); delay_ms(1); LCD_Write_Data(0xFF); delay_ms(1); LCD_Write_Data(0xFF); delay_ms(1); LCD_Write_Comm(0x8E); delay_ms(1); LCD_Write_Data(0xFF); delay_ms(1); LCD_Write_Data(0xFF);

48、 delay_ms(1); } #ifndef _1603_H_ #define _1603_H_ sbit buzz=P2^3; sbit D_C= P1^0; sbit R_W= P1^1; sbit EN = P2^5; #define DataPort P0 bit LCD_Check_Busy(void); void LCD_Write_Comm(u8 comm); void LCD_Write_Data(u8 dat); void LCD_Write_Char(u8 x,u8 y,u8 Data); void LCD_Write_String(u

49、8 x,u8 y,u8 *s); void LCD_Write_Number(u8 x,u8 y,u32 number,u8 Nbit); void LCD_Clear(void); void LCD_Init(void); 串行口程序文件: #endif #include"reg52.h" #include"define.h" #include"delay.h" u8 receive; u16 n; u8 flagR; u8 stopF; void COMInit(u16 bps) { u8 s; EA=0; if(bps>=19200) {

50、 PCON|=0x80; s=1; } else { PCON&=0x7F; s=0; } SCON=0x50; TMOD=0x20; TH1=256-(28800*(s+1))/bps; TL1=256-(28800*(s+1))/bps; REN=1; ES=1; EA=1; TR1=1; } void serial() interrupt 4 {

51、 if(TI!=0) { TI=0; flagR=1; } else { if(RI!=0) { receive=SBUF; P1=receive; if(receive==0xFF) { stopF=1; } else { if(receive==0x5A) { stopF=0; } } RI=0; } } } #ifndef _COM_H_ #define _COM_H_ void COMInit(u

52、16 bps); #endif 自定義變量類型文件: #ifndef _DEFINE_H_ #define _DEFINE_H_ #define u8 unsigned char #define u16 unsigned int #define u32 unsigned long #endif 各種延時(shí)函數(shù)文件: #include"define.h" #include"delay.h" void delay_us(u16 xus) { xus=2*xus; while(xus--); } void delay_ms(u16 xms) { int i

53、,j; for(i=xms;i>0;i--) { for(j=110;j>0;j--); } } #ifndef _DELAY_H_ #define _DELAY_H_ void delay_us(u16 xus); void delay_ms(u16 xms) 各個(gè)外設(shè)中斷服務(wù)函數(shù)文件: #ifndef _IRQ_H_ #define _IRQ_H_ #include"define.h" #include"1603.h" u8 key_flag=0; u8 receive=0; float juli; u16 T; u8 T1_Count=0

54、; bit T1_F=0; void Int0_Routine(void) interrupt 0 { if(IE0) { delay_ms(800); if(IE0) { key_flag++; } } } void Int1_Routine(void) interrupt 2 { T=(TH1*256+TL1); TH1=0; TL1=0; juli=((float)T1_Count)*11141.12+0.1844618*((float)T); LCD_Write_Number(0,2,juli,5); T1

55、_Count=0; T1_F=1; } void Timer1_Routine(void) interrupt 3 { T=(TH1*256+TL1); TH1=0; TL1=0; T1_Count++; } void UART_Routine(void) interrupt 4 { if(TI) { TI=0; } else { if(RI) { receive=SBUF; RI=0; } } } #endif 脈寬測(cè)量初始化文件: #include #inc

56、lude"define.h" #include"delay.h" #include"1603.h" #include"capture.h" void capture_init(void) { TMOD|=0x90; TH1=0; TL1=0;// TR1=1; EX1=1; IT1=1; } #ifndef _CAPTURE_H_ #define _CAPTURE_h_ sbit chufa=P2^1; void capture_init(void); #endif 舵機(jī)控制文件: #include"delay.h" #include"160

57、3.h" #include"externIRQ.h" #include"steer.h" void Init_SteerPWM(void) { TMOD|=0x02; TH0=0xB7; TL0=0xB7; TR0=1; CMOD=0x04; CL=0x00; CH=0x00; CCAPM0=0x42; CCAPM1=0x42; CCAP0H=home; CCAP0L=home; CCAP1H=home; CCAP1L=home; CR=1;//PCA } void steer(u8 Mod,u8 Num,int degre

58、e) { double duty; if(Mod)// { duty=19.2+0.14222*((double)degree); if(duty>29) { duty=29; } else { if(duty<7) { duty=7; } } if(Num==1) { CCAP0H=(int)duty; CCAP0L=(int)duty; LCD_Write_Number(0,3,duty,3); } if(Num==2) { CCA

59、P1H=(int)duty; CCAP1L=(int)duty; LCD_Write_Number(4,3,duty,3); } } else { if(degree>29) { degree=29; } else { if(degree<7) { degree=7; } } if(Num==1) { CCAP0H=degree; CCAP0L=degree; LCD_Write_Number(0,3,duty,3); } if(Num

60、==2) { CCAP1H=degree; CCAP1L=degree; LCD_Write_Number(4,3,duty,3); } } } #ifndef _STEER_H_ #define _STEER_H_ #include"define.h" #define CryOsc 11059200 #define SteerCycle 50 #define home 0x13 void Init_SteerPWM(void); void steer(u8 Mod,u8 Num,int degree); #endif 電機(jī)控制文

61、件: #include"REG52.h" #include"define.h" #include"delay.h" #include"PWM.h" sbit motorIO=P1^2; void Init_PWM(void) { CMOD=0x08; CL=0x00; CH=0x00; CCAPM0=0x42; CCAPM1=0x42; CR=1; } void forward(u8 duty) { CCAP0H=duty; motorIO=0; } void stop(void) { CCAP0H=0; motorIO=0;

62、 } void back(u8 duty) { CCAP0H=256-duty; motorIO=1; } #ifndef _PWM_H_ #define _PWM_H_ void Init_PWM(void); void forward(u8 duty); void stop(void); void back(u8 duty); #endif 主機(jī)的主函數(shù)文件: #include"reg52.h" #include"define.h" #include"delay.h" #include"1603.h" #include"com.h" #includ

63、e"externIRQ.h" #include"capture.h" #include"steer.h" #include"IRQ.h" void system_init(void) { EA=0; LCD_Init(); COMInit(); IRQ_Init(); capture_init(); Init_SteerPWM(); EA=1; } void main(void) { u8 i,closeN=0,fitN=0,remoteN=0; float xdata tem[5]; u32_l xdata distance[22];

64、 u8 xdata close[22],xdata fit[22],xdata remote[22]; system_init(); while(1) { if(key_flag) { buzz=0; delay_ms(500); buzz=1; delay_ms(500); buzz=0; delay_ms(500); buzz=1; delay_ms(500); buzz=0; delay_ms(500); buzz=1; delay_ms(500); buzz

65、=0; delay_ms(500); buzz=1; delay_ms(500); break; } } while(1) { closeN=0; fitN=0; remoteN=0; for(i=7;i<30;i++) { steer(0,1,i); chufa=1; while(!T1_F); tem[0]=juli; chufa=1; while(!T1_F); tem[1]=juli; chufa=1; while(!T1_F);

66、 tem[2]=juli; chufa=1; while(!T1_F); tem[3]=juli; chufa=1; while(!T1_F); tem[4]=juli; distance[i-7]=(tem[0]+tem[1]+tem[2]+tem[3]+tem[4])/5; } for(i=0;i<22;i++) { if(distance[i]<200) { close[closeN]=i; closeN++; } else { if(distance[i]>1500) { remote[remoteN]=i; remoteN++; } else { fit[fitN]

展開閱讀全文
溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!