devbox
繁依Fanyi0
这个屌丝很懒,什么也没留下!
当前位置:   article > 正文

【蓝桥杯单片机】十四届省赛“重难点”解析(附源码)_蓝桥杯单片机省赛代码总是写超了怎么办

蓝桥杯单片机省赛代码总是写超了怎么办


笔记包括:①题目难点解析、②易出错点提示、③完整代码链接
本文提供的所有代码都是使用第十四届竞赛包完成

⭐系列文章链接⭐
【蓝桥杯单片机】十四届省赛“重难点”解析(附源码)
【蓝桥杯单片机】十三届省赛“重难点”解析(附源码)
【蓝桥杯单片机】十二届省赛“重难点”解析(附源码)
【蓝桥杯单片机】十一届省赛“重难点”解析(附源码)


一、题目难点解析

  1. 亮切换到暗状态
    解释:AD转换输出的值小于阈值后,认为是触发了一次;
    阈值需要在0~255之间选择,因ad输出模拟的5v即数字的255,1v映射为数码管显示的51
    方法:经过测试,阈值为51时可以很好地辨别亮与暗
    据官方的解释,会以0为暗状态进行考评,所以阈值的设定能实现亮暗转换即可
  1. 立刻切换
    方法:亮变暗状态后(即处于暗状态),数码管显示的界面(stat_smg)需要赋新值(100)
  1. 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的值,并做相应处理
  1. 返回原状态
    解释: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;  //回到原子界面
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

  1. 长按按键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;
			else
				param_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();	
	}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

二、易出错点提示

  1. 温度转换需要一定的延时时间,为了等待转换完成
  2. if((temp & 0xf800) == 0x0000)涉及多个运算符时,最好用括号标清楚运算顺序,以免报错
  3. stat_led 也需要初始化,赋值为 0xff;
  4. 软件生成的定时器初始化函数,要补充一些语句
    ①若将T0做计数器使用,则需要添加TMOD |= 0x05;
    ②定时器设置的语句要写全,包含定时器开启(TR)、中断允许(ET、EA)
    在这里插入图片描述

三、完整代码链接

下面提供了14届蓝桥杯单片机省赛代码,依据小蜜蜂老师风格编写,在修改bug时参考了部分B站视频
网盘链接:14届蓝桥杯单片机省赛代码-饥饿的半导体(提取码:1414)
参考视频①:蓝桥杯单片机第十四届省赛从新建工程到完成工程-左-岚
参考视频②:第十四届蓝桥杯单片机省赛讲解-是青不是氢


本文是在博主练习完部分省赛题目后总结的笔记
文章为本人对试题的观点,难免有所欠缺,欢迎大家在评论区里共同讨论

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/706142
推荐阅读
相关标签
  

闽ICP备14008679号