竞赛感想及学习建议
蓝桥杯大赛电子类分单片机,嵌入式,物联网和EDA组。这次电子院带队参加单片机和EDA组。单片机组在电子类里学习周期短,参加选手基数大,相对来说拿奖会容易一些。
单片机组题目包括15分的客观题和一道85分的程序设计题。客观题主要考察基本的数模电知识和51单片机的基础知识(可以在提供的资源包中的用户手册中找到)。本次比赛中,我的客观题得分不高,就不多说了,主要讲一下程序题的准备。
学习蓝桥杯的单片机,预备知识掌握基本的c语言就足够了。我学习参考的是这个开发板原厂出的《单片机设计与开发实训指导》书。也有其他同学推荐视频网站上的一些教学视频,讲的也比较通俗易懂。但对于接触过单片机的同学来说,看书学的相对快一点。
准备单片机组的比赛首先要能分别实现开发板上每个模块的功能。目前比赛题目只会用到主板上的模块,其它扩展的模块例如LCD液晶屏,LED点阵等都不会考到,如果只为准备比赛的话可以不学。
学习单片机的第一件事就是点亮一颗LED。在这块蓝桥杯单片机开发板上也不例外。学习的第一个程序应当是控制GPIO输出,点亮板子上的8颗LED。因为这个板子上的led不是直接连在GPIO上,而是通过锁存器间接连接,所以除了控制相应的GPIO口输出LED信号外,还要控制另一组GPIO控制锁存器的通断,这点需要注意。蜂鸣器和继电器控制原理和LED一致,为了保险起见,在程序开始时应该先关一遍蜂鸣器,以免蜂鸣器一直乱叫。
接着应该学习定时器和软件延时。这两个都可以直接在STC-ISP软件里生成代码。非常方便。复制到你的程序里使用即可。(定时器须在初始化函数内使能中断,并编写相应中断函数)。定时器用于精确定时,软件延时用于粗略延时。可以通过控制led延时闪烁来验证代码编写是否正确。
然后该学的是数码管显示,注意这个板子上的数码管是共阳极,对应要亮的数码段要取反。此外每个数码管要先消影再显示,也就是先段选全灭,然后位选,再段选显示正确的的字符。合理的使用”sprintf”函数,可以大大简化数码管显示的程序。我一般是设置定时器1ms,然后每1ms刷新一个数码管,这样显示出来的效果比较好。
下一步应该学习的是矩阵键盘和独立按键。两种通过跳线帽切换,都需掌握。除了掌握基本的读取按键值外,还要会判断按键长短按,控制不同功能。我是从按钮按下时开始计时,按钮松开后根据按下的时间来区别长短按。长短按不能相互影响,这在今年的省赛和国赛都考到了。
以上是最重要的四部分,所有的题目都会用到,一定要能准确无误的快速写出来。剩下的外围器件,题目会从中挑选几个使用。想拿好成绩的话也要全部掌握。此外,所有通过锁存器控制的外围设备最好都在定时器内顺序操作(数码管,led,蜂鸣器,继电器),防止误触发。
有了以上四部分的基础,其它模块验证起来就比较方便了。所有采集的数据或计算结果都可以显示到数码管上验证。
个人推荐用定时器1做计时,控制数码管刷新以及led定时闪烁等其它程序内用到的计时功能。串口使用定时器2产生波特率。定时器0计算555芯片产生方波的频率(计数器)或超声波测距定时。这样可以最大化减少定时器之间的冲突,减少麻烦。
555芯片的输出通过跳线帽连接到定时器0,频率计算的原理是通过定时器1定时1秒,计算这段时间内输入定时器0的脉冲个数(也可计算更少的时间来换算,牺牲精度换取更快的时间)。定时器0配置成计数器的方法要阅读用户手册,注意每次读取完频率要对定时器0的计数值清零。并且如果连接跳线帽到P34会影响最右一列按键不能正常工作。
超声波测量距离时要考虑距离过远导致定时器溢出。一般来说题目会要求测量距离在几十厘米的范围内。定时器可以通过STC-ISP软件生成初始化代码,产生40kHz信号。注意区分定时器是工作在12T模式还是1T模式。
串口初始化程序可以通过STC-ISP软件生成,最好通过定时器2产生波特率,这样可以和其它模块和功能不干扰。如果需要做串口接收功能的话需要在程序内打开中断,并编写相应的中断程序。部分代码可以参考STC-ISP内的范例程序。
DS18B20、DS1302、PCF8591、AT24C02这四个通过通信协议控制的模块,资源包中会给出基本的驱动代码,只需要参考datasheet,自行添加模块的控制代码即可。(几种通信协议的原理也要了解,客观题可能会考。)注意DS1302储存的是8421BCD码,读取和写入需要程序转换。PCF8591的3通道接的是电位器,1通道接的是光敏电阻,刚开始学容易被忽视。学会看数据手册,以免以后某次出题人要求使用芯片的另一种工作模式,而你因为只背了一种固定的方法而丢分。
备赛建议
熟悉每个模块后,就可以练习往届的题目了。练习不在于多,而在于精,总结出题目的相似之处,并举一反三。蓝桥杯单片机程序的结构都是一致的,只需要练习几道题目,总结出规律,总结出一套通用的程序“模板”。遇到新题目时,先写好要使用的模块的驱动程序,写好程序的大体框架,然后根据题目的具体要求编写不同页面和输出的跳转逻辑即可。当然要养成良好的代码风格,模块驱动代码和程序框架的编写要熟练,要尽快准确无误的写出来,留时间编写题目要求的逻辑功能。
比赛电脑会安装一些常见的代码编辑器,可以使用一些有代码补全功能的编辑器,提高编写效率,编写完后再在Keil中编译。我一般会先写好程序框架和按键、数码管驱动代码,然后在数码管上显示按键值,检验这部分的代码正确。然后逐个编写题目要使用的模块驱动程序,将每个模块的测量结果显示在数码管上验证代码编写无误。然后将题目要求的页面切换功能先写好后验证。最后再添加题目要求的其它功能,例如程序复位、按钮长短按、显示单位切换、数据记录和输出等。
工程文件以最后一次提交为准。所以每做完一部分,最好把工程文件提交一次,以免发生意外。省赛时,比赛进行到一半的时候我膝盖不小心碰到了电脑的电源键,重新开机后之前编写的代码全都丢失了,只能从头重写,后面的时间非常紧张,程序也没完全写完。侥幸进入决赛后,我吸取经验教训,几乎每半个小时就提交一次工程文件,防止再出现悲剧。此外,题目也要仔细理解,程序题占的比分非常大,想要拿到好成绩容不得纰漏。同期参加比赛的另一位杨同学,即使客观题答得很好,但在编程题的一个关键部分理解有误,最终与一等奖失之交臂。
以后参加比赛的同学们不必完全照搬参考书或者我所说的,主要是总结出适合自己并且有效的方法,认真学习培训资料,多与老师和同学们交流经验,勤加练习,一定能取得优异的成绩!
祝大家都能取得好成绩!