Bootstrap

蓝桥杯单片机初赛

蓝桥杯单片机初赛代码基础框架


前言

蓝桥杯单片机的初赛给我的感觉就是在熟悉基础模块的基础上,把基础模块进行组合,同时运用中断和定时器辅助,就能完成大部分功能。所以基础模块比如:按键,数码管,上电初始化等是非常重要的,是决定能进一步完成题目的关键。在一些竞争相对较弱的省份,甚至把基础模块全都写上,再实现题目里面的一个小功能,就能拿省三!!!那接下来直接上代码!!!!

一、代码基础框架是什么?

是一套实现基础模块的代码,这套代码是一定一定一定一定会用得上的!!!甚至可以在开考前先默写上去!

二、具体代码

代码如下(示例):

#include<STC15F2K60S2.H>

#define uint unsigned int
#define uchar unsigned char

uint ms;
uchar num_key;
uchar temp;//存键值
uchar yi,er,san,si,wu,liu,qi,ba;
uchar code com[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};//数码管0——9的段选码,最后是全灭
void delay(uint ms);//延迟函数,大约是1ms延迟
void allinit();//上电初始化
void smg_display(uchar yi,uchar er,uchar san,uchar si,uchar wu,uchar liu,uchar qi,uchar ba);
uchar boredscan();
void keyscan()

void main()
{
	allinit();
	
	while(1)
	{
		yi = 1,er = 2,san = 3,si = 4,wu = 5,liu = 6,qi = 7,ba = 8;//主要用来验证数码管是否正常
		
		smg_display(yi,er,san,si, wu,liu, qi, ba);
	}
}

void allinit()
{
	P2 = 0XA0;
	P0 = 0X00;//关闭继电器,蜂鸣器
	
	P2 = 0X80;
	P0 = 0XFF;//关闭led
	
	P2 = 0XC0;
	P0 = 0XFF;//选择所有数码管
	P2 = 0XFF;
	P0 = 0XFF;//关闭所有数码管
}

void delay(uint ms)
{
	uint a;
	int b;
	for(a = ms; a >0; a--)
		for(b = 845; b> 0;b--);
}

void smg_display(uchar yi,uchar er,uchar san,uchar si,uchar wu,uchar liu,uchar qi,uchar ba)
{
	uchar i;
	for(i = 0; i<8; i++)
	{
		P2 = 0xc0;
		P0 = com[i];
		P2 = 0xff;
		switch(i)
		{
			case 0:P0 = tab[yi];break;
			case 1:P0 = tab[er];break;
			case 2:P0 = tab[san];break;
			case 3:P0 = tab[si];break;
			case 4:P0 = tab[wu];break;
			case 5:P0 = tab[liu];break;
			case 6:P0 = tab[qi];break;
			case 7:P0 = tab[ba];break;
		}
		delay(1);
	}
	if(i == 8)
		i = 0;
}

//uchar boredscan()
//{
//		P3=0X7F;
//		P4=0XEF;
//		temp = P3;
//		temp = temp&0x0f;
//		if(temp != 0x0f)
//		{
//			delay(5);
//			temp = P3;
//			temp = temp&0x0f;
//			if(temp != 0x0f)
//			{
//				temp = P3;
//				switch(temp)
//				{
//					case 0x7e: num_key = 0; break;
//					case 0x7d: num_key = 1; break;
//					case 0x7b: num_key = 2; break;
//					case 0x77: num_key = 3; break;
//				}
//				while(temp!=0x0f)
//				{
//					temp=P3;
//					temp=temp&0x0f;
//				}
//			}
//		}
//	
//		P3 = 0XbF;
//		P4=0XFB;
//		temp = P3;
//		temp = temp&0x0f;
//		if(temp != 0x0f)
//		{
//			delay(5);
//			temp = P3;
//			temp = temp&0x0f;
//			if(temp != 0x0f)
//			{
//				temp = P3;
//				switch(temp)
//				{
//					case 0xbe: num_key = 4; break;
//					case 0xbd: num_key = 5; break;
//					case 0xbb: num_key = 6; break;
//					case 0xb7: num_key = 7; break;
//				}
//				while(temp!=0x0f)
//				{
//					temp=P3;
//					temp=temp&0x0f;
//				}
//			}
//		}
//		
//		P4=0XFF;
//		P3 = 0XdF;
//		temp = P3;
//		temp = temp&0x0f;
//		if(temp != 0x0f)
//		{
//			delay(5);
//			temp = P3;
//			temp = temp&0x0f;
//			if(temp != 0x0f)
//			{
//				temp = P3;
//				switch(temp)
//				{
//					case 0xde: num_key = 8; break;
//					case 0xdd: num_key = 9; break;
//					case 0xdb: num_key = 10; break;
//					case 0xd7: num_key = 11; break;
//				}
//				while(temp!=0x0f)
//				{
//					temp=P3;
//					temp=temp&0x0f;
//				}
//			}
//		}
//		P3 = 0Xef;
//		temp = P3;
//		temp = temp&0x0f;
//		if(temp != 0x0f)
//		{
//			delay(5);
//			temp = P3;
//			temp = temp&0x0f;
//			if(temp != 0x0f)
//			{
//				temp = P3;
//				switch(temp)
//				{
//					case 0xee: num_key = 12; break;
//					case 0xed: num_key = 13; break;
//					case 0xeb: num_key = 14; break;
//					case 0xe7: num_key = 15; break;
//				}
//				while(temp!= 0x0f)
//				{
//					temp=P3;
//					temp=temp&0x0f;
//				}
//			}
//		}
//		return num_key;
//}

void keyscan()
{
	if(P30 == 0)
		{
			delay(5);
			if(P30 == 0)
			{
				a = a - 1; 1111 1110
				P0 = a;
			}
			while(!P30); //松手检测
		} 
		else if(P31 == 0)
		{
			delay(5);
			if(P31 == 0)
			{
				P0 = 0XFD;
			}
			while(!P31);
		}
}

代码是两年前编写的,如有为题欢迎批评指正!!

三、代码说明

1、使用矩阵键盘还是独立按键,根据试题具体要求进行选择,这两部分代码虽然多,但是思路都是重复的,只需要改一些细节。
2、为了基础学习,代码中使用的是软件延迟来实现数码管动态扫描,如果试题功能较复杂,建议使用定时器来替代软件延迟。
3、**一定一定一定要在独立熟练实现所有外设功能后,再记忆此代码。**否则不利于初学者学习。

总结

再分享一点我的心得吧,蓝桥杯的初赛试题并不难,只要好好准备,省二,省一真的没问题!我的学习路线是:先把基础模块全部实现一遍,熟悉基础框架,然后刷到一遍真题(用最基础的方法,以实现功能为主),最后再刷第二遍真题(这次不仅要实现功能,还要减少bug)。我的总结是,标志位非常非常非常重要,如果有写过真题的同学应该也有体会吧。
;