【Learning】 Lanqiao Cup Embedded : 8 차 예비 테스트 문제 — 시뮬레이션 리프팅 컨트롤러

서문
여덟 번째 예비 시험 문제에 대해. 오실로스코프가 없어서 PWM 부분을 작성했지만 디버깅하지 않았기 때문에 전체 시스템에서 PWM_Set 부분을 주석과 함께 사용할 수 있어야합니다 (완벽하지는 않음). 이 글은 단지 메모와 소통과 학습을위한 것으로 여전히 개선의 여지가 많이 남아 있습니다. 질문이나 통찰력이 있으면 댓글 영역에 메시지를 남길 수 있습니다.

1. 주제 수정

여기에 사진 설명 삽입

기능 설명
여기에 사진 설명 삽입
여기에 사진 설명 삽입

2. 시스템 설계 분석

전반적인 아이디어는 등급별로 실현되고 먼저 작은 기능을 실현 한 다음 점차 개선됩니다.
1. 버튼 프레임 :

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();
	}
}

주요 기능 분석

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 (무효)

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)
LCD도 매우 단순하여 디버깅에 편리하며 나중에 삭제할 수있는 상태 표시 기능을 추가했습니다.

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. Time_Display (void)
시간은 다음과 같이 처리됩니다.

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. 풀 리드 (무효)
물 램프 모듈
타이머의 모든 기능을 구현하기로했기 때문에 딜레이를 사용할 때 계수 변수를 선언하고 별도로 처리해야합니다.

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 (void)
엘리베이터 작업 주요 기능

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 (void)
플래그 비트에 의해 결정되어야하는 일부 작업

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();
		}
}

프레임 워크는 매우 명확합니다. 교환 및 토론을 환영합니다.

프로젝트 소스 코드 :

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

편리한 경우 한 번의 클릭과 세 번의 연속으로 권장 할 수 있습니다.

추천

출처blog.csdn.net/qq_45689790/article/details/115270547