第六届 蓝桥杯 嵌入式设计与开发项目 省赛

赛题

请添加图片描述

部分程序

主函数

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC2_Init();
  MX_TIM6_Init();
  MX_USART1_UART_Init();
  MX_RTC_Init();
  /* USER CODE BEGIN 2 */
	m24c02_init();	//EEPROM初始化
	KEY_init();			//KEY初始化
	LED_init();			//LED初始化
	LCD_Init();			//LCD初始化
	TASK_TIMES_init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */	
		KEY_function();	//按键功能
		ADC_function();	//ADC功能
		LED_function();	//LED功能
		LCD_function();	//LCD功能
		RTC_Alarm_function();	//定时上报功能
		UART_function();//串口功能
  }
  /* USER CODE END 3 */

按键功能函数


uint8_t KYE_scan(void)
{
	uint8_t val,key;
	static uint8_t com;
	
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET) 			val=1;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET) val=2;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET) val=3;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET) val=4;
	else 																												val=0;
	
	key=val&(val^com);
	com=val;
	return key;
}


void KEY_function(void)
{
	uint8_t key;
	if(get_time_task(TASK_TIMES.TASK_KEY)==0)
	{
		TASK_TIMES.TASK_KEY=get_time()+KEY_time;
		key=KYE_scan();				//扫描按键
		if(key==1)						//打开/关闭指示灯闪烁报警功能
		{ flag_LED^=(1<<7); }	//对指定为取反
		else if(key==2)				//切换界面
		{
			if(++flag_LCD==2) {flag_LCD=0;}
			if(flag_LCD==0) 	
			{
				set_Alarm(RTC_Alarm_time[0],RTC_Alarm_time[1],RTC_Alarm_time[2]);	//重新设置上报时间
				sprintf((char *)LCD_Line4_buf,"  k:0.1             ");
				sprintf((char *)LCD_Line6_buf,"  T:23-59-55        ");
			}
			else if(flag_LCD==1)
			{
				falg_set=0;
				LCD_ClearLine(Line3);LCD_ClearLine(Line4);
				LCD_ClearLine(Line5);LCD_ClearLine(Line6);
				sprintf((char *)LCD_Line4_buf,"      Setting       ");
				sprintf((char *)LCD_Line6_buf,"      00-00-00      ");
				LCD_DisplayStringLine(Line4,LCD_Line4_buf);			
			}
		}
		else if(key==3)	//选择时分秒
		{
			if(flag_LCD==1)	//仅在参数设置界面有效
			{ if(++falg_set==3) {falg_set=0;} }	
		}
		else if(key==4)
		{
			if(flag_LCD==1)	//仅在参数设置界面有效
			{
				if(falg_set==0)  	//时
				{ if(++RTC_Alarm_time[falg_set]>23) RTC_Alarm_time[falg_set]=0; }
				else 	//分 秒
				{ if(++RTC_Alarm_time[falg_set]>59) RTC_Alarm_time[falg_set]=0; }
			}
		}		
	}
}

ADC功能函数

/* USER CODE BEGIN 1 */
void ADC_function(void)
{
	uint8_t a;
	if(get_time_task(TASK_TIMES.TASK_ADC)==0)
	{
		TASK_TIMES.TASK_ADC=get_time()+ADC_time;

		HAL_ADC_Stop_DMA(&hadc2);	//停止ADC2 DMA
		ADC=0;
		for(a=0;a<100;a++)
		{ ADC+=ADC2_ch15_buf[a]; }	//计算近100次ADC值
		HAL_ADC_Start_DMA(&hadc2,(uint32_t *)ADC2_ch15_buf,ADC2_ch15_len);	//重新使能ADC DMA
		ADC=ADC*3.3/255;	//计算放大100倍后的电压
	}
	
	if((ADC>(flag_k*33))&&(flag_LED&0x80))	//闪烁
	{ flag_LED|=(1<<0); }
	else  	//熄灭
	{ flag_LED&=~(1<<0); }
}
/* USER CODE END 1 */

LED功能函数

void LED_function(void)
{
	if(get_time_task(TASK_TIMES.TASK_LED)==0)
	{
		TASK_TIMES.TASK_LED=get_time()+LED_time;
		if(flag_LED&0x01) { LED_state^=(1<<0); }
		else 							{ LED_state=0xFF; }
		LED_Write_all(LED_state);
	}
}

LCD功能函数

void LCD_function(void)
{
	if(flag_LCD==0)				//数据显示界面
	{	
		HAL_RTC_GetTime(&hrtc,&RTC_Time,RTC_FORMAT_BIN);
		HAL_RTC_GetDate(&hrtc,&RTC_Date,RTC_FORMAT_BIN);
		LCD_Line3_buf[5]=ADC/100+48;LCD_Line3_buf[7]=ADC/10%10+48;LCD_Line3_buf[8]=ADC%10+48;
		LCD_Line4_buf[6]=flag_k+48;
		if(flag_LED&0x80) {LCD_Line5_buf[6]='O';LCD_Line5_buf[7]='N';LCD_Line5_buf[8]=' ';}
		else 						  {LCD_Line5_buf[6]='O';LCD_Line5_buf[7]='F';LCD_Line5_buf[8]='F';}
		LCD_Line6_buf[4]=RTC_Time.Hours/10+48;	 LCD_Line6_buf[5]=RTC_Time.Hours%10+48;
		LCD_Line6_buf[7]=RTC_Time.Minutes/10+48; LCD_Line6_buf[8]=RTC_Time.Minutes%10+48;
		LCD_Line6_buf[10]=RTC_Time.Seconds/10+48;LCD_Line6_buf[11]=RTC_Time.Seconds%10+48;
		LCD_DisplayStringLine(Line3,LCD_Line3_buf);
		LCD_DisplayStringLine(Line4,LCD_Line4_buf);
		LCD_DisplayStringLine(Line5,LCD_Line5_buf);
		LCD_DisplayStringLine(Line6,LCD_Line6_buf);		
	}
	else if(flag_LCD==1)	//参数设置界面
	{
		LCD_Line6_buf[6] =RTC_Alarm_time[0]/10+48; LCD_Line6_buf[7] =RTC_Alarm_time[0]%10+48;
		LCD_Line6_buf[9] =RTC_Alarm_time[1]/10+48; LCD_Line6_buf[10]=RTC_Alarm_time[1]%10+48;
		LCD_Line6_buf[12]=RTC_Alarm_time[2]/10+48; LCD_Line6_buf[13]=RTC_Alarm_time[2]%10+48;
		LCD_DisplayStringLine(Line6,LCD_Line6_buf);
	}
}

RTC功能函数

void RTC_Alarm_function(void)
{
	if(flag_Alarm==1)
	{
		flag_Alarm=0;
		RTC_Alarm_buf[0]=ADC/100+48;RTC_Alarm_buf[2]=ADC/10%10+48;RTC_Alarm_buf[3]=ADC%10+48;
		RTC_Alarm_buf[7]=flag_k+48;
		RTC_Alarm_buf[9]=RTC_Time.Hours/10+48;RTC_Alarm_buf[10]=RTC_Time.Hours%10+48;
		RTC_Alarm_buf[11]=RTC_Time.Minutes/10+48;RTC_Alarm_buf[12]=RTC_Time.Minutes%10+48;
		RTC_Alarm_buf[13]=RTC_Time.Seconds/10+48;RTC_Alarm_buf[14]=RTC_Time.Seconds%10+48;
		HAL_UART_Transmit_DMA(&huart1,RTC_Alarm_buf,16);
	}
}

串口功能函数

void UART_function(void)
{
	if(flag_uart1_rx==1)
	{
		flag_uart1_rx=0;
		
		if(UART1_RX_len==5)	//
		{
			if((UART1_RX_buf[0]=='k')&&(UART1_RX_buf[1]=='0')&&(UART1_RX_buf[2]=='.')&&(UART1_RX_buf[4]=='\n'))
			{
				UART1_RX_buf[3]-=48;
				if((UART1_RX_buf[3]>0)&&(UART1_RX_buf[3]<10))
				{
					flag_k=UART1_RX_buf[3];
					X24c02_buf[1]=flag_k;
					m24c02_write(X24c02_buf+1,DATA_ARR+1,1);
					HAL_UART_Transmit_DMA(&huart1,"ok\n",3);
				}
			}
		}
	}
}

完整程序下载

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值