**模拟升降控制器**
赛题
部分程序
主函数
/* 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