历史上的今天
返回首页

历史上的今天

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

正在发生

2019年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++)

                                {

推荐阅读

史海拾趣

Advanced Detector Corp公司的发展小趣事

随着技术的不断成熟和市场的扩大,ADC开始将业务扩展到更广泛的领域。公司不仅继续深耕探测器领域,还逐渐拓展到传感器、测量仪器等多个领域。通过不断推出多样化的产品,ADC成功满足了不同客户的需求,并在市场上取得了良好的口碑。

Data Translation Inc公司的发展小趣事

随着公司业务的不断发展,Data Translation开始寻求全球扩张的机会。公司通过设立海外分支机构、与当地企业合作等方式,成功将产品推向全球市场。同时,公司还加大了品牌建设的力度,通过参加国际展会、发布新产品等方式提高品牌知名度。这些举措不仅为公司带来了更多的客户和合作伙伴,还进一步巩固了其在全球数据采集和处理领域的领先地位。

Eurohm Resistors公司的发展小趣事

随着环保意识的不断提高,Eurohm Resistors公司积极响应绿色发展的号召。公司投入大量资源研发环保型电阻器产品,采用可再生材料和绿色生产工艺,降低产品对环境的影响。同时,公司还积极参与各种环保活动,推动行业的绿色发展。

Faraday Technology公司的发展小趣事

在全球化的浪潮下,Eurohm Resistors公司积极拓展海外市场。公司深入分析了全球电子行业的发展趋势和市场需求,制定了详细的市场拓展计划。通过与当地合作伙伴的紧密合作,Eurohm Resistors成功打入了多个国家和地区的市场,实现了全球化布局。

Deutronic Elektronik GmbH公司的发展小趣事

1983年,Deutronic Elektronik GmbH在德国阿德尔科芬成立,当时只是一家专注于电源技术的小公司。创始人凭借对电力电子技术的深刻理解和对市场需求的敏锐洞察,开始了公司的创业之旅。公司初期专注于电源产品的研发和生产,通过技术创新和质量保证,逐渐在行业内建立了良好的声誉。

GardTec Inc公司的发展小趣事

背景:为了满足全球客户的需求,GardTec开始实施全球化战略,在亚洲和美国等地设立全球制造厂和库存地。

发展:通过在全球范围内的战略布局,GardTec不仅提升了产品的供应效率,还更好地服务了世界各地的客户。公司的全球化布局进一步巩固了其在风扇配件市场的领先地位。

影响:全球化战略的实施,使得GardTec的产品能够迅速响应市场变化,满足不同地区客户的多样化需求,从而增强了公司的市场竞争力。

问答坊 | AI 解惑

仿真器不能仿真c6713

装上ccs3.3之后,tds510不能仿真c6713,能进入也能load程序,就是执行其他操作就出问题,说什么芯片保护不让仿真器读写寄存器。过去使用3.1的时候没有出现这个问题的。不知道是怎么回事。:L…

查看全部问答>

单片机的应用领域

单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:   1.在智能仪器仪表上的应用   单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用 ...…

查看全部问答>

no cpu is delected

串口是USB转的 并口是PCI转的 可以连上JTAG 但是烧写程序的时候显示这个错误~!…

查看全部问答>

tinyos能不能移植到CC2430上

我现在做毕业设计,准备将tinyos移植到CC2430上,请问能不能做到,难度有多大?…

查看全部问答>

哪位好心人帮帮我发一个keil软件给我

我的keil 老是出错, 比如: void main(void) { unsigned int w; w=10; } 程序执行到‘}’结束符就出错。 ***   error   65:   access   violation   at   C:0x0A00  &nb ...…

查看全部问答>

vs2005 编写 wince6.0程序问题

小弟这两天碰到一个很诡异的问题。 我在以前写的工程中加入代码调试运行时,新写的代码不运行。具体如下: 假如先前函数代码: [code]OnBnClickedBtnPrint1() {         int a=0;         a++; &nb ...…

查看全部问答>

请问多个不同的硬件中断号(IRQ)能否关联到同一个逻辑中断(SYSINT)?

还有就是一个硬件中断号是否可以关联多个逻辑中断号? 希望大家讨论讨论!!…

查看全部问答>

怎样把protel99里的某个图层导出到CAD文件中

怎样把protel99里的某个图层导出到CAD文件中 多谢~~~~…

查看全部问答>

纹波电压

  最近在看一本外国的书籍 电子电路分析与设计   刚开始看不久   看到一个纹波电路 纹波电压   好像以前没看过呢   这个纹波电压是做什么呢??   请问   (本人系菜鸟,如果问的问题比较弱智, ...…

查看全部问答>