

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p> 課題名稱 基于ARM平臺(tái)的智能遙控小車 </p><p> 專 業(yè) 電子信息工程技術(shù) </p><p> 班 級(jí) 電子B1512班 </p><p> 姓 名
2、 </p><p> 同 組 人 </p><p> 指導(dǎo)教師 </p><p> 2017-11-02</p><p><b> 目 錄</b></p>&
3、lt;p> 1.設(shè)計(jì)題目、要求及分工4</p><p> 1.1 設(shè)計(jì)題目4</p><p> 1.2 設(shè)計(jì)要求4</p><p><b> 1.3 分工4</b></p><p><b> 2.設(shè)計(jì)方案4</b></p><p> 3.硬件電路設(shè)
4、計(jì)5</p><p> 3.1硬件系統(tǒng)整體分析5</p><p> 3.2各模塊功能介紹5</p><p> 3.2.1 L298N驅(qū)動(dòng)模塊5</p><p> 3.2.2 NRF24L01無線通信模塊6</p><p> 3.2.3 STM32處理器6</p><p>
5、 3.2.4 液晶屏顯示模塊7</p><p> 3.2.5 顯示屏與微控制器通信方式7</p><p> 3.2.6本章小結(jié)8</p><p> 4.軟件系統(tǒng)的分析與設(shè)計(jì)8</p><p> 5.調(diào)試結(jié)果記錄及分析10</p><p> 5.1作品編譯環(huán)境10</p><
6、p> 5.2結(jié)果記錄及分析11</p><p> 5.2.1電阻式觸摸屏調(diào)試記錄11</p><p> 5.2.2 2.4G無線通信模塊調(diào)試記錄11</p><p> 5.2.3直流電機(jī)調(diào)試記錄11</p><p><b> 參考文獻(xiàn)12</b></p><p><
7、b> 附錄113</b></p><p><b> 附錄222</b></p><p> 1.設(shè)計(jì)題目、要求及分工</p><p><b> 1.1 設(shè)計(jì)題目</b></p><p> 本課程設(shè)計(jì)題目是基于ARM平臺(tái)的智能遙控小車。在嵌入式高速發(fā)展,ARM獨(dú)占一席的今
8、天,熟練運(yùn)用ARM對(duì)于電科大學(xué)生至為重要。</p><p><b> 1.2 設(shè)計(jì)要求</b></p><p> 由無線通信NRF24L01發(fā)射裝置、STM32F103微處理器和電阻式觸摸屏構(gòu)成的遙控裝置向主體小車發(fā)送信息,控制小車的運(yùn)行。由無線通信NRF24l01接收裝置、STM32F103微處理器、L298N直流電機(jī)驅(qū)動(dòng)、直流電機(jī)組合的智能小車接收遙控裝置信息
9、來達(dá)到主機(jī)遙控從機(jī)的目的。</p><p><b> 1.3 分工</b></p><p> 在本次設(shè)計(jì)中,張榮俊同學(xué)主要負(fù)責(zé)軟件的設(shè)計(jì)與分析,賴慶鵬同學(xué)和湯青紅同學(xué)負(fù)責(zé)硬件電路的設(shè)計(jì)以及課程報(bào)告的撰寫,最后由我們?nèi)齻€(gè)人共同交流分析,對(duì)整個(gè)系統(tǒng)以及設(shè)計(jì)報(bào)告進(jìn)行了優(yōu)化和改良。</p><p><b> 2.設(shè)計(jì)方案</b&g
10、t;</p><p> 方案一:采用STC89C52單片機(jī)作為主控芯片,ESPP8266WIFI模塊作無線通信、以及采用繼電器對(duì)電動(dòng)機(jī)進(jìn)行控制,通過切換電動(dòng)機(jī)的開關(guān)來調(diào)整小車的速度。該方案的優(yōu)點(diǎn)是電路相對(duì)比較簡(jiǎn)單,但是它的缺點(diǎn)也比較多,如:ESP8266WiFi模塊通信協(xié)議較為復(fù)雜,而繼電器的響應(yīng)時(shí)間偏慢,壽命較短,容易損壞,可靠性也不是很高。故決定放棄此方案。</p><p> 方案
11、二:采用STM32F103系列單片機(jī)作為主控芯片,NRF24L01模塊作無線通信、以及專用的電機(jī)驅(qū)動(dòng)芯片L298N來控制直流減速電機(jī),L298N芯片是一個(gè)具有高電壓大電流的全橋驅(qū)動(dòng)芯片,通過單片機(jī)的IO口輸出電平來改變芯片控制端的輸入電平,即可以實(shí)現(xiàn)對(duì)電機(jī)進(jìn)行正轉(zhuǎn)、反轉(zhuǎn)和停止操作。用該芯片作為電機(jī)驅(qū)動(dòng),驅(qū)動(dòng)能力大、操作方便、穩(wěn)定性好、性能優(yōu)良。故決定采用該方案。</p><p><b> 3.硬件電路
12、設(shè)計(jì)</b></p><p> 3.1硬件系統(tǒng)整體分析</p><p> 智能小車的硬件系統(tǒng)主要由電源模塊、MCU、電阻式觸摸屏模塊、電機(jī)驅(qū)動(dòng)、直流電機(jī)、2.4G無線通信模塊、車架等組成。其硬件系統(tǒng)框圖如下:</p><p> 圖3.1 硬件系統(tǒng)主機(jī)框圖</p><p> 圖3.2 硬件系統(tǒng)從機(jī)框圖</p>
13、<p> 3.2各模塊功能介紹</p><p> 3.2.1 L298N驅(qū)動(dòng)模塊</p><p> L298N是SGS公司的產(chǎn)品,比較常見的是15腳Multiwattt封裝的L298N,內(nèi)部包含4通道邏輯驅(qū)動(dòng)電路??梢苑奖愕尿?qū)動(dòng)兩個(gè)直流電機(jī),或一個(gè)兩相步進(jìn)電機(jī)。</p><p> L298N可接受標(biāo)準(zhǔn)TTL邏輯電平信號(hào)VSS,VSS可接4.5~7V
14、電壓。4腳VS接電源電壓,VS電壓范圍為+2.5~46V。輸出電流可達(dá)2.5A,可驅(qū)動(dòng)電感性負(fù)載。1腳和15腳下管的發(fā)射極分別單獨(dú)引出以便接入電流采樣電阻,形成電流傳感信號(hào)。L298N可驅(qū)動(dòng)2個(gè)電動(dòng)機(jī),OUT1,OUT2和OUT3,OUT4之間可分別接電機(jī)。</p><p> 圖3.3 L298N驅(qū)動(dòng)模塊原理圖</p><p> 圖3.4 L298N驅(qū)動(dòng)模塊實(shí)物正面圖 圖3.
15、5 L298N驅(qū)動(dòng)模塊實(shí)物背面圖</p><p> 3.2.2 NRF24L01無線通信模塊</p><p> 本設(shè)計(jì)無線通信用到了NRF24L01模塊,2.4G通信是無線通信技術(shù)的一種,因?yàn)槠涔ぷ髟?.400GHz~2.4835GHz頻段之間,所以被稱為2.4G無線通信技術(shù)。是市面上主要無線技術(shù)(包括 Bluetooth、27M、2.4G)之一。多應(yīng)用于無線鍵盤鼠標(biāo),四軸飛行器。&
16、lt;/p><p> 特點(diǎn):低電壓,高效率,低成本,雙向高速數(shù)據(jù)傳輸,特小體積(不需要外接天線),具有快速跳頻,前向糾錯(cuò),校驗(yàn)等功能,其工作在全球免費(fèi)開放的ISM頻段,無需許可證。</p><p> 圖3.6 2.4G模塊實(shí)物圖</p><p> 3.2.3 STM32處理器</p><p> STM32F103系列處理器是32位ARM
17、微控制器,此系列控制芯片是意法半導(dǎo)體公司生產(chǎn),是 Cortex-M3內(nèi)核,該系列控制芯片按片內(nèi)F1ash容量大小可分為三大類:小容量、中容量、大容量。ARM32位的 Cortex-M3最高72MHz工作頻率支持串行單線調(diào)試(SWD)和JTAG接口調(diào)試模式,3個(gè) USART接口,Vbat為RTC和后備寄存器供電,2個(gè)SPI接口。其價(jià)格低,功能強(qiáng)大。</p><p> 3.2.4 液晶屏顯示模塊</p>
18、<p> 市場(chǎng)上的主流顯示屏主要有TFT、OLED、12864、諾基亞5510。12864、諾基亞5510顯示分辨率不高,故不適合在本設(shè)計(jì)中使用。OLED雖然分辨率高、且又自帶背光,具有極高的市場(chǎng)使用率。但是OLED不能觸摸,不適合在人機(jī)交互界面中使用。所以本作品選擇TFT液晶顯示屏。市場(chǎng)上的TFT顯示屏分為2種,一種是電阻式顯示屏,還有一種是電容式顯示屏。</p><p> 圖3.7電阻式顯示
19、屏實(shí)物圖 圖3.8 電阻式顯示屏背部圖</p><p> 3.2.5 顯示屏與微控制器通信方式</p><p> IL9341簡(jiǎn)介:26萬色TFT液晶顯示驅(qū)動(dòng)器,支持320×240分辨率,172800字節(jié)顯存(320*240*2),使用FSMC方式模擬8080接口,FSMC可用于STM32微處理器控制NOR FLASH、PSRAM、和NAND F
20、LASH存儲(chǔ)芯片。在這里使用NORIPSRAM模式控制LCD,主要用到以下幾種信號(hào)線。各信號(hào)線與信號(hào)方向和功能如下表3-1所示。</p><p> 表3-1 FSMC引腳說明</p><p> 3.2.6本章小結(jié) </p><p> 本章首先介紹了智能小車硬件系統(tǒng)框架,然后對(duì)硬件系統(tǒng)框架中各個(gè)模塊在系統(tǒng)設(shè)計(jì)中擔(dān)當(dāng)?shù)木唧w角色與其性能進(jìn)行了分析與介紹。在此基礎(chǔ)上對(duì)
21、智能小車的硬件進(jìn)行了組裝,智能車整體外形如下圖。</p><p> 圖3.9智能車外形圖</p><p> 4.軟件系統(tǒng)的分析與設(shè)計(jì)</p><p> 本文研究智能小車的軟件系統(tǒng)主要有:系統(tǒng)初始化;電阻式觸摸屏的顯示和觸摸;2.4G無線數(shù)據(jù)的發(fā)送和接收;直流電機(jī)的驅(qū)動(dòng)等。系統(tǒng)流程圖如圖4.1所示。</p><p> 圖4.1主機(jī)軟件系
22、統(tǒng)流程圖</p><p> 圖4.2主機(jī)主界面圖 圖4.3主機(jī)控制界面圖</p><p> 圖4.4從機(jī)軟件系統(tǒng)流程圖</p><p> 1、系統(tǒng)初始化包括:IO端口初始化、電阻式觸摸屏初始化、2.4G模塊初始化和系統(tǒng)滴答定時(shí)器初始化等。</p><p> 2、觸摸屏檢測(cè):觸摸屏檢測(cè)的過程主要是MCU端口通過SPI讀取液晶
23、屏板載XPT2046芯片坐標(biāo)信息,另經(jīng)過觸摸屏校準(zhǔn)算法,執(zhí)行相應(yīng)的功能。</p><p> 3、發(fā)送數(shù)據(jù):觸摸屏獲取的坐標(biāo)信息后,使能2.4G無線模塊,再通過模塊發(fā)送對(duì)應(yīng)的信息。</p><p> 4、接收數(shù)據(jù):接收數(shù)據(jù)功能在從機(jī)小車上,從機(jī)啟動(dòng)后,2.4G無線模塊進(jìn)入數(shù)據(jù)接收模式,等待接收主機(jī)發(fā)送的數(shù)據(jù)。</p><p> 5、電機(jī)驅(qū)動(dòng):MCU對(duì)無線模塊接收
24、的數(shù)據(jù)進(jìn)行解析,接收信息無誤后使能L298N直流電機(jī)驅(qū)動(dòng)模塊驅(qū)動(dòng)直流電機(jī)。本設(shè)計(jì)研究的智能車的軟件系統(tǒng)所使用的編程語言是C語言。</p><p> 5.調(diào)試結(jié)果記錄及分析</p><p><b> 5.1作品編譯環(huán)境</b></p><p> 本作品的編譯環(huán)境為Keil,當(dāng)前最高版本是Keil5,此軟件編譯環(huán)境界面十分良好??梢杂脩糇孕性O(shè)
25、置。圖5.1是Keil的主界面</p><p> 圖5.1 Keil5的主界面</p><p> 為了方便編寫代碼,及界面符合用戶自己的習(xí)慣,可以進(jìn)入配置界面。下載程序時(shí)也需要在這里設(shè)置DEBUG。如圖5.2是編譯環(huán)境的設(shè)置界面。</p><p> 圖5.2 Keil5的配置界面</p><p> Keil5的調(diào)試界面也十分良好,點(diǎn)
26、擊debug按鈕便會(huì)進(jìn)入debug調(diào)試模式,點(diǎn)擊run便可以運(yùn)行程序的主函數(shù),隨即可以設(shè)置斷點(diǎn)或點(diǎn)擊單步運(yùn)行去調(diào)試程序。如圖3-4為Kei15的調(diào)試窗口:</p><p> 圖5.3 keil5的調(diào)試窗口</p><p> 5.2結(jié)果記錄及分析 </p><p> 5.2.1電阻式觸摸屏調(diào)試記錄</p><p> 屏幕板載XPT204
27、6芯片起初讀取坐標(biāo)信息有錯(cuò),通過Keil軟件DEBUG發(fā)現(xiàn)是在使用軟件模擬SPI時(shí)序時(shí)延時(shí)時(shí)間沒處理好。</p><p> 5.2.2 2.4G無線通信模塊調(diào)試記錄</p><p> 在調(diào)試2.4G無線通信模塊時(shí),模塊發(fā)送數(shù)據(jù)異常,通過Keil軟件DEBUG讀取模塊狀態(tài)寄存器的值得出原因是主機(jī)未接收到從機(jī)的應(yīng)答信號(hào)導(dǎo)致數(shù)據(jù)發(fā)送異常。</p><p> 5.2.
28、3直流電機(jī)調(diào)試記錄</p><p> 小車一共有四個(gè)電機(jī),通過L298N驅(qū)動(dòng)板驅(qū)動(dòng)。起初調(diào)電機(jī)時(shí)有一個(gè)電機(jī)不轉(zhuǎn)動(dòng),通過檢測(cè)發(fā)現(xiàn)驅(qū)動(dòng)電流不夠大。最后外加移動(dòng)電源解決了該問題。</p><p> 在設(shè)計(jì)過程中遇到各種各樣的小問題,總結(jié)一點(diǎn)就是需要硬件加軟件結(jié)合調(diào)試,才能找出問題的根本。還有就是一定要有耐心,代碼一行一行檢查。其次就是要善于利用串口調(diào)試,跟蹤傳輸?shù)臄?shù)據(jù)信息,準(zhǔn)確定位問題在哪。
29、最后,感謝兩位老師的耐心指導(dǎo),提供解決問題的思路。</p><p><b> 參考文獻(xiàn)</b></p><p> [1]劉火良.STM32庫開發(fā)實(shí)戰(zhàn)指南[M].北京:機(jī)械工業(yè)出版社,2013:320-422</p><p> [2]蒙博宇.STM32自學(xué)筆記[M].北京:北京航空航天大學(xué)出版社,2012:230-240</p>
30、<p> [3]韓旭,王娣. C語言從入門到精通[M].北京:清華大學(xué)出版社,2010:244-260</p><p> [4]胡仁喜. Altium Designer 16從入門到精通[M].北京:機(jī)械工業(yè)出版社,2016:118-168</p><p><b> 附錄1</b></p><p> 程序1:主機(jī)主界面程序
31、</p><p> uint8_t display_home(void) </p><p><b> {</b></p><p> display_picture(0,0,240,320,gImage_1);//顯示九江學(xué)院校徽?qǐng)D片</p><p> LCD_SetFont(&Font8x16);//設(shè)置
32、顯示字體</p><p> LCD_SetColors(BLUE,WHITE);//設(shè)置顯示字體顏色</p><p> ILI9341_DispStringLine_EN_CH(LINE(0)," 高級(jí)職業(yè)技能實(shí)訓(xùn)");</p><p> ILI9341_DispStringLine_EN_CH(LINE(1),"題目:
33、基于ARM平臺(tái)智能遙控小車");</p><p> ILI9341_DispStringLine_EN_CH(LINE(2)," 班級(jí):B1512班");</p><p> ILI9341_DispStringLine_EN_CH(LINE(3),"姓名:張榮俊、賴慶鵬、湯青紅");</p><p>
34、 ILI9341_DispStringLine_EN_CH(LINE(4),"學(xué)號(hào): 17號(hào)、 22號(hào)、 26號(hào)");</p><p> LCD_SetColors(RED,WHITE);</p><p> ILI9341_DrawRectangle (0,270,240,20,1);</p><p> LCD_SetColors(BLA
35、CK,RED);</p><p> ILI9341_DispStringLine_EN_CH(LINE(17)," 請(qǐng)點(diǎn)擊此處進(jìn)入控制界面 ");</p><p> LCD_SetColors(BLACK,GREEN);</p><p><b> while(1)</b></p><p>&
36、lt;b> {</b></p><p> switch(status)</p><p><b> {</b></p><p> case SUCCESS:</p><p><b> {</b></p><p> ILI9341_DispStrin
37、gLine_EN_CH(LINE(19),"NRF與MCU連接成功??!");</p><p><b> break;</b></p><p><b> }</b></p><p> case ERROR:</p><p><b> {</b><
38、/p><p> ILI9341_DispStringLine_EN_CH(LINE(19),"NRF與MCU連接失?。。?quot;);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b>&l
39、t;/p><p> if(XPT2046_TouchDetect() == TOUCH_PRESSED)//檢測(cè)是否有觸摸操作</p><p><b> {</b></p><p> BEEP_ON();</p><p> XPT2046_Get_TouchedPoint(&zuobiao,strXPT204
40、6_TouchPara);//獲取觸摸坐標(biāo)</p><p> SysTick_Delay_ms(100);</p><p> if(zuobiao.x >= 0 && zuobiao.x <= 240 && zuobiao.y >= 270 && zuobiao.y <= 286)</p><p
41、><b> {</b></p><p> flag_function =1;</p><p> return flag_function;</p><p><b> }</b></p><p><b> }</b></p><p><
42、;b> else</b></p><p><b> {</b></p><p> BEEP_OFF();</p><p><b> }</b></p><p><b> }</b></p><p><b> }&l
43、t;/b></p><p> 程序2:主機(jī)控制界面程序</p><p> uint8_t display_control(void)</p><p><b> {</b></p><p> LCD_SetColors(WHITE,WHITE);</p><p> ILI9341_D
44、rawRectangle (0,0,240,320,1);</p><p> ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);//清屏,顯示全黑 </p><p> LCD_SetColors(BLUE,WHITE);</p><p> ILI9341_DispStringLine_EN_CH(LINE(3),&quo
45、t; 2.4G遙控小車控制面板");</p><p> LCD_SetFont(&Font16x24);</p><p> LCD_SetColors(GREEN,WHITE);</p><p> ILI9341_DrawRectangle (80,80,80,80,1);</p><p> LCD_SetCo
46、lors(WHITE,GREEN);</p><p> ILI9341_DispString_EN (105 ,110, "go" );</p><p> LCD_SetColors(BLUE,WHITE);</p><p> ILI9341_DrawRectangle (0,160,80,80,1);</p><p&
47、gt; LCD_SetColors(WHITE,BLUE);</p><p> ILI9341_DispString_EN ( 8 ,185,"left" );</p><p> LCD_SetColors(RED,WHITE);</p><p> ILI9341_DrawRectangle ( 80, 160, 80, 80, 1);&
48、lt;/p><p> LCD_SetColors(WHITE,RED);</p><p> ILI9341_DispString_EN (88,185,"stop" );</p><p> LCD_SetColors(MAGENTA,MAGENTA);</p><p> ILI9341_DrawRectangle (1
49、60,160,80,80,1);</p><p> LCD_SetColors(WHITE,MAGENTA);</p><p> ILI9341_DispString_EN (160,185,"right" )</p><p> LCD_SetColors(YELLOW,WHITE);</p><p> ILI93
50、41_DrawRectangle (80,240,80,80,1);</p><p> LCD_SetColors(WHITE,YELLOW);</p><p> ILI9341_DispString_EN (88,265,"back");</p><p> LCD_SetColors(RED,RED);</p><p&
51、gt; ILI9341_DrawRectangle (180,300,60,20,1);</p><p> LCD_SetFont(&Font8x16);</p><p> LCD_SetColors(BLACK,RED);</p><p> ILI9341_DispString_CH (193,302,"退出");</p&
52、gt;<p><b> while(1)</b></p><p><b> {</b></p><p> if(XPT2046_TouchDetect() == TOUCH_PRESSED)</p><p><b> {</b></p><p> B
53、EEP_ON();</p><p> XPT2046_Get_TouchedPoint(&zuobiao,strXPT2046_TouchPara);</p><p> SysTick_Delay_ms(100);</p><p> if(zuobiao.x >= 180 && zuobiao.x <= 240 &&
54、amp; zuobiao.y >= 300 && zuobiao.y <= 320)</p><p><b> {</b></p><p> BEEP_OFF();</p><p> LED_OFF();</p><p> status = NRF2_Tx_Dat(tx_quit);
55、</p><p> status = NRF2_Check();</p><p> flag_function = 0;return flag_function;</p><p><b> }</b></p><p> else if(zuobiao.x >= 80 && zuobia
56、o.x <= 160 && zuobiao.y >= 80 && zuobiao.y <= 160)</p><p><b> {</b></p><p><b> LED_G();</b></p><p> status = NRF2_Tx_Dat(tx_go);
57、</p><p> switch(status)</p><p><b> {</b></p><p> case MAX_RT:</p><p> printf("\r\n 主機(jī)端 沒接收到應(yīng)答信號(hào),發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n");</p><p>
58、<b> break;</b></p><p> case ERROR:</p><p> printf("\r\n 未知原因?qū)е掳l(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case TX_DS:</p>
59、<p> printf("\r\n 主機(jī)接收到從機(jī)的應(yīng)答信號(hào),發(fā)送成功!發(fā)送的數(shù)據(jù)為%d\r\n",tx_go[0]); </p><p> break; </p><p><b> }</b></p><p> status = 0;</p><p><b&g
60、t; }</b></p><p> else if(zuobiao.x >= 0 && zuobiao.x <= 80 && zuobiao.y >= 160 && zuobiao.y <= 240)</p><p><b> {</b></p><p>
61、<b> LED_B();</b></p><p> status = NRF2_Tx_Dat(tx_left);</p><p> switch(status)</p><p><b> {</b></p><p> case MAX_RT:</p><p>
62、; printf("\r\n 主機(jī)端 沒接收到應(yīng)答信號(hào),發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case ERROR:</p><p> printf("\r\n 未知原因?qū)е掳l(fā)送失敗。 \r\n");</p>
63、<p><b> break;</b></p><p> case TX_DS:</p><p> printf("\r\n 主機(jī)接收到從機(jī)的應(yīng)答信號(hào),發(fā)送成功!發(fā)送的數(shù)據(jù)為%d\r\n",tx_left[0]); </p><p> break; </p><p>
64、;<b> }</b></p><p> status = 0;</p><p><b> }</b></p><p> else if(zuobiao.x >= 80 && zuobiao.x <= 160 && zuobiao.y >= 160 &&am
65、p; zuobiao.y <= 240)</p><p><b> {</b></p><p><b> LED_R();</b></p><p> status = NRF2_Tx_Dat(tx_stop);</p><p> switch(status)</p>
66、<p><b> {</b></p><p> case MAX_RT:</p><p> printf("\r\n 主機(jī)端 沒接收到應(yīng)答信號(hào),發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p>
67、case ERROR:</p><p> printf("\r\n 未知原因?qū)е掳l(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case TX_DS:</p><p> printf("\r\n 主機(jī)接收到從機(jī)的應(yīng)答信號(hào),發(fā)送成功!發(fā)送的
68、數(shù)據(jù)為%d\r\n",tx_stop[0]); </p><p> break; </p><p><b> }</b></p><p> status = 0;</p><p><b> }</b></p><p> else if(zu
69、obiao.x >= 160 && zuobiao.x <= 240 && zuobiao.y >= 160 && zuobiao.y <= 240)</p><p><b> {</b></p><p> LED_R_B();</p><p> status = N
70、RF2_Tx_Dat(tx_right);</p><p> switch(status)</p><p><b> {</b></p><p> case MAX_RT:</p><p> printf("\r\n 主機(jī)端 沒接收到應(yīng)答信號(hào),發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n")
71、;</p><p><b> break;</b></p><p> case ERROR:</p><p> printf("\r\n 未知原因?qū)е掳l(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> c
72、ase TX_DS:</p><p> printf("\r\n 主機(jī)接收到從機(jī)的應(yīng)答信號(hào),發(fā)送成功!發(fā)送的數(shù)據(jù)為%d\r\n",tx_right[0]); </p><p> break; </p><p><b> }</b></p><p> status = 0;<
73、;/p><p> flag_control = 4;</p><p><b> }</b></p><p> else if(zuobiao.x >= 80 && zuobiao.x <= 160 && zuobiao.y >= 240 && zuobiao.y <= 3
74、20)</p><p><b> {</b></p><p> LED_R_G();</p><p> status = NRF2_Tx_Dat(tx_back);</p><p> switch(status)</p><p><b> {</b></
75、p><p> case MAX_RT:</p><p> printf("\r\n 主機(jī)端 沒接收到應(yīng)答信號(hào),發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case ERROR:</p><p> pri
76、ntf("\r\n 未知原因?qū)е掳l(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case TX_DS:</p><p> printf("\r\n 主機(jī)接收到從機(jī)的應(yīng)答信號(hào),發(fā)送成功!發(fā)送的數(shù)據(jù)為%d\r\n",tx_back[0]); </
77、p><p> break; </p><p><b> }</b></p><p> status = 0;</p><p> flag_control = 5;</p><p><b> }</b></p><p><b&g
78、t; }</b></p><p><b> else</b></p><p><b> {</b></p><p> BEEP_OFF();</p><p><b> }</b></p><p><b> }</b
79、></p><p><b> }</b></p><p><b> 程序3:主機(jī)主程序</b></p><p> int main(void)</p><p><b> {</b></p><p> Beep_GPIO_Config()
80、;</p><p> LED_GPIO_Config();</p><p> ILI9341_Init(); </p><p> XPT2046_Init();</p><p> Calibrate_or_Get_TouchParaWithFlash(6,0);</p><p> SPI_FLASH_Init
81、();</p><p> SPI_NRF2_Init();</p><p> status = NRF2_Check();</p><p> USART_Config();</p><p> printf("\r\n 正在檢測(cè)NRF與MCU是否正常連接。。。\r\n");</p><p>
82、; if(status == SUCCESS)</p><p><b> {</b></p><p> printf("\r\n NRF與MCU連接成功!\r\n"); </p><p><b> }</b></p><p><b> else
83、</b></p><p><b> {</b></p><p> printf("\r\n NRF與MCU連接失敗,請(qǐng)重新檢查接線。\r\n");</p><p><b> }</b></p><p> NRF2_TX_Mode();</p>
84、<p> printf("\r\n 主機(jī)進(jìn)入發(fā)送模式\r\n");</p><p><b> while(1)</b></p><p><b> {</b></p><p> display_home();</p><p> if(flag_functi
85、on == 1)</p><p><b> {</b></p><p> display_control();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b&g
86、t;</p><p> 程序4:圖片顯示程序</p><p> void display_picture(u32 Xpos,u32 Ypos,u32 Pic_x,u32 Pic_y,const unsigned char * p)</p><p><b> { </b></p><p> u32 i,j;
87、</p><p> for(j = 0; j < Pic_y; j++)</p><p><b> { </b></p><p> for(i = 0; i < Pic_x; i++)</p><p><b> { </b></p><p> ILI93
88、41_SetPointPixel1(Xpos+i,Ypos+j,(*p<<8)+*(p+1)); </p><p><b> p += 2;</b></p><p><b> }</b></p><p><b> }</b></p><p><b>
89、 }</b></p><p> 程序5:觸摸屏坐標(biāo)獲取程序</p><p> uint8_t XPT2046_Get_TouchedPoint ( strType_XPT2046_Coordinate * pDisplayCoordinate, strType_XPT2046_TouchPara * pTouchPara )</p><p><
90、;b> {</b></p><p> uint8_t ucRet = 1; //若正常,則返回0</p><p> strType_XPT2046_Coordinate strScreenCoordinate; </p><p> if ( XPT2046_ReadAdc_Smooth_XY ( & strScr
91、eenCoordinate ) )</p><p><b> { </b></p><p> pDisplayCoordinate ->x = ( ( pTouchPara[LCD_SCAN_MODE].dX_X * strScreenCoordinate.x ) + ( pTouchPara[LCD_SCAN_MODE].dX_Y * strScre
92、enCoordinate.y ) + pTouchPara[LCD_SCAN_MODE].dX ); </p><p> pDisplayCoordinate ->y = ( ( pTouchPara[LCD_SCAN_MODE].dY_X * strScreenCoordinate.x ) + ( pTouchPara[LCD_SCAN_MODE].dY_Y * strScreenCoor
93、dinate.y ) + pTouchPara[LCD_SCAN_MODE].dY );</p><p><b> }</b></p><p> if(pDisplayCoordinate ->x>=500){pDisplayCoordinate ->x=0;}</p><p> else ucRet = 0;
94、</p><p> return ucRet;</p><p><b> }</b></p><p> 程序6:NRF24L01數(shù)據(jù)發(fā)送程序</p><p> u8 NRF_Tx_Dat(u8 *txbuf)</p><p><b> {</b></p>
95、<p> u8 state; </p><p> NRF2_CE_LOW();</p><p> SPI_NRF2_WriteBuf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH); </p><p> NRF2_CE_HIGH(); </p>
96、<p> while(NRF2_Read_IRQ()!=0); </p><p> state = SPI_NRF2_ReadReg(STATUS); </p><p> SPI_NRF2_WriteReg(NRF_WRITE_REG+STATUS,state); <
97、/p><p> SPI_NRF2_WriteReg(FLUSH_TX,NOP); </p><p> if(state&MAX_RT) </p><p> return MAX_RT; </p><p> else if(state&TX_DS)
98、 </p><p> return TX_DS;</p><p> else </p><p> return ERROR; </p><p><b> }</b></p><p><b> 程序7:從機(jī)主程序</b>
99、</p><p> int main(void) </p><p><b> { </b></p><p> CAR_Config();</p><p> LED_GPIO_Config();</p><p> SPI_NRF_Init();<
100、/p><p> USART1_Config();</p><p> printf("\r\n 這是一個(gè) NRF24L01 無線傳輸實(shí)驗(yàn) \r\n");</p><p> printf("\r\n 這是無線傳輸 主機(jī)端 的反饋信息\r\n");</p><p> printf("\r\n
101、 正在檢測(cè)NRF與MCU是否正常連接。。。\r\n");</p><p> status = NRF_Check(); </p><p> if(status == SUCCESS)</p><p><b> {</b></p><p> printf("\r\n NRF1與MCU
102、連接成功!\r\n"); </p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> printf("\r\n NRF1與MCU連接失敗,請(qǐng)重新檢查接線。\r\
103、n");</p><p><b> }</b></p><p> NRF_RX_Mode();</p><p> printf("\r\n 從機(jī)端 進(jìn)入接收模式\r\n"); </p><p><b> while(1)</b></p><p
104、> { status = NRF_Rx_Dat(rxbuf);</p><p> if(status == RX_DR)</p><p><b> {</b></p><p> printf("\r\n 從機(jī)端 接收到 主機(jī)端 發(fā)送的數(shù)據(jù)為:%d \r\n",rxbuf[0]);</p>&
105、lt;p> switch(rxbuf[0])</p><p><b> {</b></p><p><b> case 1:</b></p><p><b> {</b></p><p> printf("go\r\n");</p>
106、;<p><b> LED_G();</b></p><p><b> go();</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case 2:&l
107、t;/b></p><p><b> {</b></p><p> printf("left\r\n");</p><p><b> LED_B();</b></p><p><b> left();</b></p><p&
108、gt;<b> break;</b></p><p><b> }</b></p><p><b> case 3:</b></p><p><b> {</b></p><p> printf("stop\r\n");<
109、;/p><p><b> LED_R();</b></p><p><b> stop();</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> c
110、ase 4:</b></p><p><b> {</b></p><p> printf("right\r\n");</p><p> LED_R_B();</p><p><b> right();</b></p><p><
111、b> break;</b></p><p><b> }</b></p><p><b> case 5:</b></p><p><b> {</b></p><p> printf("back\r\n");</p>
112、<p> LED_R_G();</p><p><b> back();</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case 6:</b></p&g
113、t;<p><b> {</b></p><p> printf("led_off\r\n");</p><p> LED_OFF();</p><p><b> }</b></p><p><b> default:</b><
114、/p><p><b> {</b></p><p> rxbuf[0] = 0;</p><p><b> }</b></p><p><b> } </b></p><p> else if (status == ERROR)</p>
115、;<p><b> {</b></p><p> printf("未接收到主機(jī)數(shù)據(jù)");</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
116、/p><p> 程序7:電機(jī)驅(qū)動(dòng)程序</p><p> void go (void)</p><p><b> {</b></p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN1_PIN); </p><p> GPIO
117、_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN2_PIN);</p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN3_PIN); </p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN4_PIN);</p><p>
118、GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN1_PIN); </p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN2_PIN);</p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN3_PIN);</p&
119、gt;<p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN4_PIN);</p><p><b> }</b></p><p> void back(void)</p><p><b> {</b></p><p> GPI
120、O_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN1_PIN); </p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN2_PIN);</p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN3_PIN); </p><p&g
121、t; GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN4_PIN);</p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN1_PIN); </p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN2_PIN);</p>
122、<p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN3_PIN);</p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN4_PIN);</p><p><b> }</b></p><p> void left(v
123、oid)</p><p><b> {</b></p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN1_PIN); </p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN2_PIN);</p><p>
124、 GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN3_PIN); </p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN4_PIN);</p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN1_PIN); </p>
125、<p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN2_PIN);</p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN3_PIN); </p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN4_PIN);&
126、lt;/p><p><b> }</b></p><p> void right(void)</p><p><b> {</b></p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN1_PIN); </p><p
127、> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN2_PIN);</p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN3_PIN);GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN4_PIN);</p><p> GPIO_ResetBi
128、ts(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN1_PIN); </p><p> GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN2_PIN);</p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN3_PIN); </p><p> GPI
129、O_SetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN4_PIN);</p><p><b> }</b></p><p> void stop(void)</p><p><b> {</b></p><p> GPIO_ResetBits(MOTOR_GPIO
130、_PORT, MOTOR_LEFT_IN1_PIN);</p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN2_PIN);</p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_LEFT_IN3_PIN);</p><p> GPIO_ResetBits(MOTOR
131、_GPIO_PORT, MOTOR_LEFT_IN4_PIN);</p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN1_PIN);</p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN2_PIN);</p><p> GPIO_ResetBit
132、s(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN3_PIN);</p><p> GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_RIGHT_IN4_PIN);</p><p><b> }</b></p><p><b> 附錄2</b></p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 遙控智能小車課程設(shè)計(jì)
- 無線監(jiān)控小車課程設(shè)計(jì)報(bào)告
- 基于arm的無線遙控和激光循跡小車
- 無線遙控門鈴課程設(shè)計(jì)
- 無線遙控賽車課程設(shè)計(jì)
- 小車課程設(shè)計(jì)報(bào)告
- arm課程設(shè)計(jì)報(bào)告
- 無線遙控小車控制系統(tǒng)設(shè)計(jì)開題報(bào)告
- 遙控窗簾課程設(shè)計(jì)報(bào)告
- 基于arm空調(diào)綜合課程設(shè)計(jì)報(bào)告
- 嵌入式課程設(shè)計(jì)報(bào)告--基于arm平臺(tái)的打地鼠游戲
- 循跡小車課程設(shè)計(jì)報(bào)告
- 尋跡小車課程設(shè)計(jì)報(bào)告
- 無線遙控循跡小車設(shè)計(jì)方案
- 課程設(shè)計(jì)-基于單片機(jī)的遙控窗簾課程設(shè)計(jì)
- 紅外遙控開關(guān)課程設(shè)計(jì)報(bào)告
- 基于單片機(jī)的無線遙控小車設(shè)計(jì)【文獻(xiàn)綜述】
- 基于單片機(jī)的無線遙控小車設(shè)計(jì)-文獻(xiàn)綜述
- 通信原理課程設(shè)計(jì)--無線話筒和無線遙控門鈴的制作
- 自動(dòng)循跡小車 課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論