STM32实战项目—密码锁


🎀 文章作者:二土电子

🌸 关注文末公众号获取其他资料和工程文件!

🐸 期待大家一起学习交流!


一、任务要求

设计一款密码锁,通过串口输入输出信息。需要实现以下功能

  • 开机提示“欢迎使用智能密码锁系统”,换行回车后显示“请输入密码”
  • 输入六位任意字符密码,不能是汉字。如果密码正确,返回“密码正确,已开门”。如果密码错误,返回“密码错误,您还有*次输入机会”
  • 如果连续三次输入密码错误,提示“三次密码错误,警报!”。此时,LED闪烁报警
  • 如果输入“Enter(空格)Admin(空格)Mode”,返回“已进入管理员模式”,换行之后显示“请输入管理员密码”。输入密码正确后,提示“管理员密码正确”,进入管理员模式。管理员密码默认为“147258”。如果管理员密码输入错误,提示“管理员密码错误”
  • 进入管理员模式后,提示“请输入新密码”。输入完成一次后提示“请再次输入新密码”。连续两次输入正确后,提示“密码修改成功”,自动退出管理员模式。如果两次密码不一致,会提示“连续两次输入密码不同,请重新输入”。如果新密码与原密码相同,会提示“新密码请勿与原密码相同”
  • 如果输入内容错误,会提示“Error!”,回车加换行

二、实现方法

2.1 输入密码判断

首先有一个默认密码“123456”。将密码存储到一个数组中。接收到输入密码后,利用for循环,挨个比较串口接收数组中接收输入的密码是否与密码数组中密码相同。相同的话,提示“密码正确,已开门”。如果错误,累计错误次数,提示“密码错误,您还有*次输入机会”。如果三次输入任意一次正确,会将之前累计的错误次数清零。如果三次输入均错误,提示“三次密码错误,警报!”。此时,LED闪烁报警。

2.2 管理员模式

如果串口接收中断中接收到内容后,利用for循环,挨个对比指令是否为进入管理员模式指令。如果是进入管理员模式指令,返回“已进入管理员模式”,换行回车后显示“请输入管理员密码”。密码的判断方法与最开始的输入密码相同。

2.3 修改密码

进入管理员模式且正确输入密码后,可以修改密码。修改密码时,第一次输入后会首先拿新密码与原密码比较。如果新密码与原密码相同,返回“新密码请勿与原密码相同”。如果第二次输入密码后,判断与第一次的密码手抖相同。如果两次输入的密码相同,提示“密码修改成功”。然后自动退出管理员模式。

三、程序设计

3.1 输入密码判断

如果接收到的内容长度为六位,而且此时不是管理员模式。会对输入的密码进行判别。正确返回正确信息,错误提示错误信息。连续三系错误,提示报警。同时,LED闪烁。三次中任意一次输入正确,清零错误累计次数。程序设计如下

// 输入密码判断
void PassWord_Judge (void)
{
	u8 tempVar = 0;   // 临时循环变量
	u8 judgeRes = 0;   // 判别结果
	
	// 非管理员模式下输入密码
	if (gAdminFlag == 0 && gPassWordFlag == 1 && gPassWordChargeFlag == 0)
	{
		// for循环判断密码是否正确
		for (tempVar = 0;tempVar < 6;tempVar ++)
		{
			// 任意一位密码错误,就说明密码错误
			if (gReceFifo[tempVar] != gPassWord[tempVar])
			{
				judgeRes = 1;
			}
		}
		
		// 提示密码正确
		if (!judgeRes)
		{
			printf ("密码正确,已开门\r\n");
			gPassWordErrorCunt = 0;   // 清零密码错误计数变量
		}
		// 密码错误
		else
		{
			gPassWordErrorCunt = gPassWordErrorCunt + 1;   // 密码错误计数变量加1
			
			// 连续三次密码错误,报警
			if (gPassWordErrorCunt >= 3)
			{
				printf ("三次密码错误,警报!\r\n");
				gPassWordErrorCunt = 0;   // 清零密码错误计数变量
				
				// LED闪烁报警
				tempVar = 5;
				while (tempVar > 0)
				{
					Med_Led_StateReverse(LED1);   // LED闪烁
					delay_ms(200);
					tempVar --;
				}
			}
			else
			{
				printf ("密码错误,您还有%d次输入机会\r\n",3 - gPassWordErrorCunt);
			}
			
			judgeRes = 0;   // 清零判别结果
		}
		
		gPassWordFlag = 0;   // 清零输入密码标志位
		Clear_Rece();   // 清空接收数组
	}
	
	// 管理员模式下输入密码
	if (gAdminFlag == 1 && gPassWordFlag == 1 && gPassWordChargeFlag == 0)
	{
		// for循环判断密码是否正确
		for (tempVar = 0;tempVar < 6;tempVar ++)
		{
			// 任意一位密码错误,就说明密码错误
			if (gReceFifo[tempVar] != gAdminPassWord[tempVar])
			{
				judgeRes = 1;
			}
		}
		
		// 提示密码正确
		if (!judgeRes)
		{
			printf ("管理员密码正确\r\n");
			printf ("请输入新密码\r\n");
			gPassWordChargeFlag = 1;   // 修改密码标志位置1
		}
		else
		{
			printf ("管理员密码错误\r\n");
			judgeRes = 0;   // 清零判别结果
		}
		
		gPassWordFlag = 0;   // 清零输入密码标志位
		gAdminFlag = 0;   // 清零进入管理员模式标志位
		Clear_Rece();   // 清空接收数组
	}
}

密码判断有两种,一种是非管理员模式的密码判断,一种是管理员模式密码判断。编程时利用标志位进行了区分。

3.2 进入管理员模式

利用for循环,当接收内容长度为18(进入管理员模式指令加回车换行,共18个)时,判断指令是否与进入管理员指令相同。以此来判断是否需要进入管理员模式。程序设计如下

/*
 *==============================================================================
 *函数名称:Uart_Rece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
extern u8 gAdminFlag;   // 进入管理员模式标志位
extern u8 gPassWordFlag;   // 输入为密码的标志位
void Clear_Rece (void);   // 清空串口接收数组

u8 gAdminMode[16] = "Enter Admin Mode";

void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{
	u8 tempVar = 0;   // 临时循环变量
	
	// 接收内容长度为6
	if (gReceCount == 8)
	{
		gPassWordFlag = 1;   // 接收内容为密码
	}
	// 接收到进入管理员模式指令
	else if (gReceCount == 18)
	{
		for (tempVar = 0;tempVar < 16;tempVar ++)
		{
			// 错误指令
			if (gReceFifo[tempVar] != gAdminMode[tempVar])
			{
				printf ("Error!\r\n");
			}
		}
		
		printf ("已进入管理员模式\r\n");
		printf ("请输入管理员密码\r\n");
		// 进入管理员模式标志位置1
		gAdminFlag = 1;
		Clear_Rece();   // 清空接收内容
	}
	// 错误指令
	else
	{
		printf ("Error!\r\n");
		Clear_Rece();   // 清空接收内容
	}
}

这里把判断是否为输入密码的程序也加进来了,比较简单,就不再单独介绍了。

3.3 修改密码

修改密码只需要定义一个数组用来接收新密码。第一次接收到新密码后,与原密码对比。如果与原密码相同,返回对应信息。如果不同,提示“请再次输入新密码”。然后再拿接收数组中的新输入密码与第一次输入的密码对比,相同提示“密码修改成功”。程序设计如下

// 修改密码
void PassWord_Charge (void)
{
	u8 tempVar = 0;   // 临时循环变量
	u8 judgeRes = 0;   // 判别结果
	
	// 第一次输入新密码
	if (gPassWordChargeFlag == 1 && gPassWordFlag == 1)
	{
		// for循环判断新密码是否与原密码相同
		for (tempVar = 0;tempVar < 6;tempVar ++)
		{
			if (gReceFifo[tempVar] != gPassWord[tempVar])
			{
				judgeRes = 1;
			}
		}
		
		// 新密码与原密码相同
		if (!judgeRes)
		{
			printf ("新密码请勿与原密码相同\r\n");
			judgeRes = 0;   // 清零判别结果
		}
		else
		{
			// for循环用新密码覆盖原密码
			for (tempVar = 0;tempVar < 6;tempVar ++)
			{
				gPassWord[tempVar] = gReceFifo[tempVar];
			}
			gPassWordChargeFlag = 2;   // 标志位变为2,提示下一次准备再次确认新密码
			printf ("请再次输入新密码\r\n");
		}
		
		gPassWordFlag = 0;   // 清零输入密码标志位
		Clear_Rece();   // 清空接收数组
	}
	
	// 第二次输入新密码
	if (gPassWordChargeFlag == 2 && gPassWordFlag == 1)
	{
		// for循环判断新密码是否与上次输入的新密码相同
		for (tempVar = 0;tempVar < 6;tempVar ++)
		{
			if (gReceFifo[tempVar] != gPassWord[tempVar])
			{
				judgeRes = 1;
			}
		}
		
		// 连续两次输入新密码相同
		if (!judgeRes)
		{
			printf ("密码修改成功\r\n");
			gPassWordChargeFlag = 0;   // 清零修改密码标志位
		}
		else
		{
			printf ("连续两次输入密码不同,请重新输入\r\n");
		}
		
		gPassWordFlag = 0;   // 清零输入密码标志位
		Clear_Rece();   // 清空接收数组
	}
}

四、问题总结

4.1 输入内容一直提示Error

这个原因是清除接收数组的位置不对。在while(1)轮询中有一个清除接收数组,导致还未进行判断,接收内容就已经被清除。清除接收数组内容,一定要放在每一个if判断里面,而不能放在外面。

4.2 密码判断一直错误

原因是程序中存储密码的数组定义错误。最开始的定义方法如下

u8 gPassWord[6] = {1,2,3,4,5,6};   // 密码,初始为123456
u8 gAdminPassWord[6] = {1,4,7,2,5,8};   // 管理员密码,147258

这么定义,数组中的每一位数就是数字,而不是字符。如果想定义成字符,应该像下面这样定义

u8 gPassWord[6] = {'1','2','3','4','5','6'};   // 密码,初始为123456
u8 gAdminPassWord[6] = {'1','4','7','2','5','8'};   // 管理员密码,147258

五、成果展示

5.1 输入密码判断

输入密码判断
密码错误报警

5.2 进入管理员模式

进入管理员模式

5.3 修改密码

修改密码

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
6位密码锁是一种基于STM32微控制器的密码锁系统,用于保护物品或区域的安全。STM32是一种高性能、低功耗的微控制器,广泛应用于各种嵌入式系统中。 这个6位密码锁系统主要由STM32微控制器、按键、数码管、电源和电磁锁等组成。用户可以通过按键输入密码,并通过数码管进行密码输入的显示和验证。当用户输入正确的密码时,电磁锁会被解锁,允许用户打开所保护的物品或区域。 在这个系统中,STM32微控制器负责密码的输入、验证和控制电磁锁的开关。它通过检测按键输入,将按键对应的数字输入到密码变量中。当用户输入完整的6位密码后,STM32会对密码进行验证,如果密码正确,则发送信号给电磁锁,使其解锁。同时,STM32还负责通过数码管显示用户输入的密码,以及状态指示灯的控制以提供用户反馈。 这个密码锁系统具有一定的安全性。首先,密码长度为6位,增加了密码猜测的难度。其次,通过STM32微控制器进行密码验证,避免了简单的电路开关或机械锁易受攻击的问题。同时,由于系统采用了数字输入和集成电路控制,更加便于管理和维护。 总而言之,STM32 6位密码锁是一款基于STM32微控制器的密码保护系统,通过密码输入、验证和控制电磁锁的开关,提供了一定的安全性和便利性,适用于各种物品或区域的保护需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二土电子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值