这套题目做起来相对还是比较轻松的,只是突然考了一个频率计可能让大家措手不及。
首先,附上该题的真题和完整代码,完全开源免费,请自行食用!
https://download.csdn.net/download/qq_44629819/18931429?spm=1001.2014.3001.5501
现在,我把这届赛题需要注意的几个点说一下:
1、数码管和led的关断
u8 smg_resigter=0xff;//数码管使能寄存器
我首先定义了一个数码管使能寄存器,首先这个寄存器的默认值为0xff,即上电使能数码管。
case 7:
if(smg_resigter==0xff) {smg_resigter=0x00;}
else {smg_resigter=0xff;}
break;
按照要求,按下按键S7即可使能和失能数码管。当变量smg_resigter的值为0x00时即定义为失能数码管。
switch(display_mode)
{
case 1:P0=~(adc_array[i]&smg_resigter);P2=0XE0;P2=0X00;break;
case 2:P0=~(freq_array[i]&smg_resigter);P2=0XE0;P2=0X00;break;
}
我使用位运算达到控制数码管显示的目的。当变量smg_resigter的值为0xff时,数码管显示的值为前面的变量,当变量smg_resigter的值为0x00时数码管将全部熄灭。led灯的使能和失能操作与数码管相同。
本来我打算用状态机来实现这部分的功能,想来还是这种操作要更为直观和简便,所以放弃了状态机这种方式来做这个细节。
2、外设模块采样率
值得注意的是,在这道题里我让频率计、电压读取的周期都确保在250ms;这样一来我既保证了采样率满足题目要求,又防止电压读取以及输出函数里总中断EA的操作影响频率计的正确读数。
OK,就此结束