今天给大家分享的是某年的蓝桥杯省题。我用的板子是原子哥的精英板(stm32f103zet6),屏幕oled。
现在给大家介绍一下功能:
基本功能:扫描三个按键,根据按键执行数据显示、存储和指示灯相关功能。
性能要求:电压存储数量大于100个,按键响应时间小于2s。
显示界面:
1.数据显示界面:数据显示界面包含三个显示要素:界面名称(Data)、电压值(ADC)、数据保存次数(Total)。
2.统计界面:数据统计包含四个显示要素:界面名称(Hist)、max、min、avg。
按键功能:按键1定义为“切换”按钮,每次按下在数据显示和统计界面切换。按键2为记录按钮,每次按下都会采集当前的电压值并保存,按键2仅在数据界面有效。按键3为清除按键,可以清除电压数据、次数、max等等,按键3仅在数据界面有效。
led指示灯功能:处于数据显示界面时,led1点亮,否则灭。当记录的max、min之间相差大于1v时,led2以一秒为间隔切换亮灭状态报警。
初始化界面:处于数据显示界面。次数、max、min、avg均为0。
代码展示:
// v:当前电压值
// max、min、avg:最大电压、最小电压、平均电压
// vcc[1000]:存储电压值
// count:记录按下次数
float v,Max=0,Min=0,Avg,vcc[1000];
int count;
int main()
{
int KEY1Flag=0;//按键一切换的flag
void ShowVcc(void);
void ShowMainItface(void);
void showHist(void);//声明
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
Init_LED();
Init_BEEP();
Init_ADC();
Init_KEY();
delay_init();
OLED_Init();
Init_TIM();//初始化外甥
OLED_Clear(0);//清除屏幕
LED0_O;//led0初始化为亮
while(1)
{
if(KEY1Flag==0)//如果为data界面 则一直检测电压值
{
delay_ms(150);
ShowMainItface();
}
if(WK_UP&&KEY1Flag)//WK_UP触发切换事件
{
LED0_O;
OLED_Clear(0);
delay_ms(150);
KEY1Flag=0;
ShowMainItface();
}
else if(WK_UP&&!KEY1Flag)//hist见面(统计界面)
{
LED0_C;
OLED_Clear(0);
delay_ms(200);
KEY1Flag=1;
showHist();
}
if(KEY1&&!KEY1Flag)//KYE1触发记录事件 按下后保存当前电压值
{
delay_ms(100);
vcc[count]=v;
Avg=Avg+vcc[count];
if(Max<vcc[count])
{
Max=vcc[count];
}
if(Min==0)
{
Min=vcc[count];
}
else if(Min>vcc[count])
{
Min=vcc[count];
}
if(Max-Min>=1)//最大、最小相差1v 开启tim2中断接收 报警灯闪烁
{
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
}
else
{
TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);
}
count++;
}
if(KEY2&&KEY1Flag)//KYE2触发清零事件
{
count=0;
vcc[0]='\0';
Max=0;
Min=0;
Avg=0;
TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);
showHist();
}
}
}
//数据显示函数
void ShowVcc(void)//获取电压值最大3.3v
{
v=ad0*3.3/4096;//电压转换公式
OLED_ShowNum(40,2,(int)v,2,16);
OLED_ShowChar(60,2,'.',16);
OLED_ShowNum(70,2,(int)((v-(int)v)*100),2,16);
OLED_ShowChar(90,2,'V',16);
}
void ShowMainItface(void)//显示Data界面
{
OLED_ShowString(50,0,(void *)"Data",16);
OLED_ShowString(10,2,(void *)"ADC:",16);
ShowVcc();
OLED_ShowString(10,5,(void *)"Total:",16);
OLED_ShowNum(55,5,count,2,16);
}
//数据统计函数
void showHist(void)
{
OLED_ShowString(50,0,(void *)"Hist",16);
OLED_ShowString(10,2,(void *)"MAX:",16);
OLED_ShowNum(40,2,(int)Max,2,16);
OLED_ShowChar(60,2,'.',16);
OLED_ShowNum(70,2,(int)((Max-(int)Max)*100),2,16);
OLED_ShowString(10,4,(void *)"MIN:",16);
OLED_ShowNum(40,4,(int)Min,2,16);
OLED_ShowChar(60,4,'.',16);
OLED_ShowNum(70,4,(int)((Min-(int)Min)*100),2,16);
float avg=Avg;
avg=avg/count;
OLED_ShowString(10,6,(void *)"AVG:",16);
OLED_ShowNum(40,6,(int)avg,2,16);
OLED_ShowChar(60,6,'.',16);
OLED_ShowNum(70,6,(int)((avg-(int)avg)*100),2,16);
}
这是主函数代码(有兴趣初始化外设代码 查看下面链接)。
链接:https://pan.baidu.com/s/1bDhGiVErVTnN3HABTiDm-g?pwd=8fwx
提取码:8fwx