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

赛题

在这里插入图片描述

CubeMX配置

ADC

在这里插入图片描述

在这里插入图片描述

输入捕获

在这里插入图片描述

脉冲输出

在这里插入图片描述

串口

在这里插入图片描述

程序展示

按键功能

u8 key_flag=0;

u8 KEY_scan(void)
{
	u8 key=0,val;
	static u8 com;
	static u8 time_num=0;
	
	if(!TIME.KEY)
	{
		TIME.KEY=KEY_TIME;
		
		if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0))			val=1;
		else if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1))	val=2;
		else if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2))	val=3;
		else if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))	val=4;
		else 											val=0;

		if(DATA.display==2)
		{
			if(val==4)
			{
				if(key_flag==0)
				{
					if(++time_num==101)
					{
						time_num=0;
						key_flag=1;
						return 4;
					}				
				}
			}
			else if(time_num)	//短按
			{
				time_num=0;
				return 4;
			}
			else
			{
				if(key_flag==2) key_flag=0;
				key=val&(val^com);
				com=val;	
			}			
		}
		else
		{
			key=val&(val^com);
			com=val;			
		}
	}
	
	return key;
}

void KEY_function(void)
{
	u8 key;
	u8 a;
	float data[2]= {0};
 
	
	key=KEY_scan();
	
	if(key)
	{
		if(key==1)
		{
			if(++DATA.display==3) DATA.display=0;
			
			LCD_Clear(Black);
			
			if(DATA.display==0)
			{
				sprintf((char *)LCD_LINE_BUF[1],"        DATA        ");
				sprintf((char *)LCD_LINE_BUF[3],"     PA4=%-3.2f     ",DATA.PA4);
				sprintf((char *)LCD_LINE_BUF[4],"     PA5=%-3.2f     ",DATA.PA5);
				sprintf((char *)LCD_LINE_BUF[5],"     PA1=%-4d        ",DATA.PA1);
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4|LCD_LINE_5;
			}
			else if(DATA.display==1)
			{
				sprintf((char *)LCD_LINE_BUF[1],"        PARA        ");
				sprintf((char *)LCD_LINE_BUF[3],"     X=%1d          ",DATA.X);
				sprintf((char *)LCD_LINE_BUF[4],"     Y=%1d          ",DATA.Y);
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4;			
			}
			else if(DATA.display==2)
			{
				sprintf((char *)LCD_LINE_BUF[1],"        REC-PA4     ");
				sprintf((char *)LCD_LINE_BUF[3],"     N=%-d          ",DATA.N[0]);
				sprintf((char *)LCD_LINE_BUF[4],"     A=%-3.2f       ",DATA.A[0]);
				sprintf((char *)LCD_LINE_BUF[5],"     T=%-3.2f       ",DATA.T[0]);
				sprintf((char *)LCD_LINE_BUF[6],"     H=%-3.2f       ",DATA.H[0]);
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4|LCD_LINE_5|LCD_LINE_6;			
			}
		}
		else if(key==2)
		{
			if(DATA.display==1)
			{
				if(++DATA.X==5) DATA.X=1;
				sprintf((char *)LCD_LINE_BUF[3],"     X=%1d          ",DATA.X);				
				LCD_LINE_state|=LCD_LINE_3;
			}	
			EEPROM_write(1,DATA.X);			
		}
		else if(key==3)
		{
			if(DATA.display==1)
			{
				if(++DATA.Y==5) DATA.Y=1;
				sprintf((char *)LCD_LINE_BUF[4],"     Y=%1d          ",DATA.Y);				
				LCD_LINE_state|=LCD_LINE_4;
			}	
			EEPROM_write(0,DATA.Y);
			
			if(DATA.PA4>(DATA.PA5*DATA.Y))
			{
				DATA.led_flag=1;
			}
			else
			{
				DATA.led_flag=0;
				LED_state|=LED3;
			}			
			
		}
		else if(key==4)
		{
			if(DATA.display==0)
			{
				for(a=0;a<ADC_LEN/2;a++)
				{
					data[0]+=ADC_BUF[2*a];
					data[1]+=ADC_BUF[2*a+1];
				}
				data[0]/=(ADC_LEN/2);
				data[1]/=(ADC_LEN/2);
				 
				data[0]=data[0]*3.3/4095;
				data[1]=data[1]*3.3/4095;
				
				DATA.PA4=data[0];
				DATA.PA5=data[1];
				
				sprintf((char *)LCD_LINE_BUF[3],"     PA4=%-3.2f     ",DATA.PA4);
				sprintf((char *)LCD_LINE_BUF[4],"     PA5=%-3.2f     ",DATA.PA5);
				LCD_LINE_state|=LCD_LINE_3|LCD_LINE_4; 

				if(DATA.PA4>(DATA.PA5*DATA.Y))
				{
					DATA.led_flag=1;
				}
				else
				{
					DATA.led_flag=0;
					LED_state|=LED3;
				}
				
				for(a=0;a<2;a++)
				{
					if(DATA.adc_flag[a]==0)
					{
						DATA.adc_flag[a]=1;
						DATA.N[a]++;
						DATA.A[a]=data[a];
						DATA.T[a]=data[a];
						DATA.H[a]=data[a];
						DATA.ADC_data_num[a]+=data[a];
					}
					else
					{
						DATA.N[a]++;
						if(DATA.A[a]<data[a]) DATA.A[a]=data[a];
						if(DATA.T[a]>data[a]) DATA.T[a]=data[a];
						DATA.ADC_data_num[a]+=data[a];
						DATA.H[a]=DATA.ADC_data_num[a]/DATA.N[a];
					}				
				}
			}
			else if(DATA.display==1)
			{
				DATA.pwm_mode=!DATA.pwm_mode;
				
				if(DATA.pwm_mode==0) 
				{
					LED_state&=~LED1;
					LED_state|=LED2;
				}
				else
				{
					LED_state|=LED1;
					LED_state&=~LED2;				
				}
			}
			else if(DATA.display==2)
			{
				if(key_flag==0)	//短按
				{
					if(++DATA.ERC_flag==2) DATA.ERC_flag=0;
				}
				else	//长按
				{
					key_flag=2;
					
					DATA.N[DATA.ERC_flag]=0;
					DATA.A[DATA.ERC_flag]=0;
					DATA.T[DATA.ERC_flag]=0;
					DATA.H[DATA.ERC_flag]=0;
					DATA.adc_flag[DATA.ERC_flag]=0;
					DATA.ADC_data_num[DATA.ERC_flag]=0;
				}
				
				sprintf((char *)LCD_LINE_BUF[1],"        REC-PA%1d   ",DATA.ERC_flag==0?4:5);
				sprintf((char *)LCD_LINE_BUF[3],"     N=%-d          ",DATA.N[DATA.ERC_flag]);
				sprintf((char *)LCD_LINE_BUF[4],"     A=%-3.2f       ",DATA.A[DATA.ERC_flag]);
				sprintf((char *)LCD_LINE_BUF[5],"     T=%-3.2f       ",DATA.T[DATA.ERC_flag]);
				sprintf((char *)LCD_LINE_BUF[6],"     H=%-3.2f       ",DATA.H[DATA.ERC_flag]);	
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4|LCD_LINE_5|LCD_LINE_6;					
				
			}
		}
	}
}

输入捕获功能

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	static u8 flag=0;
	if(htim==(&htim2))
	{
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
		{
			if(flag==0)
			{
				flag=1;
				TIME_IN.data=TIM2->CCR2;
			}
			else if(flag==1)
			{
				flag=0;
				TIME_IN.data=TIM2->CCR2-TIME_IN.data;
				TIME_IN.state=2;
				
				HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_2);			
			}
		}
	}
}

void TIM_IN_function(void)
{
	if(!TIME.TIM_IN)
	{
		if(TIME_IN.state==0)
		{
			TIME_IN.state=1;
			TIME.OVER_TIME=1000;
			TIM2->CNT=0;
			HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
		}
		else if(TIME_IN.state==1)
		{
			if(TIME.OVER_TIME==0)
			{
				TIME_IN.state=2;
				HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_2);
				
				TIME_IN.data=0;
			}
		}
		else if(TIME_IN.state==2)
		{
			TIME_IN.state=0;		
				
			DATA.PA1=TIME_IN.data;

			if(DATA.display==0)
			{
				sprintf((char *)LCD_LINE_BUF[5],"     PA1=%-4d        ",TIME_IN.data==0?0:1000000/TIME_IN.data);
				LCD_LINE_state|=LCD_LINE_5;			
			}
			if(DATA.pwm_mode==0)
			{
				TIM3->ARR=DATA.PA1/DATA.X;
				TIM3->CCR2=DATA.PA1/DATA.X/2;	
			}
			else
			{
				TIM3->ARR=DATA.PA1*DATA.X;
				TIM3->CCR2=DATA.PA1*DATA.X/2;				
			}
			TIME.TIM_IN=TIM_IN_TIME;						
		}
	}
}

串口功能

	char buf[64],len;
u8 UART_Handler(void)
{

	
	if(UART1_RX_LEN==1)	//查询参数 | 切换显示模式
	{
		if(UART1_BUF[0]=='X')
		{
			buf[0]='X';
			buf[1]=':';
			buf[2]=DATA.X+0x30;
			len=3;
		}
		else if(UART1_BUF[0]=='Y')
		{
			buf[0]='Y';
			buf[1]=':';			
			buf[2]=DATA.Y+0x30;
			len=3;
		}
		else if(UART1_BUF[0]=='#')
		{
			DATA.lcd_mode=!DATA.lcd_mode;
			if(DATA.lcd_mode==0)  
			{
				LED_state&=~LED4;
				LCD_WriteReg(R96 , 0x2700); // Gate Scan Line		  0xA700
				LCD_WriteReg(R1  , 0x0000); // set SS and SM bit	  //0x0100
			}
			else 				  
			{
				LED_state|=LED4;
				LCD_WriteReg(R96 , 0xA700); // Gate Scan Line		  0xA700
				LCD_WriteReg(R1  , 0x0100); // set SS and SM bit		  //0x0100				
			}
			LCD_Clear(Black);
			if(DATA.display==0)
			{
				sprintf((char *)LCD_LINE_BUF[1],"        DATA        ");
				sprintf((char *)LCD_LINE_BUF[3],"     PA4=%-3.2f     ",DATA.PA4);
				sprintf((char *)LCD_LINE_BUF[4],"     PA5=%-3.2f     ",DATA.PA5);
				sprintf((char *)LCD_LINE_BUF[5],"     PA1=%-4d        ",DATA.PA1);
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4|LCD_LINE_5;
			}
			else if(DATA.display==1)
			{
				sprintf((char *)LCD_LINE_BUF[1],"        PARA        ");
				sprintf((char *)LCD_LINE_BUF[3],"     X=%1d          ",DATA.X);
				sprintf((char *)LCD_LINE_BUF[4],"     Y=%1d          ",DATA.Y);
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4;			
			}
			else if(DATA.display==2)
			{
				sprintf((char *)LCD_LINE_BUF[1],"        REC-PA4     ");
				sprintf((char *)LCD_LINE_BUF[3],"     N=%-d          ",DATA.N[0]);
				sprintf((char *)LCD_LINE_BUF[4],"     A=%-3.2f       ",DATA.A[0]);
				sprintf((char *)LCD_LINE_BUF[5],"     T=%-3.2f       ",DATA.T[0]);
				sprintf((char *)LCD_LINE_BUF[6],"     H=%-3.2f       ",DATA.H[0]);
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4|LCD_LINE_5|LCD_LINE_6;			
			}			
			
			return 0;
		}
		else return 0;
	}
	else if( (UART1_RX_LEN) && (UART1_BUF[0]=='P') && (UART1_BUF[1]=='A') )	//查询数据
	{
		if(UART1_BUF[2]=='1')
		{
			sprintf(buf,"PA1:%-5d",1000000/DATA.PA1);
			len=9;
		}
		else if(UART1_BUF[2]=='4')
		{
			sprintf(buf,"PA4:%-3.2f",DATA.PA4);
			len=8;			
		}
		else if(UART1_BUF[2]=='5')
		{
			sprintf(buf,"PA5:%-3.2f",DATA.PA5);
			len=8;			
		}
		else return 0;
	}
	else return 0;

	HAL_UART_Transmit_DMA(&huart1,(u8 *)buf,len);
	return 1;
}

void UART_function(void)
{
	if(UART_over)
	{
		UART_over=0;
		UART_Handler();
		HAL_UART_Receive_DMA(&huart1,UART1_BUF,UART1_LEN);	
	}
}

LCD翻转功能

			DATA.lcd_mode=!DATA.lcd_mode;
			if(DATA.lcd_mode==0)  
			{
				LED_state&=~LED4;
				LCD_WriteReg(R96 , 0x2700); // Gate Scan Line		  0xA700
				LCD_WriteReg(R1  , 0x0000); // set SS and SM bit	  //0x0100
			}
			else 				  
			{
				LED_state|=LED4;
				LCD_WriteReg(R96 , 0xA700); // Gate Scan Line		  0xA700
				LCD_WriteReg(R1  , 0x0100); // set SS and SM bit		  //0x0100				
			}
			LCD_Clear(Black);
			if(DATA.display==0)
			{
				sprintf((char *)LCD_LINE_BUF[1],"        DATA        ");
				sprintf((char *)LCD_LINE_BUF[3],"     PA4=%-3.2f     ",DATA.PA4);
				sprintf((char *)LCD_LINE_BUF[4],"     PA5=%-3.2f     ",DATA.PA5);
				sprintf((char *)LCD_LINE_BUF[5],"     PA1=%-4d        ",DATA.PA1);
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4|LCD_LINE_5;
			}
			else if(DATA.display==1)
			{
				sprintf((char *)LCD_LINE_BUF[1],"        PARA        ");
				sprintf((char *)LCD_LINE_BUF[3],"     X=%1d          ",DATA.X);
				sprintf((char *)LCD_LINE_BUF[4],"     Y=%1d          ",DATA.Y);
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4;			
			}
			else if(DATA.display==2)
			{
				sprintf((char *)LCD_LINE_BUF[1],"        REC-PA4     ");
				sprintf((char *)LCD_LINE_BUF[3],"     N=%-d          ",DATA.N[0]);
				sprintf((char *)LCD_LINE_BUF[4],"     A=%-3.2f       ",DATA.A[0]);
				sprintf((char *)LCD_LINE_BUF[5],"     T=%-3.2f       ",DATA.T[0]);
				sprintf((char *)LCD_LINE_BUF[6],"     H=%-3.2f       ",DATA.H[0]);
				
				LCD_LINE_state|=LCD_LINE_1|LCD_LINE_3|LCD_LINE_4|LCD_LINE_5|LCD_LINE_6;			
			}			
			

完整程序下载

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值