新台阶——蓝桥杯单片机省赛第十四届程序设计题目
在做十四届题目之前,常常听学长说,十四届以前拿省一真的是右手就行,并不相信,在经历十四届痛苦的大量修bug和优化之后,或许学长的话真说对了几分。话不多说,我们开始一起完成单片机第十四届程序设计题目。
代码在这:
链接:https://pan.baidu.com/s/1E7S1zt6E9KrUoIRGVt-eqQ?pwd=1234
提取码:1234 //这个注释比较多但是如果出现小瑕疵问题,可以用下面那个(因为懒得改全部hh
下面是第一次默写和优化后的代码,上面的注释比较多
链接:https://pan.baidu.com/s/1PakTSsUwwlIMly_FWpR9RQ?pwd=1234
提取码:1234
一,变化
因为之前都是使用的keil5来写,但是笔者这里比赛需要使用到keil4,所以也跟你们分享一下。
芯片选择这里就只能点左下角这个区域,其他地方都是黑的,点击红框,找到STC89C52点击OK就行。
按照笔者之前三大模板的文章写到这里,我们已经分好了文件夹、勾选了生成.hex文件、错误miss、和最重要的路径添加。
在keil4中,添加.c文件不能右键就添加,而是键盘Ctrl+N创建一个新文件,再Ctrl+S保存修改成.c文件。
新出现的bug(下面第一张图)
新bug,不过是笔者的低级错误,宏定义后面加了分号就会这样,数组定义会错误,就说指针类型错误了。
唯一模板和底层改动的地方
onewire底层的修改,为了方便显示小数。
二、三大模板和底层驱动的完善
这除了定时器不能单独测试,其余文件的函数都是可以独立检测的,来验证你写的是否正确。这一步是所有代码的基础,所以一定要踏实地测试完。防止后面还要倒回来修bug。
三、老规矩,从按键部分开始写
变量
清除数据的函数先放着不写,到时候定义完全部变量再写也来的及。然后模板那里使用检测到一个就返回键码值的那一套模板,上一篇文章有讲。因为这个效果比较好。
勘误:应该是长按2s,那定时器那里改成>=2000和锁死在2001,把按键那里也改改就行了
计时
模式切换
void key_proc(void)
{if(key_dly)return;key_now=key_read();key_down=key_now&(key_now^key_old);key_up=(~key_now)&(key_now^key_old);key_old=key_now;if(key_down==4){Disp_mode=(++Disp_mode)%3;huixian_mode=0;}if((Disp_mode==1)&&(key_down==5)){huixian_mode=(++huixian_mode)%3; }if(Disp_mode==2){if(key_down==8){para_temperature=(++para_temperature>99)?99:para_temperature; }if(key_down==9){para_temperature=(--para_temperature>254)?0:para_temperature; }}if((Disp_mode==1)&&(huixian_mode==2)){if(key_down==9)long_press_flag=1;if(key_up==9){if(tims_3s>=3000)Clear_data();long_press_flag=tims_3s=0;} }
}
四、第二步写数码管(最难最多得分点的部分)
1.框架
变量
我们先不管最大值平均值这些怎么计算,我们就先根据模式变量将要显示的几个界面写好。
void seg_proc(void)
{
// ui temperature_10x,humi_10x;//也是十倍,就是用来计算平均值 if(uiseg_dly)return;if(Disp_mode==0){Rtc_read(ucRtc);sprintf(seg_char,"%02d-%02d-%02d",(ui)ucRtc[0],(ui)ucRtc[1],(ui)ucRtc[2]);}else if(Disp_mode==1){if(huixian_mode==0){sprintf(seg_char,"C %02d-%02d.%1d",(ui)max_temperature_10x/10,(ui)aver_temperature_10x/10,(ui)aver_temperature_10x%10);}if(huixian_mode==1){sprintf(seg_char,"H %02d-%02d.%1d",(ui)max_humi_10x/10,(ui)aver_humi_10x/10,(ui)aver_humi_10x%10);}if(huixian_mode==2){sprintf(seg_char,"F%02d%02d-%02d",(ui)tri_count,(ui)tri_time[0],(ui)tri_time[1]); } }else if(Disp_mode==2)sprintf(seg_char,"P %02d",(ui)para_temperature);// sprintf(seg_char,"E %02d-%02d",(ui)temperature_10x/10,(ui)humi_10x/10);
// sprintf(seg_char,"E %02d-AA",(ui)temperature_10x/10);Seg_Tran(seg_char,seg_buf);
}
这样写好之后,实验现象:按键正常,模式切换正常,不同模式显示不同内容,只有时钟显示界面不是0和参数界面是默认30,其余都是显示0(很烦人的一个毛病,笔者在之前的代码,时间显示界面是稳定的,但是此次再写,尽管代码一样,但分钟十位还是一直在1和5之间闪烁,到0时0分0秒之后就没什么问题,换成不是59的分钟也没什么问题,不知道你们的板子会不会出现跟我一样的毛病)
2.开始做题
直到现在,我们前面写那么多东西,都是可以靠熟练度写完的,所以大家对于基础模板一定要熟练掌握,我们现在看到题目中,这个采集部分是凌驾于我们所有逻辑之上的,也就说我们什么时候显示什么内容都会被它影响,那我们就可以先写这个触发检测代码,根据这个代码,创建标志位,来告诉单片机什么时候该显示什么内容。
采集部分的判断和界面切换
下面就是采集部分的判断和界面切换的判断(代码看着有点多,但是到这一步就写了一个光强的判断和计时,其余都是上一步的框架,然后提一嘴,定时器一定是12T不然检测到的光强极其不稳定。(因为笔者找这个bug找了好久))
void seg_proc(void)
{uc tri_count_old;uc light_val_old,light_val;ui temperature_10x=0,humi_10x;//也是十倍,就是用来计算平均值 if(uiseg_dly)return;light_val=pcf8591_Adc(1);if((light_val_old>50)&&(light_val<50)&&(tri_flag==0)){tri_flag=1;if(++tri_count==100)tri_count=99;tri_count_old=tri_count; }if((tri_flag==1)&&(time_3s>=3000))tri_flag=0;light_val_old=light_val;//判断完之后再赋值 if(tri_flag==1){temperature_10x=(rd_temperature()*10);if(humi_10x==0)//无效数据{tri_count=tri_count_old-1;sprintf(seg_char," ");sprintf(seg_char,"E %02d-AA",(ui)temperature_10x/10); }else//有效数据{sprintf(seg_char,"E %02d-%02d",(ui)temperature_10x/10,(ui)humi_10x/10); }}else if(tri_flag==0){if(Disp_mode==0){Rtc_read(ucRtc);sprintf(seg_char,"%02d-%02d-%02d",(ui)ucRtc[0],(ui)ucRtc[1],(ui)ucRtc[2]);}else if(Disp_mode==1){if(huixian_mode==0){sprintf(seg_char,"C %02d-%02d.%1d",(ui)max_temperature_10x/10,(ui)aver_temperature_10x/10,(ui)aver_temperature_10x%10);}if(huixian_mode==1){sprintf(seg_char,"H %02d-%02d.%1d",(ui)max_humi_10x/10,(ui)aver_humi_10x/10,(ui)aver_humi_10x%10);}if(huixian_mode==2){sprintf(seg_char,"F%02d%02d-%02d",(ui)tri_count,(ui)tri_time[0],(ui)tri_time[1]); } }else if(Disp_mode==2)sprintf(seg_char,"P %02d",(ui)para_temperature);}Seg_Tran(seg_char,seg_buf);
}
以上的内容是可以检测的,模式切换正常,采集触发也是可以正常使用。
最大值和平均值的计算
如果触发次数为0则显示标识符
满足上面题目的要求就下面那些要加上的代码,不过还没写湿度计算部分,还没法检测。
Ne555测频率转湿度和之前没写的清除数据操作封装函数
变量和计算函数封装
清除数据函数和读取温度常规延时
定时器中的脉冲次数计算(定时器0的配置之前文章有讲)
一个小小的优化
测试实验现象:完成了除led部分之外所有的题目要求,并且不会出现小瑕疵比如说数据严重错误的情况。(这就是你们写到这里之后要达到的效果)然后因为还要有一个处于温湿度界面就按键失效的要求嘛,就在if(key_down==4)上一行加上if(tri_flag==1)return;就行了
五、最简单的led部分
第一类
同一类在点亮前要将不亮的全部熄灭。(所以笔者会将其分类)
void led_proc(void)
{if(led_dly)return;if(tri_flag==1){ucLed&=~0x03;ucLed|=0x04;}else if(tri_flag==0){ucLed&=~0x04;if(Disp_mode==0){ucLed&=~0x03;ucLed|=0x01;}elseucLed&=~0x01;if(Disp_mode==1){ucLed&=~0x03;ucLed|=0x02;}elseucLed&=~0x02;}}
第二类
这一类都是由标志位点亮,标志位被置1就点亮,是独立的。
第一个
变量
为闪烁服务
逻辑判断
Led部分
实验现象:触发采集,如果温度数据大于温度参数,则L4闪烁,间隔100ms,(这个是直到下一次温度数据低于温度参数时才会停止闪烁,如果想让其在采集的时候闪,那就可以在tri_flag=0时将warn_flag置0就行了)
然后那个数据错误的点灯就不拿出来讲了,应该都知道在哪进行置1和置
第二个
变量
逻辑判断
LED部分
实验现象:完成题目中所有的要求,并且没有小问题,小瑕疵。(有的话就再优化,笔者板子上没啥问题)
六、结言
至此,我们总算是完成了第十四届的省题,之所以说是新台阶,是因为难度较之前真的有天壤之别,体现在变量多(这个时候会出现大家陌生的内存空间不足bug要大家去合理节省内存空间),逻辑判断多,界面多,底层驱动使用多,模块多等等,这些对于要备战今年蓝桥杯省赛的读者来说,是向国一迈进的一个坎。最后祝愿大家能取得好成绩。
相关文章:

新台阶——蓝桥杯单片机省赛第十四届程序设计题目
在做十四届题目之前,常常听学长说,十四届以前拿省一真的是右手就行,并不相信,在经历十四届痛苦的大量修bug和优化之后,或许学长的话真说对了几分。话不多说,我们开始一起完成单片机第十四届程序设计题目。 …...
php魔术方法
PHP 中的魔术方法(Magic Methods)是一组具有特殊名称的方法,它们会在特定的事件发生时自动被调用。这些事件包括对象的创建、销毁、属性的访问和修改等。通过使用魔术方法,你可以更好地控制对象的行为,并增加代码的灵活…...
Linux系统——Mysql索引详解
目录 一、索引介绍 1.索引的概念 2.索引的作用 3.索引的缺点 4.创建索引的原则依据 5.索引优化 二、索引的分类和创建 1.索引分类 1.1普通索引 1.1.1直接创建索引 1.1.2修改表方式创建 1.1.3创建表的时候指定索引 1.2唯一索引 1.2.1直接创建唯一索引 1.2.2修改表…...

Java22已发布,支持SpringBoot3.3.0正式版
Java22已发布,支持SpringBoot3.3.0正式版 文章目录 Java22已发布,支持SpringBoot3.3.0正式版1. JDK22现已推出!2. Java22的新功能1. 语言改进1. 语言预览 2. 库文件3. 性能4. 工具 3. 资源 Java 22现已发布 下一个Java版本提高了Java应用程序…...

第二证券策略:关注部分华为板块、年报绩优品种反弹机会
第二证券指出,短期商场或偏震动运行,跟着4月财报密布发表期临近,重视年报成绩确定性的三大线索:1)出口相关性高的外需拉动种类,如汽车、白电及上游氟化工、纺服及上游化纤;2)供应强约…...

IBM SPSS Statistics for Mac v27.0.1中文激活版
IBM SPSS Statistics for Mac是一款功能强大的统计分析软件,专为Mac用户设计,用于数据分析和决策支持。该软件拥有直观易用的界面和丰富多样的统计工具,使得用户可以轻松进行数据处理、分析和解释。 软件下载:IBM SPSS Statistics…...

C# WPF编程-布局
C# WPF编程-布局 布局WPF布局原则布局过程布局容器布局属性Border控件 常用布局StackPanel布局WrapPanel布局DockPanel布局Grid布局UniformGrid布局Canvas布局InkCanvas布局 布局 WPF布局原则 WPF窗口只能包含单个元素。为在WPF窗口中放置多个元素并创建更贴近实用的用户界面…...

上位机图像处理和嵌入式模块部署(qmacvisual点线测量)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 上面一篇文章,我们完成了直线的拟合操作。在实际场景中,拟合之后更多地是需要进行长度的测量。既然是测量,那么…...

yolov5训练并生成rknn模型部署在RK3588开发板上,实现NPU加速推理
简介 RK3588是瑞芯微(Rockchip)公司推出的一款高性能、低功耗的集成电路芯片。它采用了先进的28纳米工艺技术,并配备了八核心的ARM Cortex-A76和Cortex-A55处理器,以及ARM Mali-G76 GPU。该芯片支持多种接口和功能,适…...

SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测
SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…...

javaSwing宿舍管理系统(三个角色)
一、 简介 宿舍管理系统是一个针对学校宿舍管理的软件系统,旨在方便学生、宿管和管理员进行宿舍信息管理、学生信息管理以及宿舍评比等操作。该系统使用 Java Swing 进行界面设计,分为三个角色:管理员、宿管和学生。 二、 功能模块 2.1 管…...

蓝桥杯day12刷题日记
P8720 [蓝桥杯 2020 省 B2] 平面切分 思路:首先借用dalao的图解释一下,又多出一条与当前平面任意一条直线都不重合线时,多了的平面是交点数1,所以用双层循环每次往里面加一条直线,计算交点 #include <iostream>…...

深度学习pytorch——多分类问题(持续更新)
回归问题 vs 分类问题(regression vs classification) 回归问题(regression) 1、回归问题的目标是使预测值等于真实值,即predy。 2、求解回归问题的方法是使预测值和真实值的误差最小,即minimize dist(p…...
Flutter探索之旅:控制键盘可见性的神奇工具(flutter_keyboard_visibility)
随着移动应用的不断发展,用户体验的重要性愈发突显。而键盘的弹出和隐藏对于用户体验来说是至关重要的一环。在Flutter中,我们有幸拥有一个强大的工具——flutter_keyboard_visibility,它让我们能够轻松地监测键盘的可见性并做出相应的响应。…...

提升质量透明度,动力电池企业的数据驱动生产实践 | 数据要素 × 工业制造
系列导读 如《“数据要素”三年行动计划(2024—2026年)》指出,工业制造是“数据要素”的关键领域之一。如何发挥海量数据资源、丰富应用场景等多重优势,以数据流引领技术流、资金流、人才流、物资流,对于制造企业而言…...

华为数通 HCIP-Datacom H12-831 题库补充
2024年 HCIP-Datacom(H12-831)最新题库,完整题库请扫描上方二维码,持续更新。 缺省情况下,PIM报文的IP协议号是以下哪一项? A:18 B:59 C:103 D:9 答案&a…...
tensorflow中显存分配
tensorflow中显存分配 问题:使用tensorflow-gpu训练模型,GPU的显存都是占满的。 # GPU 1的显存将占满 os.environ["CUDA_VISIBLE_DEVICES"] "1" 原因:默认情况下,tensorflow会把可用的显存全部占光&#…...

STM32--RC522学习记录
一,datasheet阅读记录 1.关于通信格式 2.读寄存器 u8 RC522_ReadReg(u8 address) {u8 addr address;u8 data0x00;addr((addr<<1)&0x7e)|0x80;//将最高位置一表示read,最后一位按照手册建议变为0Spi_Start();//选中从机SPI2_ReadWriteByte(ad…...
函数封装冒泡排序
大家好: 衷心希望各位点赞。 您的问题请留在评论区,我会及时回答。 一、冒泡排序 冒泡排序是最常见的一种排序算法,按照指定顺序比较相邻元素,如果顺序不同,就交换元素位置,每一趟比较,都会导致…...

mysql基础学习
一、DML 介绍:DML(数据操作语言),用来对数据库中表的数据记录进行增删改操作。 1.添加数据 /*给指定字段添加数据*/ insert into user(id, name) values (1,小王); select *from user;/*查询该表的数据*/ /*给所有字段添数据*/ insert int…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...