同学们大家好,本帖是该蓝桥杯赛前经验分享帖中的最后一篇了,在这里呢,马上就要结束了,说实在的,大Z还挺舍不得大家的。
在之前的学习阶段中,我们已经对历届的省赛题目逐个做了完整的讲解,虽然考点就那么多但是总结和优化的工作是必不可少的,要对这些题目完整的概括,对知识点有系统的认知才能取得好成绩,正所谓知己知彼百战百胜啊!
先总结一下历届蓝桥杯单片机省赛的题目:
第三届:温度监控器。
第四届:自动售水机
第五届:模拟智能灌溉系统
第六届:简易温度采集与控制装置
第七届:模拟风扇控制系统
第八届:基于单片机的电子钟
第九届:彩灯控制系统
我们不难发现,有些知识点是省赛的必考考点,有的知识点是间断性考,但也并不代表不考,因此我做了一个整理:
省赛必考知识点: | ||||||||||
1 | 蜂鸣器和继电器:573锁存器+138译码器+ULN2003 | |||||||||
2 | 数码管动态显示:573锁存器+138译码器+数码管 | |||||||||
3 | 发光二极管:573锁存器+138译码器 | |||||||||
省赛出现过的知识点: | 第三届 | 第四届 | 第五届 | 第六届 | 第七届 | 第八届 | 第九届 | |||
DS1302时钟模块 | √ | √ | √ | √ | ||||||
DS18B20温度传感器 | √ | √ | ||||||||
AT24C02储存器 | √ | √ | √ | |||||||
PCF8591 AD转换 | √ | √ | √ | |||||||
独立按键 | √ | √ | √ | √ | √ | √ | ||||
矩阵按键 | √ | |||||||||
PWM脉宽调制 | √ | √ | √ |
当然,除此之外,还有其他考点:
串口通信、NE555、LCD1602、超声波测距
基于这些信息,我对蓝桥杯单片机比赛(省赛)部分做了如下总结:
1、往届的比赛题目中一些知识点一直都没考,但是也不代表不考,这些知识也是大家必须掌握的。当然省赛难度相比国赛难度来说比较低,在这些考点中最难的也就属超声波测距了,所以省赛一直没有考,大概以后也不会在省赛中出现;串口通信这个知识点虽然在省赛中一直没有考过,但是它作为一个单片机的基础外设是必须要掌握的。串口通信本身不难,但是和独立按键一样,一旦功能切换多了,难度就会骤然增加。
2、独立按键是一个必考的内容,虽然其本身的使用并不难,但是很灵活,逻辑变换很多,任务可以设计的很复杂,出题有时会让一个按键有多个功能,涉及到状态机的编程思路,其功能会变得非常复杂,所以对于这个独立按键考点来说还需要多加练习。
3、对于PCF8951 AT24C02 DS1302 DS18B20 来说,听起来非常难,但是里面的内容并不多,无非就是一些驱动协议;况且比赛的时候还会给你这些底层驱动的代码,只要对协议的内容理解了,操作流程熟悉了,再自己写一遍驱动代码,基本上就没问题了,因为底层驱动是固定的,没有变化。
4、蓝桥杯单片机这个比赛的硬件平台其实也就这么多硬件,考点也是不多的,但是并不是说把每个模块学会了就完事大吉了。从历届命题来说,独立按键的功能切换基本上是重难点,对于考生能力要求还是比较高的。要求具有扎实的编码能力和系统综合分析能力,一般来说很多错误都是逻辑方面的错误,这就是基础能力不牢固的表现。再者,这个比赛是有时间限制的要在有限的时间内完成任务的话也是对参赛者对单片机编程熟练程度的一个体现。
5、对于比赛过程中的话,没有仿真调试,不能跟踪调试是对于功能复杂的任务系统来说是一个难题,所以解决办法只有平常多敲代码多积累经验了。
6、备赛的话,本人的建议是分为三步:(1)对于单片机各个模块熟练使用,需要用CT107D平台;(2)综合训练,最有效而简单的方法就是把历年的省赛的真题都做一遍;(3)限时训练,归纳与总结,不要说这个题目已经做过了就已经会了,要限时多做几遍,并且根据以前做过的代码进行优化,这样的话会发现自己的编码能力会有本质的提升。
7、当然,蓝桥杯单片机比赛可是有客观题的哦,也不能忽视,一部分同学就是因为轻视了客观题从而进不了国赛的,所以一定要学好模电、数电和单片机的基本知识,客观题也是考验功底的哦。
以上是关于蓝桥杯省赛的参赛经验总结,接下来我们对使用51单片机写代码的大体思路和程序优化方面,进行一下经验分享。
由于51单片机相对于其他嵌入式芯片来说资源和速度还是比较有限的,所以要使系统运行更加流畅,有必要对代码进行优化:
(1)遇到加减按键对变量进行加减的操作的时候,尽量用自加和自减代替 i=i-1 和i=i+1,前者比后者生成的指令短。
(2)尽量用小的数据类型,比如一个状态变量只有“真”“假”两个状态,尽量使用bit型,能使用bit 就不要用unsigned char 能使用unsigned char 就不要用unsigned int,计算好变量的作用和大小。
(3)尽量减小运算强度,一般来说位运算和逻辑运算是比较快的,而且使用它们的时候有时候会和其它运算有同样的效果
取余运算 n=n%8 可以写为 n=n&7;
除法运算 n=n/8 可以写为 n=n>>3;
乘法运算 n=n*8 可以写为 n=n<<3;
(4)用单片机内部rom空间来换取运算速度 一些固定的数组不要使用变量形式,比如:
unsigned char leddata[]={……..};
不如写成:
unsigned char code leddata[]={……};
使用code关键词是把这些数据存入rom里了,虽然占用空间,但是换取了运算速度。
(5)用指针代替数组,用指针运算代替数组索引,指针一般能使代码速度更快,占用空间更少。例如代码:
unsigned char dat1[8];
unsigned char dat2[8];
unsigned char I;
unsigned char *p=dat1;
for(i=0;i<8;i++){dat2[i]=dat1[i];} //一
for(i=0;i<8;i++){dat2[i]=*p++;} //二
例如以上代码,一和二的作用是相同的,但是效率不一样。
(6)将数码管显示写在定时器中断里面,结合intrins.h里面的_cror_或者_crol_将数码管显示写在定时器中断里面可以保证数码管显示的数亮度非常均匀,而且不会因为按键松手检测的时候显示不正常。一般中断周期为10ms即可。
对于单片机程序的优化方法其实还有很多,可以利用编译器,也可以使用嵌入汇编的方法,方法层出不穷;其实具体优化的思路还是和写的程序息息相关的,说到底,就是对单片机编程的深入理解和大量的练习总结的经验。到这里,我们的系列教程也就告一段落了,当然也不排除以后可能还会更新的可能性哦,同学们,希望大家都能取得好成绩,咱们国赛见啦!