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

付费下载

下载本文档

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

文档简介

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

2、次作业中采用STM32g列中的STM32F103RCT6限制器芯片,采用ALIENTE期月STM32F发板,使用 MiniSTM32开发板上的LCD接口,来点亮TFTLCD实现触摸屏功能.第3页共32页第4页共32页课程设计任务要求本次的课程设计目的是实现一个经典的贪吃蛇游戏,整个游戏实现功能分别为:初始化程序.2、随机红点、左转、右转、判断边框.系统硬件设计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*中网口 因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硬件设计原理图根据此硬件设计图再结合软件设计就能做出此游戏.三、系统软件实现此次的课程设计在于开发个贪吃蛇游戏,其流程图如下列图所示.并蛤延时初始化生成食物LED腌化毕I ,随脸一|触摸屏初始化程序流程图为方便介绍,此软件实现只给出主要程序局部: 1、本例程提供了硬件平台的初始化GPIO 是常规输入/输出端口,STM32F103RCT6 有 PA、PB、PC、PD、PE 共5个16位的GPIO.STM32的GPIO都可编程,具有很多复用功能.GPIO可以配置为很多总模式,这些模式有:输入浮空、输入上拉、输入下拉、模拟 输入、开漏输入、推挽输出、推挽复用、开漏复用.通过对GPIO存放器编

7、程,可以设置每个端口的工作模式.24C02 EEPROM 是开发板板载的 2Kbit (256个字节)EEPROM ,型号 为:24C02,用于掉电数据保存.由于 STM32内部没有EEPROM ,所开发板 外扩了 24C02,用于存储重要数据,用来做IIC实验,该芯片直接挂在 STM32 的IO 口上.IIC(Inter Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式用行总线,用于连接微限制器及其外围设备.它是由数据线SDA和时钟SCL 构成的串行总线,可发送和接收数据.在CPU与被控IC之间、IC与IC之 间进行双向传送,高速IIC总线一般可达400k

8、bps以上.IIC总线在传送数 据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号.开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据. 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据.应答信号:接收数据的IC在接U到8bit数据后,向发送数据的IC发 出特定的低电平脉冲,表示已收到数据.CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是 否继续传递信号的判断.假设未收到应答信号,由判断为受控单元出现故障./* 名称:AT24CXX_Init(void)*功能:初始化IIC接口*/初始

9、化IIC接口void AT24CXX_Init(void)IIC_Init();void IIC_Init(void)GPIO_InitTypeDef GPIO_InitStructure;RCC->APB2ENR|=1<<4;先使能外设 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是串行外设端口,是一种同步串行外设端口,它可以使 MCU与各种外 围设备以串行方式进行通信、交换信息.STM32的SPI支持全双工同步传输,可选择以8或16位传输帧格式进行传输,支持多种模式.USART为STM32的同步异步接收器.它提供了一种灵活的方法与使用异 步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择

13、.另外,它还允许多处理器通信.USART也可以使用DMA方式直接将接受的数据存储到内存或从内存中批量发送数据,也支持多种中断方式.TFT-LCD即薄膜晶体管液晶显示器.其英文全称为:Thin Film Transistor-Liquid CrystalDisplay .TFT-LCD 与无源 TN-LCD、STN-LCD 的 简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的申扰,使显示液晶屏的静态特性与扫描线 数无关,因此大大提升了图像质量. TFT-LCD也被叫做真彩液晶显示器. ALIENTEK 提供的2.8寸TFTLCD 模块,具驱动芯片

14、有很多种类型,比方 有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP453 5/SPFD5408/SSD1289/1505/B505/C505/NT35310/NT35510 等.LED (DS0和 DS1).其电路在 ALIENTEK MiniSTM32开发板上默认是已经连接好了的.DS0接PA8, DS1接PD2./* 名称:int main(void)*功能:主函数*/#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();延时函数初始化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();校准成功就保存参数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);产生随机坐标 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 );关中断 预防中断效劳函数对 显示坐标的影响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); /转向数组初始化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、参数:往左消失,往右消失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+)/先判断是否是转方向点if(snake.X1=turni0&&snake.Y1=turn皿 1)snake.d2=turni2;turni0=400;/ 转向完毕去除记录的坐标(将坐标变为LCD以外 区域)turni1=400;break;)/* 名称:u8 show(u8 d)*功能:贪吃蛇移动前部新增格子*/新显示的一格/参数:往左显示,往右显示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()*功能:触摸屏扫描函数*void CM_Scan()(static u8 times=0;static u8 i=0;if(TPEN=0&&!times)(times=1;if(CMLCD_GetLCD()取坐标成功后再选择是否转向(if(cm

温馨提示

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

评论

0/150

提交评论