歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

自動避障小車課程設(shè)計(jì)學(xué)術(shù)參考

  • 資源ID:45580372       資源大小:15.57MB        全文頁數(shù):45頁
  • 資源格式: DOC        下載積分:10積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要10積分
郵箱/手機(jī):
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機(jī)號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗(yàn)證碼:   換一換

 
賬號:
密碼:
驗(yàn)證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認(rèn)打開,此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請知曉。

自動避障小車課程設(shè)計(jì)學(xué)術(shù)參考

單片機(jī)系統(tǒng)課 程 設(shè) 計(jì)成績評定表設(shè)計(jì)課題 : 自動避障小車 學(xué)院名稱 : 電氣工程學(xué)院 專業(yè)班級 : 自動1105 學(xué)生姓名 : 學(xué) 號 : 指導(dǎo)教師 : 設(shè)計(jì)地點(diǎn) : 31-630 設(shè)計(jì)時間 : 指導(dǎo)教師意見:成績: 簽名: 年 月 日優(yōu)質(zhì)+材料單片機(jī)系統(tǒng)課 程 設(shè) 計(jì) 課程設(shè)計(jì)名稱: 自動避障小車 專 業(yè) 班 級 : 自動1105 學(xué) 生 姓 名 : 學(xué) 號 : 指 導(dǎo) 教 師 : 課程設(shè)計(jì)地點(diǎn): 31-630 課程設(shè)計(jì)時間: 單片機(jī)系統(tǒng) 課程設(shè)計(jì)任務(wù)書學(xué)生姓名專業(yè)班級學(xué)號題 目自動避障小車課題性質(zhì)產(chǎn)品設(shè)計(jì)課題來源自擬指導(dǎo)教師主要內(nèi)容(參數(shù))利用增強(qiáng)版51MCU設(shè)計(jì)一個自動避障小車,實(shí)現(xiàn)以下功能:1、自主判別障礙,自動避開障礙;2、識別出多障礙區(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ì)電路。畫出總體電路圖,而且選好各個元件的參數(shù)、數(shù)量類型。然后由原理圖生成PCB,用熱轉(zhuǎn)印法腐蝕這個電路板。 第6-7天:構(gòu)建硬件系統(tǒng),并且測試確認(rèn)都可以正常工作。之后完成機(jī)械部分和硬件部分的搭建。第8-11天:編寫程序,設(shè)計(jì)軟件,并且開始撰寫課程設(shè)計(jì)報告。第12-13天:整體調(diào)試,逐步完善。第14天:完成課程設(shè)計(jì)報告。主要參考資料【1】張迎新單片微型計(jì)算機(jī)原理、應(yīng)用及接口技術(shù)(第2版)M北京:國防工業(yè)出版社,2004【2】單片機(jī)程序設(shè)計(jì)實(shí)例清華大學(xué)出版社【3】 單片機(jī)應(yīng)用設(shè)計(jì)200例【4】單片機(jī)程序設(shè)計(jì)及應(yīng)用李華軍,電子工業(yè)出版社審查意見系(教研室)主任簽字: 年 月 日 目 錄1概述41.1研究背景41.2設(shè)計(jì)思想及基本功能42總體方案設(shè)計(jì)42.1方案論證42.2系統(tǒng)框圖52.3總體方案設(shè)計(jì)63硬件電路設(shè)計(jì)73.1電源電路83.2晶振電路93.3復(fù)位電路103.4鍵盤電路103.5顯示電路113.6超聲波測距電路123.7舵機(jī)電路133.8電機(jī)驅(qū)動電路143.9電機(jī)轉(zhuǎn)速測量電路133.10設(shè)計(jì)PCB和腐蝕電路板144系統(tǒng)軟件設(shè)計(jì)164.1分模塊程序設(shè)計(jì)174.2主程序設(shè)計(jì)205系統(tǒng)調(diào)試226總結(jié)22參考文獻(xiàn):23附錄A硬件電路圖24附錄B 源程序251概述1.1研究背景科技的發(fā)展趨勢之一就是讓幾乎所有的東西具有一定的智能。這樣的智能一方面可以避免人的復(fù)雜性帶來的錯誤,另一方面,作為人的能力的延伸,快速、便捷地適應(yīng)環(huán)境。本文研究的超聲波自動避障小車,就是讓小車具有一定的智能,可以作為有人駕駛車輛的一部分,幫助司機(jī)及早發(fā)現(xiàn)司機(jī)還未覺察的危險。另外,可以應(yīng)用在無人控制系統(tǒng)里,代替人類完成信息接收、處理和判斷。那么這樣它還有更廣闊的應(yīng)用和發(fā)展空間。這個月我國嫦娥三號載著玉兔號月球車踏上了月球,已經(jīng)開始探索活動。玉兔號月球車可以自動尋找有價值的目標(biāo),自動避開障礙物,自動尋找最優(yōu)路徑等等,這些功能在原理上都差不多,只是所用儀器以及控制算法的不同。1.2設(shè)計(jì)思想及基本功能小車設(shè)計(jì)的基本思路是:不斷掃描前方180°左右的水平面內(nèi)的物體,根據(jù)反饋的距離和方位信息確定前方的地形是開闊還是多障礙。然后根據(jù)這些信息通過路徑最優(yōu)算法選擇前進(jìn)方向。小車的基本功能是識別空曠區(qū)和多障區(qū);自動避開障礙物;能夠在空曠區(qū)快速行駛。2總體方案設(shè)計(jì)2.1方案論證首先是測距方案:方案一:激光測距優(yōu)點(diǎn):測速快,適應(yīng)范圍廣,精確;不過相對于自動避障小車系統(tǒng),有點(diǎn)大材小用。激光測距是點(diǎn)對點(diǎn)的測距,一般進(jìn)行遠(yuǎn)距離測距比較精確。如是近距離激光測距,必須要涉及到微小時間測量,51MCU無法勝任。因此激光測距方案否定。方案二:超聲波測距優(yōu)點(diǎn):結(jié)構(gòu)簡單,成本低,便于與MCU聯(lián)機(jī)工作。測量范圍從5CM到幾百米的距離內(nèi)精度在毫米級。盡管它測量的是點(diǎn)到面的距離,但是定向性滿足本小車系統(tǒng)的要求。而且,數(shù)據(jù)處理簡單??梢钥紤]。方案三:雷達(dá)測距不太現(xiàn)實(shí),受到本人技術(shù)水平限制,無法駕馭雷達(dá)測距系統(tǒng),此外,雷達(dá)應(yīng)用于較大范圍的測量和監(jiān)控,如果用于本小車,同樣涉及到微小時間測量,以及雷達(dá)數(shù)據(jù)處理,51MCU難以勝任。否定!方案四:紅外線測距優(yōu)點(diǎn):技術(shù)難度低,數(shù)據(jù)處理簡單,但是測量開關(guān)信號比較好,測量連續(xù)信號不夠準(zhǔn)確。測量的精度有點(diǎn)低。因此不是一種較好的測距方法。綜合各因素,選用超聲波測距。其次是微控制器的選擇:可選的微控制器有:系列的STC89C52RC、STC12C5A60S2;公司的MSP430G2553;飛思卡爾的MC9S12XS128MAL;意法的STM32F407-Discovery;(這些玩兒過一點(diǎn),而且最小系統(tǒng)板手邊都有)根據(jù)本系統(tǒng)的需求,需要兩路同頻率(50hz)的PWM控制兩個舵機(jī)、一路PWM頻率約幾千赫茲控制電機(jī)、三個個定時器做脈沖捕捉、至少兩個外部中斷輸入、一個并行6800總線接口。除了系列的兩款,其他一片足以勝任。而且對于意法的F407顯得大材小用。飛思卡爾的S12比較合適;TI的G2553的引腳有點(diǎn)少(20個),外圍電路設(shè)計(jì)的會復(fù)雜一點(diǎn),成本也會高一點(diǎn)。60S2用兩片比較合適; 用89C52比較麻煩,兩片也不夠。根據(jù)個人能力,以及時間和進(jìn)度方面考慮選用60S2,60S2呢,它的資源有:完全兼容51 的兩個定時器T0、T1和兩個外部中斷;兩路擁有獨(dú)立波特率的串行口;一個PCA定時器,可產(chǎn)生兩路同頻的PWM;八個10位精度的AD 轉(zhuǎn)換通道; 一個硬件SPI接口。2.2系統(tǒng)框圖 系統(tǒng)框圖如圖2.2所示圖2.2系統(tǒng)框圖2.3 總體方案設(shè)計(jì)兩片60S2一個做主機(jī),一個做從機(jī),通過串行口通信,傳遞數(shù)據(jù)。主機(jī)用到的功能有:()、定時器T1和外部中斷INT1,作用是:測脈寬,用到的IO是P33;P20作為超聲波測距模塊的觸發(fā)功能引腳;()、定時器T0和PCA產(chǎn)生兩路同頻率的PWM,作用是:T0的溢出率作為PCA的計(jì)數(shù)脈沖產(chǎn)生50HZ的PWM控制兩路舵機(jī)。使用T0作為PCA的時鐘源,可以通過改變T0的溢出率改變輸出的頻率。用到的IO是P13和P14;()、外部中斷INT0接一個按鍵。()、串口一使用獨(dú)立波特率發(fā)生器,與從機(jī)通P30和P31;()、并行數(shù)據(jù)接口:P0口作為6800并行總線的數(shù)據(jù)總線P27、P26和P25作為控制總線,分別為:EN(總使能)、RW(讀寫控制)、CD(命令數(shù)據(jù)控制);地址總線CS接地,一直處于選通狀態(tài)。從機(jī)用到的功能:()、串行口一使用獨(dú)立波特率發(fā)生器P30和P31與主機(jī)通訊;()、PCA產(chǎn)生一路PWM,P12共同控制電機(jī)速度。()、定時器T0和T1作為編碼器脈沖計(jì)數(shù)和測脈寬使用,測量電機(jī)的轉(zhuǎn)速。3硬件電路設(shè)計(jì)首先是單片機(jī)的最小系統(tǒng)如圖3.1、3.2所示圖3.1 單片機(jī)的最小系統(tǒng) 圖3.2 單片機(jī)的最小系統(tǒng) 然后是各個模塊電路:3.1電源電路本系統(tǒng)由7.5V可充電電池供電,由開關(guān)電源LM2596轉(zhuǎn)換成5V電壓給單片機(jī)和測距模塊供電。出于對系統(tǒng)的穩(wěn)定性、可靠性和成本的考慮,選用了開關(guān)電源模塊作為轉(zhuǎn)換電路。電源部分電路如圖3.3 圖3.3 電源部分電路圖3.4 電源模塊實(shí)物 3.2晶振電路雖然60S2內(nèi)部有RC振蕩電路作為時鐘電路的輸入源,但是外部連接一個無源晶振電路,可以使單片機(jī)的時鐘頻率更穩(wěn)定,因而工作更可靠。電路參數(shù):四個電容均為22PF,作為石英晶振頻率的微調(diào)。石英晶振的頻率為12MHZ。3.3復(fù)位電路復(fù)位電路是單片機(jī)必不可少的基本電路,在調(diào)試階段,可以按下復(fù)位按鍵,使復(fù)位引腳保持兩個機(jī)器周期的低電平,就可以使單片機(jī)內(nèi)部所有電路初始化。電路參數(shù):電容1UF只要保證電容的時間常數(shù)大于兩個機(jī)器周期即可。電阻值為1K歐。3.4鍵盤電路鍵盤電路如圖3.5所示圖3.5鍵盤電路可以利用外部中斷法或查詢法檢測按鍵是否按下。這里都采用外部中斷的方法檢測。3.5顯示電路 顯示電路如圖3.6所示圖3.6顯示電路采用1603液晶屏顯示數(shù)字和字符。1603與1602的硬件接口完全一樣。不同之處在于1603的RAM區(qū)的內(nèi)容可以全部同時顯示在屏幕上,沒有屏幕內(nèi)容的位移切換??梢燥@示四行。狀態(tài)指示燈如圖3.7所示圖3.7 狀態(tài)指示燈這幾個LED燈是作為狀態(tài)指示用的,方便調(diào)試。3.6超聲波測距電路 超聲波測距模塊如圖3.8所示 圖3.8超聲波測距模塊這是超聲波模塊的接口電路。這個超聲波的工作原理是:(1)采用 IO 觸發(fā)測距,給至少 10us 的高電平信號;(2)模塊自動發(fā)送 8 個 40khz 的方波,自動檢測是否有信號返回;(3)有信號返回,通過 IO 輸出一高電平,高電平持續(xù)的時間就是(4)超聲波從發(fā)射到返回的時間測試距離=(高電平時間*聲速(340M/S)/2;超聲波模塊測距工作時序圖:觸發(fā)信號(由單片機(jī)產(chǎn)生一個寬度大于10US的高脈沖,觸發(fā)模塊工作一次):_|¯¯¯¯|_|¯¯¯¯模塊內(nèi)部發(fā)出的信號(循環(huán)發(fā)出8個40KHZ的脈沖):_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_輸出回響信號(回響信號的高電平持續(xù)時間正比于檢測的距離):_|¯¯¯¯¯¯¯¯¯¯¯¯¯¯|_3.7舵機(jī)電路 舵機(jī)電路如圖3.9所示圖3.9舵機(jī)電路舵機(jī)驅(qū)動電路。舵機(jī)接口是信號線、電源正、地。信號線一般可以直接接到單片機(jī)的IO上,但是接多了就不行了,電流太大。這里用了一級三極管驅(qū)動。通常用的這種舵機(jī),控制信號是一個周期為20ms占空比在2.5%12.5%之間的PWM信號,分別對應(yīng)舵機(jī)的控制角為0°180°之間。舵機(jī)本身有反饋調(diào)節(jié),因此,單片機(jī)給出一個占空比,舵機(jī)就到某一個角度。3.8電機(jī)驅(qū)動電路 電機(jī)驅(qū)動電路如圖3.10所示 圖3.10電機(jī)驅(qū)動模塊電機(jī)的控制采用的是L298N全橋驅(qū)動電路。驅(qū)動電路如圖3.11所示 圖3.11 驅(qū)動電路電機(jī)正反轉(zhuǎn)原理:IO: _|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯電流流向:¦¦¦¦¦¦¦¦¦ ¦¦¦¦¦¦¦¦¦¦¦PWM: |_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_ |假設(shè)此時電機(jī)正轉(zhuǎn)| 該時刻電機(jī)反轉(zhuǎn)|3.9電機(jī)轉(zhuǎn)速測量電路 電機(jī)轉(zhuǎn)速測量電路如圖3.12所示圖3.12電機(jī)轉(zhuǎn)速測量電路編碼器輸出信號:AB兩相輸出矩形正交脈沖,電路輸出為NPN集電極開路輸出型,此種輸出類型可以和帶內(nèi)部上拉電阻的單片機(jī)。接線方式:黃=A相,藍(lán)=B相,紅=Vcc正電源,黑=V0地。 編碼器輸出信號圖如圖3.13所示圖3.13信號圖3.10設(shè)計(jì)PCB和腐蝕電路板這是原始的PCB圖和單面的腐蝕電路板,紅色的TOPLAYER層作為跳線。PCB如圖3.14所示圖3.14 PCB圖圖3.15 打印PCB負(fù)片圖圖3.16 腐蝕效果圖4系統(tǒng)軟件設(shè)計(jì)主程序的流程圖如圖4.1所示。圖4.1主程序流程圖主程序流程說明:電路主要分為以下幾個部分,分別是電源部分、顯示部分、按鍵部分、步進(jìn)電機(jī)控制部分、超聲波檢測模塊、舵機(jī)模塊、單片機(jī)主控器件部分,各部分具有不同的子程序。系統(tǒng)初始化流程如圖4.2所示: 圖4.2 系統(tǒng)初始化流程圖4.1分模塊程序設(shè)計(jì)4.1.1鍵盤程序 小車系統(tǒng)需要的按鍵不多,有兩個,采用中斷法。在系統(tǒng)中的作用是啟動小車。4.1.2舵機(jī)驅(qū)動程序和電機(jī)驅(qū)動程序控制原理部分在敘述硬件時已介紹。這里說說具體怎么實(shí)現(xiàn)。產(chǎn)生50HZ的PWM控制舵機(jī):時鐘頻率Fosc=11059200HZ,定時器T0的溢出率Ft0作為PCA定時器的時鐘輸入。60S2工作在51模式下。設(shè)TO的初值為X,自動重裝模式,T0、PCA均無中斷。計(jì)算方法為:X*(12/Fosc)*256=0.02s可以得出X=72,TH0=0xB7。再計(jì)算占空比:PCA的中心計(jì)數(shù)器每(72*12/Fosc)秒記一個數(shù),記256個數(shù)(即一個八位計(jì)數(shù)器)溢出再從零開始。比較寄存器的取值是:256*0.025和256*0.125之間,對應(yīng)的轉(zhuǎn)角在0到180度。在實(shí)際情況下,舵機(jī)不夠精密,最大旋轉(zhuǎn)角沒有180度,而且比較寄存器只能比較寫入整數(shù)。實(shí)際的取值為729,控制方向的舵機(jī)取值為1721(分級明顯,轉(zhuǎn)向不夠舒暢?。?。電機(jī)的頻率沒有嚴(yán)格的要求,因此,選用簡單的處理:對時鐘進(jìn)行256*12分頻,是3.6KHZ。4.1.3超聲波測距程序超聲波測距實(shí)現(xiàn)原理就是測量高電平脈沖持續(xù)的時間。用到了51定時器啟停由外部控制的功能。GATE=1,TRn=1,定時器由外部中斷引腳電平控制,上升沿之后開始計(jì)數(shù),下降沿之后停止計(jì)數(shù)。同時打開相應(yīng)的外部中斷,在下降沿到來后進(jìn)入外部中斷服務(wù)程序,記錄停止計(jì)數(shù)時的數(shù)值。這里應(yīng)當(dāng)注意一個問題是:如果測量的距離較遠(yuǎn),定時器可能就溢出了,對這個不處理,結(jié)果將是錯誤的。因此同時開啟定時器中斷,在溢出時,記下溢出的次數(shù)。距離的計(jì)算方法是:距離=【Number*(12/Fosc)+N*65536*(12/Fosc)】/2void Int1_Routine(void) interrupt 2T=(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ì)主程序里主要是避障程序。我的思路是,把區(qū)域三部分:近距離20CM以內(nèi),適中區(qū)域(20CM150CM),遠(yuǎn)距離(150CM以外)。得到22組數(shù)據(jù)后首先是根據(jù)區(qū)域分類,然后記各區(qū)域的角度大小,當(dāng)遠(yuǎn)距離的角度范圍最大時,判斷為空曠區(qū),其他是多障礙區(qū)。然后根據(jù)角度大小排序,當(dāng)適中區(qū)最大時,走的方向?yàn)檫m中區(qū)集中的方向。當(dāng)最大區(qū)域?yàn)榻嚯x或遠(yuǎn)距離時,走遠(yuǎn)距離區(qū),具體方向?yàn)樽钸h(yuǎn)點(diǎn)方向。速度總是由最近的障礙物距離計(jì)算得出。5系統(tǒng)調(diào)試首先是分模塊調(diào)試。把各個模塊的功能分開實(shí)現(xiàn)。然后是部分的組合到一起使用,如超聲波測距和1603顯示、兩路舵機(jī)同時控制。在軟件調(diào)試的時候,出現(xiàn)了RAM區(qū)不夠用。原因出在避障算法上。定義的數(shù)組多,而且長。用戶128RAM不夠用??梢杂袃蓚€解決辦法:一是改進(jìn)代碼,使用指針;二是擴(kuò)展RAM區(qū)??紤]到代碼優(yōu)化不是一天兩天就弄好的,而且我的C語言編程水平實(shí)在淺薄,指針依然是用不好,一用就報錯。那只好擴(kuò)展RAM。查查60S2的數(shù)據(jù)手冊,它取消了外部擴(kuò)展RAM和ROM的功能,但是內(nèi)部增加了1的RAM,用法是在定義變量時,加前綴“XDATA”,告訴編譯器把后面的變量定義在擴(kuò)展RAM區(qū)。此外我還了解到“DATA”、“PDATA”、“IDATA”都是51系統(tǒng)編譯器允許的關(guān)鍵字,具體的解釋是:dATa: 固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。 idATa: 固定指前面0x00-0xff的256個RAM,其中前128和dATa的128完全相同,只是因?yàn)樵L問的方式不同。idATa是用類似C中的指針方式 訪問的。匯編中的語句為:mox ACC,Rx.(不重要的補(bǔ)充:c中idATa做指針式的訪問效果很好) xdATa: 外部擴(kuò)展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。 pdATa: 外部擴(kuò)展RAM的低256個字節(jié),地址出現(xiàn)在A0-A7的上時讀寫,用movx ACC,Rx讀寫。硬件方面的調(diào)試主要在模塊調(diào)試方面。因?yàn)榛旧隙加玫默F(xiàn)有的模塊電路,自己設(shè)計(jì)的電路基本沒有(自己還差的很遠(yuǎn)唉?。?,沒有什么難的。小車主板:圖5.1 小車主板整車圖片:圖5.2 整車鳥瞰圖6總結(jié)兩周的單片機(jī)課程設(shè)計(jì)很快就結(jié)束了,但是在進(jìn)軍單片機(jī)領(lǐng)域,這僅僅是個開始。學(xué)習(xí)單片機(jī)最重要的是實(shí)踐。要投入必要的成本。一塊開發(fā)板必不可少,還有一大堆配套的硬件軟件。作為有志于今后繼續(xù)在單片機(jī)方面發(fā)展的我,學(xué)會使用51單片機(jī),遠(yuǎn)遠(yuǎn)不夠,世界上51系列占的市場份額并不多。流行的單片機(jī),其功能遠(yuǎn)遠(yuǎn)好于51,因此,學(xué)習(xí)51單片機(jī)重點(diǎn)在于利用它簡單易學(xué)的特點(diǎn)掌握單片機(jī)的各種通用性的東西,深刻理解和掌握它的工作原理和使用方式,這樣可以快捷的掌握其他單片機(jī)的使用。把單片機(jī)作為改變生活的萬能工具。學(xué)習(xí)單片機(jī),離不開編程,離不開軟件。語言作為一種高級語言,與硬件聯(lián)系緊密。因此在單片機(jī)領(lǐng)域,基本都用的是語言。靈活運(yùn)用語言,對單片機(jī)學(xué)習(xí)帶來極大的便利。今后還得繼續(xù)深入學(xué)習(xí)語言。還有一點(diǎn),非常重要,把軟件工程的思想融入到單片機(jī)的編程中。比如分層和封裝思想。這個課程設(shè)計(jì)中所有的程序,并不是都在這兩周寫的,有一些以前玩過類似的模塊,當(dāng)然有可靠地例程,在這里,修改一下硬件接口,修改一下工作方式,就可以用了。由此看出,單片機(jī)學(xué)習(xí)是可以積累的。除了掌握大量的知識,還有個人的單片機(jī)例程、軟件、電路設(shè)計(jì)庫,這樣會越來越容易。參考文獻(xiàn):【1】單片微型計(jì)算機(jī)原理、應(yīng)用及接口技術(shù)(第2版)張迎新M北京:國防工業(yè)出版社,2004【2】 夏路易 石宗義Protel 99se電路原理圖與電路板設(shè)計(jì)教程北京:北京希望電子出版社,2004【3】單片微型計(jì)算機(jī)原理、應(yīng)用及接口技術(shù)(第2版)張迎新M北京:國防工業(yè)出版社,2004【4】宏晶STC12單片機(jī)技術(shù)手冊附錄A硬件電路圖圖A.1 整車鳥瞰圖附錄B 源程序 工程文件結(jié)構(gòu):圖B.1 整車鳥瞰圖STC12C5A60S2增加的特殊功能寄存器與地址的映射:#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 = 0x95;/*stc12c5a60s2*/sfr P2M0 = 0x96;/*stc12c5a60s2*/sfr CLK_DIV=0x97;/*stc12c5a60s2*/Clock Divdersfr S2CON = 0x9A;/*stc12c5a60s2*/sfr S2BUF = 0x9B;/*stc12c5a60s2*/sfr BRT = 0x9C;/*stc12c5a60s2*/sfr BUS_SPEED=0xA1;/*stc12c5a60s2*/sfr AUXR1 = 0xA2;/*stc12c5a60s2*/sfr IE2 = 0xAF;/*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 Highsfr P4SW = 0xBB;/*stc12c5a60s2*/P4 I/O Switchsfr ADC_CONTR=0xBC;/*stc12c5a60s2*/sfr ADC_RES=0xBD;/*stc12c5a60s2*/sfr ADC_RESL=0xBE;/*stc12c5a60s2*/A/D Result Lowsfr P4 = 0xC0;/*stc12c5a60s2*/P4 I/Osfr WDT_CONTR=0xC1;/*stc12c5a60s2*/Watch-Dog-Timer Cotrol Registersfr IAP_DATA=0xC2;/*stc12c5a60s2*/ISP/IAP Flash Data Registersfr IAP_ADDRH=0xC3;/*stc12c5a60s2*/ISP/IAP Flash Address Highsfr IAP_ADDRL=0xC4;/*stc12c5a60s2*/ISP/IAP Flash Address Lowsfr IAP_CMD= 0xC5;/*stc12c5a60s2*/ISP/IAP Flash Command Registersfr IAP_TRIG=0xC6;/*stc12c5a60s2*/ISP/IAP Flash Command Triggersfr IAP_CONTR=0xC7;/*stc12c5a60s2*/ISP/IAP Control Registersfr P5 = 0xC8;/*stc12c5a60s2*/P5 I/Osfr P5M1 = 0xC9;/*stc12c5a60s2*/sfr P5M0 = 0xCA;/*stc12c5a60s2*/sfr TL2 = 0xCC; /*8052*/sfr SPSTAT= 0xCD;/*stc12c5a60s2*/SPI Control Registersfr SPCTL = 0xCE;/*stc12c5a60s2*/SPI Status Registersfr SPDAT = 0xCF;/*stc12c5a60s2*/SPI Data Registersfr CCON = 0xD8;/*stc12c5a60s2*/PCAsfr CMOD = 0xD9;/*stc12c5a60s2*/PCAsfr CCAPM0= 0xDA;/*stc12c5a60s2*/PCAsfr CCAPM1= 0xDB;/*stc12c5a60s2*/PCAsfr CL = 0xE9;/*stc12c5a60s2*/sfrCCAP0L= 0xEA;/*stc12c5a60s2*/sfrCCAP1L= 0xEB;/*stc12c5a60s2*/sfr PAC_PWM0=0xF2;/*stc12c5a60s2*/PCA PWMsfr PAC_PWM1=0xF3;/*stc12c5a60s2*/PCA PWMsfr CH = 0xF9;/*stc12c5a60s2*/sfr CCAP0H= 0xFA;/*stc12c5a60s2*/sfr CCAP1H= 0xFB;/*stc12c5a60s2*/* BIT Registers */*CCON*/sbit CF =CCON7;sbit CR =CCON6;sbit CCF1 =CCON1;sbit CCF0 =CCON0;#endifLCD1603顯示程序文件:#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);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; 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(Data); 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) 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=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);LCD_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);break;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_Data(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); LCD_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); delay_ms(1); #ifndef _1603_H_#define _1603_H_sbit buzz=P23;sbit D_C= P10;sbit R_W= P11;sbit EN = P25;#define DataPort P0bit 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(u8 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)PCON|=0x80;s=1;elsePCON&=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 if(TI!=0)TI=0;flagR=1;elseif(RI!=0)receive=SBUF;P1=receive;if(receive=0xFF)stopF=1;elseif(receive=0x5A)stopF=0;RI=0; #ifndef _COM_H_#define _COM_H_void COMInit(u16 bps);#endif自定義變量類型文件:#ifndef _DEFINE_H_#define _DEFINE_H_#define u8 unsigned char#define u16 unsigned int#define u32 unsigned long#endif各種延時函數(shù)文件:#include"define.h"#include"delay.h"void delay_us(u16 xus)xus=2*xus;while(xus-);void delay_ms(u16 xms)int i,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) 各個外設(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;bit T1_F=0;void Int0_Routine(void) interrupt 0if(IE0)delay_ms(800);if(IE0)key_flag+;void Int1_Routine(void) interrupt 2T=(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;void Timer1_Routine(void) interrupt 3T=(TH1*256+TL1);TH1=0;TL1=0;T1_Count+;void UART_Routine(void) interrupt 4 if(TI)TI=0;elseif(RI)receive=SBUF;RI=0; #endif脈寬測量初始化文件:#include<reg52.h>#include"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=P21;void capture_init(void);#endif舵機(jī)控制文件:#include"delay.h"#include"1603.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;/Æô¶¯PCAvoid steer(u8 Mod,u8 Num,int degree)double duty;if(Mod)/½Ç¶Èduty=19.2+0.14222*(double)degree);if(duty>29)duty=29;elseif(duty<7)duty=7;if(Num=1)CCAP0H=(int)duty;CCAP0L=(int)duty;LCD_Write_Number(0,3,duty,3);if(Num=2)CCAP1H=(int)duty;CCAP1L=(int)duty;LCD_Write_Number(4,3,duty,3);elseif(degree>29)degree=29;elseif(degree<7)degree=7;if(Num=1)CCAP0H=degree;CCAP0L=degree;LCD_Write_Number(0,3,duty,3);if(Num=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ī)控制文件:#include"REG52.h"#include"define.h"#include"delay.h"#include"PWM.h"sbit motorIO=P12;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;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"#include"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 tem5;u32_l xdata distance22;u8 xdata close22,xdata fit22,xdata remote22;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=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);tem0=juli;chufa=1;while(!T1_F);tem1=juli;chufa=1;while(!T1_F);tem2=juli;chufa=1;while(!T1_F);tem3=juli;chufa=1;while(!T1_F);tem4=juli;distancei-7=(tem0+tem1+tem2+tem3+tem4)/5;for(i=0;i<22;i+)if(distancei<200)closecloseN=i;closeN+;elseif(distancei>1500)remoteremoteN=i;remoteN+;elsefitfi

注意事項(xiàng)

本文(自動避障小車課程設(shè)計(jì)學(xué)術(shù)參考)為本站會員(無***)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點(diǎn)擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因?yàn)榫W(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

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

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


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