当前位置:网站首页>第十一届 蓝桥杯 嵌入式设计与开发项目 决赛

第十一届 蓝桥杯 嵌入式设计与开发项目 决赛

2022-06-22 11:58:00 然而然自

赛题

在这里插入图片描述

CubeMX配置

ADC

在这里插入图片描述

在这里插入图片描述

输入捕获

在这里插入图片描述

PWM输出

在这里插入图片描述

程序展示

按键功能

u8 key_state=0xf;

u8 KEY_scan(void)
{
    
	u8 data=0;
	u8 key=0;
	
	if(!TIME.KEY)
	{
    
		TIME.KEY=KEY_TIME;
		data|=(GPIOB->IDR&0x07);
		data|=((GPIOA->IDR&0x01)<<3);
		
		key=data^key_state;
		key_state=data;		
	}
	
	return key;
}

u8 KEY_function(void)
{
    
	u8 key;
	
	key=KEY_scan();
	if(!key) return 0;
	
	if(key&KEY1)
	{
    
		if( !(key_state&KEY1) )	//按下 切换界面
		{
    
			DATA.display=++DATA.display>1?0:DATA.display;	
			
			if(!DATA.display)	//数据显示界面
			{
    
				sprintf((char *)LCD_LINE_BUF[1]," DATA ");
				sprintf((char *)LCD_LINE_BUF[3]," V1:%3.1fV ",DATA.V1);
				sprintf((char *)LCD_LINE_BUF[4]," V2:%3.1fV ",DATA.V2);
				sprintf((char *)LCD_LINE_BUF[5]," F1:%dHz ",DATA.F1);
				sprintf((char *)LCD_LINE_BUF[6]," F2:%dHz ",DATA.F2);
				
				LCD_LINE_state|=LCD_Line1|LCD_Line3|LCD_Line4|LCD_Line5|LCD_Line6;
				
				//从参数设置界面切换回数据显示界面,检查LED状态
				if(!(led_state&(0x01<<DATA.VD_S)))
				{
    
					led_state|=(0x01<<DATA.VD_S);
					
					led_state&=(~(0x01<<DATA.VD));
				}				
				if(!(led_state&(0x01<<DATA.FD_S)))
				{
    
					led_state|=(0x01<<DATA.FD_S);
					
					led_state&=(~(0x01<<DATA.FD));
				}
				
				DATA.VD_S=DATA.VD;	//退出设置界面,参数生效
				DATA.FD_S=DATA.FD;
			}
			else	//参数设置界面
			{
    
				LCD_ClearLine(Line5);
				LCD_ClearLine(Line6);
				
				sprintf((char *)LCD_LINE_BUF[1]," PARA ");
				sprintf((char *)LCD_LINE_BUF[3]," VD:LD%d ",DATA.VD+1);
				sprintf((char *)LCD_LINE_BUF[4]," FD:LD%d ",DATA.FD+1);
				
				LCD_LINE_state|=LCD_Line1|LCD_Line3|LCD_Line4;			
			}
		}
		else	//松开
		{
    
				;
		}
	}
	
	if(key&KEY2)
	{
    
		if( !(key_state&KEY2) )	//按下 切换电压输出指示灯
		{
    
			if(DATA.display==1)	//仅在参数设置界面下有效
			{
    
				DATA.VD=++DATA.VD>7?0:DATA.VD;
				if(DATA.VD==DATA.FD)	DATA.VD=++DATA.VD>7?0:DATA.VD;	//若与频率输出指示灯相同,本次指示灯再加1 
				
				sprintf((char *)LCD_LINE_BUF[3]," VD:LD%d ",DATA.VD+1);		
				LCD_LINE_state|=LCD_Line3;			
				
			}
		}
		else	//松开
		{
    
			;
		}	
	}
	
	if(key&KEY3)
	{
    
		if( !(key_state&KEY3) )	//按下 切换频率输出指示灯
		{
    
			if(DATA.display)	//仅在参数设置界面下有效
			{
    
				DATA.FD=++DATA.FD>7?0:DATA.FD;
				if(DATA.VD==DATA.FD)	DATA.FD=++DATA.FD>7?0:DATA.FD;	//若与电压输出指示灯相同,本次指示灯再加1

				sprintf((char *)LCD_LINE_BUF[4]," FD:LD%d ",DATA.FD+1);		
				LCD_LINE_state|=LCD_Line4;					
			}

		}
		else	//松开
		{
    
			;
		}	
	}

	if(key&KEY4)
	{
    
		if( !(key_state&KEY4) )	//按下 //切换PA7跟随模式
		{
    
			DATA.PWM_MODE=++DATA.PWM_MODE>1?0:DATA.PWM_MODE;	
		}
		else	//松开
		{
    
			;
		}	
	}

	return 1;	
}

ADC功能

void ADC_function(void)
{
    
	static u8 ADC_flag=0;
	u8 a;
	u32 data=0;
	
	if(!TIME.ADC)
	{
    
		TIME.ADC=ADC_TIME;
		
		if(++ADC_flag==2) ADC_flag=0;
		
		for(a=0;a<ADC_LEN/2;a++)
		{
    
			data+=ADC_buf[a*2+ADC_flag];
		}
		data/=(ADC_LEN/2);	//均值 
		
		if(ADC_flag)	//V1电压
		{
    
			DATA.V1=(float)data/1241;	//转换为电压 data/(4095/3.3)
			if(!DATA.display)	//只在数据显示界面显示
			{
    
				sprintf((char *)LCD_LINE_BUF[3]," V1:%3.1fV ",DATA.V1);
				LCD_LINE_state|=LCD_Line3;			
			}

		}
		else		//V2电压
		{
    
			DATA.V2=(float)data/1241;
			if(!DATA.display)
			{
    
				sprintf((char *)LCD_LINE_BUF[4]," V2:%3.1fV ",DATA.V2);
				LCD_LINE_state|=LCD_Line4;				
			}	
		}
		
		if(DATA.V1>DATA.V2) led_state&=(~(0x01<<DATA.VD_S));
		else				led_state|=(0x01<<DATA.VD_S);
	}
}

输入捕获

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    
	static u8 state[TIM_IN_NUM]={
    0};
	
	if(htim==(&htim2))
	{
    
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
		{
    
			if(state[0]==0)	TIM_IN.data[0]=TIM2->CCR2;
			else
			{
    				
				HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_2);
				TIM_IN.state[0]=2;				
				
				if(TIM2->CCR2>TIM_IN.data[0])	TIM_IN.data[0]=TIM2->CCR2-TIM_IN.data[0];
				else 							TIM_IN.data[0]=0xffffffff-TIM2->CCR2+TIM_IN.data[0];						
			} 	
			state[0]=!state[0];			
		}
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_3)
		{
    
			if(state[1]==0)	TIM_IN.data[1]=TIM2->CCR3;
			else
			{
    				
				HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_3);
				TIM_IN.state[1]=2;				
				
				if(TIM2->CCR3>TIM_IN.data[1])	TIM_IN.data[1]=TIM2->CCR3-TIM_IN.data[1];
				else 							TIM_IN.data[1]=0xffffffff-TIM2->CCR3+TIM_IN.data[1];						
			} 	
			state[1]=!state[1];			
		}
	}
}

void TIM_IN_function(void)
{
    
	u32 buf[TIM_IN_NUM]={
    TIM_CHANNEL_2,TIM_CHANNEL_3};
	u8 a;
	
	for(a=0;a<TIM_IN_NUM;a++)
	{
    
		if(!TIME.TIM_IN[a])
		{
    
			if(TIM_IN.state[a]==0)	//启动
			{
    
				TIM_IN.state[a]=1;
				TIME.TIM_IN_OVER[a]=1000;	//1s超时检测
				HAL_TIM_IC_Start_IT(&htim2,buf[a]);
			}
			else if(TIM_IN.state[a]==1)	//超时检测
			{
    
				if(!TIME.TIM_IN_OVER[a])	
				{
    
					TIM_IN.state[a]=2;
					HAL_TIM_IC_Stop_IT(&htim2,buf[a]);
					TIM_IN.data[a]=0;	//超过1s无输入捕获,则判定为0Hz
				}
			}
			else if(TIM_IN.state[a]==2)	//结束,计算
			{
    
				TIM_IN.state[a]=0;
				TIME.TIM_IN[a]=TIM_IN_TIME;
				if(a==0)
				{
    
					if(TIM_IN.data[0])	DATA.F1=1000000/TIM_IN.data[0];	//捕获之非0才进行频率转换
					else				DATA.F1=0;
					
					if(!DATA.display)
					{
    
						sprintf((char *)LCD_LINE_BUF[5]," F1:%dHz ",DATA.F1);
						LCD_LINE_state|=LCD_Line5;					
					}							
				}
				else
				{
    
					if(TIM_IN.data[1])	DATA.F2=1000000/TIM_IN.data[1];
					else				DATA.F2=0;					
					
					if(!DATA.display)
					{
    
						sprintf((char *)LCD_LINE_BUF[6]," F2:%dHz ",DATA.F2);
						LCD_LINE_state|=LCD_Line6;							
					}							
				}
				
				if(DATA.PWM_MODE==a)	
				{
    
					TIM3->CCR2=	TIM_IN.data[DATA.PWM_MODE]/2;	//50%占空比 
					TIM3->ARR=TIM_IN.data[DATA.PWM_MODE];		//PA7输出频率跟随PULS或PULS2 
				}				
				
				if(DATA.F1>DATA.F2) led_state&=(~(0x01<<DATA.FD_S));
				else				led_state|=(0x01<<DATA.FD_S);				
			}
		}	
	}
}

PWM输出

				if(DATA.PWM_MODE==a)	
				{
    
					TIM3->CCR2=	TIM_IN.data[DATA.PWM_MODE]/2;	//50%占空比 
					TIM3->ARR=TIM_IN.data[DATA.PWM_MODE];		//PA7输出频率跟随PULS或PULS2 
				}	

完整程序下载

下载链接:
链接:https://pan.baidu.com/s/1LMECSy3GuABduu42YUJdSQ
提取码:qy2o

原网站

版权声明
本文为[然而然自]所创,转载请带上原文链接,感谢
https://blog.csdn.net/z945738307/article/details/125249715