蓝桥杯单片机第十四届国赛真题解析-测评满分代码

目录

前言 

一.负数

1.采用设置标志位的办法实现假负数

2.直接使用char类型 会自动判别校准值与0的大小(范围:-128~+127)写入数码管时在负数的情况下前面再加个负号就能解决

二.按键

1.S8按键

2.S9按键

3.双按键

三. DAC

四.LED

五.继电器


 

前言 

本文介绍了蓝桥杯单片机第十四届国赛易错点及注意事项

第十四届国赛实现难度相比于省赛更加容易,但是对于题目的理解才是重中之重。

一.负数

60db91e42c514de4a6e5d0f24ce33b1b.png

 负数问题在第十五届省赛中也有考到,现给出两种解决办法 

1.采用设置标志位的办法实现假负数

 if(fu==0)//校准值大于等于0的情况
 {			 
	 if(check>0)
	 {
	  if(Key_Up==8)
		{
		 check+=5;
	      if(check==95)check=90;
		}
	else if(Key_Up==9)
	{
	check-=5;
	}
 }
else if(check==0)//当校准值等于0
 {
	if(Key_Up==8)//正常加
	 {
	   check+=5;
	   if(check==95)check=90;
	 }
	 else if(Key_Up==9)//减的时候校准值变成5,并改变标志位
	 {
	  check=5;
	  fu=1;//对应为数码管带负号的情况
 	 }
 }
 }
else if(fu==1)//此时为负数的情况,加减对调
 {			 
	 if(check>0)
	 {
		 if(Key_Up==8)
	  {
		 check-=5;//注:校准值等于0时让fu默认为0,就会跳出语句
	  }
	else if(Key_Up==9)
	 check+=5; 
	 if(check==95)check=90;					 
	}
 }

2.直接使用char类型 会自动判别校准值与0的大小(范围:-128~+127)写入数码管时在负数的情况下前面再加个负号就能解决

二.按键

1.S8按键

仔细看题 ceb2d322d3e5428ea59d12d6f52f21a5.png

 记录功能:只在测距界面下生效,并且记录6s内距离的连续变化,其他按键无效,保留最近记录的一组数据整套题目的关键点

相信大部分人第一眼看到都会觉得是记录6s结束的最后一个数据,这是错误的

我们应该设置一个数组来存储6s内的一串距离数据,并且因为题目性能要求超声波数据刷新时间最长为1s,为了节省内存所以设置7位的数组

if(writedown==1)//按键按下标志
{			  
	if(count4%1000==0)//1s记录一次
	{
		Grouplength[i]=writelength;
		i++;
		if(i==7)i=0;
	}
	if(count4==6000)//6s后退出记录
	{			
		count4=0;
		writedown=0;
	}
	count4++;//放最后是为了count4=0时可以记录到数据
}

2.S9按键

1876aaf9a9fc41a188c0b47f8bda0156.png

同样的 输出数据也是一连串的

输出功能也只在测距界面生效

if(readac==1)//输出数据
{
	if(count8%1000==0)
	{
	  lastlength=Grouplength[j];
	  j++;
	 if(j==7)j=0;
	}
	if(count8==6000)
	{
		readac=0;
		count8=0;
	}
	count8++;
}

3.双按键

5d417cb78933458ba7e866835726c61f.png

在矩阵键盘底层加入双按键情况,因为题目说长按持续状态超过2s实现功能,所以无需松手检测

只要定时达到2s时立刻恢复初始状态,和松手时间无关。

又因为松手产生的时间差会导致某个数值的加减变化,这里设一个标志位,当双按键按下时锁住其他按键的加减功能,但此时键值读取还是正常的,等松手后再解锁键盘就实现了完美的双按键长按功能。

P42=0;P34=P35=P44=1;
if(P33==0&&P32==0)Temp=89;
if(Key_Down==89)
{
	writedown=0;	//防止在测距界面按下s8时会触发记录功能
	time2s=1;       //开始计时
	lock=1;         //因为双按键按下会有时间差 为了避免造成影响将键盘锁住
}
else if(Key_Old==0)//如果上一个时刻的键值读取为0 意味着没有按键按下 
{
	time2s=0;
	lock=0;//此时退出锁定
}

还有一个注意点 初始状态 并不只是数值初始化 还有界面的初始状态为测距界面

155a54dbef4941408c7de14279dff348.png

 

三. DAC

dac输出是本套试题的一大难点 归根结底很多人做不出来是记录和输出有问题 

if(readac==1)//定时器内进行计时
{
	if(count8%1000==0)//按顺序每s输出一次记录的其中一个数据
	{
	  lastlength=Grouplength[j];
	  j++;
	if(j==7)j=0;
	}
	if(count8==6000)
	{
		readac=0;
		count8=0;
	}
	count8++;
}
if(readac==1)//测距界面下进行输出数据
{
	 if(lastlength<=10)
	 putdac=dac*0.1;
	 else if(lastlength>10&&lastlength<90)
	{
		putdac=((lastlength-10)/80.0)*(5-dac/10.0)+dac*0.1;
	}
	 else if(lastlength>=90)
		 putdac=5.0;
}
DA_Write(putdac*51.0);//在while里直接输出dac

四.LED

20e2d8ef787c4453a6e96da5db6fdea1.png

最大的问题是在测距界面按距离点亮led指示灯

这里采用直接赋值给P0并取反,因为计算机会将十进制自动转化为二进制 而十六进制的本质也是转化成了二进制 所以可以直接赋值

值得注意的是为了防止LED闪烁太快造成现象不好 我们可以在定时器内设置一个200ms延时的标志位

if(flag1==1)//测距界面下
{
	flag1=0;
	P0=~length;
    InitHC138(4);
}
if(count6==200)//定时器内
{
	flag1=1;
	count6=0;
}

五.继电器

1ef548cbfa4b483187bb11ef8819b5de.png

 

因为继电器控制没有特定在某一界面 所以测距读取要放在while内 

为了避免继电器和蜂鸣器间的影响 我们直接使用优化后的继电器模块

void Relay(unsigned char flag)
{
	static unsigned char temp = 0x00;
	static unsigned char temp_old = 0xff;
	if(flag)
		temp |= 0x10;
	else
		temp &= ~0x10;
	if(temp != temp_old)
	{
		P0 = temp;
		P2 = P2 & 0x1f | 0xa0;
		P2 &= 0x1f;
		temp_old = temp;		
	}	
}

 

 

0b9b1629d09e425784fe72ab87f74c65.png

 

 

 

 

 

  • 41
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
### 回答1: 第十三届蓝桥杯大赛青少国赛python真题是一个关于电梯的问题。题目要求我们模拟一个电梯系统,根据乘客的请求,确定电梯的运行状态和楼层,最终输出总运行时间。 首先,我先定义了一个电梯类,其中包括电梯的当前楼层、运行状态、总运行时间等属性,并且编写了相应的初始化函数进行初始设置。 然后,我利用一个列表来表示乘客的请求列表,列表中每个元素都是一个元,包括请求的楼层和请求时间。通过遍历这个列表,我判断当前请求是否在电梯运行的楼层范围内。如果是,则不需要改变电梯的运行状态,只需要更新电梯的总运行时间。如果不是,则根据请求的楼层和电梯当前的楼层确定运行的方向,并且更新电梯的总运行时间。 最后,我输出了电梯的总运行时间。 这道题的难点在于正确判断电梯的运行状态和方向,并且根据不同情况进行相应的操作。我通过分析题目要求和思考,设计了合理的算法和逻辑,最终成功解决了问题。 通过这道题,我巩固了对Python语言的掌握,并且提高了编程和逻辑思维能力。这个比赛真题对于提高编程水平和培养创新能力来说是非常有益的,我会继续参加类似的比赛,不断提升自己。 ### 回答2: 第十三届蓝桥杯大赛青少国赛Python真题主要包括以下几个问题: 1. 判断一个数是否为素数。 在这个问题中,可以使用一个循环从2开始到该数的平方根,判断是否存在能够整除该数的因子。如果不存在,则该数为素数。 2. 模拟游戏角色的移动。 这个问题可以通过设定一个坐标系,然后记录游戏角色的位置和移动方向。根据给定的指令,改变角色的位置。可以使用单个变量来表示角色的位置,并根据不同的指令来更新角色的位置。 3. 求解整数序列的最大连续和。 在这个问题中,可以使用动态规划的思想来解决,设置一个变量max_sum表示当前的最大连续和,另一个变量tmp_sum表示当前子序列的和。遍历整个序列,如果tmp_sum加上当前元素大于0,则更新tmp_sum,并比较tmp_sum和max_sum的大小。 4. 判断一个IP地址是否合法。 IP地址由四个整数成,每个整数范围在0-255之间,且由点分隔。可以使用正则表达式来匹配IP地址的格式,并使用条件判断来判断每个整数是否在正确的范围内。 以上是对第十三届蓝桥杯大赛青少国赛Python真题的简要回答。具体的解题过程需要根据每个具体问题的要求和限制条件来进行分析和解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值