STM32课程设计贪吃蛇_第1页
STM32课程设计贪吃蛇_第2页
STM32课程设计贪吃蛇_第3页
STM32课程设计贪吃蛇_第4页
STM32课程设计贪吃蛇_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、STM3族程设计贪吃蛇STM32大作业报告第3页共32页ft光电信息与计算机工程学院学生姓名: 学 号: 所在院系: 专业班级: 授课教师:完成时间2016 年刖言随着科学技术的不断进步,嵌入式近些年来逐 渐兴起,其领域比较新,发展非常迅速,由于它 属于新兴领域,接触的人并不是很多,但是嵌入 式在各种电子设备上的应用越来越越广泛,并且各种电子设备也在朝着嵌入式微系统,智能化的 方向前进。STM32系列是基于专为要求高性能、 低成本、低功耗的嵌入式应用专门设计的 ARM Cortex-M内核。作为21世纪的人才,为了与社 会实际需要相衔接,提高我们的学习兴趣,利用 STM32系列单片机进行了一次

2、嵌入式系统设计摘要在本次作业中采用STM32系列中的STM32F103RCT微控制器芯片,采用ALIENTEK战舰STM32开发板,使用 MiniSTM32开发板上的LCD接口,来点亮TFTLC D实现触摸屏功能。第3页共32页第4页共32页21课程设计任务要求本次的课程设计目的是实现一个经典的贪吃蛇游戏,整个游戏实现功能分别为:初始化程序。随机红点、左转、右转、判断边框。系统硬件设计icIKJllk* (ITHiKlHjjd 二 汽1: K.斤lir-T_I4 llaI I nr+THOz :< tiM:hI1!T-*T HUirr ,kKT¥1. 曲q - hJ IIZII

3、IIIh pn小PD*irM 口星PW M hl»NEkwiS nr I?. 1 MiTw dii: 伽H si LTIMn ei 占W IN I (uru W k- I'l.M Mb M INII-r+Jn 昭MPh- i|r mF J y V I"'- N hPfj. Tl沁 milt RK、处 1 Mb 耳1 r si»ij k hf_l A “TillO D <出&.盯111=*-iL IJ Mh- l门:I#IJ II KJ卩晒i1 1:一讦l1J i琨KU 111 J.11 Illi 1 1 11 .kih1h1 uk&g

4、t; 11-1 rl1 FlXth i N<. 1-1 n,'l:1l N p忙 -1IV:Fll *41*"-凸二厂rsTJJB-UU 一丄 LB 1 Va厂PCf ;4fr: ixL 兀rvi111T,iT fMrui-.1 Lh.':一M P hl 11 1 1 II,I' 1!);k::l |h -1UT E :、Llh1,1 -1 ml 1 lb丄i uku _;i_Iy.r ;AU rvi. Krtj版u r 11和厂fti: 111 II 5 rT¥A iH i lli>t i ii»i p: FAI'.M

5、XIHM :_:!:* F:I:姑总 Ti 龌;IlMJ 1-2 I LU li4ip軒;;rv:rT : r 11 M5 :yfEkab 1:H誉jHP巴w制"rr I Iki- F Ui i-Mi| r N'-h* 丨 JILI J 11M F Ha 11 iAy -riHix ! ' IL> I«II|+ ilZL 辽 I X lA屮! 1.1I片汩y sni ELPI 1i1 i rjii.1 '20 业丽<bl TFP iNhn hi 叫yiwI:iM*fc JMh 111.SI I i L AIK>、W ;m: y *、

6、 pj. J 略.0 I» nibg1Uhl l*l»:- t IU- -Xli in? u .“珂 11 ZrnH M-LHW VF, I XHil Ilk* < r- "叫首九TIk l|i r*-i-i T乂 T卜:i: 和111“1 .1什讪 Tiki.运二皿D lM>i i-il l I* C<l-ii_|s- llv* L IIMI ! qipiMI HbI n V 'PUIMfl i I rspti: srK.12 /kmirjHi-U hix AM2l J Z mJ mi (1*1%K*91mi'i直q-I刚IJI

7、II; JLJJ 工丿LJr i r'> M E'i'"F问L 如_ 沁J:j1?卩丁卜I II1 -1 %|m;IM Til T L III J 厂I 一1LilIIM>L.UFFIg宝1*1硬件设计原理图根据此硬件设计图再结合软件设计就能做出此游戏。系统软件实现此次的课程设计在于开发个贪吃蛇游戏,其流程图如下图所示。程序流程图为方便介绍,此软件实现只给出主要程序部分:1、本例程提供了硬件平台的初始化GP10 是常规输入 /输出端口,STM32F103RCT6 有 PA、PB、PC、PD、PE 共5个16位的GPI0。STM32的GP10都可编程

8、,具有很多复用功能。GPI0可以配置为很多总模式,这些模式有:输入浮空、输入上拉、输入下拉、模拟 输入、开漏输入、推挽输出、推挽复用、开漏复用。通过对GPIO寄存器编程,可以设置每个端口的工作模式。24C02 EEPROM 是开发板板载的 2Kbit ( 256个字节)EEPROM ,型号 为:24C02,用于掉电数据保存。因为 STM32内部没有EEPROM,所开发板 外扩了 24C02,用于存储重要数据,用来做IIC实验,该芯片直接挂在 STM32 的IO 口上。IIC(I nter In tegrated Circuit)总线是一种由 P HILI PS 公司开发的两线式串行总线,用于连

9、接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC 与 IC之 间进行双向传送,高速IIC总线一般可达400kbps以上。IIC总线在传送数 据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发 出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答

10、信号后,根据实际情况作出是 否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。*称:AT24CXX_Init(void)能:初始化IIC接口*/初始化lie接口 void AT24CXX_I nit(void)lie _ln it();void IIC_I nit(void)GPIO_ln itTy peDef GPIO_lni tStructure; RCC->APB2ENR|=1vv4;先使能外设 IOP ORT时钟RCC_A PB2Perip hClockCmd(RCC_A PB2Penph_GPI OC, ENABLE );GP IO_I ni tStructur

11、e.G PIO_Pi nGPIO_P in_12|G PIO_P in_11;GP IO_I ni tStructure.G PIO_ModeGPIO_Mode_Out_PP ; / 推挽输出GP IO_I ni tStructure.G PIO_S peedGP IO_S peed_50MH z;GPIO_ln it(G PIOC, &GPIO_lni tStructure);IIC_SCL=1;IIC_SDA=1;/* 名 称:void CMLCD_Init(void)*功 能:初始化触摸屏的硬件接口*void CMLCDnit(void)GPIO_ln itTy peDef GP

12、IO_lni tStructure;RCC_A PB2Perip hClockCmd(RCC_A PB2 Periph_GPIOGENABLE);/使能 PORT时钟GPIO_lni tStructure.G PIO_Pi n=GPIO_P in_O|G PIO_P in_3|G PIO_P in_13;GP IO_I ni tStructure.G PIO_Mode=GPI O_Mode_Out_ PP; /设置成推免输出GP IO_I ni tStructure.G PIO_S peed=G PIO_S pee d_50MHz;GPIO_ln it(G PIOC,&GPIO_lni

13、tStructure);/初始化 GPIOC 0 3 13GP IO_I ni tStructure.G PIO_Pi n=GPIO_Pin_2|GPIO_Pin_1; / 初始化 GPIOC 2 1 GP IO_I ni tStructure.G PIO_Mode=G PIO_Mode.IN_FLOATING;/浮 空输入GP IO_I ni tStructure.G PIO_S peed=G PIO_S pee d_50MHz;GPIO_ln it(G PIOC, &GPIO_lni tStructure);TP EN=1;2、贪吃蛇功能控制SPI是串行外设端口,是一种同步串行外设

14、端口,它可以使MCU与各种外围设备以串行方式进行通信、交换信息。STM32的SPI支持全双工同步传输,可选择以8或16位传输帧格式进行传输,支持多种模式。USART为STM32的同步异步接收器。它提供了一种灵活的方法与使用异 步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。另外,它还允许多处理器通信。USART也可以使用DMA方式直接将接受的数据存储到内存或从内存中批量发送数据,也支持多种中断方式。TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin FilmTransistor-Liquid CrystalDisplay 。TFT

15、-LCD 与无源 TN-LCD、STN-LCD 的 简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线 数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。ALIENTEK 提供的2.8寸TFTLCD 模块,其驱动芯片有很多种类型,比如 有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGD P4531/LGD P453 5/SPF D5408/SSD1289/1505/B505/C505/NT35310/NT35510 等。LED ( DS

16、0和DS1)。其电路在 ALIENTEK MiniSTM32开发板上默认是已经连接好了的。DS0接PA8,DS1接PD2。*称:int main(void)能:主函数*#in elude "led.h"#i nclude "delay.h"#i nclude "sys.h"#i nclude "usart.h" #in clude "lcd.h" #in elude "ta nchishe.h" #in elude "cmlcd.h" #i nclude

17、"timeit.h" #i nclude "stdlib.h"画一个大点(2*2的点)/x,y:坐标/color:颜色void TP _Draw_Big _P oi nt(u16 x,u16 y,u16 color) P OINT_COLOR=color;LCD_DrawPoint(x,y);/ 中心点LCD_Draw Poi nt(x+1,y);LCD_Draw Poi nt(x,y+1);LCD_Draw Poi nt(x+1,y+1);int main( void)u8 sta,sta1;u16 ran d_color; delaynit(); u

18、art_i nit(9600); LED_I nit();件接口LCD_I ni t();time_i nit();CMLCD _ln it();AT24CXX_I nit();延时函数初始化/串口初始化为9600初始化与LED连接的硬/触摸屏初始化/ee prom初始化sta1=T P_Get_Adjdata();if(!sta1)sta=CMLCD_Adjust();if(sta)TP_Save_Adjdata();/ 校准成功就保存参数LCD_ShowStri ng(40,40,100,16,16,"SUCCESS FUL!");elseLCD_ShowStri ng

19、(40,40,100,16,16,"N0 SUCCESSFUL!");TABCHISHEnit();while(1)delay_ms(500);/产生随机坐标if(s nake.eat_sta)sn ake.eat_sta=0;sn ake.ra nd_x=8*(1+( in t)(29.0*ra nd()/(RAND_ MAX+1.0);sn ake.ra nd_y=8*(1+( in t)(34.0*ra nd()/(RAND_ MAX+1.0);ran d_color=LCD_Read Poin t(s nake.ra nd_x,s na ke.ra nd_y);wh

20、ile(ra nd_color=BLUE)/ 随机点哥上的点sn ake.ra nd_x=8*(1+( in t)(29.0*ra nd()/(RAND_ MAX+1.0);sn ake.ra nd_y=8*(1+( in t)(34.0*ra nd()/(RAND_ MAX+1.0);ran d_color=LCD_Read Poin t(s nake.ra nd_x,s na ke.ra nd_y);LCD_Fill(s nake.ra nd_x,s nake.ra nd_y,s nake.ra nd _x+s nake.size,s nake.ra nd_y+s nake.size,RE

21、D);LED0=!LED0;TIM_ITCo nfig(TIM3,TIM_IT_U pdate,DISABLE );关中断 防止中断服务函数对 显示坐标的影响sn ake.eat_sta=show(s nake.dl);disa pp ear(s nake.d2,tur n);中断TIM_ITCo nfig( TIM3,TIM_IT_ Up date,ENABLE );/ 开/* 名 称:void TABCHISHE_Init(void)*功 能:贪吃蛇初始化*void TABCHISHE _ln it(void)Shuzu_lnit(turn);/转向数组初始化LCD_Clear(WHITE

22、);POIN T_COLOR=RED;LCD_DrawL in e(0,282, 240, 282);LCD_DrawL in e(120,280, 120, 320);LCD_ShowStri ng(20,290,72,12,12,"left/dow n")LCD_ShowStri ng(20,303,36,12,12,"score:");LCD_ShowStri ng(140,290,64,12,12,"right/u p")/以下为贪吃蛇程序初始化LCD_Fill(120,160,136,168,BLUE);一开始蛇长度为2个S

23、IZEsn ake.eat_sta=O;sn ake.le ngth=2;LCD_ShowxNum(56,303,s nake.le ngth312,0x80);sn ake.max=MAX;sn ake.size=8;sn ake.d1=0;sn ake.d2=0;sn ake.x1=128;s nake.x2=s nake.x1+s nake.size;sn ake.y1=160;s nake.y2=s nake.y1+s nake.size;sn ake.X1=112;s nake.X2=s nake.X1+s nake.size;snake. Y1=160;s nake. Y2=s n

24、ake. Y1+s nake.size;sn ake.ra nd_x=8*(1+( in t)(29.0*ra nd()/(RAND_MAX+1.0);sn ake.ra nd_y=8*(1+( in t)(34.0*ra nd()/(RAND_MAX+1.0);LCD_Fill(s nake.ra nd_x,s nake.ra nd_y,s nake.ra nd _x+s nake.size,s nake.ra nd_y+s nake.size,RED);/*称 : void disappear(u8 d,ul6*名turnMAX3)*功 能:贪吃蛇移动尾部消失格子*新消失的一格参数:往左消

25、失,往右消失void disa pp ear(u8 d,u16 tumMAX3)int i=0;if(d=0)/默认方向为从左到右sn ake.X1=s nake.X1+s nake.size;s nake.X2=s nake.X2+s nake.size;LCD_Fill(s nake.X1,s nake. Y1,s nake.X2,s nake.Y2,WHITE);新显示的一格else if(d=1) 方向为下到sn ake. 丫仁s nake. Y1-s nake.size;s nake. Y2=s nakeY2-sn ake.size;LCD_Fill(s nake.X1,s nake

26、. Y1,s nake.X2,s nake.Y2,WHITE); 新显示的一格else if(d=2) 方向为右到左sn ake.X1=s nake.X1-s nake.size;s nake.X2=s nake.X2-s nake.size;LCD_Fill(s nake.X1,s nake. Y1,s nake.X2,s nake.Y2,WHITE); 新显示的一格else if(d=3)方向为上到下sn ake. 丫仁s nake. Y1+s nake.size;s nake. Y2=s nake.Y 2+s nake.size;LCD_Fill(s nake.X1,s nake. Y1

27、,s nake.X2,s nake.Y2,WHITE);新显示的一格for(i=0;i<MAX;i+)/先判断是否是转方向占八、if(s nake.X1=turni0&&sn ake. Y1=turni1)sn ake.d2=turni2;turni0=400;/ 转向完毕清除记录的坐标(将坐标变为LCD以外 区域)turni1=400;break;/* 名 称:u8 show(u8 d)*功 能:贪吃蛇移动前部新增格子*新显示的一格参数:往左显示,往右显示u8 show(u8 d)static u8 i=0;u16 color,color1;判断是否撞到自己的身体if(

28、d=0)color仁LCD_Read Poin t(s nake.x2+3,s nake.y2- 3);if(color=BLUE&&color1=BLUE)LCD_ShowStri ng(40,40,100,16,16,"NO SUCCESSFUL!");prin tf("color%x color1%xrn",color,color1);prin tf("shezhua ngziji0rn"); delay_ms(5000);TABCHISHEnit();d=s nake.d1;else if(d=1)color=

29、LCD_Read Poi nt(s nake.x1+4,s nake.y1-4)color仁LCD_Read Poin t(s nake.x1+3,s nake.y1-3);23if(color=BLUE&&color1=BLUE)LCD_ShowStri ng(40,40,100,16,16,"NO SUCCESSFUL!");prin tf("color%xcolor1%xrn",color,color1);prin tf("shezhua ngziji1%d%d %drn",s nake.d1,s nake.d2

30、,d);delay_ms(5000);TABCHISHEnit();d=s nake.d1;prin tf("%d %d%drn",s nake.d1,s nake.d2,d);else if(d=2)color仁LCD_Read Poi nt(s nake.x1-3,s nake.y1 + 3);if(color=BLUE&&color1=BLUE)LCD_ShowStri ng(40,40,100,16,16,"NO SUCCESSFUL!");prin tf("color%x color1%xrn",color,

31、color1);prin tf("shezhua ngziji2rn"); delay_ms(5000);TABCHISHEnit();d=s nake.d1;else if(d=3)color=LCD_Read Poi nt(s nake.x2-4,s nake.y2+4)color仁LCD_Read Poin t(s nake.x2-3,s nake.y2+3);if(color=BLUE&&color1=BLUE)LCD_ShowStri ng(40,40,100,16,16,"NO SUCCESSFUL!");prin tf(&q

32、uot;color%x color1%xrn",color,color1);prin tf("shezhua ngziji3rn"); delay_ms(5000);TABCHISHEnit();d=s nake.d1;if(s nake.y1=0&&d=1)|(s nake.x1=0&&d= =2)| (s nake.y2=280&&d=3)|(snake.x2=240& &d=0)蛇撞到墙了LCD_ShowStri ng(40,40,100,16,16,"NO SUCCESSFUL!&q

33、uot;);prin tf("shezhua ngqia ngrn");delay_ms(5000);TABCHISHE_I ni t();d=s nake.d1;if(s nake.ra nd_x=s nake.x1 &&sn ake.ra nd_y= snake.y1) 判断是否增加长度即碰到随机点i=1;if(s nake.d2=0)sn ake.X1-=16;s nake.X2-=16;/ 在尾端增加 一格else if(s nake.d2=1)sn ake. Y1+=16;s nake. Y2+=16;else if(s nake.d2=2)sn

34、ake.X1+=16;s nake.X2+=16; else if(s nake.d2=3)sn ake. Y1-=16;s nake. Y2-=16; sn ake.le ngth+;LCD_ShowxNum(56,303,s nake.le ngth312,0x80);if(d=0)/默认方向为从左到右sn ake.x1=s nake.x1+s nake.size;s nake.x2=s nakex2+s nake.size;LCD_Fill(s nake.x1,s nake.y1,s nake.x2,s nake.y2,BLUE);新显示的一格else if(d=1) 方向为下到上sn

35、ake.y1=s nake.y1-s nake.size;s nake.y2=s nake.y2-s nake.size;LCD_Fill(s nake.x1,s nake.y1,s nake.x2,s nake.y2,BLUE);新显示的一格else if(d=2) 方向为右到左sn ake.x1=s nake.x1-s nake.size;s nake.x2=s nake.x2-s nake.size;LCD_Fill(s nake.x1,s nake.y1,s nake.x2,s nake.y2,BLUE);新显示的一格else if(d=3) 方向为上到下sn ake.y1=s nake.y1+s nake.size;s nake.y2=s nake.y2+s nake.size;LCD_Fill(s nake.x1,s nake.y1,s nake.x2,s nake.y2,BLUE);新显示的一格if(i=1) i=0;return 1;return 0;/* 名 称:void CM_Scan()*功 能:触摸屏扫描函数*35void CM_Sca n()static u8 times=0;static u8 i=0;if(TP EN=0&&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论