本帖最后由 喜欢独处的阿飞 于 2021-7-2 14:48 编辑
哈喽哈喽大家好,我是阿飞的小蝴蝶,大家可以叫我阿飞或者小飞,没错,我又回来啦~
本次要给大家分享的是:第十一届蓝桥杯国赛题。好的,话不多说,直接开始我们本节的内容。
试题要求摸我下载哦~(
2020年蓝桥杯真题.pdf
(381.92 KB)
)
拿到赛题后还是先打开编程题大致看了一遍,带给我的感觉就是。。这真的是国赛题嘛?感觉有点简单呀,有种在做稍难一点的省赛题的感觉。
本次赛题用到了开发板上的模块有:数码管、LED、矩阵按键、DS18B20、DS1302、PCF8591,这些模块都是我们平时常练习到的,个人感觉并没有太大的难度,按键虽然用到的是矩阵按键,但也只有4个按键,逻辑上也并有没太大的难度,这部分写起来还是比较轻松的,值得注意的是,今年竞赛资料里边新给的驱动跟往年一些变化,特别是DS1302的驱动,把往年的读写地址以及读写函数中的数据转化都去掉了,这部分需要我们自己编写,不过只要了解协议,这部分也并不会太难,因为没有用到超声波、NE555等模块,定时器资源还是非常充足的。
数码管的显示界面一共有6种,于是我这里就写了六个不同的数码管显示函数,用了两个标志位变量来搭配切换数码管的界面,通过按键来改变两个标志位的值就可完成数码管界面的切换,参数设置界面有一点要求是:当退出参数设置界面时,设置的参数才可生效,设置时不生效,所以我在这里除了用到存放三个参数的变量以外,还用到了暂存三个参数的变量,设置时修改暂存的变量,退出参数设置界面时把暂存的变量赋值给用来比较的存放变量就可以了,这部分相对来说还是比较简单的。
由于温度数据要求了保留小数点后一位,这里就不能像之前省赛题那样只读取16位数据的中间8位了,因为要读取小数,这里读取了16位数据,再将数据进行一些处理就可以了,光敏电阻部分跟之前常用的电位器是一样的,时钟模块也是我们常用到的,这里并没觉得有什么需要特别值得注意的地方,不过有意思的是判断亮和暗的分界值,题目并没有具体要求,需要我们根据实际情况来设定,这里设定的分界值为:1.8V,效果还可以。由于题目要求了一些数据的刷新时间,这里设定的温度刷新时间为500ms,光敏刷新时间为200ms。由于代码嵌套在一起时出现了一些小问题,可能是某些程序对读取协议有一些干扰,温度数据和时间数据会有偶尔不正常的跳变,数码管显示就会有写乱闪的现象,于是在主函数中对这些数据进行了处理:温度读取数据过大(大于50℃时)舍弃本次数据,时钟连续读三次数据,当判断到其中最少有两次数据相同时使用此次相同的数据。干扰得到了非常好的处理。
亮暗环境3S计时的部分,这里采用了两个不同的计时标志,当环境发生变化时,打开或关闭对应的计时标志并清零当前计时数值,定时器中判断条件满足时开始计时,LED灯部分。。刚开始打算使用与或运算符来写LED灯,但发现各个情况下LED各种冲突,于是当时想到的方法就是,把各种状态下的LED亮灭情况全都列出来,于是。。LED灯部分写了整整200行。。算了,不想回忆了。
两个定时器分别计时为2ms中断和5ms中断,其中,数码管扫描函数单独放在了2ms定时器中,5ms定时器用来给各个计时变量计时,同时来处理LED灯部分,按键扫描、温度、AD、时间等数据的读取全部放在了主函数循环中轮流处理,我个人还是很不习惯也不太推荐大家把按键扫描放在定时器中断里的,可能是我自己的问题,按键放在定时器中的结果总是不理想,特别是按键和数码管在同一个定时器中的情况下。
以上就是我对本次赛题的分析以及编程时的思路,最后附上本次赛题代码,代码以及经过测试,可实现全部功能,欢迎大家批评指正~
这次比赛还算是比较顺利的,比赛时用了3个小时的时间大本分功能都写完了,相对来说LED灯部分花了很多时间,赛后给我的感觉就是。。保二争一吧,结果是二等奖,全国第61名,二等奖中的第7名,也就是说只要前进7名就能拿到一等奖,可能。。也就是一道选择题的分数吧,选择题做的感觉一般般,虽然留有些遗憾,但也是尽力了的,所以。。也还好啦。
----------------所有代码打包下载链接------------------
第11届国赛题程序.zip
(91.06 KB)
|