这是我第一次写CSDN的文章,如果有什么写的不好的,还请各位见谅,不喜勿喷,谢谢。
经过这两个星期时间准备省赛,两个星期准备国赛,最终取得了国二的成绩,个人认为这个比赛就是耗时长,我对源码不够熟悉,所以导致时间基本都耗在了源码的调试上,蓝桥杯嵌入式比赛是提供源码的,但是不一定全,需要自己更改为自己需要的源码,也就是他提供的代码,不一定是你的开发板上的。好,那我们废话不多说了,步入正题。
链接: 蓝桥杯资源包.
提取码:1112
省赛资源包就是没有以上框选的的代码提供。
客观题部分会有几道关于stm32的题目,可以查看该文档来查找
其他客观题问模电数电,这个可以找学校老师拿“客观题讲义”,也就是往届客观题的汇总。或者就是去CSDN找,都可以找到的。我大多数都是蒙的。哈哈哈~~~~~
代码部分我是看的一位大佬发的文章,上连接链接: 蓝桥杯嵌入式备赛手册.
这位大佬写得很详细,如何移植蓝桥杯官方的代码。非常感谢这位大佬的分享
由于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灯等等的代码,我看过一些,发现里面的代码就像是往届赛题的代码。所以一定要仔细看一看,要学会做界面,长按短按这些,这些都是必考的。
这里面代码很多,多看看总有好处的
国赛代码是没有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;
}
蓝桥杯嵌入式是出了一块新版的,所以他考的时候要注意两块板子的区别
在此预祝参加蓝桥的各位同学们,都能取得优秀成绩。加油