首页 > 其他分享 >基于状态机STM32/51密码锁

基于状态机STM32/51密码锁

时间:2023-05-20 15:32:18浏览次数:49  
标签:STM32 IDLE else 状态机 state num key 按键 密码锁

1、状态机讲解

状态机其实在学习数字电路的接触过但是我已经忘得差不多了,由于我的毕业设计是关于FPGA的题目,状态机是重中之重。 刚才在贴吧有uu们问关于单片机之类的密码锁的问题,突然想到之前蓝桥杯当时也有类似的题目,我当时处理的不是特别好,所以现在想着用C去实现,本科毕设时我导师是一直让我使用三段状态机,模式固定,逻辑清晰,写起来也比较容易,说白了就是一个流程图。

基于状态机STM32/51密码锁_状态机

在FPGA里面由于我们都是在clk跳变时才会变化,但是单片机程序编写时没有这种拘束,所以第一段可以抛弃,保留第二段、第三段即可,第二段触发条件就是按键按下(描述状态切换),第三段主要根据当前状态去判断(根据状态进行响应输出)。

2、C/C++实现方式

代码我虽然用的是C++,但是基本参照C来。设置开门密码为 34688,这里我只给了大家理想的转换图(按照密码输入),也就是说当在TWO状态时我按下8,此时按键组合为348,完全不符合密码要求直接回到IDLE,如果按下3时按键组合为343回到ONE,因为现在第一位是3符合要求。 如果大家实在不理解状态机直接看我的流程图以及代码就可以,很好理解

#include <iostream>

using namespace std;

//开门密码为34668
//定义各状态,状态数=密码位数+空状态
#define  IDLE   0
#define	 ONE    1
#define  TWO    2
#define  THREE  3
#define  FOUR   4
#define  FIVE   5
//定义状态
int state = IDLE;
//函数声明
void Key_scan();
void Trans_state();
void Out_put();
//全局变量区
int  key_num=0;
bool key_flag=0;

void main()
{
	while (1)
	{
		Key_scan();//按键扫描函数
		Trans_state();//状态转换函数
		Out_put();//状态判断函数
	}
	

}


void Key_scan()
{

	cout << "请输入当前密码:" ;

	cin >> key_num;  //这里模仿我们日常的按键检测,实际操作时每次进入Key_Scan函数时初始化num数值为0,

	if (key_num == 0) //如果还是0的话表示无按键按下
		key_flag = 0;
	else
		key_flag = 1;//按键按下的标志位
}

/*实际操作
void Key_scan()
{
	key_num=-1;

	*按键检测执行*
	//在实际操作中按键是有0按键的,所以初始化为-1会更好 
	
	if (key_num == -1) //如果还是0的话表示无按键按下
		key_flag = 0;
	else
		key_flag = 1;//按键按下的标志位
}

*/

void Trans_state()
{
	if (key_flag )//按键按下标志位有效才会进行判断
	{
		switch (state)
		{
		case IDLE: 
			if (key_num == 3)
				state = ONE;
			else
				state = IDLE;
			break;

		case ONE:
			if (key_num == 4)
				state = TWO;
			else if (key_num == 3)
				state = ONE;
			else
				state = IDLE;
			break;

		case TWO:
			if (key_num == 6)
				state = THREE;
			else if (key_num == 3)
				state = ONE;
			else
				state = IDLE;
			break;

		case THREE:
			if (key_num == 6)
				state = FOUR;
			else if (key_num == 3)
				state = ONE;
			else
				state = IDLE;
			break;

		case FOUR:
			if (key_num == 8)
				state = FIVE;
			else if (key_num == 3)
				state = ONE;
			else
				state = IDLE;
			break;

		case FIVE:
			state = IDLE;
			break;

		default:
			state = IDLE;
			break;
		}
	}
}

void Out_put()
{
	if (state == FIVE)
	{
	  state = IDLE;
	  cout << "门锁打开" << endl;//实际操做可以利用LED表示
	}
		
}
/*实际操作
void Out_put()
{
	if (state == FIVE)
	{
	   state = IDLE;
	   LED0=1;
	}
	        
	else
		LED0=0;//不要忘记其他状态关闭哦
}
*/

基于状态机STM32/51密码锁_嵌入式_02

3、STM32F103ZET6最小系统板上板测试

由于按键原因,密码修改为12212

#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
 

//开门密码为12212
//定义各状态,状态数=密码位数+空状态
#define  IDLE   0
#define	 ONE    1
#define  TWO    2
#define  THREE  3
#define  FOUR   4
#define  FIVE   5
//定义状态
u8 state = IDLE;
//函数声明
void Key_scan();
void Trans_state();
void Out_put();
//全局变量区
u8  key_num=0;
u8  key_flag=0;
 int main(void)
 {
	delay_init();	    	 //延时函数初始化	  
	KEY_Init();          //初始化与按键连接的硬件接口
	uart_init(115200);
	while(1)
	{
		Key_scan();//按键扫描函数
		Trans_state();//状态转换函数
		Out_put();//状态判断函数
  }
}




void Key_scan()
{
	key_num= 0;
	//*按键检测执行*
	//在实际操作中按键是有0按键的,所以初始化为-1会更好
  if(!KEY0|!KEY1)
	{
		delay_ms(10);
		  if(!KEY0|!KEY1)
			{
				if(!KEY0)      key_num=1;
				else           key_num=2;
				while(!KEY0|!KEY1);//松手检测
				printf("当前按下的按键:%d\r\n",key_num);
			}
	}
	
	if (key_num == 0) //如果还是0的话表示无按键按下
		key_flag = 0;
	else
		key_flag = 1;//按键按下的标志位
}



void Trans_state()
{
	if (key_flag )//按键按下标志位有效才会进行判断
	{
		switch (state)
		{
		case IDLE: 
			if (key_num == 1)
				state = ONE;
			else
				state = IDLE;
			break;

		case ONE:
			if (key_num == 2)
				state = TWO;
			else if (key_num == 1)
				state = ONE;
			else
				state = IDLE;
			break;

		case TWO:
			if (key_num == 2)
				state = THREE;
			else if (key_num == 1)
				state = ONE;
			else
				state = IDLE;
			break;

		case THREE:
			if (key_num == 1)
				state = FOUR;
			else
				state = IDLE;
			break;

		case FOUR:
			if (key_num == 2)
				state = FIVE;
			else if (key_num == 1)
				state = ONE;
			else
				state = IDLE;
			break;

		case FIVE:
			state = IDLE;
			break;

		default:
			state = IDLE;
			break;
		}
	}
}

void Out_put()
{
	if (state == FIVE)
	{
	   state = IDLE;
	   printf("密码正确\r\n");
	}
	        
}

基于状态机STM32/51密码锁_嵌入式_03

解释一下为什么我不限制密码输入的位数(可以理解我们手机锁屏,只能输入4位),这样其实是很好的安全方式,假如有人在看我们输密码,只要我们输入的密码里含有正确密码即可,4412212与7612212都是正确密码。

标签:STM32,IDLE,else,状态机,state,num,key,按键,密码锁
From: https://blog.51cto.com/u_16086695/6317615

相关文章

  • 四位阳数码管显示 stm32
      #ifndef__LED595_H#define__LED595_H#include"main.h"#defineSDI_595PCout(8)/*1bit数据*/#defineSCLK_595PCout(9)/*将串行数据锁存到并口驱动LED,一个高低电平变化*/#defineLOAD_595PCout(10)/*将串行数据锁存到并口驱动LED,一个高低电平变化*/void......
  • STM32 开发工具集 All In One
    STM32开发工具集AllInOneSTM32F103C8T6STM32的3种启动模式自举加载程序Bootloader从程序闪存存储器自举从系统存储器自举从内部SRAM自举https://cdn.xgqfrms.xyz/STM32/STM32F103x8B_DS_CH_V10.pdfhttps://www.st.com/resource/en/application_note/cd001......
  • 关于STM32Cube_FW_F1_V1.8.0内的example顶层程序设计逻辑 与 RTC_Calendar增补
     Examples内程序结构STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Examples内程序结构分析如下:使用外设XXX向工程添加 stm32f10x_XXX.c修改stm32f10x_conf.h 在stm32f1xx_hal_msp.c中写 外设XXX写初始化程序在stm32f1xx_it.c中写中断服务程序在main.c中写配置程......
  • STM32 单片机烧录程序的方式 All In One
    STM32单片机烧录程序的方式AllInOneSTM32F103C8MCU微控制器MPU微处理器https://www.st.com/zh/microcontrollers-microprocessors/stm32f103c8.htmlhttps://www.st.com/zh/microcontrollers-microprocessors/stm32f103.html烧录方式Stlink-V2仿真器/Stlink-V3......
  • 记录stm32多重ADC模式
    为什么要使用多重ADC模式呢?主要是馋多重ADC模式下可以轻易实现采样率翻倍的效果实现原理可以参考这篇ADI的文章:交织采样ADC基础的基本原理|亚德诺半导体(analog.com)总结:解决了单个ADC采样需要等待转换结束才能继续采样的问题,代价是使用更多的ADC上个......
  • PB6接SCL,PB7接SDA,IIC通信访问 24C02, STM32F103的HAL版本
    在野火霸道板子上,已有at24c02,256个字节。/*测试代码*/staticuint8_tflag;uint8_tdata_w[]={1,2,3,4,5};uint8_tdata_r[5]={0};AT24CXX_Init();//初始化IIC接口flag=AT24CXX_Check();//检查器件if(flag==0){u16Writ......
  • STM32+HAL库+SHT30温湿度传感器模块I2C通讯数字型
    模块与接线SHT30模块与引脚SCL-------PA4SCL--------PA5实现步骤:  1、IIC地址 0x45(板子上有)  2、启动温湿度测量写入0x2c0x06  3、延时10ms,等待测量结束  4、读测量值,发读指令,延时1ms,接收测量结果。  5、采样值转换为温度值、湿度值程序代......
  • 激光切割机打标机雕刻机打码机控制系统上位机源码,完全自主开发,控制系统用stm32f407平
    激光切割机打标机雕刻机打码机控制系统上位机源码,完全自主开发,控制系统用stm32f407平台开发,上位机用C#开发,上位机具备x.y.z手动控制功能,圆弧插补,画正弦波,直线,往复运动,回原点,激光开关控制,强度设定等功能,速度和移动距可设置,圆弧插补输入半径即可。在上位机点击导入坐标文件会打开选......
  • co2激光切割机控制系统上位机C#源码,stm32f407控制板源码,可用于雕刻机,切割机,写字机,点胶
    co2激光切割机控制系统上位机C#源码,stm32f407控制板源码,可用于雕刻机,切割机,写字机,点胶机。标价为最低价,谢绝还价功能描述:1.自动解析G代码并在主界面还原图形显示2.可手动操作xy轴3.显示g代码坐标文件4.回原点控制。5.支持图形缩放,鼠标拖动YID:622500643037657099......
  • 激光切割机雕刻机桌面打标机打码机点胶机写字机上位机C#源码STM32F407控制板源码
    激光切割机雕刻机桌面打标机打码机点胶机写字机上位机C#源码STM32F407控制板源码可用在各类切割机、雕刻机、打标机、点胶机、写字机、打孔机控制板STM32F407支持3轴手动操作,鼠标单击运行距离和速度可设置,通信方式为串口轴控模式:两轴和三轴三轴模式可调节z轴作为升降和角度控......