赞
踩
作者参加的是第十四届单片机设计与开发大学组,最终是拿到了全国一等奖的成绩,本文将从作者本人的经历来分享备赛经验,希望能够给正在备赛的同学们一些帮助。
蓝桥杯单片机组相对于蓝桥杯的其他组别是获奖难度比较低的一个组别,原因在于这个组别的参赛人数是电子类所有组别中最多的,同时这个组别一般不会有强校的学生参加(可能是看不上吧,哈哈哈)。故这个组别是很适合大一和大二的同学参加的,电子类的同学在大一刚接触51单片机后就可以开始备赛。
赛题难度并不是很大,主要考察的是对各个模块的熟悉程度,还有一些基本的逻辑组合,一般国赛的题目比省赛要难,但也有例外,就作者参加的第十四届,国赛的题目就要比省赛的简单(主要是省赛题目难度相当大)。
寒假开始学习各个模块,用一个月的时间把基础模块学完(即除了超声波和串口等)
开学差不多三月份,考虑到学校会有一些事情,这个时候可以慢慢的做两套省赛真题,速度不重要,主要是理解省赛的出题逻辑和习惯各个模块的组合使用,形成适合自己的模板,这个过程大概一到两周左右
当离正式比赛还有三周的时候就可以开始正式刷真题了,最好是把过去五年内的真题都做一遍(肝帝的话可以把前十年的真题和模拟题都做一遍,当然作者个人觉得太久远的题目参考价值并不大),按照比赛限时去做(比赛限时五个小时,但我们刷题一般不做客观题,所以作者刷题时会把时间限制在四个小时内)
赛前最后一周主要是准备客观题和做国信长天提供的模拟题,模拟题考察的模块跟省赛考察的模块并没有太大关系,但我们可以从模拟题的难度大概把握当年省赛难度
PS:刷题的时候要注意一切按照正式比赛的节奏来,从新建一个工程开始实现整个赛题,这样做的目的主要是防止正式比赛时对于模块底层的编写不熟悉而导致浪费时间。
模拟题来源:4T评测网
既然是面向比赛,建议直接从比赛的板子进行学习(STC15F2K60S2),至于教学视频的话,网上有很多,比如小蜜蜂、蚂蚁工厂等。这里需要注意的是,看教程尽量不要反复横跳,比如说不要看着蚂蚁工厂的视频又去看小蜜蜂的视频,原因在于两个老师的代码风格是不太一样的,虽然原理是一样的,但是学着学着代码风格突然一换很影响学习心态。至于效果的话,作者只能说好好学都能拿国一,两者的区别主要还是在代码风格上。
整体框架如下:
首先基础模块的学习并不复杂,这里值得注意的是,由于芯片资源有限(IO口有限),故竞赛板使用了大量的锁存器实现了引脚复用。
如图所示,LED的控制就是通过锁存器实现的,在具体代码实现时,就需要通过控制锁存器的开关来选择控制不同的外设(LED、数码管、蜂鸣器/继电器)
基础模块中还剩一个定时器,本身定时器并不简单,但由于我们面向比赛学习,故只需要学习其最常用的一种模式(16位自动重装载模式)。当然我们需要了解定时器的相关寄存器操作,这对初学者来说可能会较难理解,但值得庆幸的是,STC的烧录软件可以生成定时器的初始化代码。
但这并不是说明不需要去学习定时器模块,相反定时器模块十分重要,对于寄存器底层的学习是十分必要的。
当然我们使用定时器的主要目的产生定时器中断,这个会在后面的中断系统详细说明。
常考外设官方会在比赛当天给出底层参考代码,我们只需要在底层参考代码上添加自己的代码即可。
当然这里有一个值得注意的点在于官方资料包是会更新的,有可能大家手上的底层文件会跟教程的底层有细微区别,主要是在时序上,这个大家在实际编写代码时注意一下即可。
由于这个部分不是一篇博客就能讲完的,而且关于各个模块的基础知识网上资料也很多,这个部分就不赘述,主要给大家介绍一下芯片手册中比较重要的部分。
DS1302:
这个表格主要是对DS1302进行读写操作时需要操作的寄存器地址以及数据所在的bit位
DS18B20:
这个主要是操作DS18020需要的三个步骤
PCF8591:
IIC器件地址
控制字节所对应的模式和功能
AT24C02:
IIC器件地址
对于AT24C02,这是一个EEPROM,在进行数据写入的时候要考虑按字节写入还是按页写入,这个就需要根据实际任务决定。
一般情况下,省赛是不会出现串口和超声波,但考虑到题目难度逐年上升的情况下,建议大家还是一并学习,当然这部分外设内容的讲解会放在国赛准备部分。
原则上中断系统并不需要单独拿出来讲,但考虑涉及的中断较多,这里简单做一个总结。
上图为STC15系列芯片手册中的中断结构图,一共包括了外部中断(INT)、定时器中断(Timer)、串口中断等。使用这些中断时,需要在各个初始化中先将对应的中断打开(例如启动定时器0中断,则ET0 = 1),最后在主函数中开启总中断(EA = 1)。
14届省赛的题目相对于前几届难度较大,原因在于题目意思比较难理解,作者身边的同学很多参加省赛的时候都是因为题目意思理解错误最后错失省一的,包括作者本身也对题目理解有问题导致有功能未实现,故切记要确保理解题目后再编写代码,省赛的时间一般都是够的。
省赛还有一个问题创建变量太多使得data > 128字节导致编译无法通过,一般情况下这种情况是不会出现的,但这个问题可以使用内部高字节存储(idata)或外部扩展存储器(xdata)解决,但存储在这些位置的变量读写速度就会相对较慢(这个跟寻址方式有关,有兴趣的同学可以深入了解),实际使用时要注意考虑实时性。
PS:一般情况变量是不容易超限的,如果省赛发现自己的变量超限大概率是自己对题目理解出现了问题,比如有些不需要保存下来的数据用数组保存了下来。
频率采集的原理其实很简单,首先要有一个计数器去统计脉冲次数,然后需要一个定时器中断,两者结合统计1s内的脉冲次数即可得到频率。
定时器0初始化为计数器模式:
void Timer0Init(void)
{
TMOD &= 0XF0;
TMOD |= 0x05;
TL0 = 0;
TH0 = 0;
TR0 = 1;
}
这里的寄存器配置需要大家自行查阅用户手册,并不难理解
1ms中断中统计脉冲次数:
if(++freq_time == 1000)
{
freq_time = 0;
freq = (TH0 << 8) | TL0;
TH0 = 0;
TL0 = 0;
}
串口通信的部分涉及具体原理这里就不赘述,我们来看一下实现
串口初始化:
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xC7; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
ES = 1; //开启串口中断
}
串口初始化一样可以通过STC的烧录软件生成,如下图,但我们需要手动添加开启串口中断这一步。
串口收发数据:
//串口发送数据 void Uart_Sengstring(unsigned char *pucBuf) { while(*pucBuf != '\0') { SBUF = *pucBuf; while(TI == 0); TI = 0; pucBuf++; } } //串口中断结束数据 void Uart1() interrupt 4 { if(RI) { Uart_ReString[Uart_num++] = SBUF; RI = 0; } }
上述只是进行了串口的数据收发,需要根据实际情况设计串口数据处理。
超声波测距原理也很简单,这里不赘述,一般情况下我们都是通过将定时器配置成计数器的方式进行测距的,但可能出现一种情况导致单片机的定时器不够用,因为STC15F2K60S2只有三个定时器,如果同时考555频率采集,串口通信,超声波测距,加上一定需要的定时器中断,就需要四个定时器,这种极端情况,我们就可以使用STC系列芯片上自带的PCA计数器。
具体实现:
void PCA_init(void) { CMOD &= 0XF1; CCON = 0X00; } void Wave_send(void) { unsigned char Wave_Num = 2; while(Wave_Num--) { TX = 0; Delay12us(); TX = 1; Delay12us(); } } unsigned char Wave_Recv(void) { unsigned char ucDist; Wave_send(); CH = 0; CL = 0; CR = 1; while(RX && !CF); CR = 0; if(CF) { CF = 0; ucDist = 255; } else ucDist = ((CH << 8) | CL)*0.017; return ucDist; }
写法其实跟将定时器配置为计数器基本一致,PCA计数器的使用网上已有资料,有兴趣的同学可以去深入学习,这里作者只是给读者提供一种极端情况时的写法而已。
国赛的准备其实也没有什么特别的,主要还是要刷往年真题,14届的国赛个人认为比较简单,作者在赛场上用了三个小时左右就完成了程序题。
虽然本文并未提及客观题部分,但国赛分水岭其实就在客观题,作者个人感觉14届国赛主要就是靠客观题区分国一和国二,因为能进入国赛的选手对程序题的实现基本大差不差。
蓝桥杯这个比赛的意义更多是以赛促学,因为对于电子类的同学来说,这个比赛的上手难度并没有电赛或智能车那么高,很适合大一的同学进行入门,只要大家用心去学,获奖其实并不难,很多人其实都是倒在了入门这一关上,因为当你面对那些陌生的原理图和复杂的寄存器的时候,很容易产生放弃的心理,但坚持下来,你就已经战胜了很多人。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。