当前位置:   article > 正文

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

蓝桥杯单片机组十四届国赛

目录

前言 

一.负数

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

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

二.按键

1.S8按键

2.S9按键

3.双按键

三. DAC

四.LED

五.继电器


 

前言 

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

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

一.负数

60db91e42c514de4a6e5d0f24ce33b1b.png

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

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

  1. if(fu==0)//校准值大于等于0的情况
  2. {
  3. if(check>0)
  4. {
  5. if(Key_Up==8)
  6. {
  7. check+=5;
  8. if(check==95)check=90;
  9. }
  10. else if(Key_Up==9)
  11. {
  12. check-=5;
  13. }
  14. }
  15. else if(check==0)//当校准值等于0
  16. {
  17. if(Key_Up==8)//正常加
  18. {
  19. check+=5;
  20. if(check==95)check=90;
  21. }
  22. else if(Key_Up==9)//减的时候校准值变成5,并改变标志位
  23. {
  24. check=5;
  25. fu=1;//对应为数码管带负号的情况
  26. }
  27. }
  28. }
  29. else if(fu==1)//此时为负数的情况,加减对调
  30. {
  31. if(check>0)
  32. {
  33. if(Key_Up==8)
  34. {
  35. check-=5;//注:校准值等于0时让fu默认为0,就会跳出语句
  36. }
  37. else if(Key_Up==9)
  38. check+=5;
  39. if(check==95)check=90;
  40. }
  41. }

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

二.按键

1.S8按键

仔细看题 ceb2d322d3e5428ea59d12d6f52f21a5.png

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

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

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

  1. if(writedown==1)//按键按下标志
  2. {
  3. if(count4%1000==0)//1s记录一次
  4. {
  5. Grouplength[i]=writelength;
  6. i++;
  7. if(i==7)i=0;
  8. }
  9. if(count4==6000)//6s后退出记录
  10. {
  11. count4=0;
  12. writedown=0;
  13. }
  14. count4++;//放最后是为了count4=0时可以记录到数据
  15. }

2.S9按键

1876aaf9a9fc41a188c0b47f8bda0156.png

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

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

  1. if(readac==1)//输出数据
  2. {
  3. if(count8%1000==0)
  4. {
  5. lastlength=Grouplength[j];
  6. j++;
  7. if(j==7)j=0;
  8. }
  9. if(count8==6000)
  10. {
  11. readac=0;
  12. count8=0;
  13. }
  14. count8++;
  15. }

3.双按键

5d417cb78933458ba7e866835726c61f.png

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

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

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

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

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

155a54dbef4941408c7de14279dff348.png

 

三. DAC

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

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

四.LED

20e2d8ef787c4453a6e96da5db6fdea1.png

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

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

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

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

五.继电器

1ef548cbfa4b483187bb11ef8819b5de.png

 

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

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

  1. void Relay(unsigned char flag)
  2. {
  3. static unsigned char temp = 0x00;
  4. static unsigned char temp_old = 0xff;
  5. if(flag)
  6. temp |= 0x10;
  7. else
  8. temp &= ~0x10;
  9. if(temp != temp_old)
  10. {
  11. P0 = temp;
  12. P2 = P2 & 0x1f | 0xa0;
  13. P2 &= 0x1f;
  14. temp_old = temp;
  15. }
  16. }

 

 

0b9b1629d09e425784fe72ab87f74c65.png

 

 

 

 

 

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

闽ICP备14008679号