課程設(shè)計(jì)--基于arm平臺(tái)的無線遙控小車設(shè)計(jì)報(bào)告_第1頁
已閱讀1頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論