蓝桥杯17年赛题
一、 基本要求
1.1 使用 CT117E 嵌入式竞赛板,完成试题功能的程序设计与调试;
1.2 设计与调试过程中,可参考组委会提供的“资源数据包”;
1.3 Keil 工程文件以准考证号命名,完成设计后,提交完整、可编译的 Keil
工程文件到服务器。
二、 硬件框图
“模拟升降控制器” 模拟升降机的运行过程。通过按键设定到达目标平台,
双路 PWM 输出分别模拟控制上下行电机和开关门电机, LED 流水灯模拟运行
方向。 系统框图如图 1 所示:
图 1 系统框图
三、 功能描述
- LCD 显示
LCD 显示时钟和当前所在平台。 当升降机运行到目标平台时, 平台数字在 1
秒内闪烁 2 次。 系统上电后升降机默认位于平台 1, 升降机门默认为打开状
态。
图 2. LCD 显示界面参考图
LCD 显示
MCU
按键控制
双路 PWM 输出
LED 流水指示
方向控制
PA6-7
当前平台
1
12: 50: 55
PA4-52 / 2 - 按键功能
4 个按键分别代表 4 个平台。按下后通过点亮 LED 指示要到达的平台
(LD1-LD4, LD1 对应平台 1,依此类推), 当升降机到达目标平台时, 对应
LED 灯熄灭。按下当前平台对应的按键无效。一次可以设定多个目标平台,
上下平台都有按键时, 运行顺序是先上后下。
在最后一次按键按完 1 秒之后,模拟电机开始运行: 升降机先关门, 运行到
下一层后开门; 如果还有目标平台, 则开门后停留 2 秒,然后关门,继续运
行到下一个目标平台,直到没有目标平台。
当设置多个目标平台时, 升降机的升降顺序与按键顺序无关, 先按从低到高
的顺序走完设定的上行平台,再按从高到低的顺序走完设定的下行平台。
电机运转期间按键无效。 - PWM 输出
两路 PWM 输出分别控制上下行电机(PA6)和开关门电机(PA7),并分别
用一路方向控制信号控制电机的运转方向。 PA4 高电平表示升降机上行, 反
之表示升降机下行。 PA5 高电平表示升降机开门, 反之表示关门。
上下每层平台的电机运行时间为 6 秒, 升降机开关门时间为 4 秒。
上下行电机控制信号的频率为 1KHz。升降机上行时,PWM 信号占空比为 80%;
升降机下行时, PWM 信号占空比为 60%。
开关门电机控制信号的频率为 2KHz。升降机开门时,PWM 信号占空比为 60%;
升降机关门时, PWM 信号占空比为 50%。 - LED 流水指示
升降机上下行时, 4 个 LED(LD5-LD8) 组成流水灯用来表示升降机的运行
方向。合理选择流水灯的流水方式和时间间隔。 - RTC 功能
通过单片机片内 RTC 设计实现时钟功能。
部分代码
#include "stm32f10x.h"
#include <string.h>
#include <stdio.h>
#include "lcd.h"
#include "Deputy.h"
#include "i2c.h"
u32 TimingDelay = 0;
u32 num=0;
u8 EepromData=0;
u8 CurrentPlatform=0x01;
u8 AchievePlatformFlag=1;
u8 UPDown=1;
u16 FlowTime=0;
u8 FlowDirect=0;
__IO uint16_t CCR1_Val = 500;
__IO uint16_t CCR2_Val = 250;
float Duty1=0.2;
float Duty2=0.2;
u8 Open_Motor=0;
u8 Open_Door=0;
extern u8 Start;
extern u8 Floor;
void Delay_Ms(u32 nTime);
void KeyScan(void);
void Display(void);
//Main Body
int main(void)
{
char buf[20]={0};
LCDInit();
i2c_init();
RTCInit();
ADCInit();
LED_AND_KEYInit();
// PWMOutPutMode(999,71);
PWMOutPut();
LED_Control(LED_ALL, DISABLE);
EEPROM_Write(0x00,88);
EepromData = EEPROM_Read(0x00);
while(1){
// ADCValue=ADC_GetConversionValue(ADC1);
KeyScan();
Display();
if(Start){
sprintf((char *)buf," Start ");
LCD_DisplayStringLine(Line5,(unsigned char *)buf);
if(Floor>CurrentPlatform){
FlowLed(FlowDirect);
Open_Motor=1;
Open_Door=1;
}
}
}
}
void Display(void)
{
static u8 FloorNUM=1;
char buf[20]={0};
Time_Display(RTC_GetCounter());
if(CurrentPlatform==0x01)FloorNUM=1;
else if(CurrentPlatform==0x02)FloorNUM=2;
else if(CurrentPlatform==0x04)FloorNUM=3;
else if(CurrentPlatform==0x08)FloorNUM=4;
sprintf((char *)buf," %d ",FloorNUM);//AchievePlatformFlag
LCD_DisplayStringLine(Line3,(unsigned char *)buf);
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}