蓝桥杯单片机组学习路线指南

文章目录

  • 前言
  • 一、参赛建议
  • 二、备赛过程
  • 1.资料
  • 2. 学习路线
  • 三、比赛过程
  • 总结
  • 附-模板
  • main.c

  • 前言

    前段时间整理硬盘发现了当时大二参加蓝桥杯时的一些记录,现在回想当时踩过的坑和备赛经历,现结合其写下这篇经验贴,供大家学习、高效备赛


    一、参赛建议

    蓝桥杯可参加的赛别很多,在所有赛别中单片机组可以说是最好拿奖的,虽然说含金量不高,但是很建议大家参加。个人建议大家在大一的时候就进入实验室参加蓝桥杯,单片机组的门槛其实很低,只需要有C的基础和对数模电的基本认知,而这些知识对后期的学习、其他的比赛都是很有帮助的,起到打基础的作用。其次很多小白看代码两三百行就有惧怕心理,其实大可不必,大家学习后就会发现,整个程序由很多个小模块组成,而这些小模块完全用不到高深的算法,都是if while for等一些最简单的语句的嵌套,就算C语言学的不好也能写,所以说完全不用怕,直接莽。我当时的练习代码也放在了专栏中供大家参考。

    简单来说,建议小白从大一寒假开始准备,这时候刚好学完C语言,可以开始编程,

    二、备赛过程

    1.资料

    关于资料,建议直接从比赛的这块板子(stc15f2k60s2)开始学,没必要先买别的板子学,我当时就是先买的普中的板子一个一个模块学,后面发现这样只是浪费时间。而蓝桥杯板子的教学视频,在B站、淘宝有很多,大科、蚂蚁工厂、小蜜蜂等等都是可以的。

    2. 学习路线

    省赛备赛过程:

    STEP1:按模块学,不仅要掌握代码,也要知道其原理,会用手册
    STEP2:敲历年省赛题代码,这时候会遇到各种问题,尤其注意各模块之间的冲突问题(如按键按下去影响数码管显示等问题)一开始可以不严格按比赛时间来敲,这个阶段主要是发现问题解决问题,熟悉代码的使用。注意在写代码的同时也要用txt记录自己的问题。
    STEP3:在不断优化后,形成一套自己的模板,这个时候建议看一些进阶的资料,如杰克等,对模板再进行优化,这个时候可以关注一下多个定时器多个中断之间的冲突、数码管显示不稳定、每个LED灯亮度不一样等疑难杂症。
    STEP4:用优化完的模板二刷省赛题,这时候的重点是对代码的熟练度,尽量按比赛时间完成,并背住自己的模板代码。这时也要带着看数模电C语言的基础知识,尽量背住一些通识性的知识,可以参考往年的卷子看看考到什么程度。
    STEP5:比赛前不断熟练自己的代码模板,到比赛当天以最快的速度打出模板,然后按赛题直接填空即可。到后面就会发现大家模块都能实现个大概,大家的差距就体现在了客观题上,所以在这段时间要加强对客观题的学习。

    关于所有模块要不要都学的问题:建议是把省赛和国赛中出现的模块都学一遍,以防万一

    国赛备赛过程:

    有了省赛学习的基础,国赛无非就是在省赛的基础上多加一些模块,直接刷往届国赛题即可。要注意模块和功能要求的增多,就会使中断里的东西会变得很多,如何保证不起冲突仍然是最为重要的,我当时在国赛中就因为没处理好DS1302的中断,加上主程序里对数据的运算程序,导致超声波测距乱码,自己的调试能力还是有待提升吧。

    三、比赛过程

    电子类比赛时间为5个小时,带好准考证、万用表。答题顺序看个人,写程序的时候先把自己准备的各模块模板写好,然后再按照赛题要求扩展。还有就是早上一定要吃饱,食物是可以自带的,但是基本也是啃两口面包就继续写代码了,省赛时间还行,国赛因为要实现的要求多就得抓紧时间。


    总结

    总的来说,蓝桥杯很适合作为一个入门类比赛,它可以帮你打好基础,锻炼自学能力,对后面的专业课的学习也起到预习的作用,祝大家玩的愉快!

    附-模板

    在蓝桥的杯所有组别中,单片机组相对较水,尤其是省赛,实现了数码管显示、按键等基本功能就有二等奖,其实最后大家的功能都实现的差不多,主要差距在客观题,所以说基础功能的实现是入门蓝桥杯的第一步,如何处理使按键、数码管扫描和中断不冲突稳定运行尤其重要。下面将分享我当初备赛时的基本功能模板,具体功能的实现在其基础上填写即可。

    main.c

    #include<stc15f2k60s2.h>
    unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
    unsigned char smgbuffer[8];
    unsigned char smgcom,keytt;
    
    
    void display();
    void keyscan();
    
    void Timer1Init(void)		//1毫秒@12.000MHz
    {
    	AUXR |= 0x40;		//定时器时钟1T模式
    	TMOD &= 0x0F;		//设置定时器模式
    	TL1 = 0x20;		//设置定时初值
    	TH1 = 0xD1;		//设置定时初值
    	TF1 = 0;		//清除TF1标志
    	TR1 = 1;		//定时器1开始计时
    	ET1=1;
    	EA=1;
    }
    
    void Timer1() interrupt 3    
    {
    	unsigned char P0_kepper=0,P2_kepper=0;
    	P0_kepper=P0; P2_kepper=P2; P2=P2&0x1f;
    	
    	display();
    	keytt++; if(keytt==10) {keytt=0; keyscan();}
    
    	P0=P0_kepper; P2=P2_kepper;
    }
    
    void display()
    {
    	P0=0xff; P2=P2&0x1f|0xc0; P2=P2&0x1f;
    	P0=0xff; P2=P2&0x1f|0xe0; P2=P2&0x1f;
    	P0=1<<smgcom; P2=P2&0x1f|0xc0; P2=P2&0x1f;
    	P0=smgduan[smgbuffer[smgcom++]]; P2=P2&0x1f|0xe0; P2=P2&0x1f;
    	if(smgcom==8) smgcom=0;
    }
    
    void keyscan()    //独立键盘:普通按键用trg  长按键用dat(松手变为0) cnt有时会失效
    {
    	unsigned char dat,trg,cnt;
    	dat=P3^0xff;
    	trg=dat&(dat^cnt);
    	cnt=dat;
    	
    	if(trg&0x01){P0=0; P2=P2&0x1f|0x80; P2=P2&0x1f;}
    	else if(trg&0x02){P0=0x55; P2=P2&0x1f|0x80; P2=P2&0x1f;}
    	else if(trg&0x04){P0=0xaa; P2=P2&0x1f|0x80; P2=P2&0x1f;}
    	else if(trg&0x08){P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f;}
    }
    
    
    void main()
    {
    	P0=0x00; P2=P2&0x1f|0xa0; P2=P2&0x1f;
    	P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f;
      Timer1Init();
    	while(1)
    	{
    
    
    	}
    }
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 蓝桥杯单片机组学习路线指南

    发表评论