서문
여덟 번째 예비 시험 문제에 대해. 오실로스코프가 없어서 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
편리한 경우 한 번의 클릭과 세 번의 연속으로 권장 할 수 있습니다.