设计亮点:
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++) {
上一篇:基于单片机的简易计算器proteus仿真和源代码
下一篇:单片机AD7705转换程序
推荐阅读
史海拾趣
Ethertronics公司的发展故事一:技术突破与初创期
Ethertronics公司成立于XXXX年,由一群热衷于无线通信技术创新的工程师共同创立。在创立初期,公司就瞄准了天线技术的未来发展方向,致力于研发高性能、多频段、小型化的天线产品。通过不断的技术创新和实验,Ethertronics成功开发出了一系列具有革命性的天线产品,这些产品不仅性能卓越,而且体积小巧,可以广泛应用于各种电子设备中。这些技术突破为公司赢得了业界的广泛认可,也为公司的后续发展奠定了坚实的基础。
Ethertronics公司的发展故事二:市场拓展与合作伙伴关系
随着技术的不断成熟和产品的不断完善,Ethertronics开始积极拓展市场。公司与多家知名电子设备制造商建立了长期稳定的合作伙伴关系,为其提供定制化的天线解决方案。通过与这些合作伙伴的紧密合作,Ethertronics的产品逐渐打入了主流市场,并被广泛应用于智能手机、平板电脑、笔记本电脑等各种电子设备中。这些合作伙伴的信任和支持,为公司的发展提供了强大的动力。
Ethertronics公司的发展故事三:持续创新与研发投入
作为一家以技术为核心的公司,Ethertronics始终将创新作为公司发展的核心动力。公司不断加大对研发的投入,积极引进和培养高素质的研发人才,不断推出具有竞争力的新产品。同时,公司还与多家高校和科研机构建立了紧密的合作关系,共同开展技术研究和创新。这些持续的创新和研发投入,使Ethertronics在天线技术领域始终保持领先地位。
Ethertronics公司的发展故事四:国际化战略与全球布局
随着全球市场的不断开放和竞争的加剧,Ethertronics开始实施国际化战略,积极拓展海外市场。公司在全球范围内建立了多个研发中心和销售机构,与当地的合作伙伴建立了紧密的合作关系。通过这些机构,Ethertronics能够更好地了解当地市场需求和竞争态势,为客户提供更加优质和高效的服务。同时,公司的国际化战略也为其带来了更多的商业机会和发展空间。
Ethertronics公司的发展故事五:社会责任与可持续发展
作为一家有着高度社会责任感的企业,Ethertronics始终将可持续发展作为公司发展的重要目标。公司积极倡导环保和节能的理念,致力于开发更加环保和节能的产品。同时,公司还积极参与各种公益活动和社会责任项目,为社会做出积极贡献。这些举措不仅提升了公司的品牌形象和社会声誉,也为公司的长期发展奠定了更加坚实的基础。
为了进一步扩大市场份额,Compex Corporation开始实施全球化战略。公司积极开拓国际市场,与全球多个国家的客户建立了合作关系。同时,公司还在海外设立了生产基地和研发中心,以便更好地服务当地市场。这一战略的实施使得公司的业务范围不断扩大,国际影响力也逐渐增强。
随着公司实力的不断增强,雅特力开始将目光投向全球市场。公司积极参与国际电子展会和论坛,与全球各地的客户和合作伙伴建立了广泛的联系。同时,雅特力还通过设立海外分支机构、开展跨国合作等方式,进一步拓展其全球市场。这些举措不仅提升了雅特力的品牌知名度和影响力,也为公司的长远发展奠定了坚实的基础。
在竞争激烈的电子行业中,只有不断创新才能保持领先地位。DART公司深知这一点,因此他们投入大量资金用于研发新的技术和产品。同时,公司也积极开展与高校、研究机构和其他企业的合作,共同探索新的技术路线和市场应用。这些合作不仅为DART公司带来了更多的技术积累和市场机会,也促进了整个电子行业的进步和发展。
北京人民电器厂有限公司,作为北方地区最大的低压电器制造企业,于1995年成功研发出全球首台高分断微型直流断路器。这一创新成果不仅填补了国内空白,更在国际上展现了中国在低压电器领域的研发实力。该断路器的诞生,标志着北京人民电器在直流断路器技术领域迈出了坚实的一步,为后续的产品研发和市场拓展奠定了坚实的基础。
随着技术的不断成熟和市场的逐步认可,Astro Tool Corp公司开始积极拓展海外市场。通过与国际知名电子制造商建立合作伙伴关系,公司成功将产品打入国际市场。同时,公司还积极参与国际行业展会和交流活动,不断提升品牌知名度和影响力。这些努力不仅为公司带来了更多的订单和合作伙伴,也进一步巩固了其在全球电子制造工具市场的地位。
一 监护产品检验方法介绍 监护产品是目前临床上用于实时监测重症或手术患者的各种生理参数的主要设备,在监护产品的研发、生产、检验以及在临床使用过程的定期检验和校准等过程都需要采用规范的检验手段和方法。按国内的标准要求,监护仪生产企业 ...… 查看全部问答∨ |
飞龙教程------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的对话框,望解答,万分感谢!!!… 查看全部问答∨ |
有环境变量 SET PRJ_NAME=M8 想在一个.c文件里面能打印出这个项目名 RETAILMSG(1, (TEXT("PRJ_NAME = %s \\r\\n"), PRJ_NAME)); 在SOURCE里面,要如何写? CDEFINES=$(CDEFINES) -DPRJ_NAME=$(PRJ_NAME) 这样不行 CDEFINES=$(CDEFINES) - ...… 查看全部问答∨ |
USB解决方案: 经过一周的USB学习,感受颇多,由于在网上申请了几片CH375,我就打算用这个芯片来做USB通信。CH375 是一个USB总线的通用接口芯片,支持USB-HOST 主机方式和USB ...… 查看全部问答∨ |
在IAR下程序编译通过 可是在SmartRF Flash Programmer 却无法烧写 SmartRF Flash Programmer 下面烧写进度条提示:Could not open the hex-file! 尝试了很多次都不行 把hex文件改名重新编译 新建工程都不行 是不是程序有问题啊?我试了其他案例程序却可以烧写… 查看全部问答∨ |
求大神指导,最近在做zigbee低功耗,就是采用周期性点播函数进行温湿度采集,10秒发送一次,现在想在这10秒不发信息的时间段,让zigbee进入休眠状态,十秒后唤醒,然后发温湿度,然后再睡眠。 我看帖子大家说的都是低功 ...… 查看全部问答∨ |