【蓝桥杯单片机】十四届省赛“重难点”解析
- 一、题目难点解析
- 二、易出错点提示
- 三、完整代码链接
笔记包括:①题目难点解析、②易出错点提示、③完整代码链接
注:本文提供的所有代码都是使用第十四届竞赛包完成
系列文章链接:
一、题目难点解析
- 亮切换到暗状态:
解释
:AD转换输出的值小于阈值后,认为是触发了一次;
阈值需要在0~255之间选择,因ad输出模拟的5v即数字的255,1v映射为数码管显示的51
方法
:经过测试,阈值为51时可以很好地辨别亮与暗
据官方的解释,会以0为暗状态进行考评,所以阈值的设定能实现亮暗转换即可
- 立刻切换:
方法
:亮变暗状态后(即处于暗状态),数码管显示的界面(stat_smg)需要赋新值(100)
- 3s内不能重复触发:
解释
:由亮变为暗状态后(即处于暗状态),切换到的界面(stat_smg = 100)需要持续显示3s;
方法
:设置一个触发标志(enable_flag)与计时变量(time_3s)
亮变暗即触发一次,enable_flag = 1,且作为条件,一旦满足就使定时器中time_3s++;
且enable_flag == 1要作为单独的一个判断语句,因为在循环数码管时,并不是一直满足触发条件(ad小于阈值且enable_flag为0)的,所以不能一直进入到这个触发条件中去判断enable_flag的值从而判断是否到了3s,故要单独判断enable_flag的值,并做相应处理
- 返回原状态:
解释
:3s过后,数码管从温湿度界面(stat_smg = 100)切换到之前亮时的界面状态
方法
:设置存储原先界面值的变量(save_smg主界面、save_mode子界面);
在变暗时赋值一次(save_smg = stat_smg; save_mode = stat_mode)
3s过后再次赋值(stat_smg = save_smg; stat_mode = save_mode)
上述逻辑部分参考代码如下
//由亮变暗标志
bit enable_flag; //只有0或1两种状态
unsigned int time_3s;//定时器中操作
if(enable == 1)
{time_3s++;
}//数码管中操作
ad_out = AD_OUT(); //获取AD输出值if((ad_out<51)&& (enable_flag == 0))//enable是为了重复触发而设置的一个由亮变暗的标志
//除首次触发(enable_flag初始化为0),后需要满足暗条件且3s时间到了(enable == 0)才能重新进入if语句中(即触发)
{enable_flag = 1; //由亮变暗标志,处于暗状态下trig++; //触发次数 smg_save = stat_smg; //保存主界面数值mode_save = stat_mode;//保存子界面数值stat_smg == 100; //界面转换到温湿度采集界面
}
if(enable_flag == 1) //由亮变暗标志,处于暗状态下
{if(time_3s >= 3000) //3s内 enable仍旧为1 不能进入由亮转暗的操作 即不能重复触发{enable_flag = 0; //时间到以后,标志清零,才能重新进入由亮变暗的判断中time_3s = 0; //计时清零stat_smg = smg_save; //回到原主界面stat_mode = mode_save; //回到原子界面}
}
- 长按按键2s后触发功能
方法
:按键按下标志位(S9_flag)和定时2s计时值(time_2s),在延时松手前后赋值、判断
按键S9长按操作代码如下
C2 = 0;
R1 = R2 = C1 = 1;
if(R2 == 0)
{SMG_Display(); //延时消抖if(R2 == 0){ //先写短按操作if(stat_smg == 3) //处于主界面中的参数界面下才能操作{ if(param_temperature == 0) //最小值固定param_temperature = 0;elseparam_temperature -= 1;}//后写长按操作if((stat_smg ==2)&&(stat_mode == 3)) //处于回显界面中的时钟子界面才能操作{time_2s = 0; //计时变量S9_flag = 1; //标志按键按下状态while(R2 == 0) //检测松手{SMG_Display(); }S9_flag = 0; //标志按键松开状态if(time_2s >= 2000) //长按超过2s后进行操作{Clear_Data(); //全部数据清除函数}time_2s = 0; //清除计时} while(R2 == 0) //短按的检测松手{SMG_Display(); }}
}
二、易出错点提示
- 温度转换需要一定的延时时间,为了等待转换完成
- if((temp & 0xf800) == 0x0000)涉及多个运算符时,最好用括号标清楚运算顺序,以免报错
- stat_led 也需要初始化,赋值为 0xff;
- 软件生成的定时器初始化函数,要补充一些语句
①若将T0做计数器使用,则需要添加TMOD |= 0x05;
②定时器设置的语句要写全,包含定时器开启(TR)、中断允许(ET、EA)
三、完整代码链接
下面提供了14届蓝桥杯单片机省赛代码,依据小蜜蜂老师风格编写,在修改bug时参考了部分B站视频
代码链接:14届蓝桥杯单片机省赛代码-饥饿的半导体(提取码:1414)
参考视频①:蓝桥杯单片机第十四届省赛从新建工程到完成工程-左-岚
参考视频②:第十四届蓝桥杯单片机省赛讲解-是青不是氢
本文是在博主练习完部分省赛题目后总结的笔记
文章为本人对试题的观点,难免有所欠缺,欢迎大家在评论区里共同讨论