历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2019年10月16日 | 你从未见过的单片机密码锁设计(基本版)

发布者:快乐飞跃 来源: eefocus关键字:单片机  密码锁  基本版 手机看文章 扫描二维码
随时随地手机看文章

设计亮点:
1.使用OLED12864屏幕显示,具有用户菜单和管理员菜单,直观明了的设置使用流程(菜单未使用结构体或链表)
2.用户密码存储加密,使用BKDR哈希值计算并存储,防止从24C02中窃取密码
3.放弃传统的矩阵键盘,使用ADC键盘,连接上更加方便
4.如3项所示,密码为16进制,最大输入16位
5.对于添加了管理员密码的版本,使用内部EEPROM存储管理员密码(在本版本中,管理员密码明文存储)

简易操作说明:
上电进入用户模式锁定状态,在锁定状态下输入密码后,使用KEY1键确认,KEY2键取消,若密码正确,在按下确认键的时候会显示正确提示信息,松开按键进入用户菜单
如果用户模式下密码连续输入错误5次则自动锁死,此时可以重新上电清空错误计数或者进入管理员模式立即解锁,这种锁定不会自动解锁
在用户菜单下不进行任何操作5秒则自动上锁,使用KEY3、KEY4键进行选项的上下选择,KEY1键执行,KEY2键取消,在用户模式下按KEY2键取消会返回上锁状态
在用户模式锁定状态下,若硬件开关Hardware_Switch(P4^5)置0,按下KEY1键进入管理员认证,管理员密码输入流程与用户相同,密码正确则进入管理菜单
在管理员菜单下可以进行各样高权限操作,这些操作在程序上对用户模式屏蔽。
在管理模式菜单中各项选项的功能和操作说明如下:
1.立即解除锁定
    该选项将用户模式错误计数变量清零,没有提示信息,按下确认键即可
2.修改用户密码
    在管理员状态下修改用户密码不需要确认,直接输入新密码确定即立即生效,在输入密码时按下取消键原密码不改变
3.修改管理密码
    修改管理密码需要两步:身份认证和输入新密码。在任何一步按下取消键原密码不改变
4.常开常关选项
    当停用密码锁时返回用户状态时继电器常开
    当启用密码锁时用户模式正常
5.版本信息
    用于记录或显示某些信息,这些信息允许在编程阶段修改
6.退出管理模式
    选择此项按确定键和在任意项上按返回键效果一致,均回到管理员身份验证状态,希望回到用户模式时可以在管理员非密码修改模式下拔除Hardware_Switch(P4^5)跳帽或将其置高

考虑到的意外情况:
如果在关机时将AT24C02替换,且没有存储准确的信息,开机上电用户模式会自动锁死,需要管理员重置用户密码
实现机制:在AT24C02中不仅存放了用户密码的HASH值,也存入了4个字节的用户ID信息,这信息与烧录在程序中的用户ID信息必须一致,才能够通过上电检测,否则使用户锁定标志位有效

版本缺陷:

由于本版本是最初学习时尝试设计的,所以有一些问题和缺陷,随着后续的修改和测试逐渐发现的,但是已经无心更改。现列出所有问题如下所示:
1.继电器控制引脚的位定义未在包含文件语句(#include)之前,使得其他文件中对继电器的操作是直接给P00赋值,而非使用JDQ这个位定义名称,修改时需要注意;
2.继电器的控制三极管采用了NPN型,但是后来发现这样会导致上电吸合一次,在第二版中修正了这个错误但是本版本仍然保留;
3.本版本中设定密码开锁后5秒自动关锁,这个在程序中可以修改,需要注意一下;
4.按键按下会导致程序死循环,原因是仅仅使用了最简单的按键判断:即假设每个独立按键按下之后都会立即松开;
5.本版本中未添加时间修改函数,程序的时间是在下载程序的时候掐点矫正的,第二版会添加该功能。

 

 

 

 

 

 
单片机源程序如下:

#include

#include


sbit LED1=P3^0;

sbit LED2=P3^1;

sbit KEY1=P3^2;

sbit KEY2=P3^3;

sbit KEY3=P2^1;

sbit KEY4=P2^2;

//由于后续包含的文件中可能用到上述位定义故将这部分位定义放在包含文件的语句之前

#include"OLED_Display.c"

#include"DS1302_Driver.c"

#include"AT24C02_Driver.c"

#include"BKDR_HASH_Fuction.c"


sbit JDQ=P0^0;//继电器引脚


sbit Hardware_Switch=P4^5;//管理员/用户硬件开关 用户:1 管理员:0


//扩展作用域

extern unsigned char hash_result[4];


//运行数组

unsigned char user_ID[4]={0x92,0x5A,0xA0,0xC1};

unsigned char version[4]={0,9,0,8};//版本信息(自定义)

unsigned char Administrator_Password[16]={0,1,0,15,0,0,0,0,0,0,0,0,0,0,0,0};//管理员密码存放数组

unsigned char User_Password_Putin[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//用户密码输入临时存放数组

unsigned char Admin_Password_Putin[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//管理员密码输入临时存放数组

unsigned char Admin_Password_New_Temp[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//管理员密码修改时,新密码临时存放数组,可以考虑与输入临时存放数组复用


//运行变量

unsigned int ADC_DATA;//读取到的ADC转换值

unsigned char ADC_value=0;//设置一个读取到的按键位置值。位置值由电路连接确定,各个按键位置值由所连电阻分压大小依次顺序排列

unsigned char ADC_keyvalue=0;//读取到的ADC按键设定值。按键位置由电路而定可能并不规整,设定值为自定的各按键数值

unsigned char first_num=1;//管理模式第一项菜单标号


//运行计数

unsigned char choose=1;//用户菜单选择号,用于记录当前选中的菜单项目序号,默认在第一项位置

unsigned char cnt_user_putin_wrong=0;//用户输入错误计数

unsigned char t1_cnt=0;//定时器1运行计数


//运行标志位

bit flag_Identity=1;//身份标志位,表明当前所处身份状态 用户:1 管理员:0

bit En_Standby=1;//待机状态有效标志位(使能) 有效:1 无效:0

bit En_Admin=0;//管理员模式下管理有效标志位(使能) 有效:1 无效:0

bit User_Locker=0;//用户输入错误导致的锁定有效 有效:1 无效:0

bit Admin_Info=0;//管理员提示开关,在用户待机状态下显示某些信息 有效:1 无效:0

bit _ReLock=0;//自动锁定标志位,显示定时器是否已经到达计时时间 是:1 否:0


/*##############################################################################################

设计名称:电子锁设计

设计者:清河


版本:9.8.1

详情:已经初步完成功能设定,添加自动锁定功能,并排除BUG。丰富了注释内容。

        添加用户的断电密码记忆功能和密码加密存储功能,添加开机AT24C02判断


掉电存储构想:

        在每一次更新用户密码时将新密码hash值存放进存储器中,管理员密码明文存储


加密存储构想:

        使用加密函数将用户密码加密后存储,核对密码时通过加密函数求出特征值和存储器中的比对


存储安全性保证:为防止换用AT24C02导致使用不便或达到非法开锁的目的,分别使用AT24C02存储用户的密码HASH值

片外EEPROM:存放用户密码的HASH值,并存入检测字节,在系统启动时检测AT24C02是否有被改动过以提高系统安全性

扩展:如果有用户个性化的设置,也可以如此存放,便于管理


平台:STC15W4K48S4

硬件部分

独立按键:共4个,用于进行各项调整

ADC键盘:用于输入密码,本作品中可以输入16进制的密码,较平常10位密码更加安全,只要程序和电路做相应的修改,也可以实现在AD可分辨的情况下上百的按键键位

DS1302:配电池,实现断电走时,用于待机显示,如果在关机时取下电池或者替换DS1302则会出错,需要重新烧录程序初始化DS1302

LED指示灯:指示所处状态,本作品中进入用户模式则LED1亮,进入管理员模式则LED2亮

AT24C02:实现断电密码记忆功能,用于记录用户密码的HASH值


软件部分

使用定时器0实现对DS1302数据的定时读取,间隔50ms,以便更新当前的显示值

使用定时器1在用户解锁成功时定时上锁,设置的超时时间为5秒


操作说明:

上电进入用户模式锁定状态,在锁定状态下输入密码后,使用KEY1键确认,KEY2键取消,若密码正确,在按下确认键的时候会显示正确提示信息,松开按键进入用户菜单

如果用户模式下密码连续输入错误5次则自动锁死,此时可以重新上电清空错误计数或者进入管理员模式立即解锁,这种锁定不会自动解锁

在用户菜单下不进行任何操作5秒则自动上锁,使用KEY3、KEY4键进行选项的上下选择,KEY1键执行,KEY2键取消,在用户模式下按KEY2键取消会返回上锁状态

在用户模式锁定状态下,若硬件开关Hardware_Switch(P4^5)置0,按下KEY1键进入管理员认证,管理员密码输入流程与用户相同,密码正确则进入管理菜单

在管理员菜单下可以进行各样高权限操作,这些操作在程序上对用户模式屏蔽。

在管理模式菜单中各项选项的功能和操作说明如下:

1.立即解除锁定

        该选项将用户模式错误计数变量清零,没有提示信息,按下确认键即可

2.修改用户密码

        在管理员状态下修改用户密码不需要确认,直接输入新密码确定即立即生效,在输入密码时按下取消键原密码不改变

3.修改管理密码

        修改管理密码需要两步:身份认证和输入新密码。在任何一步按下取消键原密码不改变

4.常开常关选项

        当停用密码锁时返回用户状态时继电器常开

        当启用密码锁时用户模式正常

5.版本信息

        用于记录或显示某些信息,这些信息允许在编程阶段修改

6.退出管理模式

        选择此项按确定键和在任意项上按返回键效果一致,均回到管理员身份验证状态,希望回到用户模式时可以在管理员非密码修改模式下拔除Hardware_Switch(P4^5)跳帽或将其置高


考虑到的意外情况:

如果在关机时将AT24C02替换,且没有存储准确的信息,开机上电用户模式会自动锁死,需要管理员重置用户密码

实现机制:在AT24C02中不仅存放了用户密码的HASH值,也存入了4个字节的用户ID信息,这信息与烧录在程序中的用户ID信息必须一致,才能够通过上电检测,否则使用户锁定标志位有效


特别注意:继电器部分在本版本程序中没有考虑到上电初始控制电平的问题,上电瞬间会吸合一次,建议将所有JDQ位反向控制,并将OLED_Display.c中对P00的控制相应更改。

更改后外围电路上应采用PNP典型控制电路即P口低电平时继电器打开,否则关闭


经过再三考虑,不添加密码重置功能,即在添加掉电存储的程序版本中,一旦忘记用户密码和管理密码则无法找回,只能通过刷固件的方式重置密码以提高整体安全性

但是后期若能够添加指纹识别等模块,通过该个人生物识别的机制更改管理密码会使安全性得到很大的提升

##############################################################################################*/


void delay(unsigned int cnt)//调用该函数进行一段时间的延时

{

        while(cnt--);

}


unsigned char KeyScan()

{

        unsigned char ADC_keyvalue=0;//读取到的ADC按键设定值

        ADC_CONTR=0xea;//开始转换

        delay(1000);//这段暂停的时间用于等待AD转换完成

        switch(ADC_value)

        {

                case 0:ADC_keyvalue=12;break;

                case 1:ADC_keyvalue=13;break;

                case 2:ADC_keyvalue=14;break;

                case 3:ADC_keyvalue=15;break;

                case 4:ADC_keyvalue=11;break;

                case 5:ADC_keyvalue=10;break;

                case 6:ADC_keyvalue=9;break;

                case 7:ADC_keyvalue=8;break;

                case 8:ADC_keyvalue=4;break;

                case 9:ADC_keyvalue=5;break;

                case 10:ADC_keyvalue=6;break;

                case 11:ADC_keyvalue=7;break;

                case 12:ADC_keyvalue=3;break;

                case 13:ADC_keyvalue=2;break;

                case 14:ADC_keyvalue=1;break;

                case 15:ADC_keyvalue=0;break;

                default:ADC_keyvalue=16;break;

        }

        return ADC_keyvalue;

}


unsigned char Modify_User_Password()//用户密码更改函数,用于获取新值赋给用户密码数组

{

        unsigned char i;

        OLED_Clear();

        OLED_Show_CHinese(0,CCTitle7,1);//显示标题:修改密码

        for(i=0;i<16;i++)

        {

                OLED_Show_sChar(i*8,2,sChar3,1);//显示横线

        }

        OLED_Show_CHinese(4,CCInfo5,1);//显示说明文字:请输入新密码:

        

        for(i=0;i<16;)//进入输密码的环节

        {

                OLED_Show_Number(0,6,User_Password_Putin,i,1);//显示输入的值

                if(KeyScan()!=16)

                {

                        delay(5000);

                        if(KeyScan()!=16)

                        {

                                User_Password_Putin[i]=KeyScan();//记录每一次输入的值

                                i++;

                        }

                        while(KeyScan()!=16);//等待按键松开

                }

                

                if(KEY1==0||i==16)//如果确定键按下或输满16位

                {

                        delay(5000);

                        if(KEY1==0||i==16)

                        {

                                unsigned char k=0;

                                Password_BKDRHASH_Calculation(User_Password_Putin,16);//对输入的值求HASH值,保存在hash_result数组中

                                Save_User_Password();//保存新数据

                                for(k=0;k<16;k++)

                                {

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
关键字:单片机  密码锁  基本版 引用地址:你从未见过的单片机密码锁设计(基本版)

上一篇:基于单片机的简易计算器proteus仿真和源代码
下一篇:单片机AD7705转换程序

推荐阅读

DMA部分我用到的相对简单,当然,可能这是新东西,我暂时还用不到它的复杂功能吧。下面用问答的形式表达我的思路。DMA有什么用?直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。有多少个DMA资源?有两个DMA控制器,DMA1有7个通道,DMA2有5...
7 纳米芯片是当今已量产之最先进制程产品,金属材料加入钴(Co)是关键,但钴(Co)真的完全取代原先的铜(Cu)了吗?人工智慧及大数据时代来临,芯片也必须透过不断微缩提升效能?然而面对7 纳米先进制程,如何生产出效能更高、耗电更少、面积更小,又符合可靠度要求的芯片,是当今半导体制程上的重要课题。当今,随着摩尔定律,半导体7 纳米先进制程...
材料准备STC89c51/52 一块ESP8266-01一块手机一块第一 下载STC89c51示例程序(keil 编程开发)程序下载地址: cloud.bemfa点com/zip/stc89c51_wechat.zip程序说明,波特率9600,晶振11.0592由于ESP8266-01默认波特率是115200,需要先手动调节esp8266-01的波特率。调整方法:ESP8266-01连接到usb转ttl五根线esp8266---------UsbTTLtx----------rxrx-----...
今年以来已经有多家厂商推出了新一代折叠屏手机,例如华为、小米、三星等,还有消息称荣耀、OPPO、vivo、谷歌等厂商也将推出自家折叠屏手机。  数码博主 @数码闲聊站 透露,各厂商接下来还将推出多款折叠屏新机,例如小米将推出一款 MIX FOLD 改良款,并将引入屏下前摄,依然保持大屏内折设计。  此外,华为则将推出一款搭载海思麒麟 9...

史海拾趣

问答坊 | AI 解惑

心电参数_监护产品监护参数的检验方法(一)

一 监护产品检验方法介绍 监护产品是目前临床上用于实时监测重症或手术患者的各种生理参数的主要设备,在监护产品的研发、生产、检验以及在临床使用过程的定期检验和校准等过程都需要采用规范的检验手段和方法。按国内的标准要求,监护仪生产企业 ...…

查看全部问答∨

飞龙教程------51单片机

飞龙教程------51单片机 51单片机=====单片机的学习 http://v.ku6.com/show/2HAQ5tLXh4rUFyto.html 51单片机=====跑马灯(LED) http://v.ku6.com/show/ki1nwsD0YCYnrQX7.html 51单片机=====色环电阻识别方法 http://v.ku6.com/show/9ZxwxSeT ...…

查看全部问答∨

改了exportSDK文件后build SDK,pb没有弹出生成sdk的对话框

改了exportSDK文件后build SDK,pb没有弹出生成sdk的对话框,望解答,万分感谢!!!…

查看全部问答∨

wince中如何在SOURCE中定义字符串

有环境变量 SET PRJ_NAME=M8 想在一个.c文件里面能打印出这个项目名 RETAILMSG(1, (TEXT("PRJ_NAME = %s \\r\\n"), PRJ_NAME)); 在SOURCE里面,要如何写? CDEFINES=$(CDEFINES) -DPRJ_NAME=$(PRJ_NAME) 这样不行 CDEFINES=$(CDEFINES) - ...…

查看全部问答∨

关于硬件实现随机数的原理问题 急

我不清楚硬件实现随机数的原理问题,恰有人问我,因面子,希望哪位大硖帮一下…

查看全部问答∨

关于阿拉伯语言

阿拉伯字母在连写时会发生变形,我想要这些变形的字母表,我在unicode下载了ch08.pdf,但是拷贝出来会变,希望高手指导一下…

查看全部问答∨

DIY示波器规整贴(三)

   USB解决方案:          经过一周的USB学习,感受颇多,由于在网上申请了几片CH375,我就打算用这个芯片来做USB通信。CH375 是一个USB总线的通用接口芯片,支持USB-HOST 主机方式和USB ...…

查看全部问答∨

在IAR下程序编译通过 可是在SmartRF Flash Programmer 却无法烧写

SmartRF Flash Programmer 下面烧写进度条提示:Could not open the hex-file! 尝试了很多次都不行 把hex文件改名重新编译 新建工程都不行 是不是程序有问题啊?我试了其他案例程序却可以烧写…

查看全部问答∨

stm32f103zd究竟有多少路AD??

stm32f103zd究竟有多少路AD??…

查看全部问答∨

求助zigbee睡眠与唤醒

求大神指导,最近在做zigbee低功耗,就是采用周期性点播函数进行温湿度采集,10秒发送一次,现在想在这10秒不发信息的时间段,让zigbee进入休眠状态,十秒后唤醒,然后发温湿度,然后再睡眠。      我看帖子大家说的都是低功 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved