第十三届蓝桥杯嵌入式省题(第一场)

前言

这次参加了蓝桥杯嵌入式十三届的第一场比赛,这次第一场是线上的比赛。
而且这次的比赛的难度不高,主要考的就是电子密码锁。

主要就考到了几个常考的考点。即:PWM、usart、led、key、lcd。

 使用平台:STM32RBT6(旧版)
 如果有需要代码的朋友们,可以留言一下邮箱我可发源码。

赛题分析

lcd分析

这里的lcd和平常的大多一样,分为两个页面,一个是密码输入界面和输出状态界面。
在输入密码界面主要有B1、B2、B3三位的密码。这三位密码主要通过串口修改。因此这个三位并不是我们所需要输入的密码。我们而是通过设置三个变量和B1、B2、B3去进行对比,当我们输入的密码和B1、B2、B3一致的时候我们就切换至输出状态界面。

输出界面主要就显示占空比和频率。

在这里插入图片描述
在这里插入图片描述
几个设置的变量:

/*********初始化密码:123*****************/
unsigned char B1=1;
unsigned char B2=2;
unsigned char B3=3;
/**********密码对比***********/
unsigned char mima1;
unsigned char mima2;
unsigned char mima3;

unsigned char A1=0;  //界面切换

key分析

前三个按键输入三位密码,每按一下按键(前三个按键)数值+1,范围是:0-9,第四个按键即是确认密码按键。
另外,题目还要求设备上电的时候或者重新进入密码输入界面的时候显示@字符。即:就是只有第一、二、三个按键按下的时候才不会显示@字符。

在这里插入图片描述
这里的@字符和数字字符的切换我用一个标志位变量进行判断

_Bool bb=0;  //密码显示字符  0:@ 1:其他数字

PWM分析

题目要求对pwm的频率进行更改,占空比不变。
即:在密码输入界面的时候频率为1khz,当密码输入正确的时候跳转到输出状态界面的时候频率变为2khz(在输出状态界面停留5s)。
在这里插入图片描述

usart分析

在这里插入图片描述
这个没啥好说的了,考的很多了这个串口修改密码的。

led分析

在这里插入图片描述
这里车辆最基本的设置外,还要led2的设置,输入三次密码都是错误的时候以0.1s闪烁。这里关键就是设置一个静态变量。
即:

static u8 cishu=0;   //错误的次数  

这里就题目分析完了,来看看总体全部代码

代码

#include "stm32f10x.h"
#include "string.h"
#include "stdio.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "key.h"
#include "lcd.h"

u32 TimingDelay = 0;
u8 RXBUT[20];
u8 RXCON=0;
u8 RXFLAY=0;
/*********初始化密码:123*****************/
unsigned char B1=1;
unsigned char B2=2;
unsigned char B3=3;
/**********密码对比***********/
unsigned char mima1;
unsigned char mima2;
unsigned char mima3;

_Bool bb=0;  //密码显示字符  0:@ 1:其他数字

unsigned char A1=0;  //界面切换

static u8 cishu=0;   //错误的次数  
unsigned char str[40];
unsigned char key_val;

extern u16 CCR2;

u32 TimingDelay1;
void Delay_Ms(u32 nTime);


void lcd(void)
{
  if(A1==0)   //输入密码界面
	{
		CCR2=1000;  //1khz   输入密码时频率为1kzh
	  LCD_DisplayStringLine(Line0,"                        ");  //清空
		LCD_DisplayStringLine(Line1,"        PSD          ");
		
		if(bb==0)   //未输入密码时显示@字符
		{
		  LCD_DisplayStringLine(Line3,"     B1:@          ");
			LCD_DisplayStringLine(Line5,"     B2:@          ");
			LCD_DisplayStringLine(Line7,"     B3:@          ");
		}
		else if(bb==1)  //输入密码时,将输入的密码显示(按键按下时)
		{
		  sprintf((char *)str,"     B1:%d          ",mima1);
		LCD_DisplayStringLine(Line3,str);
		
		sprintf((char *)str,"     B2:%d          ",mima2);
		LCD_DisplayStringLine(Line5,str);
		
		sprintf((char *)str,"     B3:%d          ",mima3);
		LCD_DisplayStringLine(Line7,str);
		}
		
	}
	else if(A1==1)  //频率和占空比显示界面
	{
		CCR2=500;   //2khz
	   LCD_DisplayStringLine(Line0,"                        ");
		LCD_DisplayStringLine(Line1,"        STA          ");
		
		
		LCD_DisplayStringLine(Line3,"     F:2000 HZ          ");
	
		LCD_DisplayStringLine(Line5,"     D:10%          ");
		
		LCD_DisplayStringLine(Line7,"                        ");
		
		led_scanf(0,led1);   //led1亮5s
		Delay_Ms(5000);
		led_scanf(1,led1);
		A1=0;                 //返回输入密码界面
		bb=0;                 //显示字符@
	}
}

void key(void)
{
	
  key_val=key_scanf();
	if(key_val==1||key_val==2||key_val==3) //无论哪个按键按下都显示输入值
	{
	  bb=1;
	}
	
	if(key_val==1)
	{
	  if(mima1!=9)
			mima1++;
		else if(mima1==9)
			mima1=0;
	}
	if(key_val==2)
	{
	  if(mima2!=9)
			mima2++;
		else if(mima2==9)
			mima2=0;
	}
	if(key_val==3)
	{
	  if(mima3!=9)
			mima3++;
		else if(mima3==9)
			mima3=0;
	}
	if(key_val==4)
	{
	  if(mima1==B1&&mima2==B2&&mima3==B3)  //密码正确时
		{
		  A1=1;              //第二个界面
			cishu=0;           //次数清零
			mima1=0;
			mima2=0;
			mima3=0;
		}
		else       //密码输入错误
		{	
			A1=0;     //回到密码输入界面
			bb=0;     //显示@字符
			cishu++;  //错误次数+1
			mima1=0;
			mima2=0;
			mima3=0;
		}
			
	}
}

void usart(void)
{
if(RXFLAY)
		{
		  RXFLAY=0;
			USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
			if((RXBUT[0]=='1')&&(RXBUT[1]=='2')&&(RXBUT[2]=='3')&&(RXBUT[3]=='-'))  //格式设置:123-密码
			{
			  usart_sting(USART2,RXBUT);  //串口上打印
				usart_sting(USART2,"      \r\n");
				B1=RXBUT[4]-48;
				B2=RXBUT[5]-48;
				B3=RXBUT[6]-48;
			}
			memset(RXBUT,'\0',sizeof(RXBUT));
		}
}
//Main Body
int main(void)
{
	SysTick_Config(72000);
	
	STM3210B_LCD_Init();
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	
	led_init();
	pwm_init();
	usart_init();
	key_init();
  
	
	//LCD_DisplayStringLine(Line9,(unsigned char *)"                    ");	
	
	while(1)
	{
	  lcd();
		key();
		usart();
		
		if(cishu>=3)  //次数》=3  闪烁5s
			{
			  led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				led_scanf(0,led2);
				Delay_Ms(100);
				led_scanf(1,led2);
				Delay_Ms(100);
				
				cishu=0;
				
			}

	}
}

void SysTick_Handler(void)
{
	TimingDelay--;
	
}

//
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}



  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叶同学要努力呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值