第十二届蓝桥杯嵌入式总结及分享

蓝桥杯嵌入式总结以及分享

这是我第一次写CSDN的文章,如果有什么写的不好的,还请各位见谅,不喜勿喷,谢谢。
经过这两个星期时间准备省赛,两个星期准备国赛,最终取得了国二的成绩,个人认为这个比赛就是耗时长,我对源码不够熟悉,所以导致时间基本都耗在了源码的调试上,蓝桥杯嵌入式比赛是提供源码的,但是不一定全,需要自己更改为自己需要的源码,也就是他提供的代码,不一定是你的开发板上的。好,那我们废话不多说了,步入正题。

蓝桥杯资源包

链接: 蓝桥杯资源包.
提取码:1112第十二届蓝桥杯嵌入式总结及分享_第1张图片
第十二届蓝桥杯嵌入式总结及分享_第2张图片省赛资源包就是没有以上框选的的代码提供。

客观题部分

客观题部分会有几道关于stm32的题目,可以查看该文档来查找
第十二届蓝桥杯嵌入式总结及分享_第3张图片
其他客观题问模电数电,这个可以找学校老师拿“客观题讲义”,也就是往届客观题的汇总。或者就是去CSDN找,都可以找到的。我大多数都是蒙的。哈哈哈~~~~~

代码部分

代码部分我是看的一位大佬发的文章,上连接链接: 蓝桥杯嵌入式备赛手册.
这位大佬写得很详细,如何移植蓝桥杯官方的代码。非常感谢这位大佬的分享

LED控制代码

第十二届蓝桥杯嵌入式总结及分享_第4张图片由于LED灯和LCD共用了io口,LED又是通过74HC573芯片控制的,大概就是锁存器的意思,所以他的控制代码必须这样写,他才不会出现LED混乱的情况。

void led_ctr(u8 led)
{
	GPIO_Write(GPIOC,~led<<8);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}

其他的代码,按照那位大佬的写法基本上是没有问题的。
接下来我分享一下我调试代码遇到的问题

按键 PA0、8 、 PB1、2
串口 TX PA2、RX PA3
电位器 PB0
蜂鸣器 PB4
TIM2 PA1-CH2、PA2-3
TIM3 PA6-CH1、PA7-CH2

串口代码

void usart_SendString(u8 *str)
{
	u8 i=0;
	do{
		USART_SendData( USART2, str[i]);
		while(!USART_GetFlagStatus( USART2,  USART_FLAG_TXE));			
		i++;
	}while(str[i]!=0);
}
//记住这里的u8 i=0;要不然数据会发不出去
//定义数组str存储发送的数据,通过do-while一个个的传输
//USART_FLAG_TXE:发送数据寄存器空标志位

/****接收函数也是那位大佬分享的,如下****/
u8 recevie;	//接收标志位
u8 usart_str[20];	//数据缓存区
u8 buf;		//数据位
u8 temp;		//数据接收
void USART2_IRQHandler(void)
{
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
   USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位
    /* Read one byte from the receive data register */
    temp = USART_ReceiveData(USART2);
		
    if(temp == 'A')
    {
	recevie=1;	//接收完成,失能
	buf=0;
      /* Disable the USARTy Receive interrupt */
      USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
    }
          else
	usart_str[buf++]=temp;
  }
}
/************数据接收*********/
	if(recevie==1)
	{
	recevie=0;
	LCD_ClearLine(Line2);
	sprintf((char*)str,"usart:%s",usart_str);
	LCD_DisplayStringLine(Line2,str);
	memset(usart_str,0,sizeof usart_str);	//在string.h头文件中,
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//使能接收
	}

上面的代码需要记住memset(usart_str,0,sizeof usart_str);也就是将数组清零,若不清零
在LCD上显示不同数组长度,你就会发现一些奇怪的事情。慢慢试一试吧o( ̄︶ ̄)o。

按键代码

按键长按短按基本上可以说是必考

void key_m(void)
{
	key=key_scan();
	if(key!=key_long)	//判断是长按还是短按
	{
		key_long=key;
		key_time=Time;
	}
	else
		key=0;
	if(key==1)		//短按执行代码
		led>>=1;
	if(key_long==1)			//长按执行代码
	{
		if(Time-key_time>800)
		{
			key_time=Time;
			led<<=1;
		}
	}
}

工程代码

链接:工程代码
提取码:1112
这里面的工程文件有按键和led灯等等的代码,我看过一些,发现里面的代码就像是往届赛题的代码。所以一定要仔细看一看,要学会做界面,长按短按这些,这些都是必考的。
第十二届蓝桥杯嵌入式总结及分享_第5张图片这里面代码很多,多看看总有好处的

温度传感器

国赛代码是没有DS18B20的读函数的

s16 ds18b20_read(void)
{
	s16 x;
	u8 i;
	u8 val[2];
	
	ow_reset();
	ow_byte_wr(OW_SKIP_ROM);
	ow_byte_wr(DS18B20_CONVERT);
	
	delay_us(7500);
	ow_reset();
	ow_byte_wr(OW_SKIP_ROM);
	ow_byte_wr(DS18B20_READ);
	
	for(i=0;i<2;i++)
	{
		val[i]=ow_byte_rd();
	}
	x=val[1];
	x=x<<8;
	x+=val[0];
	return x;
}

三轴传感器

三轴传感器的代码也是没有的,这个代码可以,但是我一直感觉他测出来的数据不对,这个在往届赛题中似乎都没有考过。所以你懂的吧。。。

void lis320_init(void)
{
	lis320_write(0x20,0x47);	//地址0x20,0x47上电使能xyz轴
}
0x38写0x39读
读取值
u8 lis320_data[3];
u8* lis320_read_data(void)
{
	if(lis320_read(0x27)&0x08)
	{
		lis320_data[0]=lis320_read(0x29);	//x地址
		lis320_data[1]=lis320_read(0x2B); 	//y地址
		lis320_data[2]=lis320_read(0x2D); 	//z地址
	}
	return lis320_data;
}

新板和旧板的区别

蓝桥杯嵌入式是出了一块新版的,所以他考的时候要注意两块板子的区别
第十二届蓝桥杯嵌入式总结及分享_第6张图片

在此预祝参加蓝桥的各位同学们,都能取得优秀成绩。加油

你可能感兴趣的:(蓝桥杯,嵌入式)