这是主函数#include <stm32f10x.h>
#include <led.h>
#include <usart.h>
#include <delay.h>
#include <PID.h>
#include <button4_4.h>
#include <stdlib.h>
#include <math.h>
#include <math.h>
#include <Timer.h>
#include <PWM.h>
#include <Serial.h>
#include <Motor.h>
#include <Encoder.h>
#include <OLED.h>
#include <menu.h>
int menu2;
int menu3;
int Target_Position = 0, Reality_Position = 0;
int main(void)
{
SystemInit();
delay_init(72);
LED_Init();
LED_On();
Button4_4_Init();
OLED_Init();
ADCInit();
Motor_Init();
Serial_Init();
Encoder_Init();
delay_ms(1000);
MenuSystem_Init();
while(1)
{
// ´¦Àí²Ëµ¥ÏµÍ³
MenuSystem_Process();
}
}
然后菜单系统如下:#include "menu.h"
// È«¾Ö±äÁ¿¶¨Òå
MenuState currentMenu = MENU_MAIN;
int menu1_flag = 1; // Ò»¼¶²Ëµ¥Ñ¡Ôñ
int menu2_flag = 1; // ¶þ¼¶²Ëµ¥Ñ¡Ôñ
float targetSpeed = 0;
float actualSpeed = 0;
float targetAngle = 0;
float actualAngle = 0;
uint16_t lightValue = 0;
uint8_t speedLevel = 0;
uint8_t alarmTriggered = 0;
const float MAX_SPEED = 1000.0; // ×î´óÔÊÐíתËÙ (RPM)
// ³õʼ»¯²Ëµ¥ÏµÍ³
void MenuSystem_Init(void)
{
currentMenu = MENU_MAIN;
menu1_flag = 1;
menu2_flag = 1;
alarmTriggered = 0;
OLED_Clear();
}
// ´¦Àí²Ëµ¥ÏµÍ³
void MenuSystem_Process(void)
{
switch(currentMenu)
{
case MENU_MAIN:
MenuMain_Handler();
break;
case MENU_SERIAL_SUB:
MenuSerialSub_Handler();
break;
case MENU_LIGHT_SUB:
MenuLightSub_Handler();
break;
case MENU_SPEED_CTRL:
MenuSpeedControl_Handler();
break;
case MENU_POS_CTRL:
MenuPositionControl_Handler();
break;
case MENU_LIGHT_DISPLAY:
MenuLightSensor_Handler();
break;
case MENU_SPEED_DISPLAY:
MenuMotorSpeed_Handler();
break;
}
// ¼ì²é²¢´¦Àí±¨¾¯
if(alarmTriggered)
{
HandleAlarm();
}
}
// ±¨¾¯´¦Àí
void HandleAlarm(void)
{
if(alarmTriggered)
{
Motor_Control(0); // Í£Ö¹µç»ú
OLED_ShowString(1, 1, "ALARM! OVERSPEED");
// µÈ´ýÓû§È·ÈÏ
uint8_t key;
do
{
key = Button4_4_Scan();
delay_ms(100);
}
while(key != KEY_ENTER);
alarmTriggered = 0;
// ·µ»ØÖ÷²Ëµ¥
currentMenu = MENU_MAIN;
OLED_Clear();
}
}
// Ö÷²Ëµ¥´¦Àíº¯Êý
void MenuMain_Handler(void)
{
uint8_t key = Button4_4_Scan();
if(key != 0)
{
switch(key)
{
case KEY_UP:
menu1_flag = (menu1_flag == 1) ? 2 : 1;
break;
case KEY_DOWN:
menu1_flag = (menu1_flag == 1) ? 2 : 1;
break;
case KEY_ENTER:
if(menu1_flag == 1)
{
currentMenu = MENU_SERIAL_SUB;
menu2_flag = 1;
}
else
{
currentMenu = MENU_LIGHT_SUB;
menu2_flag = 1;
}
OLED_Clear();
break;
}
}
Display_MainMenu();
delay_ms(50);
}
// ´®¿Ú¿ØÖÆ×Ӳ˵¥´¦Àíº¯Êý
void MenuSerialSub_Handler(void)
{
uint8_t key = Button4_4_Scan();
if(key != 0)
{
switch(key)
{
case KEY_UP:
menu2_flag = (menu2_flag == 1) ? 2 : 1;
break;
case KEY_DOWN:
menu2_flag = (menu2_flag == 1) ? 2 : 1;
break;
case KEY_ENTER:
if(menu2_flag == 1)
{
currentMenu = MENU_SPEED_CTRL;
targetSpeed = 0;
actualSpeed = 0;
}
else
{
currentMenu = MENU_POS_CTRL;
targetAngle = 0;
actualAngle = 0;
}
OLED_Clear();
break;
case KEY_BACK:
currentMenu = MENU_MAIN;
OLED_Clear();
break;
}
}
Display_SerialSubMenu();
delay_ms(50);
}
// ¹âÃô¿ØÖÆ×Ӳ˵¥´¦Àíº¯Êý
void MenuLightSub_Handler(void)
{
uint8_t key = Button4_4_Scan();
if(key != 0)
{
switch(key)
{
case KEY_UP:
menu2_flag = (menu2_flag == 1) ? 2 : 1;
break;
case KEY_DOWN:
menu2_flag = (menu2_flag == 1) ? 2 : 1;
break;
case KEY_ENTER:
if(menu2_flag == 1)
{
currentMenu = MENU_LIGHT_DISPLAY;
}
else
{
currentMenu = MENU_SPEED_DISPLAY;
}
OLED_Clear();
break;
case KEY_BACK:
currentMenu = MENU_MAIN;
OLED_Clear();
break;
}
}
Display_LightSubMenu();
delay_ms(50);
}
// PIDËÙ¶È¿ØÖÆ´¦Àíº¯Êý
void MenuSpeedControl_Handler(void)
{
static uint8_t time_count;
uint8_t key = Button4_4_Scan();
uint8_t RxData;
// ´¦Àí´®¿ÚÊý¾Ý
if (Serial_GetRxFlag() == 1)
{
RxData = Serial_GetRxData();
Serial_SendByte(RxData);
}
// ¶¨Ê±¸üÐÂPID¿ØÖÆ
time_count++;
delay_ms(10);
if(time_count >= 5)
{
// »ñÈ¡±àÂëÆ÷Öµ²¢¼ÆËãËÙ¶È
actualSpeed = ((Encoder_Get() * 60 * 20) / 150);
// PID¿ØÖÆ
uint32_t TIM2_CCR = PosPID(actualSpeed);
TIM_SetCompare3(TIM2, TIM2_CCR);
time_count = 0;
// ¼ì²éÊÇ·ñ³¬ËÙ
if(actualSpeed > MAX_SPEED)
{
alarmTriggered = 1;
}
}
// ´¦Àí·µ»Ø°´¼ü
if(key == KEY_BACK)
{
currentMenu = MENU_SERIAL_SUB;
Motor_Control(0);
OLED_Clear();
}
Display_SpeedControl();
}
// PIDλÖÿØÖÆ´¦Àíº¯Êý
void MenuPositionControl_Handler(void)
{
uint8_t key = Button4_4_Scan();
if(key == KEY_BACK)
{
currentMenu = MENU_SERIAL_SUB;
Motor_Control(0);
OLED_Clear();
}
Display_PositionControl();
delay_ms(50);
}
// ¹âÃô´«¸ÐÆ÷ÏÔʾ´¦Àíº¯Êý
void MenuLightSensor_Handler(void)
{
uint8_t key = Button4_4_Scan();
// ¶ÁÈ¡¹âÃô´«¸ÐÆ÷Öµ
lightValue = Get_Adc_Average(ADC_Channel_1, 10) * 100 / 4095;
OLED_ShowNum(74, 47, lightValue, 3);
// ¸ù¾Ý¹âÕÕÉèÖÃËٶȵµÎ»
if(lightValue < 33)
{
speedLevel = 1;
Motor_Control(300);
}
else if(lightValue < 66)
{
speedLevel = 2;
Motor_Control(600);
}
else
{
speedLevel = 3;
Motor_Control(900);
}
// ¼ì²éÊÇ·ñ³¬ËÙ
if(actualSpeed > MAX_SPEED)
{
alarmTriggered = 1;
}
// ´¦Àí·µ»Ø°´¼ü
if(key == KEY_BACK)
{
currentMenu = MENU_LIGHT_SUB;
Motor_Control(0);
OLED_Clear();
}
Display_LightSensor();
delay_ms(50);
}
// µç»úËÙ¶ÈÏÔʾ´¦Àíº¯Êý
void MenuMotorSpeed_Handler(void)
{
uint8_t key = Button4_4_Scan();
// »ñȡʵ¼ÊËÙ¶È
actualSpeed = ((Encoder_Get() * 60 * 20) / 150);
// ¼ì²éÊÇ·ñ³¬ËÙ
if(actualSpeed > MAX_SPEED)
{
alarmTriggered = 1;
}
// ´¦Àí·µ»Ø°´¼ü
if(key == KEY_BACK)
{
currentMenu = MENU_LIGHT_SUB;
OLED_Clear();
}
Display_MotorSpeed();
delay_ms(50);
}
// ÏÔʾº¯ÊýʵÏÖ
void Display_MainMenu(void)
{
OLED_ShowChinese(2, 4, 75); // ´®
OLED_ShowChinese(2, 6, 76); // ¿Ú
OLED_ShowChinese(2, 8, 39); // ¿Ø
OLED_ShowChinese(2, 10, 40);// ÖÆ
OLED_ShowChinese(3, 4, 77); // ¹â
OLED_ShowChinese(3, 6, 78); // Ãô
OLED_ShowChinese(3, 8, 39); // ¿Ø
OLED_ShowChinese(3, 10, 40);// ÖÆ
// ÏÔʾѡÔñ±ê¼Ç
OLED_ShowString(2, 1, (menu1_flag == 1) ? ">" : " ");
OLED_ShowString(3, 1, (menu1_flag == 2) ? ">" : " ");
}
void Display_SerialSubMenu(void)
{
OLED_ShowChinese(2, 2, 79); // ËÙ
OLED_ShowChinese(2, 4, 80); // ¶È
OLED_ShowChinese(2, 6, 40); // ¿Ø
OLED_ShowChinese(2, 8, 39); // ÖÆ
OLED_ShowChinese(3, 2, 81); // λ
OLED_ShowChinese(3, 4, 82); // ÖÃ
OLED_ShowChinese(3, 6, 40); // ¿Ø
OLED_ShowChinese(3, 8, 39); // ÖÆ
// ÏÔʾѡÔñ±ê¼Ç
OLED_ShowString(2, 1, (menu2_flag == 1) ? ">" : " ");
OLED_ShowString(3, 1, (menu2_flag == 2) ? ">" : " ");
OLED_ShowString(1, 1, "SERIAL CTRL");
}
void Display_LightSubMenu(void)
{
OLED_ShowChinese(2, 2, 83); // ´«
OLED_ShowChinese(2, 4, 84); // ¸Ð
OLED_ShowChinese(2, 6, 85); // Æ÷
OLED_ShowChinese(2, 8, 86); // Öµ
OLED_ShowChinese(3, 2, 87); // µç
OLED_ShowChinese(3, 4, 88); // »ú
OLED_ShowChinese(3, 6, 79); // ËÙ
OLED_ShowChinese(3, 8, 80); // ¶È
// ÏÔʾѡÔñ±ê¼Ç
OLED_ShowString(2, 1, (menu2_flag == 1) ? ">" : " ");
OLED_ShowString(3, 1, (menu2_flag == 2) ? ">" : " ");
OLED_ShowString(1, 1, "LIGHT SENSOR");
}
void Display_SpeedControl(void)
{
OLED_ShowString(1, 1, "SPEED CONTROL");
OLED_ShowString(2, 1, "Target:");
OLED_ShowNum(2, 8, (uint16_t)targetSpeed, 4);
OLED_ShowString(2, 13, "RPM");
OLED_ShowString(3, 1, "Actual:");
OLED_ShowNum(3, 8, (uint16_t)actualSpeed, 4);
OLED_ShowString(3, 13, "RPM");
OLED_ShowString(4, 1, "<BACK>");
}
void Display_PositionControl(void)
{
OLED_ShowString(1, 1, "POSITION CONTROL");
OLED_ShowString(2, 1, "Target:");
OLED_ShowNum(2, 8, (uint16_t)targetAngle, 4);
OLED_ShowString(2, 13, "deg");
OLED_ShowString(3, 1, "Actual:");
OLED_ShowNum(3, 8, (uint16_t)actualAngle, 4);
OLED_ShowString(3, 13, "deg");
OLED_ShowString(4, 1, "<BACK>");
}
void Display_LightSensor(void)
{
OLED_ShowString(1, 1, "LIGHT SENSOR");
OLED_ShowString(2, 1, "Value:");
OLED_ShowNum(2, 8, lightValue, 4);
OLED_ShowString(3, 1, "Speed Level:");
OLED_ShowNum(3, 14, speedLevel, 1);
OLED_ShowString(4, 1, "<BACK>");
}
void Display_MotorSpeed(void)
{
OLED_ShowString(1, 1, "MOTOR SPEED");
OLED_ShowString(2, 1, "Speed:");
OLED_ShowNum(2, 8, (uint16_t)actualSpeed, 4);
OLED_ShowString(2, 13, "RPM");
OLED_ShowString(3, 1, "Max:");
OLED_ShowNum(3, 6, (uint16_t)MAX_SPEED, 4);
OLED_ShowString(3, 11, "RPM");
OLED_ShowString(4, 1, "<BACK>");
}
解读这段程序,然后没有开启我的串口模式