STM32实战项目—密码锁

该项目的完整工程可以在博主的资源里找到,仅供参考。

文章目录

  • 一、任务要求
  • 二、实现方法
    • 2.1 输入密码判断
    • 2.2 管理员模式
    • 2.3 修改密码
  • 三、程序设计
    • 3.1 输入密码判断
    • 3.2 进入管理员模式
    • 3.3 修改密码
  • 四、问题总结
    • 4.1 输入内容一直提示Error
    • 4.2 密码判断一直错误
  • 五、成果展示
    • 5.1 输入密码判断
    • 5.2 进入管理员模式
    • 5.3 修改密码

一、任务要求

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

  • 开机提示“欢迎使用智能密码锁系统”,换行回车后显示“请输入密码”
  • 输入六位任意字符密码,不能是汉字。如果密码正确,返回“密码正确,已开门”。如果密码错误,返回“密码错误,您还有*次输入机会”
  • 如果连续三次输入密码错误,提示“三次密码错误,警报!”。此时,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;   // 临时循环变量// 接收内容长度为6if (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");// 进入管理员模式标志位置1gAdminFlag = 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 修改密码

修改密码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9219.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADB原理,常用命令汇总及示例

一. ADB简介 ADB&#xff0c;即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具&#xff0c;它可为各种设备操作提供便利&#xff0c;如安装和调试应用&#xff0c;并提供对 Unix shell&#xff08;可用来在模拟器或连接的设备上运行各种…

对话小红书剑寒:如何跨方向技术融合,全局优化打造更智能的音视频系统?...

编者按&#xff1a;在 AI 时代&#xff0c;随着 ChatGPT 掀起技术狂潮&#xff0c;构建更智能的音视频系统已经成为音视频领域从业者的共同目标。 然而&#xff0c;音视频系统的智能化&#xff0c;每个从业者对其都有自己独特的视角和理解&#xff0c;正如“一千个人眼中有一千…

基于FreeRTOS的嵌入式设备管理关键技术研究及实现(学习四)

硬件平台 终端设备的硬件选型主要由STM32芯片作为处理器&#xff0c;板载时钟电路和电源电路以及对外通信串口&#xff0c;并挂载AM2302温湿度传感器来实时收集环境相关信息&#xff0c;将收集到的信息通过NB-IoT通信模组上传到云端&#xff0c;从而实现整个环境监测功能。 主…

基于jsp+Servlet+mysql学生信息管理系统V2.0

基于jspServletmysql学生信息管理系统V2.0 一、系统介绍二、功能展示1.项目骨架2.数据库表3.项目内容4.登陆界面5.学生-学生信息6、学生-修改密码7、管理员-学生管理8、管理员-添加学生9.管理员-修改学生信息10.管理员-班级信息11.管理员-教师信息 四、其它1.其他系统实现五.获…

【Linux】LVS负载均衡群集 NAT模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LVS负载均衡群集 NAT模式 一、理解负载均衡群集的原理1.企业群集应用概述2.企业群集分类3.负载均衡群集架构4.负载均衡群集工作模式分析5.NAT模式6.TUN模式7.DR模式 二、LVS虚…

CMU 15-445 -- Tree Indexes - 05

CMU 15-445 -- Tree Indexes - 05 引言Table IndexB TreeB-Tree FamilyB TreeB Tree NodesB Tree OperationsIn Practice Clustered IndexesCompound IndexB Tree Design ChoicesNode SizeMerge ThresholdVariable Length KeysNon-unique IndexesIntra-node Search Optimizatio…

SpringBoot(原理篇)

SpringBoot原理篇 自动配置 bean加载方式 xml方式声明bean 相关类&#xff1a; domain域中的实体类&#xff1a; public class Mouse { }public class Cat { }public class Dog { }测试&#xff1a; public class App1 {public static void main(String[] args) {ClassP…

【hadoop】Linux安装和配置

安装 RedHat Linux 7.4 创建新的虚拟机 选择“自定义&#xff08;高级&#xff09;” 选择“下一步” 选择“稍后安装操作系统” 选择操作系统的类型 设置虚拟机名称和保存路径 下一步 下一步 设置网络类型&#xff0c;选择“使用仅主机模式网络” 下一步 下一步 下一步 设置硬…

Web3本地搭建truffle智能合约开发环境

之前的几篇文章 我们是成功的操作了我们本地区块链的 那么 本文 我们就来说说智能合约 啊 不容易啊 扯了这么久 终于到这了 智能合约是部署在区块链上 不可逆的 一种去中心化的程序&#xff0c;他没有任何第三方公司来管理这个程序和数据 然后 还有就是怎么连接到区块链上的智能…

垃圾回收器

CMSParNew配置 -Xms7500m -Xmx7500m 初始堆大小 -Xmn3000m # 新生代大小 -Xss512k # 每个线程的堆栈大小 -XX:MaxMetaspaceSize512m # 设置类元数据区的最大大小(限制Metaspace增长的上限&#xff0c;防止因为某些情况导致Metaspace无限的使用本地内存&#xff0c;影响到其他…

css重点学习

一、选择器 1.标签名选择器 div{border: 5px blue dotted;color: aquamarine;font-size: 20px;} <body><div id"div001">div标签1</div><div id"002">div标签2</div> </body> //只写出了重点部分 2.id选择器 #div0…

蓝桥杯专题-试题版含答案-【猜算式】【排列序数】【还款计算】【滑动解锁】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…