蓝桥杯17年赛题解析

蓝桥杯17年赛题
一、 基本要求
1.1 使用 CT117E 嵌入式竞赛板,完成试题功能的程序设计与调试;
1.2 设计与调试过程中,可参考组委会提供的“资源数据包”;
1.3 Keil 工程文件以准考证号命名,完成设计后,提交完整、可编译的 Keil
工程文件到服务器。
二、 硬件框图
“模拟升降控制器” 模拟升降机的运行过程。通过按键设定到达目标平台,
双路 PWM 输出分别模拟控制上下行电机和开关门电机, LED 流水灯模拟运行
方向。 系统框图如图 1 所示:
图 1 系统框图
三、 功能描述

  1. LCD 显示
    LCD 显示时钟和当前所在平台。 当升降机运行到目标平台时, 平台数字在 1
    秒内闪烁 2 次。 系统上电后升降机默认位于平台 1, 升降机门默认为打开状
    态。
    图 2. LCD 显示界面参考图
    LCD 显示
    MCU
    按键控制
    双路 PWM 输出
    LED 流水指示
    方向控制
    PA6-7
    当前平台
    1
    12: 50: 55
    PA4-52 / 2
  2. 按键功能
    4 个按键分别代表 4 个平台。按下后通过点亮 LED 指示要到达的平台
    (LD1-LD4, LD1 对应平台 1,依此类推), 当升降机到达目标平台时, 对应
    LED 灯熄灭。按下当前平台对应的按键无效。一次可以设定多个目标平台,
    上下平台都有按键时, 运行顺序是先上后下。
    在最后一次按键按完 1 秒之后,模拟电机开始运行: 升降机先关门, 运行到
    下一层后开门; 如果还有目标平台, 则开门后停留 2 秒,然后关门,继续运
    行到下一个目标平台,直到没有目标平台。
    当设置多个目标平台时, 升降机的升降顺序与按键顺序无关, 先按从低到高
    的顺序走完设定的上行平台,再按从高到低的顺序走完设定的下行平台。
    电机运转期间按键无效。
  3. PWM 输出
    两路 PWM 输出分别控制上下行电机(PA6)和开关门电机(PA7),并分别
    用一路方向控制信号控制电机的运转方向。 PA4 高电平表示升降机上行, 反
    之表示升降机下行。 PA5 高电平表示升降机开门, 反之表示关门。
    上下每层平台的电机运行时间为 6 秒, 升降机开关门时间为 4 秒。
    上下行电机控制信号的频率为 1KHz。升降机上行时,PWM 信号占空比为 80%;
    升降机下行时, PWM 信号占空比为 60%。
    开关门电机控制信号的频率为 2KHz。升降机开门时,PWM 信号占空比为 60%;
    升降机关门时, PWM 信号占空比为 50%。
  4. LED 流水指示
    升降机上下行时, 4 个 LED(LD5-LD8) 组成流水灯用来表示升降机的运行
    方向。合理选择流水灯的流水方式和时间间隔。
  5. 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);	
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鲲君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值