哈喽大家好,我是阿飞的小蝴蝶,大家可以叫我阿飞或者小飞,我又回来啦~
今天要给大家分享的内容是:第十一届蓝桥杯省赛程序题的解析,好的,废话不多说,直接开始我们今天的内容。
试题要求摸我下载哦~(第十一届蓝桥杯单片机省赛程序题.pdf)
与上一届相似的,第十一届的蓝桥杯在整体难度上还是很低的,但仍然是用到了开发板上一个新的功能:DA转化,即数字量转为模拟量。
按照惯例先来看一下赛题所考到的功能。本次赛题用到开发板上的功能有:LED灯、数码管、独立按键、DS18B20以及今天着重要讲一下的PCF8591中的DAC功能,好的,接下来就开始本次赛题的分析吧。
程序的开始仍然是对板子进行初始化,需要将LED灯、数码管、蜂鸣器、继电器全都关掉。这次编程直接添加了一个名为“init.c”的程序文件,把这个文件作为公共文件使用,在这个文件里边编写有关板子初始化、定时器初始化、延时函数等功能的程序。程序中使用的大部分变量也放在了这个文件里边,然后在h文件里外部声明一下,之后只需要在所用到的文件中包含这个头文件就可以了。
这次赛题设置了两个不同的数码管显示界面,这里仍然是编写了两个显示函数分别用于显示不同的界面,再通过一个标位置变量进行切换即可。
参数界面里的上下限需要进行合理性检查,即 温度上限 ≥ 温度下限,这里除了用于对比的上下限的变量以外还声明了两个用于暂存上下限数据的变量与一个用于标志是否发生错误的变量。只需在设置完成返回显示数据界面的时候进行判断,当设置合理的时候(上限暂存变量 ≥ 下限暂存变量),将暂存变量的数据赋值给对应的用于对比的变量的数据,并将是否发生错误的标志位设为0;当不合理时(上限暂存变量 < 下限暂存变量),将修改之前的上下限数据复制给暂存变量,再将是否发生错误的标志位设为1即可,之后便可通过此标志位的数值进行是否点亮指示灯的操作即可。
按键部分的功能:上一段内容说明数码管界面时通过一个对应的标志位进行切换的,按下S4按键时只需修改此标志位的值即可完成显示界面切换;S5按键也是同样的道理,通过按键改变一个标志位变量来对当前选中的参数进行切换即可,本次赛题并没有像第八、九届那样要求闪烁选中的参数,逻辑上的难度也相对容易很多。按键的加减功能也只需先通过标志位判断当前选中的参数再进行加减即可,由于参数设置有上下限,但并没有声明到达边界后的操作,所以当设置为99后再进行加操作让数据变为0可以,保持99不变也可。
LED灯部分和ds18b20部分的程序与之前的赛题中并没有太大区别,这里就不再详细介绍了,不过需要注意的是,定时器的中断较容易对温度数据的读取协议产生干扰,数据可能会偶尔产生不正常的跳变,此时只需将数据进行一次处理即可(例如:当温度数据大于50摄氏度时,可舍弃本次数据)。
对比一下PCF8591中的ADC功能(IIC读数据协议)也容易猜得到DAC功能八成用的是IIC写数据协议,关键在于写数据的地址,这一点可以通过比赛时提供的芯片手册查得到(0x40),得知地址之后的操作就很简单了,类比EEPROM写数据协议便可,只需要计算出所需的模拟电压对应的数字量并将其写入即可。(例如:输出3V模拟电压,写入数值为255/5*3)。
好的,以上就是我对本次赛题的全部分析了,最后附上本次赛题代码,代码已经经过测试,可实现全部功能,欢迎大家批评指正。
----------------所有代码打包下载链接------------------