蓝桥杯单片机组——程序框架及客观题

2023-11-18

前言

前面两篇主要是介绍了蓝桥省赛的一些参赛技巧,此篇主要是分享程序框架和一些客观题的链接。

程序框架

蓝桥的评分是综合了效果和代码步骤的,在比赛的最后提交时是需要源代码一起提交的,一个可读性高的代码或多或少的会给评分人好感,评分人心情一好说不定就会多几分,这样没有实现的功能就能一定程度被优秀的代码框架填补。所以在比赛和训练过程中一定要保持一个良好的编程习惯;这里笔者分享几点,仅供参考。

main+中断 两段式代码结构

在比赛过程中首先仔细分析出各个模块的任务,然后根据任务优先级别(比如说又要求刷新率的任务)进行大致规划,将有刷新率要求的代码放在定时器中断中会比较保险,至于为什么要放在定时器中断中,且看下面的分析。

单片机运行流程

单片机裸机开发的代码运行流程如下所示,程序永远是一行一行往下执行,每一个任务都要等上一个任务运行完毕后才能被执行,总是一条路走到黑。
没有中断产生时:整个程序会一路向前直至进入主循环,然后不停的在主循环里面转圈圈,从while(1)循环的任务1的第一行代码运行到最后一个任务的最后一行代码,碰了南墙后会回头继续来到while(1)的第一个任务的第一行执行。
有中断时:当初始化时的中断条件到达后单片机会停下正在执行的任务,自动进入中断服务函数去执行中断里面的任务,执行完毕后会自动返回到刚刚正在执行的任务中继续往下执行。
例:假设程序在任务1的位置时定时器1ms中断溢出标志到达,这时程序会进入定时器中断服务函数,执行中断服务函数,依次执行任务3,任务4…当中断服务函数的任务被执行完毕后,会返回到任务1刚刚运行截止的位置继续执行。
在这里插入图片描述
在这个运行流程中有这么几个点需要注意或者说规避的,
1.初始化时中断使能放到初始化代码的最后;中断的产生对于主线程序的运行是随机的,可能在任务1的某一行代码,也有可能在任务2的某一行代码,还可能在任务切换之间,换而言之,只要中断使能后,任何位置的代码运行都可能会被中断打断,对于主循环的函数来说还好,对于初始化的代码来说就会有影响,尤其是涉及到需要通讯时序来初始化的器件,如果通讯过程中被中断打断很可能初始化失败。因此在代码初始化的时候,尽量要将中断使能放在初始化最后,这样中断的时候程序已经进入了主循环,不会对其他的初始化造成影响。
在这里插入图片描述
**2.定时器中断内部不能放耗时特别长的函数;**拿1ms定时器中断来举个例子,如果任务4要花费790us的时间来运行,而任务3需要花费200us运行,此时如果后面还有一个任务5需要花费50us的时间运行,显然这些程序的运行时间加起来已经超过了1ms的中断周期,这样的话整个程序就会死在中断了,因此中断服务函数里面不能放时间复杂度特别高的函数。
在这里插入图片描述
**3.while(1)主循环内不要使用大于1ms的Delay阻塞式延时;**这一点也很好理解,举个反例,如下图所示代码,Keil仿真前面四个任务运行一遍的时间是差不多10ms;
在这里插入图片描述
当放置了Delay100ms后,仿真时间来到了103ms(这个100ms的延时是用的11.0592M晶振频率,而仿真是12M晶振所以时间有点不对);也就是说,整个主循环原本一秒钟可以循环1000次,现在只能循环10次了;这对于代码中的按键动作函数来说是致命的,原本按下就可以检测到,但是加了阻塞式延时后,这个按键我们最短要按下110ms才能被识别,这会严重影响整个代码的运行。
当然在学习过程中大家可能已经习惯了这种阻塞式延时,这个习惯是很不好的。笔者实习的时候,一个工程师就举了这样一个例子,实际产品中经常会设计急停按钮以防发生生产过程中危险,代码中如果使用这种阻塞的延时,当产线上发生了危险,一个人被绞进了设备,旁边的工人已经第一时间按下了急停,但是由于阻塞式延时的存在,没能第一时间检测到急停信号,设备没能及时停下,可想后果会是怎样。
在这里插入图片描述
有关非阻塞式延时和阻塞式延时的介绍可以参考吴坚鸿的《从单片机基础到程序框架》一书。这里还是推荐大家借用定时器中断来实现延时,可以参考此文——51单片机 利用定时中断做“非阻塞式”点灯。当然如果你有足够的能力,试试时间片轮询也是个不错的方式。

代码风格

除了在代码运行流程上需要注意的以外,笔者还有一些代码风格的建议;
1.建立工程时使用多.c结构;按照功能模块建立多个c文件和h文件,而不是一股脑的全部放在main.c中,这样既利于自己后期检查,也有利于评阅老师看清代码思路。
在这里插入图片描述
2.在函数命名上尽量统一格式;采用首字母大写的结构命名,多个单词拼接使用 “_” 来连接,且每个单词的首字母大写。
在这里插入图片描述
3.同一类型变量建议使用结构体来统一管理;这样有利于自己检查。

typedef struct
{
  float                kp;         //P
  float                ki;         //I
  float                kd;         //D
  float                imax;       //积分限幅
   
  float                out_p;  //KP输出
  float                out_i;  //KI输出
  float                out_d;  //KD输出
  float                out;    //pid输出
 
  float                integrator; //< 积分值
  float                last_error; //< 上次误差
  float                last_derivative;//< 上次误差与上上次误差之差
  unsigned long        last_t;     //< 上次时间
}pid_param_t;

pid_param_t Speed_PID;

4.对于界面切换或者多个模式时建议使用枚举法和switch配合;以免自己陷入if的逻辑黑洞。
在这里插入图片描述

客观题

有关客观题以及一些大佬的经验分享,笔者在此给大家把链接贴出来
蓝桥杯单片机准备目录
【蓝桥杯】历届单片机客观题及答案解析
【蓝桥杯单片机组】客观题(赛前必看)
你该不会还不知道吧——免费资源蓝桥杯单片机组完全版信息总结
这里强烈推荐最后一篇的内容,是一个很好的蓝桥杯经验分享系列,快上车跟紧大佬车队。

总结

有关蓝桥杯单片机的记录就到此为止,有不妥之处欢迎指出。哦,对了,大家赛前记得一定要去找一个Keil4的版本去建一下工程,尤其是在其他学校比赛的同学,有可能赛场提供的keil版本是老款,新建工程稍微有一点不一样,大家提前预防一手。最后,再次预祝各位取得让自己满意的成绩。

目录

蓝桥杯单片机组——榨干选手资源包(STC)
蓝桥杯单片机组——榨干选手资源包(芯片数据手册)
蓝桥杯单片机组——程序框架及客观题
蓝桥杯CT107D单片机组第四至第九届省赛完整过程代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯单片机组——程序框架及客观题 的相关文章

  • 联邦学习:在保护数据隐私的前提下进行分布式机器学习的方法

    随着大数据时代的到来 机器学习正成为各个领域中重要的工具和技术 然而 传统的机器学习方法通常需要集中式地收集和处理大量的数据 这可能涉及到用户的隐私问题 为了解决这一问题 联邦学习应运而生 联邦学习是一种分布式机器学习的方法 它允许在保护数
  • 【C++项目】【报错】[错误] new: No such file or directory, compilation terminated【及解决方法】

    一 问题描述 C源代码文件在编译过程中报错 错误 new No such file or directory compilation terminated 代码如下 include
  • C语言——!(--x)和!(-x)以及while(!(--x)) 和 while(!(-x))

    一 x 和 x 1 x 这个表达式表示先对变量 x 执行自减操作 即 x 的值减去 1 然后对自减后得到的结果取逻辑非 如果自减后的 x 等于 0 则逻辑非运算的结果为真 值为 1 否则结果为假 值为 0 2 x 这个表达式表示对 x 取反
  • pdf压缩大小方法哪个好用些?这三招可不要错过

    大家有没有被龟速的文件上传速度折磨过 好不容易等到上传进度走到最后一点点 但是却眼睁睁看着上传速度突然降到2kb s 真的是分分钟被 气死 拿网速没办法 那就只能从文件大小下手了 而怎么样做到压缩文件大小的同时又能保持它的清晰度呢 这当然少
  • 如何查看崩溃日志

    目录 描述 思路 查看ipa包崩溃日志 简单查看手机崩溃信息几种方式 方式1 手机设置查看崩溃日志 方式2 Xocde工具 方式3 第三方软件克魔助手 环境配置 实时日志 奔溃日志分析 方式四 控制台资源库 线上崩溃日志 线上监听crash
  • Camtasia2024中文绿色版本下载安装详细步骤教程

    Camtasia2024是一款功能强大的屏幕录制和视频编辑软件 它可以帮助用户轻松地记录电脑屏幕上的任何操作 并可以将录制的视频进行编辑和制作成高质量的视频教程 演示文稿 培训课程等 Camtasia具有直观的界面和易于使用的工具 包括添加
  • 你知道几个电子相册制作方法?让我来给你分享

    你知道什么是电子相册吗 其实电子相册就是我们把照片编辑成视频的另一个说法 这样的视频一般都带有神奇的转场特效 可以自定义的贴纸和背景 很多小伙伴的爸爸妈妈都很喜欢用这样的方式来制作他们的相册 展示他们拍摄的图片 那这样的电子相册在线制作的方
  • 职场生存能力最强的5类人:如何成为职场中的佼佼者?

    职场生存能力最强的5类人 如何成为职场中的佼佼者 在职场中 生存能力强的人往往更容易获得成功 他们具备各种能力和特质 使他们能够在激烈的竞争中脱颖而出 本文将介绍职场生存能力最强的5类人 看看你是否具备这些特点 一 适应能力强的人 在职场中
  • 手写转文字扫描软件有哪些?方便又好用的工具谁不喜欢?

    大家有没有仔细数过 你们在从小到大的学习生涯中使用了多少笔记本 反正我是经常被我妈催着把以前的笔记本丢掉 但是它们承载的可都是我学生时代的记忆 就连当时觉得复杂难懂的内容 其实也挺有意思的 所以 我一直在思考 到底有什么方法可以让我在不占用
  • 在线智能抠图软件有哪些?证件照背景颜色更换不求人

    2024年上半年全国计算机等级考试 NCRE 报名开始啦 不出意外 这次报名仍然是需要提交证件照 具体要求如下 本人近期正面免冠 白色背景 彩色证件照 不得使用生活照 美颜照 最小像素高宽为192x144 最小成像区高宽为48mmx33mm
  • 职场人最忌讳的10件事:从人性的角度揭示职场中的禁忌行为

    职场人最忌讳的10件事 从人性的角度揭示职场中的禁忌行为 在职场中 每个人都有自己的行为准则和价值观 然而 有些事情却是普遍被认为不可取的 从人性的角度来看 这些事情可能会触碰到人们的某些心理或道德底线 导致他人产生反感或不信任 本文将探讨
  • “性能压测揭密:关键指标分析!“

    在进行全链路压测和性能测试时 需要关注多个关键性能指标 KPIs 来评估系统的性能表现 以下是一些常见的性能测试指标 1 吞吐量 Throughput 系统在单位时间内能够处理的请求数量或事务数量 通常以每秒请求数 RPS TPS 来衡量
  • 【性能测试入门】:压力测试概念!

    压力测试可以验证软件应用程序的稳定性和可靠性 压力测试的目标是评估软件在极端负载条件下的鲁棒性和错误处理能力 并确保软件在紧急情况下不会崩溃 它甚至可以进行超出软件正常工作条件的测试 并评估软件在极端条件下的工作方式 在软件工程中 压力测试
  • C和指针课后答案

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 第八章课后答案 提示 以下是本篇文章正文内容 下面案例可供参考
  • 基于信号完整性的PCB设计原则

    最小化单根信号线质量的一些PCB设计建议 1 使用受控阻抗线 2 理想情况下 所有信号都应该使用完整的电源或地平面作为其返回路径 关键信号则使用地平面作为返回路径 3 信号的返回参考面发生变化时 在尽可能接近信号换层孔的位置增加至少一个返回
  • 带头双向循环链表基础

    带头双向循环链表基础 销毁 销毁 void ListDestory ListNode phead void ListDestory ListNode phead assert phead ListNode cur phead gt next
  • 华为OD机试真题-API集群负载统计-Java-OD统一考试(C卷)

    题目描述 某个产品的RESTful API集合部署在服务器集群的多个节点上 近期对客户端访问日志进行了采集 需要统计各个API的访问频次 根据热点信息在服务器节点之间做负载均衡 现在需要实现热点信息统计查询功能 RESTful API的由多
  • 语音翻译软件app哪家好?帮你和外国人无碍交流的软件分享

    在和外国人交流的时候发现听不懂怎么办 还能怎么办 谁让我们的英语没学好呢 这种时候还是得寻求其他人的帮助 不过万一要是在只有你一个人的情况下又怎么办呢 俗话说 求人不如求己 那还是得在自己手机里时刻准备好能够翻译英语的工具呀 今天就给大家分
  • 有效降低信号串扰的PCB设计原则

    降低信号串扰的一些PCB设计建议 1 对于传输线 保持相邻信号线之间的间距至少为两倍信号线宽 2 尽量避免信号跨越返回路径中的不连续点或者空隙 3 如果必须在返回路径中跨越空隙 则尽量使用差分线 4 电容器不是一种低阻抗互连结构 其高频阻抗
  • 如何正确使用RC滤波网络

    众所周知 最有效的滤波电路应靠近噪声源放置 滤波的作用是对噪声电流进行及时有效地阻止和转移 实际设计中 工程师经常使用高的串联阻抗 电阻 电感和铁氧体 阻止电流 并使用低的并联阻抗 电容 转移电流 通常情况下 我们期望滤波器可以对噪声信号衰

随机推荐

  • 把频谱图的纵坐标设置为分贝刻度

    在信号的频谱分析中 有时频谱的幅值有很大的动态范围 必须要把幅值取对数转换成为分贝值 有两种解决方法 一种是Y轴用对数坐标 另一种是对幅值取对数 转换成分贝值后再画图 1 Y轴用对数坐标 作图时 Y轴用对数坐标 在MATLAB中 X轴 Y轴
  • spring boot 集成logstash 日志

    1 logstash 插件配置 logstash下config文件夹下添加 test conf 文件内容 input tcp mode gt server host gt 0 0 0 0 port gt 4567 codec gt json
  • 已解决 AttributeError: module ‘tensorflow‘ has no attribute ‘random‘

    今天运行py文件的时候发现出了这个错 用了很多方法都没能解决 删了重装已经试了无数次了也不行 于是我把tensorflow的版本给升级了一下 解决问题了 之前是1 10的我升到了1 12 pip install tensorflow gpu
  • linux:vim NERDTree 安装和使用

    1 安装NERDTree之前按照网上的按照一直都安装不上 现在安装上了笔记一下 现在NERDTree 提供两种下载方法 http www vim org scripts script php script id 1658 https git
  • Linux系统通过Console线连接交换机

    Linux系统通过Console口连接交换机 安装minicom Ubuntu安装 sudo apt get install minicom Centos 安装 sudo yum install minicom 配置minicom 需要ro
  • 页面增加水印,附带vue3写法

    效果图 App vue文件
  • cmake简单使用

    概述 cmake是一种跨平台编译工具 除了可以编译c c 代码也可以编译其他语言的代码 其主要就是通过cmake执行CMakeLists txt从而生成Makefile 下面就自己了解到的简单的一点知识 做以记录 更多可查看官网 https
  • python二叉树类定义,列表转二叉树,leetcode本地调试

    如果想用本地IDE调试leetcode上的题目 可以使用以下辅助类 二叉树类定义 Definition for a binary tree node class TreeNode def init self x self val x sel
  • AIX5.3 weblogic9.2速度很慢问题的解决过程

    问题描述 开始的时侯采用的是32位JDK 但是部署应用的时侯总是out of memory 后来改用64位JDK 使用64位JDK之后没有aix 64位 native lib 最后从BEA工程师那取得了64位lib依然无法使用 没有使用na
  • python面试题:Python 剪绳子的多种思路实现(动态规划和贪心)

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了Python 剪绳子的多种思路实现 动态规划和贪心 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来
  • MyBatis-Plus开启AR功能

    开启AR功能领域模型 1 实体类开启AR 同时开启Dao层AR 继承MP特殊类Model
  • echarts x轴数据过多左右滚动显示

    dataZoom使用让出现X轴的滚动条 dataZoom type slider show true xAxisIndex 0 start 0 end 100 textStyle color ccd7d7 或者代码 dataZoom sta
  • 使用ray对pytorch模型进行超参数调节

    def main num samples 10 max num epochs 10 gpus per trial 1 data dir os path abspath data load data data dir config l1 tu
  • gradle 编译 Spring 源码(亲测有效)

    天知道我今天下午经历了什么 从去年开始断断续续看源码 在 IDEA 中 Spring 源码只读不能写 所以每次都是将方法拷贝到 vscode 中 IDEA 中看代码逻辑 接着在 vscode 对应的方法上写注释 期初这种方式没觉得有什么不便
  • 【一】第一个java程序详解

    第一个java程序详解 一 前言 二 创建并编写java源代码的文件 创建java源代码文件 更改文件后缀 java代码的结构 三 编译执行 编译 执行 四 总结 五 附 java关键字 一 前言 通过之前上一节 开篇 Java语言介绍及环
  • 【java毕业设计】基于Spring Boot+mysql的网上商城购物系统设计与实现(程序源码)-网上商城购物系统

    基于Spring Boot mysql的网上商城购物系统设计与实现 程序源码 毕业论文 大家好 今天给大家介绍基于Spring Boot mysql的网上商城购物系统设计与实现 本论文只截取部分文章重点 文章末尾附有本毕业设计完整源码及论文
  • Spring的三级缓存解决循环依赖

    一 什么是Spring三级缓存 第一级缓存 也叫单例池 存放已经经历了完整生命周期的Bean对象 第二级缓存 存放早期暴露出来的Bean对象 实例化以后 就把对象放到这个Map中 Bean可能只经过实例化 属性还未填充 第三级缓存 存放早期
  • Leetcode 600. 不含连续1的非负整数 C++

    Leetcode 600 不含连续1的非负整数 题目 给定一个正整数 n 找出小于或等于 n 的非负整数中 其二进制表示不包含 连续的1 的个数 示例 输入 5 输出 5 解释 下面是带有相应二进制表示的非负整数 lt 5 0 0 1 1
  • cesium-API分类

    Viewer类 imageryLayers 影像 terrainProvider 地形 dataSources 矢量数据 entities 几何实体集合 Widgets 组件 初始化界面上的组件 Camera 相机 Event 事件 鼠标点
  • 蓝桥杯单片机组——程序框架及客观题

    文章目录 前言 程序框架 main 中断 两段式代码结构 单片机运行流程 代码风格 客观题 总结 目录 前言 前面两篇主要是介绍了蓝桥省赛的一些参赛技巧 此篇主要是分享程序框架和一些客观题的链接 程序框架 蓝桥的评分是综合了效果和代码步骤的