概述
首先说一下自己做这道题的体会:站在往届赛题的角度来看,这次的赛题难度还是有的。但是这套题其实并没有什么新奇的点,所以只要刷过往年的省赛甚至国赛题,这道题吃下完全没有问题。
首先,附上该题的真题和完整代码,完全开源免费,请自行食用!
https://download.csdn.net/download/qq_44629819/18830350
现在,我把这届赛题需要注意的几个点说一下:
1、ADC双通道读取
adc_val=(unsigned int)(adc_val/255.0*5.0*100.0);
light_val=read_adc(0x01);
light_val=(unsigned int)(light_val/255.0*5.0*100.0);
大家发现没有?我的电压读取和光敏读取在最后传值的时候要相互对调,这样才能让最后的结果正确!其次,adc读取到的0-255要转化为0.00-5.00的数据,我让数据先全部转化为浮点数进行运算,最后在强制转换为u16类型的数据输出。
2、未用数码管熄灭
freq_menu[0]=0x71;
if(paulse_count>=1000000)
freq_menu[1]=smg_du[paulse_count/1000000%10];else
freq_menu[1]=smg_du[16];
if(paulse_count>=100000)
freq_menu[2]=smg_du[paulse_count/100000%10]; else
freq_menu[2]=smg_du[16];
if(paulse_count>=10000)
freq_menu[3]=smg_du[paulse_count/10000%10];
else
freq_menu[3]=smg_du[16];
if(paulse_count>=1000)
freq_menu[4]=smg_du[paulse_count/1000%10];
else
freq_menu[4]=smg_du[16];
if(paulse_count>=100)
freq_menu[5]=smg_du[paulse_count/100%10];
else
freq_menu[5]=smg_du[16];
if(paulse_count>=10)
freq_menu[6]=smg_du[paulse_count/10%10];
else
freq_menu[6]=smg_du[16];
freq_menu[7]=smg_du[paulse_count%10];
以频率计的操作为例子:若频率>=1000000Hz,则最高位显示对应数字,否则相应的最高位熄灭;其他位上的操作同上。特别注意的是:paulse_count需要定义成unsigned long数据类型。
3、松开长按键触发
if(key_state==KEY_STATE2)
{
if(long_press_bit_S7==1)
{
S7_count++;
if(S7_count>=1000) S7_count=1000;
}
}
else if(long_press_bit_S7)
{
long_press_bit_S7=0;
if(S7_count>=1000) {if(led_enable) led_enable=0; else led_enable=1;}
else save_freq=temp_paulse_count;
S7_count=0;
}
需要特别注意的是,上面代码放在1ms定时器中断服务函数里面。
首先,当按键S7按下的时候,标志位long_press_bit_S7置为1,表示可以开始检测长按键;在中断服务函数里一直检测key_state,当它为KEY_STATE2时,证明按键被按下并且未送松开;当检测到long_press_bit_S7为1时,S7_count一直自增但最后限幅在1000;直到松开按键S7,因long_press_bit_S7为1,所以紧接着判断S7_count的数值,若>=1000,则执行长按键操作,否则执行短按操作。
如此以下松开触发的长按键就编写完成了!
OK,就此结束
最后
以上就是洁净黑米为你收集整理的蓝桥杯电子类单片机组省赛——第十二届第二场的全部内容,希望文章能够帮你解决蓝桥杯电子类单片机组省赛——第十二届第二场所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复