STM32課程設(shè)計貪吃蛇_第1頁
STM32課程設(shè)計貪吃蛇_第2頁
STM32課程設(shè)計貪吃蛇_第3頁
STM32課程設(shè)計貪吃蛇_第4頁
STM32課程設(shè)計貪吃蛇_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、STM3源程設(shè)計貪吃蛇STM3次作業(yè)報告學生姓名:學 號:所在院系: 光電信息與計算機工程學院專業(yè)班級:授課教師:完成時間: 2021年刖百隨著科學技術(shù)的不斷進步,嵌入式近些年來逐 漸興起,其領(lǐng)域比擬新,開展非常迅速,由于它 屬于新興領(lǐng)域,接觸的人并不是很多,但是嵌入 式在各種電子設(shè)備上的應用越來越越廣泛, 并且 各種電子設(shè)備也在朝著嵌入式微系統(tǒng),智能化的 方向前進.STM3源列是基于專為要求高性能、 低本錢、低功耗的嵌入式應用專門設(shè)計的 ARM Cortex-M內(nèi)核.作為21世紀的人才,為了與社 會實際需要相銜接,提升我們的學習興趣,利用 STM3源列單片機進行了一次嵌入式系統(tǒng)設(shè)計.摘要在本

2、次作業(yè)中采用STM32g列中的STM32F103RCT6限制器芯片,采用ALIENTE期月STM32F發(fā)板,使用 MiniSTM32開發(fā)板上的LCD接口,來點亮TFTLCD實現(xiàn)觸摸屏功能.第3頁共32頁第4頁共32頁課程設(shè)計任務(wù)要求本次的課程設(shè)計目的是實現(xiàn)一個經(jīng)典的貪吃蛇游戲,整個游戲?qū)崿F(xiàn)功能分別為:初始化程序.2、隨機紅點、左轉(zhuǎn)、右轉(zhuǎn)、判斷邊框.系統(tǒng)硬件設(shè)計MCIJI B,ll! il、面.-涉 *<E,ET見?p I'M hPCIaJUp*I MN M IbUi. 1 N (TlMl tHIh 而 <L FTOLi Ht Ml Hi>W¥121 H仃y

3、AJ H dL>MI 1,“卜、mid ,611- ? . II'kr E ImiiM XHTF>1 1 A. s«K 1.皿國1 :M,.仁叫Hl* 1INH Cl :-SXi3 5 Mja IIMiU崎二rr. nr IS. i HMF即 <li J KrX EC LEW QLI-|h IX I叫H J腳/ I . ImHh4 INTIS出*rut jrivi % ir PfKTIH* Em.口* RX1TA> rMD iriti'i r i %即 4 Ml L4 tA3£g D:- i X 口1 1MxOHRilII I mTl

4、MP ClIlDWK I IftHk W f*中網(wǎng)口 因ilBM Mb .比 1FAi記ir卜中Ji 11 1 i¥MM 1 11i T .一h:4H1 woMTm MUNM* :1給J*MT d rl.曹trivi3 7l-111 «口 "1叫r ;*VUCSFAI ADCBTIM2 . I? I'IMJIN IX ECTtMa.ni 所 LiuPAS- 1-7 WK!1 Yn - MJ41111m maT*' sn LRi ticPAIlTM&SVTIKi、1 "Jr Uh* HIrt 3 & ItXTIM, OO 鼻

5、械 TXTIMr OUK* H.I t i'S- k 前 & H kl % kJ! Kf Wi . liFMi ;TIW 口H&DS ft.1 h飛 iwwTpil 11% L KSI-ri I*'麗* 次 siimi jcm l h 4 y V muiMi I- :田 eMUMI .HI, 武制" WSIX HM1BAJ.TINI BHZ.!-7ii -11h Uhr r-II i.'l一;上:":u:n du*jU LJ) IH:ftil-工xjui« urai>FA 15、zh 艮mrail司 |明口曲 I* r

6、nrrs硬件設(shè)計原理圖根據(jù)此硬件設(shè)計圖再結(jié)合軟件設(shè)計就能做出此游戲.三、系統(tǒng)軟件實現(xiàn)此次的課程設(shè)計在于開發(fā)個貪吃蛇游戲,其流程圖如下列圖所示.并蛤延時初始化生成食物LED腌化畢I ,隨臉一|觸摸屏初始化程序流程圖為方便介紹,此軟件實現(xiàn)只給出主要程序局部: 1、本例程提供了硬件平臺的初始化GPIO 是常規(guī)輸入/輸出端口,STM32F103RCT6 有 PA、PB、PC、PD、PE 共5個16位的GPIO.STM32的GPIO都可編程,具有很多復用功能.GPIO可以配置為很多總模式,這些模式有:輸入浮空、輸入上拉、輸入下拉、模擬 輸入、開漏輸入、推挽輸出、推挽復用、開漏復用.通過對GPIO存放器編

7、程,可以設(shè)置每個端口的工作模式.24C02 EEPROM 是開發(fā)板板載的 2Kbit (256個字節(jié))EEPROM ,型號 為:24C02,用于掉電數(shù)據(jù)保存.由于 STM32內(nèi)部沒有EEPROM ,所開發(fā)板 外擴了 24C02,用于存儲重要數(shù)據(jù),用來做IIC實驗,該芯片直接掛在 STM32 的IO 口上.IIC(Inter Integrated Circuit)總線是一種由 PHILIPS 公司開發(fā)的兩線式用行總線,用于連接微限制器及其外圍設(shè)備.它是由數(shù)據(jù)線SDA和時鐘SCL 構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù).在CPU與被控IC之間、IC與IC之 間進行雙向傳送,高速IIC總線一般可達400k

8、bps以上.IIC總線在傳送數(shù) 據(jù)過程中共有三種類型信號,它們分別是:開始信號、結(jié)束信號和應答信號.開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù). 結(jié)束信號:SCL為高電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù).應答信號:接收數(shù)據(jù)的IC在接U到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā) 出特定的低電平脈沖,表示已收到數(shù)據(jù).CPU向受控單元發(fā)出一個信號后,等待受控單元發(fā)出一個應答信號,CPU接收到應答信號后,根據(jù)實際情況作出是 否繼續(xù)傳遞信號的判斷.假設(shè)未收到應答信號,由判斷為受控單元出現(xiàn)故障./* 名稱:AT24CXX_Init(void)*功能:初始化IIC接口*/初始

9、化IIC接口void AT24CXX_Init(void)IIC_Init();void IIC_Init(void)GPIO_InitTypeDef GPIO_InitStructure;RCC->APB2ENR|=1<<4;先使能外設(shè) IOPORT酎鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );GPIO_InitStructure.GPIO_PinGPIO_Pin_12|GPIO_Pin_11;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP ; / 推挽輸出GPIO_

10、InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);IIC_SCL=1;IIC_SDA=1;/*稱:void CMLCD_Init(void)能:初始化觸摸屏的硬件接口*/void CMLCD_Init(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);使能 PORT酎鐘GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|

11、GPIO_Pin_3|GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; /段置成推免輸出GPIO_InitStructure.GPIO_Speed=GPIO_Spee d_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);/ 初始化 GPIOC 0 3 13GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2|GPIO_Pin_1; / 初始化 GPIOC 2 1GPIO_InitStructure.GPIO_Mode=GPIO_Mode_ IN_FLOA

12、TING;僻空輸入GPIO_InitStructure.GPIO_Speed=GPIO_Spee d_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);TPEN=1;2、貪吃蛇功能限制SPI是串行外設(shè)端口,是一種同步串行外設(shè)端口,它可以使 MCU與各種外 圍設(shè)備以串行方式進行通信、交換信息.STM32的SPI支持全雙工同步傳輸,可選擇以8或16位傳輸幀格式進行傳輸,支持多種模式.USART為STM32的同步異步接收器.它提供了一種靈活的方法與使用異 步串行數(shù)據(jù)格式的外部設(shè)備之間進行全雙工數(shù)據(jù)交換.USART利用分數(shù)波特率發(fā)生器提供寬范圍的波特率選擇

13、.另外,它還允許多處理器通信.USART也可以使用DMA方式直接將接受的數(shù)據(jù)存儲到內(nèi)存或從內(nèi)存中批量發(fā)送數(shù)據(jù),也支持多種中斷方式.TFT-LCD即薄膜晶體管液晶顯示器.其英文全稱為:Thin Film Transistor-Liquid CrystalDisplay .TFT-LCD 與無源 TN-LCD、STN-LCD 的 簡單矩陣不同,它在液晶顯示屏的每一個象素上都設(shè)置有一個薄膜晶體管(TFT),可有效地克服非選通時的申擾,使顯示液晶屏的靜態(tài)特性與掃描線 數(shù)無關(guān),因此大大提升了圖像質(zhì)量. TFT-LCD也被叫做真彩液晶顯示器. ALIENTEK 提供的2.8寸TFTLCD 模塊,具驅(qū)動芯片

14、有很多種類型,比方 有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP453 5/SPFD5408/SSD1289/1505/B505/C505/NT35310/NT35510 等.LED (DS0和 DS1).其電路在 ALIENTEK MiniSTM32開發(fā)板上默認是已經(jīng)連接好了的.DS0接PA8, DS1接PD2./* 名稱:int main(void)*功能:主函數(shù)*/#include "led.h"#include "delay.h"#include "sys

15、.h"#include "usart.h"#include "lcd.h"#include "tanchishe.h"#include "cmlcd.h"#include "timeit.h"#include "stdlib.h"畫一個大點(2*2的點)/x,y:坐標/color:顏色void TP_Draw_Big_Point(u16 x,u16 y,u16 color)POINT_COLOR=color;LCD_DrawPoint(x,y);/ 中央點LCD_D

16、rawPoint(x+1,y);LCD_DrawPoint(x,y+1);LCD_DrawPoint(x+1,y+1);int main(void)u8 sta,sta1;u16 rand_color;delay_init();延時函數(shù)初始化uart_init(9600);串口初始化為 9600LED_Init();初始化與LED連接的硬件接口LCD_Init();time_init();CMLCD_Init(); /觸摸屏初始化AT24CXX_Init(); /eeprom 初始化 sta1=TP_Get_Adjdata(); if(!sta1) sta=CMLCD_Adjust(); if

17、(sta) TP_Save_Adjdata();校準成功就保存參數(shù)LCD_ShowString(40,40,100,16,16,"SUCCESS FUL!"); elseLCD_ShowString(40,40,100,16,16,"NO SUCCESSFUL!");)TABCHISHE_Init();while(1)(delay_ms(500);產(chǎn)生隨機坐標 if(snake.eat_sta) (snake.eat_sta=0;snake.rand_x=8*(1+(int)(29.0*rand()/(RAND_ MAX+1.0);snake.rand_

18、y=8*(1+(int)(34.0*rand()/(RAND_ MAX+1.0);rand_color=LCD_ReadPoint(snake.rand_x,sna ke.rand_y);while(rand_color=BLUE) 隨機點 不能是蛇身上的點(snake.rand_x=8*(1+(int)(29.0*rand()/(RAND_MAX+1.0);snake.rand_y=8*(1+(int)(34.0*rand()/(RAND_MAX+1.0);rand_color=LCD_ReadPoint(snake.rand_x,sna ke.rand_y);LCD_Fill(snake.

19、rand_x,snake.rand_y,snake.rand _x+snake.size,snake.rand_y+snake.size,RED);LED0=!LED0;TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE );關(guān)中斷 預防中斷效勞函數(shù)對 顯示坐標的影響snake.eat_sta=show(snake.d1);disappear(snake.d2,turn);TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 開中斷/* 名稱:void TABCHISHE_Init(void)*功能:貪吃蛇初始化*/void TABCH

20、ISHE_Init(void)Shuzu_Init(turn); /轉(zhuǎn)向數(shù)組初始化LCD_Clear(WHITE);POINT_COLOR=RED;LCD_DrawLine(0,282, 240, 282);LCD_DrawLine(120,280, 120, 320);LCD_ShowString(20,290,72,12,12,"left/down");LCD_ShowString(20,303,36,12,12,"score:");LCD_ShowString(140,290,64,12,12,"right/up")J/以下為貪

21、吃蛇程序初始化LCD_Fill(120,160,136,168,BLUE); 一開始蛇長度為2個SIZEsnake.eat_sta=0;snake.length=2;LCD_ShowxNum(56,303,snake.length,3,12,0x8 0);snake.max=MAX;snake.size=8;snake.d1=0;snake.d2=0;snake.x1=128;snake.x2=snake.x1+snake.size;s nake.y1=160;snake.y2=snake.y1+snake.size; snake.X1=112;snake.X2=snake.X1+snake.

22、size;sn ake.Y1=160;snake.Y2=snake.Y1+snake.size;snake.rand_x=8*(1+(int)(29.0*rand()/(RAND_MAX+1.0);snake.rand_y=8*(1+(int)(34.0*rand()/(RAND_MAX+1.0);LCD_Fill(snake.rand_x,snake.rand_y,snake.rand_x+snake.size,snake.rand_y+snake.size,RED);/*稱 : void disappear(u8 d,u16turnMAX3)*功 能:貪吃蛇移動尾部消失格子*/新消失的一格

23、參數(shù):往左消失,往右消失void disappear(u8 d,u16 turnMAX3)int i=0;if(d=0) 默認方向為從左到右snake.X1=snake.X1+snake.size;snake.X2=snak e.X2+snake.size;LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE);新顯示的一格)else if(d=1) 方向為下到上snake.Y1=snake.Y1-snake.size;snake.Y2=snake .Y2-snake.size;LCD_Fill(snake.X1,snake.Y1,snake.X

24、2,snake.Y2,WHITE); 新顯示的一格)else if(d=2) 方向為右到左(snake.X1=snake.X1-snake.size;snake.X2=snak e.X2-snake.size;LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE);新顯示的一格)else if(d=3) 方向為上到下(snake.Y1=snake.Y1+snake.size;snake.Y2=snak e.Y2+snake.size;LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE); 新顯示的

25、一格)for(i=0;i<MAX;i+)/先判斷是否是轉(zhuǎn)方向點if(snake.X1=turni0&&snake.Y1=turn皿 1)snake.d2=turni2;turni0=400;/ 轉(zhuǎn)向完畢去除記錄的坐標(將坐標變?yōu)長CD以外 區(qū)域)turni1=400;break;)/* 名稱:u8 show(u8 d)*功能:貪吃蛇移動前部新增格子*/新顯示的一格/參數(shù):往左顯示,往右顯示u8 show(u8 d)(static u8 i=0;u16 color,color1;判斷是否撞到自己的身體if(d=0)(color=LCD_ReadPoint(snake.x2+

26、4,snake.y2-4)color1=LCD_ReadPoint(snake.x2+3,snake.y2- 3);if(color=BLUE&&color1=BLUE)LCD_ShowString(40,40,100,16,16,“NO SUCCESSFUL!");printf("color%x color1%xrn",color,color1);printf("shezhuangziji0rn");delay_ms(5000);TABCHISHE_Init();d=snake.d1;else if(d=1)color=LCD

27、_ReadPoint(snake.x1+4,snake.y1-4) ;color1=LCD_ReadPoint(snake.x1+3,snake.y1- 3);if(color=BLUE&&color1=BLUE)(LCD_ShowString(40,40,100,16,16,"NO SUCCESSFUL!");printf("color%x color1%xrn",color,color1);printf("shezhuangziji1%d %d %drn",snak e.d1,snake.d2,d);delay_m

28、s(5000);TABCHISHE_Init();d=snake.d1;printf("%d %d %drn",snake.d1,snake.d2, d);else if(d=2)(color=LCD_ReadPoint(snake.x1-4,snake.y1+4)color1=LCD_ReadPoint(snake.x1-3,snake.y1 + 3);if(color=BLUE&&color1=BLUE)LCD_ShowString(40,40,100,16,16,“NO SUCCESSFUL!");printf("color%x c

29、olor1%xrn",color,color1);printf("shezhuangziji2rn"); delay_ms(5000);TABCHISHE_Init();d=snake.d1;else if(d=3)color=LCD_ReadPoint(snake.x2-4,snake.y2+4);color1=LCD_ReadPoint(snake.x2-3,snake.y2+3);if(color=BLUE&&color1=BLUE)(LCD_ShowString(40,40,100,16,16,"NO SUCCESSFUL!&qu

30、ot;);printf("color%x color1%xrn",color,color1);printf("shezhuangziji3rn");delay_ms(5000);TABCHISHE_Init();d=snake.d1;if(snake.y1=0&&d=1)|(snake.x1=0&&d= =2)|(snake.y2=280&&d=3)|(snake.x2=240& &d=0) 蛇撞到墻了(LCD_ShowString(40,40,100,16,16,"NO SUCC

31、ESSFUL!");printf("shezhuangqiangrn"); delay_ms(5000);TABCHISHE_Init();d=snake.d1;)if(snake.rand_x=snake.x1&&snake.rand_y=snake.yl) 判斷是否增加長度即碰到隨機點(i=1;if(snake.d2=0)snake.X1-=16;snake.X2-=16; / 在尾端增加 一珞else if(snake.d2=1)snake.Y1+=16;snake.Y2+=16;else if(snake.d2=2)snake.X1+=16

32、;snake.X2+=16;else if(snake.d2=3) snake.Y1-=16;snake.Y2-=16; snake.length+;LCD_ShowxNum(56,303,snake.length,3,12,0x8 0);if(d=0) 默認方向為從左到右snake.x1=snake.x1+snake.size;snake.x2=snake .x2+snake.size;LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE); 新顯示的一格)else if(d=1) 方向為下到上snake.y1=snake.y1-snake.si

33、ze;snake.y2=snake.y2-snake.size;LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE); 新顯示的一格)else if(d=2) 方向為右到左snake.x1=snake.x1-snake.size;snake.x2=snake.x2-snake.size;LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE);新顯示的一格)else if(d=3) 方向為上到下(snake.y1=snake.y1+snake.size;snake.y2=snake.y2+snake.size;LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE);新顯示的一格)if(i=1) i=0;return 1;return 0;/* 名稱:void CM_Scan()*功能:觸摸屏掃描函數(shù)*void CM_Scan()(static u8 times=0;static u8 i=0;if(TPEN=0&&!times)(times=1;if(CMLCD_GetLCD()取坐標成功后再選擇是否轉(zhuǎn)向(if(cm

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論