第十三届——蓝桥杯嵌入式第二场
文章目录
- 一、应用模块
- 二、各点突破
- 1.响应刷新时间
- 2.E2PRON
- 3.三行按键
- 总结
#题目
一、应用模块
通过按键实现不同界面的切换,通过E2PRON实现数据的保存,通过串口实现PC端数据传输,通过定时器产生PWM。
二、各点突破
1.响应刷新时间
代码如下(示例):定时器刷新响应时间快,可以同时刷新多个事件,编程简单。
u8 Timers[4];//储存事件的数组
int main(void)
{TIM4_Int_Init(50000,72);//定时器初始化while(1){if(xDelay(0,1)==1)//0号事件每1*50ms=50ms刷新一次{ //执行的事件。}if(xDelay(1,2)==1)//1号事件每2*50ms=100ms刷新一次{ //执行的事件。}if(xDelay(2,1)==1)//2号事件每3*50ms=150ms刷新一次{ //执行的事件。}if(xDelay(3,1)==1)//3号事件每4*50ms=200ms刷新一次{ //执行的事件。}}
}
void TIM4_Int_Init(u16 arr,u16 psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能//定时器TIM4初始化TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断//中断优先级NVIC设置NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器TIM_Cmd(TIM4, ENABLE); //使能TIMx}uint8_t xDelay(uint8_t xIndex,uint8_t xTime)// 响应事件:xIndex,响应时间:xTime
{uint8_t RetValue=0;if(Timers[xIndex]==0)//判断指定软件定时器的计数器是否为 0{Timers[xIndex]=xTime;//得装计数器的值RetValue=1; //时间到到标志位 }return(RetValue);
}void TIM4_IRQHandler(void)
{static uint8_t Index;if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); for(Index=0;Index<RefreshEvent;Index++)if(Timers[Index]>0)Timers[Index]--;//进入定时器中断每一个响应事件都会减少一个50ms}}
2.E2PRON
代码如下(示例):题目上电显示初始化。如果一上电就读取E2PRON,我们无法知道官方板子储存数据是什么,读出数据还有进行判断,在给他赋值。于是我换了一个思路,利用E2PRON其他位来判断,E2PRON0到3位是否是我储存的数据。
解决方法:上电判断第一次判断第6位和第7位是否储存6和7。是读取E2PRON0到3位并显示。否,将初始数据保存到E2PRON0到3位,并在第6位和第7位储存6和7。
int main(void)
{if(i2c_read(0x05)==6&&i2c_read(0x06)==7){Xkuce=i2c_read(0x00);Ykuce=i2c_read(0x01);Xjiage=(float)i2c_read(0x02)/10; Yjiage=(float)i2c_read(0x03)/10;} while(1){ if(xDelay(2,1)==1){if(Xkuce!=Xkuce_temp){ i2c_write(0x00,Xkuce);Xkuce_temp=Xkuce;}if(Ykuce!=Ykuce_temp){i2c_write(0x01,Ykuce);Ykuce_temp=Ykuce;}if(Xjiage!=Xjiage_temp){Xjiage_temp1=Xjiage*10;i2c_write(0x02,Xjiage_temp1);Xjiage_temp=Xjiage;}if(Yjiage!=Yjiage_temp){Yjiage_temp1=Yjiage*10;i2c_write(0x03,Yjiage_temp1);Yjiage_temp=Yjiage; } i2c_write(0x05,6); i2c_write(0x06,7);} }
}
3.三行按键
代码如下(示例):三行按键是通过异或实现的按键,无阻塞延时。方便又好用。
#ifndef _KEY_H
#define _KEY_H#include "stm32f10x.h"#define B1 0x01
#define B2 0x02
#define B3 0x04
#define B4 0x08#define KEY_STATE_GET GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) << 0 | \GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) << 1 | \GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) << 2 | \GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2) << 3;extern uint8_t key_state;
extern uint8_t key_falling;
extern uint8_t key_rising;void Key_Init(void);
void Key_refresh(void);#endif
#include "key.h"uint8_t key_state = 0;
uint8_t key_falling = 0;
uint8_t key_rising = 0;void Key_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_Init(GPIOB, &GPIO_InitStructure);
}void Key_refresh(void)
{uint8_t key_temp = 0xF0;key_temp |= KEY_STATE_GET;key_temp ^= 0xFF;
// key_falling = key_temp & (key_state ^ key_temp);key_rising = (!key_state) * (key_temp ^key_state);key_state = key_temp;
}
总结
链接:https://pan.baidu.com/s/1YFieWqTmYNh52e-3I_NqvQ?pwd=abds
提取码:abds
复制这段内容后打开百度网盘手机App,操作更方便哦
第十三届——蓝桥杯嵌入式第二场相关推荐
- 【蓝桥杯】第十三届蓝桥杯单片机第二次省赛 代码程序
第十三届蓝桥杯单片机第二次省赛 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这 ...
- 第十三届蓝桥杯嵌入式备赛-STM32G431-基础模块调试①LED/LCD调试
目录 0.前言 时钟设置 项目设置 1.功能要求 电路原理图 2.STM32Cubemx初始化 3.程序实现 LCD LED 编写LED灯亮灭的相关函数 LED关闭函数 LEDx开启函数 LEDx关闭 ...
- 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解
文章目录 原题展示 原题分析 详细题解 LED模块 按键模块 串口 LCD模块 模拟电压读取(ADC) 脉冲输入输出 文章福利 原题展示 原题分析 本届国赛试题主要包含LCD.LED.按键.EEP ...
- 第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑦RTC时钟
目录 0.前言 1.功能要求 2.STM32Cubemx初始化 3.程序实现 main.c相关初始化 RTC函数 RTC_CalendarGet()日期时间获取函数 设置日期RTC_SetDate和时 ...
- 蓝桥杯嵌入式|第十三届蓝桥杯嵌入式省赛程序设计试题及其题解
题目 十三届省赛是要制作一个可由串口设置密码的密码锁.在本场比赛中,我们将用到LED模块.按键模块.串口模块.定时器的PWM模块以及官方会提供源码的LCD模块.下面就请看原题: 题解 ...
- 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛(第二场)程序设计试题及其题解
原题展示
- 第十三届蓝桥杯嵌入式省赛真题演练——密码锁
题目分析 接下来站在博主的视角来完成这次模拟题.首先,通读题目后我大致能大致能获取到如下信息:要完成一个密码锁的项目,用户通过串口通讯来设置三位密码,使用按键来输入密码.那我的思路先根据硬件框图搭出程 ...
- 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛客观题以及详细题解
题1 概念题. USRAT:异步串口通信,常用于数据传输: SW-DP:SWD 的全称应该是 The Serial Wire Debug Port (SW-DP),也就是串行调试端口,是 ARM 目前 ...
- 十三届蓝桥杯嵌入式输出比较(频率和占空比可变)
目录 原理说明: CUBMAX初始化: 代码实现: 问题和注意事项: 引用的文章: 原理说明: 输出比较模式下: CCR = CNT 时,翻转输出电平. PWM模式下: CNT < ...
最新文章
- 【原】Linux find 命令整理
- python编程界面怎么打开-为Python程序添加图形化界面的教程
- 软件项目开发流程及配置人员
- android中使用jni对字符串加解密实现分析
- 在Linux里设置环境变量的方法(export PATH)--待修改
- ssl/tls服务器瞬时_SSL / TLS REST服务器–带有Spring和TomEE的客户端
- [css] 你用过outline属性吗?它有什么运用场景
- bp 预测 matlab代码,bp神经网络进行交通预测的Matlab源代码.docx
- 转:PHP中实现非阻塞模式
- PgSQL · 应用案例 · 聚集存储 与 BRIN索引
- python ui自动_pytest+python下的UI自动化基础框架
- java中递归算法_java中递归算法是什么怎么算的?
- 阅卷系统java语言_主观题阅卷系统
- 血浆/血清RNA提取试剂盒的功能和特色
- python-静态网页爬取
- IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法
- 街道大动土,断网一周,学习计划照旧
- extern的使用方法
- JavaScript的pop()
- 如何推导欧拉公式e^iθ=cosθ+i*sinθ
热门文章
- 求助:程序员得了结膜炎+干眼症怎么办?
- 前端面试八股文(详细版)—上
- 三菱plcascll转换16进制_三菱FX系列PLC的SER指令使用方法
- JavaScript按键使盒子移动
- lumen php命令,laravel and lumen 软删除操作
- [附源码]计算机毕业设计JAVAjsp高校奖学金评定管理系统
- Java开发必学:java核心技术电子书资源
- java安装安卓模拟器下载安装_Android模拟器安装及其安装APK方法
- 【产品】产品原型设计工具 Axure 和 Mockplus 对比
- Python 使用mutagen批量修改MP3标签信息