【Aprendizaje】 Lanqiao Cup Embedded: Las octavas preguntas preliminares de la prueba: controlador de elevación de simulación

Prólogo
Acerca de las octavas preguntas preliminares del examen. Como no tengo un osciloscopio, escribí la parte PWM, pero no la depuré. Por lo tanto, en el sistema general, la parte PWM_Set debería poder usarse con comentarios (pero no perfecta). Este artículo es solo para tomar notas y comunicarse y aprender, todavía hay mucho margen de mejora. Si tiene alguna pregunta o idea, puede dejar un mensaje en el área de comentarios.

1. Reformulación del tema

Inserte la descripción de la imagen aquí

Función descriptiva
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

2. Análisis del diseño del sistema

La idea general se realiza en grados, primero realiza pequeñas funciones y luego mejora gradualmente.
1. Marco de botón:

void KEY_Cmd_Judge(void)
{
    
    
	key_cmd_flag = KEY_Read();
	
	if(key_cmd_flag == 1)
	{
    
    
		KEY_1_Processing();
	}
	else if(key_cmd_flag == 2)
	{
    
    
		KEY_2_Processing();
	}
	else if(key_cmd_flag == 3)
	{
    
    
		KEY_3_Processing();
	}
	else if(key_cmd_flag == 4)
	{
    
    
		KEY_4_Processing();
	}
}

Desglose de funciones clave

static void KEY_1_Processing(void)
{
    
    
	key_1_flag = 1; //标志位(预留),实际并未用到,仅用到了“平台标志位”
	platform[1] = 1; //平台标志位
	LED_Ctrl(LED_0,ON);
}
static void KEY_2_Processing(void)
{
    
    
	key_2_flag = 1;
	platform[2] = 1;
	LED_Ctrl(LED_1,ON);
}
static void KEY_3_Processing(void)
{
    
    
	key_3_flag = 1;
	platform[3] = 1;
	LED_Ctrl(LED_2,ON);
}

static void KEY_4_Processing(void)
{
    
    
	key_4_flag = 1;
	platform[4] = 1;
	LED_Ctrl(LED_3,ON);
}
对于绝大多数的功能,我选择在定时器中断中完成(可能导致定时不精确)

2 、 SysTick_Handler (anulado)

void SysTick_Handler(void)
{
    
    
	fulid_count++;
	Fulid();

	Handler_count++;
	time_count++;
	Time_Display();
	if(TimeDelay_ms != 0)
	{
    
    
		TimeDelay_ms--;
	}
	if(time_count == TIME_s)
	{
    
    
		time_count = 0;
		Time_s++;
	}
	if(TimeElevator_ms != 0)
	{
    
    
		TimeElevator_ms--;
		Elevator_Operation(); //进行开关门等操作
	}
	if(Handler_count % 20 == 0) //20ms 一次 判断
	{
    
    
		KEY_Cmd_Judge();
		LCD_Display();
	}
}

3. LCD_Display (void)
La pantalla LCD también es muy simple, lo que es conveniente para la depuración. Agregué la función de visualización de estado, que se puede eliminar más tarde

void LCD_Display(void)
{
    
    
	LCD_DisplayStringLine(Line2, (uint8_t*)"       Current  ");
	sprintf(LCD_Txt,"          %d",elevator_current);
	LCD_DisplayStringLine(Line4,(uint8_t*)LCD_Txt);
	sprintf(LCD_Txt,"       %d:%d:%d   ",Time_h,Time_m,Time_s);
	LCD_DisplayStringLine(Line6,(uint8_t*)LCD_Txt);
	if(open_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Open   ");
	}
	else if(close_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Close   ");
	}
	else if(up_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Up     ");
	}
	else if(down_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Down    ");
	}
	else	if(wait_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Wait     ");
	}
	else
	{
    
    
		sprintf(LCD_Txt,"         Wait     ");
	}
	LCD_DisplayStringLine(Line8,(uint8_t*)LCD_Txt);
}

4. El tiempo de visualización de tiempo (anulado)
se procesa de la siguiente manera

void Time_Display(void)
{
    
    
	if(Time_s == 60)
	{
    
    
		Time_s = 0;
		Time_m += 1;
	}
	if(Time_m == 60)
	{
    
    
		Time_m = 0;
		Time_h += 1;
	}
	if(Time_h == 24)
	{
    
    
		Time_h = 0;
	}
}

5.
Módulo de lámpara de agua Fulid (nulo)
Como elegí implementar todas las funciones en el temporizador, cuando se usa el retardo, la variable de conteo debe declararse y luego procesarse por separado.

void Fulid(void)
{
    
    
	if((up_flag == 1) && (fulid_count%Fluid_Time == 0))
	{
    
    
		fulid_i++;
		if(fulid_i == 1)
		{
    
    
			LED_Ctrl(LED_4,1);
		}
		else if(fulid_i == 2)
		{
    
    
			LED_Ctrl(LED_4,0);
			LED_Ctrl(LED_5,1);
		}
		else if(fulid_i == 3)
		{
    
    
			LED_Ctrl(LED_5,0);
			LED_Ctrl(LED_6,1);
		}
		else if(fulid_i == 4)
		{
    
    
			LED_Ctrl(LED_6,0);
			LED_Ctrl(LED_7,1);
		}
		else if(fulid_i == 5)
		{
    
    
			LED_Ctrl(LED_7,0);
			fulid_i = 0;	
		}
	}
	else if((down_flag == 1)&& (fulid_count%Fluid_Time == 0))
	{
    
    
		fulid_i++;
		if(fulid_i == 1)
		{
    
    
			LED_Ctrl(LED_7,1);
		}
		else if(fulid_i == 2)
		{
    
    
			LED_Ctrl(LED_7,0);
			LED_Ctrl(LED_6,1);
		}
		else if(fulid_i == 3)
		{
    
    
			LED_Ctrl(LED_6,0);
			LED_Ctrl(LED_5,1);
		}
		else if(fulid_i == 4)
		{
    
    
			LED_Ctrl(LED_5,0);
			LED_Ctrl(LED_4,1);
		}
		else if(fulid_i == 5)
		{
    
    
			LED_Ctrl(LED_4,0);
			fulid_i = 0;
		}
	}
}

6, Elevator_Working (anular) la
función principal del trabajo del ascensor

void Elevator_Working(void)
{
    
    
	elevator_sum = 0;
	for(elevator_i=0; elevator_i<Platform_num; elevator_i++)
	{
    
    
			elevator_sum += platform[elevator_i];// 1234
	}
	if(elevator_sum != 0)
	{
    
    
		//搜索当前楼层以上的需求 然后 搜索下面楼层
		for(elevator_i=Platform_num-1; elevator_i>elevator_current;elevator_i--)
		{
    
    
			if(platform[elevator_i]==1)
			{
    
    
				elevator_temp = elevator_i;//搜寻最近需求
			}
		}

			
		if(elevator_temp > elevator_current)
		{
    
    

			up_flag = 1;
			down_flag = 0;
			close_flag = 0;
			open_flag = 0;
			wait_flag = 0;
			
			GPIO_SetBits(Elevator_GPIO_PORT,Elevator_GPIO_PIN);
			//PWM_Set(1000,80,1);
			TimeElevator_ms = Elevator_TIME*(elevator_temp - elevator_current);
			while(TimeElevator_ms);
			elevator_current = elevator_temp;
			open_flag = 1;
			TimeElevator_ms = Door_TIME;
			while(TimeElevator_ms);
			elevator_current = elevator_temp;
			LED_Close(elevator_current-1);
			wait_flag = 1;
			TimeElevator_ms = Wait_TIME;
			while(TimeElevator_ms);
			close_flag = 1;
			TimeElevator_ms = Door_TIME;
			while(TimeElevator_ms);
		}
		else//确定楼上没有需求
		{
    
    
//				//搜索当前楼层以下的需求 然后 搜索下面楼层
			for(elevator_i=0; elevator_i<elevator_current;elevator_i++)
			{
    
    
				if(platform[elevator_i]==1)
				{
    
    
					elevator_temp = elevator_i;//搜寻最近需求
				}
			}
			if(elevator_temp < elevator_current)
			{
    
    
				up_flag = 0;
				down_flag = 1;
				close_flag = 0;
				open_flag = 0;
				wait_flag = 0;
				GPIO_ResetBits(Elevator_GPIO_PORT,Elevator_GPIO_PIN);
				//PWM_Set(1000,60,1);
				TimeElevator_ms = Elevator_TIME*(elevator_current - elevator_temp);
				while(TimeElevator_ms);
				open_flag = 1;
				TimeElevator_ms = Door_TIME;
				while(TimeElevator_ms);
				elevator_current = elevator_temp;
				LED_Close(elevator_current-1);
				wait_flag = 1;
				TimeElevator_ms = Wait_TIME;
				while(TimeElevator_ms);
				close_flag = 1;
				TimeElevator_ms = Door_TIME;
				while(TimeElevator_ms);
				
			}
		}
	}
}
	

7, Elevator_Operation (anulado)
algunas operaciones que deben ser determinadas por el bit de bandera

void Elevator_Operation(void)
{
    
    
		if(open_flag == 1)
		{
    
    
			Elevator_Open();
		}
		else if(close_flag == 1)
		{
    
    
			Elevator_Close();
		}
		else if(up_flag == 1)
		{
    
    
			Elevator_UP();
		}
		else if(down_flag == 1)
		{
    
    
			Elevator_DOWN();
		}
}

void Elevator_DOWN(void)
{
    
    
	
	//Fluid_LED(DOWN);
	if(TimeElevator_ms == 0) 
	{
    
    
		down_flag = 0;
		platform[elevator_current] = 0;
	}
}
void Elevator_UP(void)
{
    
    
	
	//Fluid_LED(UP);
	if(TimeElevator_ms == 0) 
	{
    
    
		up_flag = 0;
		platform[elevator_current] = 0;
	}
}

void Elevator_Open(void)
{
    
    
	GPIO_SetBits(Elevator_GPIO_PORT,Door_GPIO_PIN);
	//PWM_Set(2000,50,2);
	if(TimeElevator_ms == 0) 
	{
    
    
		open_flag = 0;
		wait_flag = 0;
	}
}

void Elevator_Close(void)
{
    
    
	GPIO_ResetBits(Elevator_GPIO_PORT,Door_GPIO_PIN);
	//PWM_Set(2000,60,2);
	if(TimeElevator_ms == 0) 
	{
    
    
		close_flag = 0;
		wait_flag = 0;
	}
}
void Elevator_Operation(void)
{
    
    
		if(open_flag == 1)
		{
    
    
			Elevator_Open();
		}
		else if(close_flag == 1)
		{
    
    
			Elevator_Close();
		}
		else if(up_flag == 1)
		{
    
    
			Elevator_UP();
		}
		else if(down_flag == 1)
		{
    
    
			Elevator_DOWN();
		}
}

El marco es muy claro, bienvenido a intercambiar y discutir

Código fuente del proyecto:

链接:https://pan.baidu.com/s/1M4jUBj8PNrhiD8uJRq5qrQ 
提取码:zzfs 

Si le conviene, puede animarlo con un clic y tres veces consecutivas.

Supongo que te gusta

Origin blog.csdn.net/qq_45689790/article/details/115270547
Recomendado
Clasificación