第十四届蓝桥杯单片机模拟赛代码分享

2023-03-09 00:06:50 来源:哔哩哔哩

新建文件夹,创建工程,添加文件,保存文件,将文件添加进工程这些操作在比赛通用模板里面有类似操作,因为这里用的是矩阵键盘(注意把板子上面的跳帽接好),那key.c里面的程序就要改成矩阵键盘的。

文末附代码


(资料图)

1.调试好外设(DS18B20,PCF8591,串口通信等)

将官方驱动程序移植进工程后,编写驱动程序,并测试模块是否能正常使用。

onewire.c

添加DS18B20读取温度的代码即可,写完后可以先用数码管显示一下读取温度数值看看模块驱动程序有无问题。

iic.c

添加PCF8591的驱动代码即可,写完后可以先用数码管显示一下读取数值看看模块驱动程序有无问题。

sys.c

这部分要添加串口通信相关代码,包括串口初始化与串口发送字符串,其实也就是之前视频里面的代码。

一定要保证所有外设都是正常的才好进入下一步,如果有模块不能正常驱动,要尽快调试好,以保证后期系统的正常运行。

2.主函数main.c函数介绍

宏定义区——主要是方便将变量显示在数码管

变量定义区——系统变量进行全局定义

函数定义区——将写在main()函数下面的函数进行定义

main()函数

首先是各种初始化:sys_init(),这个在sys.c里面,是对LED,蜂鸣器,数码管和继电器的初始化,就是把它们全都关掉;接下来是预读取温度,然后延时这样能够解决上电显示85的问题;然后是定时器与串口初始化函数(在sys.c里面)

在while(1)里面,第一个进程是按键扫描,判断按键S4和S5与题目中的锁定模式联系上,这里的Lock是标志位,Lock=0就是没锁,Lock=1就是锁上了,然后根据mode执行对应模式,这两个函数将在下面介绍,进程最后是刷新LED,蜂鸣器和继电器这些。

Time0中断服务函数

数码管每隔1ms刷新一次,按键每隔20ms扫描一次,Led,蜂鸣器继电器这些每隔50ms刷新一次,在电压测量模式下每隔100ms测量一次电压,time_flag是为了锁定系统时闪烁L3的标志位,在温度测量模式每隔500ms测量一次温度值。

Tmp_Mode()函数

温度测量模式函数,这里的tmp_mea是定时器里面的进程,500ms一到,tmp_mea置位此时测温并显示温度在数码管上,这里用到了上面定义的宏,shi(temp_T)这里后面+32是为了显示小数点,不懂的可以去tube.c里面研究一下,去数一下wei那个数组就懂了;这里如果按下S12就会将数据上传至串口助手。

注意:sprintf()函数在stdio.h里面,要去main.h里面添加#include <stdio.h>这个头文件

我这里没有判断负数温度,其实应该是要加一下的,这样稳一点。

AD_Mode()函数

电压测量模式,读取电位器电压,与上面的温度测量模式函数类似,不过多解释了。

LED_Show()函数

刷新LED,该函数是我之前总结出来的,基本可以应用在所有的题目上,大家可以参考一下,前面两个灯就是对应模式下点亮,L3是锁上时闪烁,这里就用到了time_flag,若是锁上了那么每隔100ms对L3取反就是L3闪烁,没锁时就是L3灭。

重点介绍一下uLed:

首先要知道LED是低电平点亮,那么0xf8 = 1111 1000,直接让前五位都灭,最后三位分别对应L3,L2,L1(开发板上L1对应P0^0,L2对应P0^1......L8对应P0^7)

举个例子,若是L1 = 1,L2 = 0,L3=1

所以 L3<<2 | L2<<1 | L1 = 0000 0101

uLed = 0xf8 | (L3<<2 | L2<<1 | L1) = 1111 1101,所以这时候L2被点亮了。大家可以多举几个例子自己理解一下哈。

然后下面就是关中断,点灯,开中断,这个步骤是为了点灯时不与数码管冲突。

Beep_Realy_Run()

刷新蜂鸣器继电器,这个过程与上面点灯也是类似的,基本过程是一样的,唯一要注意的是继电器和蜂鸣器都是高点平驱动的。

其实这个0xaf不是固定的,但一定要保证第6位和第4位都是0,因为这两位连接的蜂鸣器和继电器。

串口中断服务函数

这里就是从电脑串口接收数据,根据Lock的值判断此时是否可以切换模式。

3.总结

本次模拟赛的其实就是考个串口来吓唬我们的,其实基本的功能都很好实现,没有很难的考点,只要串口通信能搞定其他都不是问题。

比赛前把所有模块的驱动全都记熟了(包括超声波和串口都要记),当然也要会灵活变通啦,省赛考的逻辑不会太难也都是比较基础的吧,所以好好准备,预祝大家都能取得好成绩!

代码下载地址:https://wwnz.lanzouw.com/iAstT0pn3sza

代码仅供参考,因为每个人理解不同所以实现的功能可能与大家不太一样,如果代码中有任何问题欢迎大家在评论区留言交流。

如果本专栏内容对您有所帮助,可以给新人UP主三连支持一下嘛(手动doge),您的支持是对我最大的鼓励,谢谢啦!

标签:

为您推荐

新闻快讯