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

			**模拟升降控制器**

赛题

请添加图片描述
请添加图片描述

部分程序

主函数

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_RTC_Init();
  MX_TIM7_Init();
  /* USER CODE BEGIN 2 */
	KEY_init();	
	LED_init();
	LCD_Init();
	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();			
		PLATFORM_function();		
		TIM3_function();
		LED_function();
		LCD_function();
  }
  /* USER CODE END 3 */

按键功能函数


u8 KEY_SCAN(void)
{
	u8 val,key;
	static u8 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)
{
	u8 key;
	
	if(get_time_task(TASK_TIMES.KEY_TIME)==0)
	{
		TASK_TIMES.KEY_TIME=get_time()+KEY_time;
		
		key=KEY_SCAN();
		
		if((key)&&(Current_platform!=key)&&(flag_start==0||(flag_start==4)))	//有按键按下,当前平台对应按键无效,电机运转期间按键无效
		{
				flag_platform|=(0x10<<(key-1));		//对应平台标志位置1
				LED_state&=(~(0x01<<(key-1)));		//对应LED置1	

				flag_start=0;
				KEY_platform_time=0;	//每次按键按下,时间清零
				KEY_platform_down=1;	//按键按下1s后,电机开始运行			
		}		
	}
}


升降功能函数


void PLATFORM_function(void)
{
		//关门
		if(flag_start==1)
		{
			if(PLATFORM_time==0)	//4s
			{
				PLATFORM_time=machinery_TIME; flag_start=3;	//电机运行上下
				CCR2_dc=0;						//关门完成,关门电机停止
				if(flag_platform&0x02)	//上
				{
					CCR1_dc=machinery_up_zkb;	//上行占空比为80
					HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);	//PA4低电平上行
				}
				else
				{
					CCR1_dc=machinery_down_zkb;//下行占空比为60
					HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);	//PA4低电平下行
				}
			}
		}
		//开门
		else if(flag_start==2)
		{
			if(PLATFORM_time==0)
			{
				CCR2_dc=0;		//开关门电机停止
				target_platform=PLATFORM_check();
				if(target_platform)	{ flag_start=4;PLATFORM_time=2000; }	//停留2s状态			
				else  							{ flag_start=0; }
			}
		}
		//电机上下行运转
		else if(flag_start==3)
		{
			if(PLATFORM_time==0)	//6s
			{		
				if(flag_platform&0x02)	{ Current_platform++; }	//上			
				else 										{ Current_platform--; }
				if(target_platform==Current_platform)	//当前平台等于目标平台
				{
					flag_target_platform=1;LCD_Line4_buf[9]=' ';			//到达目标平台,平台数字闪烁
					TASK_TIMES.LCD_TIME=get_time()+LCD_time;					
					flag_platform&=(~(0x10<<(Current_platform-1)));		//对应平台标志位清零
					LED_state|=(0x01<<(Current_platform-1));					//对应LED清零		
					PLATFORM_time=DOOR_OPEN_TIME;flag_start=2;				//开门状态
					CCR1_dc=0;																				//上下行电机停止
					CCR2_dc=DOOR_OPEN_zkb;														//开门占空比为50
					HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);	//PA5高电平开门							
				}
				else { PLATFORM_time=machinery_TIME;flag_start=3; }
				if(Current_platform==4) 	//在最顶层
				{ flag_platform&=0xFD; }	//标志位切换为下				
				if(Current_platform==1) 	//在最低层
				{ flag_platform|=0x02;}		//标志位切换为上
									
			}
		}
		//停留2s(若按键按下,则改为按键后1s)
		else if(flag_start==4)
		{
			if(PLATFORM_time==0)
			{
			  PLATFORM_time=DOOR_CLOSE_TIME;flag_start=1;			//关门状态
				CCR2_dc=DOOR_CLOSE_zkb;		//关门占空比为50
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);	//PA5低电平关门		
			}
		}
}


PWM功能函数


void TIM3_function(void)
{
	static u8 flag_a1=2,flag_a2=2;
	
	if(CCR1_dc<1)	//占空比为0%持续输出低电平
	{
		flag_a1=1;			
		
		TIM3->CCMR1&=0xff0f;
		TIM3->CCMR1|=0x0040;	//强制为有效电平。		
	}
	else if(CCR1_dc>=100)	//占空比为100持续输出高电平
	{		
		flag_a1=0;

		TIM3->CCMR1&=0xff0f;  
		TIM3->CCMR1|=0x0050;	//强制为无效电平。		
	}
	else					//恢复翻转模式
	{
		if(flag_a1!=2)		
		{
			flag_1=flag_a1;flag_a1=2;//防止恢复翻转模式时,极性相反
			
			TIM3->CCMR1&=0xff0f;
			TIM3->CCMR1|=0x0030;	//翻转模式		
		}		 				
	}	
	
	if(CCR2_dc<1)	//占空比为0%持续输出低电平
	{
		flag_a2=1;			
		
		TIM3->CCMR1&=0x0fff;
		TIM3->CCMR1|=0x4000;	//强制为有效电平。		
	}
	else if(CCR2_dc>=100)	//占空比为100持续输出高电平
	{		
		flag_a2=0;

		TIM3->CCMR1&=0x0fff;
		TIM3->CCMR1|=0x5000;	//强制为无效电平。	
	}
	else					//恢复翻转模式
	{
		if(flag_a2!=2)		
		{
			flag_2=flag_a2;flag_a2=2;//防止恢复翻转模式时,极性相反
			
			TIM3->CCMR1&=0x0fff;
			TIM3->CCMR1|=0x3000;	//翻转模式				
		}		 				
	}		
}

LED功能函数

void LED_function(void)
{
	static u8 LED_state_last=0XFF;
	static u8 a=4;
	
	if(get_time_task(TASK_TIMES.LED_TIME)==0)
	{
		TASK_TIMES.LED_TIME=get_time()+LED_time;
		
		if(flag_start==3)	//上下行电机运行,开始流水的
		{
			LED_state^=(1<<a);			
			if(flag_platform&0x02)	//上
			{ if(++a==8) {a=4;} }
			else										//下
			{ if(--a==3) {a=8;} }
		}
		else
		{
			if(flag_platform&0x02)	{ a=4; }	//上			
			else										{ a=7; }	//下				
			LED_state|=0XF0;
		}
		
		if(LED_state_last!=LED_state)
		{
			LED_state_last=LED_state;
			LED_write(LED_state);
		}		
	}
}

LCD功能函数

void LCD_function(void)
{
	if(get_time_task(TASK_TIMES.LCD_TIME)==0)
	{
		TASK_TIMES.LCD_TIME=get_time()+LCD_time;
		//获取时间
		HAL_RTC_GetTime(&hrtc,&RTC_Time,RTC_FORMAT_BIN);
		HAL_RTC_GetDate(&hrtc,&RTC_Date,RTC_FORMAT_BIN);	
		LCD_Line8_buf[6] =RTC_Time.Hours/10+48;		LCD_Line8_buf[7] =RTC_Time.Hours%10+48;
		LCD_Line8_buf[9] =RTC_Time.Minutes/10+48;	LCD_Line8_buf[10]=RTC_Time.Minutes%10+48;
		LCD_Line8_buf[12]=RTC_Time.Seconds/10+48;	LCD_Line8_buf[13]=RTC_Time.Seconds%10+48;
		//获取当前平台
		if(flag_target_platform==0) LCD_Line4_buf[9]=Current_platform+48;
		//刷新LCD
		LCD_DisplayStringLine(Line4,LCD_Line4_buf);	
		LCD_DisplayStringLine(Line8,LCD_Line8_buf);
	}
}

完整程序下载

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值