蓝桥杯单片机十六届国赛真题
6月15日刚结束蓝桥杯单片机国赛之旅,自我感觉难度不低
话不多说先上题:








下面说一点我对这次国赛的感受:
这届题目定时器0 1 2全上场,模块也是全就位,量大嘛,我就敲的快点,还好解决。啪!串口不出意外打出有力一击。其他部分大家感兴趣可以讨论一下,下面主要谈一下对串口配置部分的疑惑点和看法:
1、配置参数:8个参数的设置全由串口来发送(关键还有H1两位参数名和s一位参数名的区分,导致串口解析也很费劲),当时我的第一想法便是把可能都用if写上(之前的题目教会我,写不出来就暴力),在草稿纸上一列(8个数据,排列组合一下2的8次方吗)才发现暴力是多么可笑,无奈,最后写了8个if判断单独判断一下定长串口。下来思考了一下,因为发送的格式是(参数,数据)(参数,数据),那么我是否能判断括号数量来判断具体传了几个参数,然后判断参数是什么,再将‘,’的位置找到,后面一位不就是参数的数据吗?(但是好像还是有点麻烦的,还没成功实践)-----未解
2、‘查询参数’部分:这部分还好解决,因为他属于固定位数的串口解析,通过发送(参数,?)来返回相应(参数,数值),这个部分依旧分两种情况,H1和H2属于两位长度的参数,其他都是一位长度的参数,那么我就用if来判断位数,列出两种可能,如下:
unsigned char Uart_Recv[];//接收函数
unsigned char Uart_Recv_Index;//索引值
if(Uart_Recv_Index == 6)//H1 和 H2 两种情况
{
if(Uart_Recv[0] == '(' && Uart_Recv[1] == 'H' && Uart_Recv[2] == '1' || '2' && Uart_Recv[3] == ',' && Uart_Recv[4] == '?' && Uart_Recv[5] == ')')
{
if(Uart_Recv[2] == '1')
{
printf("H1:%.1f",H1_Para);
}
else
{
printf("H2:%.1f",H2_Para);
}
}
}
if(Uart_Recv_Index == 5)//其他情况,同上
3、修改时间:(没有费脑子,依旧暴力列出if)
//配置时间
unsigned char ucRtc[3];//初始时钟
//串口函数中
if(Uart_Recv_Index == 10)
{
if(Uart_Recv[0] == '(' && Uart_Recv[1] == 'T' && Uart_Recv[2] == ':' && (Uart_Recv[3] <= '2' && Uart_Recv[4] <= '3') || (Uart_Recv[3] <= '1' && Uart_Recv[4] <= '9') && (Uart_Recv[5] <= '5' && Uart_Recv[6] <= '9') && (Uart_Recv[7] <= '5' && Uart_Recv[8] <= '9') && Uart_Recv[9] == ')')
{
ucRtc[0] = (Uart_Recv[3] - '0')*16 + (Uart_Recv[4] - '0');
ucRtc[1] = (Uart_Recv[5] - '0')*16 + (Uart_Recv[6] - '0');
ucRtc[2] = (Uart_Recv[7] - '0')*16 + (Uart_Recv[7] - '0');//此处采用ds1302时钟芯片16进制,如果10进制,直接相加即可
set_Rtc(ucRtc);//设置时钟函数
}
else
{
printf("ERROR");//返回报错信息
}
}
4、‘异常上报’部分,在本人看来也挺麻烦,(除了数据之间的比较,还考了一个常见的考点便是条件生效后只发送一次,这里可以用一个switch来解决,这样能确保只执行一次操作)
//简单列一下思路
bit flag;
switch(flag)
{
case 0:
if( A < B)//前一刻条件不成立
{
flag = 1;
}
break;
case 1:
if( A > B)//下一刻条件成立
{
flag = 0;
执行操作
}
break;
}
当时在考场最后来写串口,时间不够了就没写完,总之这套题目考点很多用到的知识点也很多,就是有些难,各位大佬有好的想法可以分享一下。
更多推荐



所有评论(0)