当前位置: 首页 > news >正文

服务机构电子商务网站有哪些十大购物网站

服务机构电子商务网站有哪些,十大购物网站,ie建设企业网站进去无法显示,网站优化怎样做目录 前言 一、设置FreeROTS用户任务 #xff08;1#xff09;事件event任务 #xff08;2#xff09;按键输入方向控制任务 #xff08;3#xff09;果实食物任务 #xff08;4#xff09;显示任务函数 #xff08;3#xff09;开始任务 二、主函数 三、ADC采样…目录 前言 一、设置FreeROTS用户任务 1事件event任务 2按键输入方向控制任务 3果实食物任务 4显示任务函数 3开始任务 二、主函数 三、ADC采样 四、效果展示 前言 网络上贪吃蛇游戏的开源资料已经很丰富了但是详细讲解代码的很少所以我打算取之开源回馈于开源帮助大家能够更好的完成这款很经典的游戏项目。 为了能够更好的实时处理贪吃蛇的各项任务如贪吃蛇任务果实任务显示任务等所以对原始代码上了FreeROTS操作系统。 这里我就不详细介绍FreeROTS操作系统了以后我会单独出一期FreeROTS的文章大家想了解的话有一份《FreeROTS内核使用指南》可以详读。  如果大家英语好的话推荐读英文版会少一些翻译上的错误。 实验平台STM32F103ZE开发板5个独立按键 独立按键与开发板连接 KEYUP→F0 KEYDOWN→F1 KEYLEFT→F2 KEYRIGHT→F3 STOP→F4 贪吃蛇项目概述 贪吃蛇也叫“移动的链表”先将不同任务所需要的参数组成结构体在用指针不断调用还得用TFTLCD进行显示可以参考我以前写过的博客 学习记录调用TFTLCD液晶屏_lcd_shownum_Bitter tea seeds的博客-CSDN博客 废话不多说代码分析来一波。 一、设置FreeROTS用户任务 一个任务就是一个线程由于操作系统管理不同的任务不同的任务分配在不同的内存块中所以一开始要给不同的任务设置优先级并为他们分配堆栈空间。被挂起的任务被送回堆栈就绪任务和运行任务从栈中恢复被送入寄存器。 #ifndef __MY_TASK_H #define __MY_TASK_H #include FreeRTOS.h #include task.h//用户任务//任务优先级#define EVENT_TASK_PRIO 7//任务堆栈大小 #define EVENT_STK_SIZE 128//任务句柄TaskHandle_t EVENTTask_Handler;//任务函数void event_task(void *pvParameters);//任务优先级#define KEY_TASK_PRIO 6//任务堆栈大小 #define KEY_STK_SIZE 128//任务句柄TaskHandle_t KEYTask_Handler;//任务函数void key_task(void *pvParameters); //任务优先级#define APPLE_TASK_PRIO 5//任务堆栈大小 #define APPLE_STK_SIZE 128 //任务句柄TaskHandle_t APPLETask_Handler;//任务函数void apple_task(void *pvParameters);//任务优先级#define SNAKE_TASK_PRIO 4//任务堆栈大小 #define SNAKE_STK_SIZE 128 //任务句柄TaskHandle_t SNAKETask_Handler;//任务函数void snake_task(void *pvParameters);//任务优先级#define DISPLAY_TASK_PRIO 3//任务堆栈大小 #define DISPLAY_STK_SIZE 128//任务句柄TaskHandle_t DISPLAYTask_Handler;//任务函数void display_task(void *pvParameters); //任务优先级#define LED_TASK_PRIO 2//任务堆栈大小 #define LED_STK_SIZE 128//任务句柄TaskHandle_t LEDTask_Handler;//任务函数void led_task(void *pvParameters); //任务优先级#define START_TASK_PRIO 1//任务堆栈大小 #define START_STK_SIZE 128 //任务句柄TaskHandle_t StartTask_Handler;//任务函数void start_task(void *pvParameters);#endif 1事件event任务 这是最重要的任务它负责数据处理所以得等其他任务完成之后才轮到它来执行它的优先级最小首先设置一个死循环判断游戏是否正常运行如果正常运行在判断游戏是否暂停都没有我们则对按键进行检测根据按键按下的情况对蛇头坐标进行更改坐标根据TFTLCD分辨率进行设置更改完蛇头坐标对蛇尾坐标进行保存在进行判断如果坐标和果实坐标相同的话蛇的长度加1果实消失使能食物函数生成食物使能LCD进行显示如果游戏结束则返回游戏结束函数。 怎么让蛇的移速随着时间的变化越来越快 我们可以初始化蛇的速度变量为一个定值然后通过除以蛇的移速设置延时函数来控制事件任务执行时间的间隔随着不断调用蛇的移速定值不断变大延时函数时间的间隔边长任务处理的时间间隔变长显示出来蛇的移速变快。 void event_task(void *pvParameters) {while(1){if(event.GameStaON)//如果游戏正常则继续{if(event.ProcessON)//如果没有暂停则继续{switch(event.Direction)//检测按键情况,根据方向调整蛇头坐标{case UP:{snake.firsty-1;if(snake.firstyGAME_YPART-1){snake.firstyGAME_YPART-1;}}break;case DOWN:{snake.firsty1;if(snake.firstyGAME_YPART-1){snake.firsty0;}}break;case LEFT:{snake.firstx-1;if(snake.firstxGAME_XPART-1){snake.firstxGAME_XPART-1;}}break;case RIGHT:{snake.firstx1;if(snake.firstxGAME_XPART-1){snake.firstx0;}}break;}snake.lastxsnake_axis[0].x;//保存下蛇尾坐标snake.lastysnake_axis[0].y;if(snake.firstxapple.xsnake.firstyapple.y)//如果此时的坐标与食物坐标相同{event.AppleStaOFF; //食物被吃掉snake.energybufapple.energy;//蛇的能量加一vTaskResume(APPLETask_Handler); //使能生成食物函数 }vTaskResume(DISPLAYTask_Handler); //使能显示函数 }}else GameOver();//如果游戏为结束状态则游戏结束delay_ms(1000/snake.speed); //按照蛇的速度调整此核心数据处理函数的时间间隔 } }2按键输入方向控制任务 按键任务通过switch判断语句实现需要注意的是我们按的方向如果是蛇移动的方向的反方向是不能响应的因为蛇不能有两个脑袋吧然后就是从结构体中用指针调用参数使用。 void key_task(void *pvParameters) {u8 key;while(1){keyKEY_PLAY_Scan(0);switch(key){case KEY_UP_PRES:{if(event.Direction!DOWN)event.DirectionUP;}break;case KEY_DOWN_PRES:{if(event.Direction!UP)event.DirectionDOWN;}break;case KEY_LEFT_PRES:{if(event.Direction!RIGHT)event.DirectionLEFT;}break;case KEY_RIGHT_PRES:{if(event.Direction!LEFT)event.DirectionRIGHT;}break;case KEY_PASS_PRES://按下切换暂停/继续状态{event.Process!event.Process;}break; }delay_ms(20);//每20ms响应一次} } 3果实食物任务 首先果实的分布是随机的所以通过STM32F1自带的一个ADC采样随机获得ADC的值作为果实将模拟量转换为数字量如果在上位机上编写的话可以使用时间戳来作为随机值。 得到随机果实的坐标之后我们还要保证食物的坐标不能出现在蛇的身上。蛇的坐标也是通过LCD分辨率来进行设置的。 void apple_task(void *pvParameters) {u16 flag,i;while(1){flag1;while(flag){flag0;apple.xGet_Rand()%(u16)(GAME_XPART);apple.yGet_Rand()%(u16)(GAME_YPART);for(i0;isnake.length;i) {if(snake_axis[i].xapple.xsnake_axis[i].yapple.y){flag;}}}Display(apple.x,apple.y,RED);vTaskSuspend(APPLETask_Handler); } } 4显示任务函数 对此任务我们首先得知道自己的LCD型号id然后根据自己LCD的型号进行驱动程序的编写。它的任务是显示出来蛇的身子。 Display显示出蛇头如果果实坐标与蛇头坐标相同蛇身长度1速度1然后更新蛇头坐标保存蛇尾坐标期间检查蛇头有没有碰到自己遍历蛇身坐标是否与蛇头坐标相同如果碰到了游戏结束。 void display_task(void *pvParameters) {u16 i;while(1){Display(snake.firstx,snake.firsty,RED);//显示蛇头if(snake.energybuf0) {Display(snake.lastx,snake.lasty,WHITE);for(i0;isnake.length-1;i){snake_axis[i].xsnake_axis[i1].x;snake_axis[i].ysnake_axis[i1].y;} }else //如果吃到了食物{snake.energybuf--;snake.length; // if(snake.length%20)snake.speed;snake.speed; } snake_axis[snake.length-1].xsnake.firstx;snake_axis[snake.length-1].ysnake.firsty;for(i0;isnake.length-1;i){if(snake_axis[i].xsnake.firstxsnake_axis[i].ysnake.firsty){event.GameStaOFF; }}vTaskSuspend(DISPLAYTask_Handler);} } 3开始任务 使用操作系统线程进入临界区为了处理临界区的代码需要关闭线程中断处理完毕后在开启中断这是为了避免同时有其他任务或中断服务ISR进入临界区代码。 void start_task(void *pvParameters) {taskENTER_CRITICAL(); xTaskCreate((TaskFunction_t )snake_task, (const char* )snake_task, (uint16_t )SNAKE_STK_SIZE, (void* )NULL, (UBaseType_t )SNAKE_TASK_PRIO, (TaskHandle_t* )SNAKETask_Handler); //创建食物任务xTaskCreate((TaskFunction_t )apple_task, (const char* )apple_task, (uint16_t )APPLE_STK_SIZE, (void* )NULL,(UBaseType_t )APPLE_TASK_PRIO,(TaskHandle_t* )APPLETask_Handler); //创建事件任务xTaskCreate((TaskFunction_t )event_task, (const char* )event_task, (uint16_t )EVENT_STK_SIZE, (void* )NULL,(UBaseType_t )EVENT_TASK_PRIO,(TaskHandle_t* )EVENTTask_Handler); //创建显示任务xTaskCreate((TaskFunction_t )display_task, (const char* )display_task, (uint16_t )DISPLAY_STK_SIZE, (void* )NULL,(UBaseType_t )DISPLAY_TASK_PRIO,(TaskHandle_t* )DISPLAYTask_Handler); //创建闪烁任务xTaskCreate((TaskFunction_t )led_task, (const char* )led_task, (uint16_t )LED_STK_SIZE, (void* )NULL,(UBaseType_t )LED_TASK_PRIO,(TaskHandle_t* )LEDTask_Handler); //创建输入任务xTaskCreate((TaskFunction_t )key_task, (const char* )key_task, (uint16_t )KEY_STK_SIZE, (void* )NULL,(UBaseType_t )KEY_TASK_PRIO,(TaskHandle_t* )KEYTask_Handler); vTaskDelete(StartTask_Handler); taskEXIT_CRITICAL(); } 二、主函数 操作系统与裸机开发的一个区别就是少了那个while1死循环改成了任务调度 int main(void){ delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Rand_Adc_Init();uart_init(115200); LED_Init(); KEY_PLAY_Init(); LCD_Init();DisplayInit();Snake_Init(snake);Apple_Init(apple);Event_Init(event);xTaskCreate((TaskFunction_t )start_task, (const char* )start_task, (uint16_t )START_STK_SIZE, (void* )NULL, (UBaseType_t )START_TASK_PRIO, (TaskHandle_t* )StartTask_Handler); vTaskStartScheduler(); } 三、ADC采样 ADC几个比较重要的参数 1测量范围测量范围对于 ADC 来说就好比尺子的量程ADC 测量范围决定了你外接的设备其信号输出电压范围不能超过 ADC 的测量范围比如STM32系列的 ADC 正常就不能超过3.3V。 2分辨率假如 ADC 的测量范围为 0-5V分辨率设置为12位那么我们能测出来的最小电压就是 5V除以 2 的 12 次方也就是 5/40960.00122V。很明显分辨率越高采集到的信号越精确所以分辨率是衡量 ADC 的一个重要指标。 3采样时间当 ADC 在某时刻采集外部电压信号的时候此时外部的信号应该保持不变但实际上外部的信号是不停变化的。所以在 ADC 内部有一个保持电路保持某一时刻的外部信号这样 ADC 就可以稳定采集了保持这个信号的时间就是采样时间。 4采样率也就是在一秒的时间内采集多少次。很明显采样率越高越好当采样率不够的时候可能会丢失部分信息所以 ADC 采样率是衡量 ADC 性能的另一个重要指标 #include rand.h//使用ADC产生16位随机数void Rand_Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/612,ADC最大时间不能超过14M//PA1 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; //模拟输入引脚GPIO_Init(GPIOA, GPIO_InitStructure); ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode DISABLE; //模数转换工作在单通道模式ADC_InitStructure.ADC_ContinuousConvMode DISABLE; //模数转换工作在单次转换模式ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; //ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel 1; //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1ADC_ResetCalibration(ADC1); //使能复位校准 while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束ADC_StartCalibration(ADC1); //开启AD校准while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束 } //获得ADC值 //ch:通道值 0~3 u16 Get_Adc(u8 ch) {//设置指定ADC的规则组通道一个序列采样时间ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_1Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果 }u16 Get_Rand(void) {u16 randnumGet_Adc(ADC_Channel_1)0x0001,i;for(i0;i15;i){randnum1;randnumGet_Adc(ADC_Channel_1)0x0001;}return randnum; } 四、效果展示 STM32精英开发板制作贪吃蛇游戏
http://www.w-s-a.com/news/507745/

相关文章:

  • 上海高端网站开发站霸网络国际网站建设的目的
  • 程序员招聘求职的网站做网站加入广告联盟
  • 网站建设的技术方案模板易做文学网站的logo
  • 建设国家标准官方网站响应式网站切图
  • 网站链接数怎么做wordpress安装网址
  • 沈阳建网站 哪家好如何做旅游网站推销
  • 继续网站建设南通网站建设方法
  • 淮南公司网站建设如果做京东优惠卷的网站
  • 二手房网站平台怎么做项目工程监理公司网站建设方案
  • 秦皇岛做网站公司小说推广平台有哪些
  • php网站做分享到朋友圈天元建设集团有限公司信用代码
  • 邱县做网站在线免费图片编辑器
  • 网站备份网站做网站如何把支付宝微信吧
  • 做网站的怎么获取客户信息晋城建设局网站
  • 新开传奇网站发布网单职业wordpress建站网页无法运作
  • 海南省住房和城乡建设厅官方网站网站开发有哪些语言
  • 网站开发排期表免费网站建设策划
  • 飞沐网站设计江苏建设人才网证书查询
  • 网站优化的意义怎么帮商家推广赚钱
  • 安顺公司做网站福州建设发展集团有限公司网站
  • 普陀企业网站建设做散客机票的网站如何推广
  • 河北网站建设与制作建设宁波市分行的互联网网站
  • python做网站是不是特别慢百度推广基木鱼
  • 卖网站链接东营住房和城乡建设信息网
  • 网站后台如何上传ico图标单位建设网站需要的材料
  • 如何建淘客网站郑州做网站最好的公司
  • 连锁酒店网站方案o2o网站建设方案
  • 功能型网站响应式网站原理
  • 聊城建设网站骨干校 建设网站
  • 网站建设与管理是干嘛的中国新闻社是什么单位