版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計 報 告</p><p> 課題名稱 基于ARM平臺的智能遙控小車 </p><p> 專 業(yè) 電子信息工程技術 </p><p> 班 級 電子B1512班 </p><p> 姓 名
2、 </p><p> 同 組 人 </p><p> 指導教師 </p><p> 2017-11-02</p><p><b> 目 錄</b></p>&
3、lt;p> 1.設計題目、要求及分工4</p><p> 1.1 設計題目4</p><p> 1.2 設計要求4</p><p><b> 1.3 分工4</b></p><p><b> 2.設計方案4</b></p><p> 3.硬件電路設
4、計5</p><p> 3.1硬件系統(tǒng)整體分析5</p><p> 3.2各模塊功能介紹5</p><p> 3.2.1 L298N驅動模塊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本章小結8</p><p> 4.軟件系統(tǒng)的分析與設計8</p><p> 5.調(diào)試結果記錄及分析10</p><p> 5.1作品編譯環(huán)境10</p><
6、p> 5.2結果記錄及分析11</p><p> 5.2.1電阻式觸摸屏調(diào)試記錄11</p><p> 5.2.2 2.4G無線通信模塊調(diào)試記錄11</p><p> 5.2.3直流電機調(diào)試記錄11</p><p><b> 參考文獻12</b></p><p><
7、b> 附錄113</b></p><p><b> 附錄222</b></p><p> 1.設計題目、要求及分工</p><p><b> 1.1 設計題目</b></p><p> 本課程設計題目是基于ARM平臺的智能遙控小車。在嵌入式高速發(fā)展,ARM獨占一席的今
8、天,熟練運用ARM對于電科大學生至為重要。</p><p><b> 1.2 設計要求</b></p><p> 由無線通信NRF24L01發(fā)射裝置、STM32F103微處理器和電阻式觸摸屏構成的遙控裝置向主體小車發(fā)送信息,控制小車的運行。由無線通信NRF24l01接收裝置、STM32F103微處理器、L298N直流電機驅動、直流電機組合的智能小車接收遙控裝置信息
9、來達到主機遙控從機的目的。</p><p><b> 1.3 分工</b></p><p> 在本次設計中,張榮俊同學主要負責軟件的設計與分析,賴慶鵬同學和湯青紅同學負責硬件電路的設計以及課程報告的撰寫,最后由我們?nèi)齻€人共同交流分析,對整個系統(tǒng)以及設計報告進行了優(yōu)化和改良。</p><p><b> 2.設計方案</b&g
10、t;</p><p> 方案一:采用STC89C52單片機作為主控芯片,ESPP8266WIFI模塊作無線通信、以及采用繼電器對電動機進行控制,通過切換電動機的開關來調(diào)整小車的速度。該方案的優(yōu)點是電路相對比較簡單,但是它的缺點也比較多,如:ESP8266WiFi模塊通信協(xié)議較為復雜,而繼電器的響應時間偏慢,壽命較短,容易損壞,可靠性也不是很高。故決定放棄此方案。</p><p> 方案
11、二:采用STM32F103系列單片機作為主控芯片,NRF24L01模塊作無線通信、以及專用的電機驅動芯片L298N來控制直流減速電機,L298N芯片是一個具有高電壓大電流的全橋驅動芯片,通過單片機的IO口輸出電平來改變芯片控制端的輸入電平,即可以實現(xiàn)對電機進行正轉、反轉和停止操作。用該芯片作為電機驅動,驅動能力大、操作方便、穩(wěn)定性好、性能優(yōu)良。故決定采用該方案。</p><p><b> 3.硬件電路
12、設計</b></p><p> 3.1硬件系統(tǒng)整體分析</p><p> 智能小車的硬件系統(tǒng)主要由電源模塊、MCU、電阻式觸摸屏模塊、電機驅動、直流電機、2.4G無線通信模塊、車架等組成。其硬件系統(tǒng)框圖如下:</p><p> 圖3.1 硬件系統(tǒng)主機框圖</p><p> 圖3.2 硬件系統(tǒng)從機框圖</p>
13、<p> 3.2各模塊功能介紹</p><p> 3.2.1 L298N驅動模塊</p><p> L298N是SGS公司的產(chǎn)品,比較常見的是15腳Multiwattt封裝的L298N,內(nèi)部包含4通道邏輯驅動電路??梢苑奖愕尿寗觾蓚€直流電機,或一個兩相步進電機。</p><p> L298N可接受標準TTL邏輯電平信號VSS,VSS可接4.5~7V
14、電壓。4腳VS接電源電壓,VS電壓范圍為+2.5~46V。輸出電流可達2.5A,可驅動電感性負載。1腳和15腳下管的發(fā)射極分別單獨引出以便接入電流采樣電阻,形成電流傳感信號。L298N可驅動2個電動機,OUT1,OUT2和OUT3,OUT4之間可分別接電機。</p><p> 圖3.3 L298N驅動模塊原理圖</p><p> 圖3.4 L298N驅動模塊實物正面圖 圖3.
15、5 L298N驅動模塊實物背面圖</p><p> 3.2.2 NRF24L01無線通信模塊</p><p> 本設計無線通信用到了NRF24L01模塊,2.4G通信是無線通信技術的一種,因為其工作在2.400GHz~2.4835GHz頻段之間,所以被稱為2.4G無線通信技術。是市面上主要無線技術(包括 Bluetooth、27M、2.4G)之一。多應用于無線鍵盤鼠標,四軸飛行器。&
16、lt;/p><p> 特點:低電壓,高效率,低成本,雙向高速數(shù)據(jù)傳輸,特小體積(不需要外接天線),具有快速跳頻,前向糾錯,校驗等功能,其工作在全球免費開放的ISM頻段,無需許可證。</p><p> 圖3.6 2.4G模塊實物圖</p><p> 3.2.3 STM32處理器</p><p> STM32F103系列處理器是32位ARM
17、微控制器,此系列控制芯片是意法半導體公司生產(chǎn),是 Cortex-M3內(nèi)核,該系列控制芯片按片內(nèi)F1ash容量大小可分為三大類:小容量、中容量、大容量。ARM32位的 Cortex-M3最高72MHz工作頻率支持串行單線調(diào)試(SWD)和JTAG接口調(diào)試模式,3個 USART接口,Vbat為RTC和后備寄存器供電,2個SPI接口。其價格低,功能強大。</p><p> 3.2.4 液晶屏顯示模塊</p>
18、<p> 市場上的主流顯示屏主要有TFT、OLED、12864、諾基亞5510。12864、諾基亞5510顯示分辨率不高,故不適合在本設計中使用。OLED雖然分辨率高、且又自帶背光,具有極高的市場使用率。但是OLED不能觸摸,不適合在人機交互界面中使用。所以本作品選擇TFT液晶顯示屏。市場上的TFT顯示屏分為2種,一種是電阻式顯示屏,還有一種是電容式顯示屏。</p><p> 圖3.7電阻式顯示
19、屏實物圖 圖3.8 電阻式顯示屏背部圖</p><p> 3.2.5 顯示屏與微控制器通信方式</p><p> IL9341簡介:26萬色TFT液晶顯示驅動器,支持320×240分辨率,172800字節(jié)顯存(320*240*2),使用FSMC方式模擬8080接口,FSMC可用于STM32微處理器控制NOR FLASH、PSRAM、和NAND F
20、LASH存儲芯片。在這里使用NORIPSRAM模式控制LCD,主要用到以下幾種信號線。各信號線與信號方向和功能如下表3-1所示。</p><p> 表3-1 FSMC引腳說明</p><p> 3.2.6本章小結 </p><p> 本章首先介紹了智能小車硬件系統(tǒng)框架,然后對硬件系統(tǒng)框架中各個模塊在系統(tǒng)設計中擔當?shù)木唧w角色與其性能進行了分析與介紹。在此基礎上對
21、智能小車的硬件進行了組裝,智能車整體外形如下圖。</p><p> 圖3.9智能車外形圖</p><p> 4.軟件系統(tǒng)的分析與設計</p><p> 本文研究智能小車的軟件系統(tǒng)主要有:系統(tǒng)初始化;電阻式觸摸屏的顯示和觸摸;2.4G無線數(shù)據(jù)的發(fā)送和接收;直流電機的驅動等。系統(tǒng)流程圖如圖4.1所示。</p><p> 圖4.1主機軟件系
22、統(tǒng)流程圖</p><p> 圖4.2主機主界面圖 圖4.3主機控制界面圖</p><p> 圖4.4從機軟件系統(tǒng)流程圖</p><p> 1、系統(tǒng)初始化包括:IO端口初始化、電阻式觸摸屏初始化、2.4G模塊初始化和系統(tǒng)滴答定時器初始化等。</p><p> 2、觸摸屏檢測:觸摸屏檢測的過程主要是MCU端口通過SPI讀取液晶
23、屏板載XPT2046芯片坐標信息,另經(jīng)過觸摸屏校準算法,執(zhí)行相應的功能。</p><p> 3、發(fā)送數(shù)據(jù):觸摸屏獲取的坐標信息后,使能2.4G無線模塊,再通過模塊發(fā)送對應的信息。</p><p> 4、接收數(shù)據(jù):接收數(shù)據(jù)功能在從機小車上,從機啟動后,2.4G無線模塊進入數(shù)據(jù)接收模式,等待接收主機發(fā)送的數(shù)據(jù)。</p><p> 5、電機驅動:MCU對無線模塊接收
24、的數(shù)據(jù)進行解析,接收信息無誤后使能L298N直流電機驅動模塊驅動直流電機。本設計研究的智能車的軟件系統(tǒng)所使用的編程語言是C語言。</p><p> 5.調(diào)試結果記錄及分析</p><p><b> 5.1作品編譯環(huán)境</b></p><p> 本作品的編譯環(huán)境為Keil,當前最高版本是Keil5,此軟件編譯環(huán)境界面十分良好??梢杂脩糇孕性O
25、置。圖5.1是Keil的主界面</p><p> 圖5.1 Keil5的主界面</p><p> 為了方便編寫代碼,及界面符合用戶自己的習慣,可以進入配置界面。下載程序時也需要在這里設置DEBUG。如圖5.2是編譯環(huán)境的設置界面。</p><p> 圖5.2 Keil5的配置界面</p><p> Keil5的調(diào)試界面也十分良好,點
26、擊debug按鈕便會進入debug調(diào)試模式,點擊run便可以運行程序的主函數(shù),隨即可以設置斷點或點擊單步運行去調(diào)試程序。如圖3-4為Kei15的調(diào)試窗口:</p><p> 圖5.3 keil5的調(diào)試窗口</p><p> 5.2結果記錄及分析 </p><p> 5.2.1電阻式觸摸屏調(diào)試記錄</p><p> 屏幕板載XPT204
27、6芯片起初讀取坐標信息有錯,通過Keil軟件DEBUG發(fā)現(xiàn)是在使用軟件模擬SPI時序時延時時間沒處理好。</p><p> 5.2.2 2.4G無線通信模塊調(diào)試記錄</p><p> 在調(diào)試2.4G無線通信模塊時,模塊發(fā)送數(shù)據(jù)異常,通過Keil軟件DEBUG讀取模塊狀態(tài)寄存器的值得出原因是主機未接收到從機的應答信號導致數(shù)據(jù)發(fā)送異常。</p><p> 5.2.
28、3直流電機調(diào)試記錄</p><p> 小車一共有四個電機,通過L298N驅動板驅動。起初調(diào)電機時有一個電機不轉動,通過檢測發(fā)現(xiàn)驅動電流不夠大。最后外加移動電源解決了該問題。</p><p> 在設計過程中遇到各種各樣的小問題,總結一點就是需要硬件加軟件結合調(diào)試,才能找出問題的根本。還有就是一定要有耐心,代碼一行一行檢查。其次就是要善于利用串口調(diào)試,跟蹤傳輸?shù)臄?shù)據(jù)信息,準確定位問題在哪。
29、最后,感謝兩位老師的耐心指導,提供解決問題的思路。</p><p><b> 參考文獻</b></p><p> [1]劉火良.STM32庫開發(fā)實戰(zhàn)指南[M].北京:機械工業(yè)出版社,2013:320-422</p><p> [2]蒙博宇.STM32自學筆記[M].北京:北京航空航天大學出版社,2012:230-240</p>
30、<p> [3]韓旭,王娣. C語言從入門到精通[M].北京:清華大學出版社,2010:244-260</p><p> [4]胡仁喜. Altium Designer 16從入門到精通[M].北京:機械工業(yè)出版社,2016:118-168</p><p><b> 附錄1</b></p><p> 程序1:主機主界面程序
31、</p><p> uint8_t display_home(void) </p><p><b> {</b></p><p> display_picture(0,0,240,320,gImage_1);//顯示九江學院?;請D片</p><p> LCD_SetFont(&Font8x16);//設置
32、顯示字體</p><p> LCD_SetColors(BLUE,WHITE);//設置顯示字體顏色</p><p> ILI9341_DispStringLine_EN_CH(LINE(0)," 高級職業(yè)技能實訓");</p><p> ILI9341_DispStringLine_EN_CH(LINE(1),"題目:
33、基于ARM平臺智能遙控小車");</p><p> ILI9341_DispStringLine_EN_CH(LINE(2)," 班級:B1512班");</p><p> ILI9341_DispStringLine_EN_CH(LINE(3),"姓名:張榮俊、賴慶鵬、湯青紅");</p><p>
34、 ILI9341_DispStringLine_EN_CH(LINE(4),"學號: 17號、 22號、 26號");</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)," 請點擊此處進入控制界面 ");</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連接成功?。?quot;);</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連接失?。?!");</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b>&l
39、t;/p><p> if(XPT2046_TouchDetect() == TOUCH_PRESSED)//檢測是否有觸摸操作</p><p><b> {</b></p><p> BEEP_ON();</p><p> XPT2046_Get_TouchedPoint(&zuobiao,strXPT204
40、6_TouchPara);//獲取觸摸坐標</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:主機控制界面程序</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 主機端 沒接收到應答信號,發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n");</p><p>
58、<b> break;</b></p><p> case ERROR:</p><p> printf("\r\n 未知原因導致發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case TX_DS:</p>
59、<p> printf("\r\n 主機接收到從機的應答信號,發(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 主機端 沒接收到應答信號,發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case ERROR:</p><p> printf("\r\n 未知原因導致發(fā)送失敗。 \r\n");</p>
63、<p><b> break;</b></p><p> case TX_DS:</p><p> printf("\r\n 主機接收到從機的應答信號,發(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 主機端 沒接收到應答信號,發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p>
67、case ERROR:</p><p> printf("\r\n 未知原因導致發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case TX_DS:</p><p> printf("\r\n 主機接收到從機的應答信號,發(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 主機端 沒接收到應答信號,發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n")
71、;</p><p><b> break;</b></p><p> case ERROR:</p><p> printf("\r\n 未知原因導致發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> c
72、ase TX_DS:</p><p> printf("\r\n 主機接收到從機的應答信號,發(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 主機端 沒接收到應答信號,發(fā)送次數(shù)超過限定值,發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case ERROR:</p><p> pri
76、ntf("\r\n 未知原因導致發(fā)送失敗。 \r\n");</p><p><b> break;</b></p><p> case TX_DS:</p><p> printf("\r\n 主機接收到從機的應答信號,發(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:主機主程序</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 正在檢測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連接失敗,請重新檢查接線。\r\n");</p><p><b> }</b></p><p> NRF2_TX_Mode();</p>
84、<p> printf("\r\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:觸摸屏坐標獲取程序</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:從機主程序</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 這是一個 NRF24L01 無線傳輸實驗 \r\n");</p><p> printf("\r\n 這是無線傳輸 主機端 的反饋信息\r\n");</p><p> printf("\r\n
101、 正在檢測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連接失敗,請重新檢查接線。\r\
103、n");</p><p><b> }</b></p><p> NRF_RX_Mode();</p><p> printf("\r\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 從機端 接收到 主機端 發(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("未接收到主機數(shù)據(jù)");</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
116、/p><p> 程序7:電機驅動程序</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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遙控智能小車課程設計
- 無線監(jiān)控小車課程設計報告
- 基于arm的無線遙控和激光循跡小車
- 無線遙控門鈴課程設計
- 無線遙控賽車課程設計
- 小車課程設計報告
- arm課程設計報告
- 無線遙控小車控制系統(tǒng)設計開題報告
- 遙控窗簾課程設計報告
- 基于arm空調(diào)綜合課程設計報告
- 嵌入式課程設計報告--基于arm平臺的打地鼠游戲
- 循跡小車課程設計報告
- 尋跡小車課程設計報告
- 無線遙控循跡小車設計方案
- 課程設計-基于單片機的遙控窗簾課程設計
- 紅外遙控開關課程設計報告
- 基于單片機的無線遙控小車設計【文獻綜述】
- 基于單片機的無線遙控小車設計-文獻綜述
- 通信原理課程設計--無線話筒和無線遙控門鈴的制作
- 自動循跡小車 課程設計報告
評論
0/150
提交評論