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
Función descriptiva
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.