前言
这次参加了蓝桥杯嵌入式十三届的第一场比赛,这次第一场是线上的比赛。
而且这次的比赛的难度不高,主要考的就是电子密码锁。
主要就考到了几个常考的考点。即: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);
}