1、能力拓展训练任务书学生姓名: 专业班级: 指导教师: 工作单位: 自动化学院 题 目: 电子密码锁设计 初始条件:计算机、Max+plus、EDA实验箱。(或单片机,PLC)要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)设计一个电子密码锁,在锁开的状态下输入密码,设置的密码共4位,用数据开关K1K10分别代表数字1,2,9,0,输入的密码用数码管显示,最后输入的密码显示在最右边的数码管上,即每输入一位数,密码在数码管上的显示左移一位。可删除输入的数字,删除的是最后输入的数字,每删除一位,密码在数码管的显示右移一位,并在左边空出的位上补充“0”。用一位输出电平
2、的状态代表锁的开闭状态。提高部分:设置一个万能密码,在主人忘记密码时使用。任务安排:(1) 设计任务及要求分析;方案比较及认证说明。(2) 系统原理阐述,写出设计方案结构图。(3) 软件思想,流程图,源程序及程序注释。(4) 调试记录及结果分析、总结。(5) 参考资料5篇以上,附录:程序清单。时间安排:D1:安排设计任务;收集资料;方案选择;D2:程序设计;D3-D4:实验室内调试程序并演示;D5-D7:撰写报告;D8-D9:交设计报告。主要参考资料:1 谭会生,张昌凡EDA 技术及应用西安:西安电子科技大学出版社20042 孙晓明EDA实验指导书武汉:武汉理工大学教材中心,20071指导教师
3、签名: 孙晓明 2012 年 6 月 24 日系主任(或责任教师)签名: 年 月 日摘要电子密码锁在当今社会的地位越来越重要。怎样才能保证用户安全?通过电子密码锁去保护用户安全是其中的一个选择,不管是保护用户数据还是保护实体的东西,都可以由电子密码锁实现。本次设计使用外部存储24C02,通过单片机STC90C516RD+作为控制核心,采用4*4矩阵键盘作为用户输入部分,通过中断方式处理按键取回用户输入数据,然后将数据传回单片机,由单片机进行处理,通过与“万能密码”和用户自己设定的密码进行对比发出相应控制,如果密码一致则开启密码锁,否则保持密码锁原有状态。显示部分使用的是四个一组的数码管,可显示
4、用户输入的四位密码,用作相应提示和交互,用一个LED表示密码锁是否开启,如果开启则亮,否则熄灭状态。设计程序采用C语言,C语言使设计更加灵活。由于需要的程序存储空间较大,所以选择了STC90C516RD+单片机,这个型号单片机最大容量为61K。通过以上器件组合,顺利完成了本次课程设计,满足设计要求,达到预期目的。关键字:单片机 密码锁 24C02目录1 设计要求及分析12 总体设计方案22.1系统设计方案论证22.2 系统结构框图设计23 硬件设计43.1 单片机的选择43.2键盘检测电路53.3 LED显示电路63.4 数码管显示电路63.5 24C02密码存储电路84 软件设计104.1
5、程序流程图104.2 程序设计124.2.1 24C02读写模块124.2.2 按键扫描处理模块154.2.3 数码管显示模块215 调试记录与仿真结果分析225.1 调试结果225.2 仿真结果分析24心得体会25参考文献26附录127附录228武汉理工大学能力拓展训练说明书基于STC90C516RD+电子密码锁的设计1 设计要求及分析设计一个电子密码锁,在锁开的状态下输入密码,设置的密码共4位,用数据开关K1K10分别代表数字1,2,9,0,输入的密码用数码管显示,最后输入的密码显示在最右边的数码管上,即每输入一位数,密码在数码管上的显示左移一位。可删除输入的数字,删除的是最后输入的数字,
6、每删除一位,密码在数码管的显示右移一位,并在左边空出的位上补充“0”。用一位输出电平的状态代表锁的开闭状态。提高部分:设置一个万能密码,在主人忘记密码时使用。由于设计要求中按键较多所以采用4*4矩阵键盘,显示部分已经要求用数码管,所以就不用考虑其他选择了。用一位输出电平的状态代表锁的开闭状态,为了可以让大家看出效果,可以选择开锁后声光报警等,本次设计权衡各方面采用一个二极管实现电平表示,密码需要保存,所以在掉电后保存到了24C02外部扩展ROM上,实现了掉电也不影响用户的正常使用。当然,密码可以用加密算法保存,本次设计由于时间仓储没有采用加密算法仅仅实现了明文密码存储在24C02的相应内存单元
7、中,加密算法可以进一步提高密码的安全性,可以使用查表替换法等等去实现明文密码加密。开启密码锁后,密码锁要求用户输入密码,当用户按下确认键后进行密码比较,密码正确则LED亮,否则保持熄灭,当然在用户键入密码的同时可以用删除键进行修改,以确保自己输入的正确,用户输入“万能密码”或自己的密码时开锁,当然期间要读出24C02上存储的密码进行比对,按下设置键可以进行用户自定义密码修改,密码修改后按下确认键确认,同时将明文密码保存到24C02上。2 总体设计方案2.1系统设计方案论证实现电子密码锁的方法主要有以下几种。方案一:采用纯硬件电路。该系统的优点在于速度较快,不需要编程,但是设计复杂、灵活性较小、
8、线路复杂、调试和安装不方便,实现难度大。方案二:FPGA/CPLD或采用带有IP内核的FPGA/CPLD方式。即用FPGA/CPLD完成采集、存储、显示等功能,由IP核实现人机交互等功能。这种方案的优点在于系统结构紧凑,可以实现复杂的控制,操作方便;缺点是调试过程复杂,成本较高。方案三:单片机与24C02相结合。即用单片机完成人机界面、系统控制、数据处理,由矩阵键盘模块完成用户输入采集等。这种方案克服了方案一、二的缺点,所以本此设计使用基于单片机和24C02的方案实现本次电子密码锁的设计。综上所述,本次设计从各方面考虑,采用方案三最为合理,相对设计较简单,容易实现,而且性能等完全满足题设要求,
9、在现有资源的条件下,本次设计选定使用方案三。2.2 系统结构框图设计图1 电子密码锁设计框图系统主要由矩阵键盘输入模块、数码管显示模块、LED显示模块、24C02密码处处模块组成,矩阵键盘采用中断方式处理按键问题,数码管采用动态扫描的方法显示,24C02采用I2C的方式进行读写数据。通过读出24C02存储的密码以及“万能密码”和用户输入密码进行对比,输入正确开锁LED亮,否则熄灭,当然这期间用户输入可以在数码管上显示,并通过键盘上的按键进行人机交互。系统框图如图1所示。3 硬件设计3.1 单片机的选择STC90C51RD+系列单片机是宏晶科技推出的新一代超强抗干扰、高速、低功耗的单片机,指令代
10、码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可任意选择,内部集成MAX810专用复位电路,时钟频率12MHz以下时,复位脚可直接接地。技术性能描述如下:1)、增强型6 时钟/机器周期,12 时钟/机器周期 8051 CPU;2)、工作电压:5.5V - 3.8V(5V 单片机)/3.8V - 2.4V(3V 单片机);3)、工作频率范围:0-40MHz,相当于普通8051的 080MHz.;4)、用户应用程序空间 4K/6K/7K/8K/10K/12K/13K/16K/32K/40K/48K/56K/ 61K/字节;5)、片上集成 1280字节/512/256字节 RAM
11、;6)、通用I/O口(35/39 个),复位后为: P1/P2/P3/P4 是准双向口/弱上拉(普通8051 传统I/O 口);P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O 口用时,需加上拉电阻。7)、ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器可通过串口(P3.0/P3.1)直接下载用户程序,8K 程序3 - 5 秒即可完成一片;8)、EEPROM 功能;9)、看门狗;10)、内部集成MAX810专用复位电路,外部晶体12M以下时,可省外部复位电路,复位脚可直接接地;11)、共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用;12
12、)、外部中断4路,下降沿中断或低电平触发中断,Power Down模式可由外部中断低电平触发中断方式唤醒;13)、通用异步串行口(UART),还可用定时器软件实现多个UART;14)、工作温度范围:0-75/-40-+85;15)、封装:LQFP-44,PDIP-40,PLCC-44。由于本人的单片机实验箱自带一片STC90C516RD+单片机,故本次设计直接使用STC90C516RD+单片机作为本设计的控制核心。这个型号的单片机用户应用程序空间达到了61K,用户应用程序存储空间非常大,因此不用考虑使用外部存储。其引脚图如图2所示。图2 STC90C516RD+引脚图3.2键盘检测电路键盘模块
13、是系统的人机交流模块,主要为用户提供进行密码输入、设置、确认、删除的功能。该设置功能模块中包括了09对应的数字按键,每一个数字对应一个按键,以及设置、确认、删除键,用户开机后可以点击数字键进行密码键入,通过删除键修改密码,确认无误后可以点击确认键进行确认提交,系统通过对比做出相应响应,同时用户原密码正确输入后可以点击设置键进行密码重设,并点击确认键进行提交新密码,当然期间可以通过删除键进行修改新密码,直到最后的提交,重设密码完成! 由于按键比较多,为了节省I/O口的资源,本系统采用4*4矩阵键盘。又因为变成扫描、定时扫描的键盘工作方式过多的占用CPU时间,本系统为了不过多的占用CPU的时间,采
14、用中断扫描方式。采用外部中断1处理键盘扫描程序,具体工作思路为先给P1口赋值0xf0,这样不论那个按键被按下均会产生一个低电平,通过四路输入与门后同样产生一个低电平,从而产生一个下降沿(程序中设定外部中断1为下降沿产生中断模式),四输入与门的输出端与P3.3相连,其他部分见图3。图3 键盘检测电路3.3 LED显示电路LED显示电路非常简单,单片机P2.6口接LED阴极。当密码正确时,单片机P2.6脚输出低电平驱动LED发光。具体电路请参见附录总电路图。3.4 数码管显示电路本次设计要求使用LED显示用户密码输入。题设已经要相应要求,所以本设计采用四位共阴极的LED七段数码管。如图4所示为4位
15、7段共阴极数码管的引脚图。由于所有的段选并联到同一个 I/O上,因此,如果是所有的4位7段LED都选通后,4位7段LED将会显示相同的字符。要使各个位的7段LED显示不同的字符,就必须采用动态扫描方法来轮流点亮每一位7段LED,即在每一瞬间只选通一位7段LED显示单独的字符,在此段点亮时间内,段选控制I/O口输出要显示的相应字符的段选码,而位选控制I/O口则输出位选信号,向要显示的位送出选通电平(共阴极送出低电平),使得该位显示相应字符。这样可以使4位7段LED轮流点亮,使得每位分时显示该位相应的字符。由于人眼的视觉暂留时间为0.1秒,当每位显示的间隔未超过33ms时,并在显示时保持直到下一位
16、显示,则人眼的视觉暂留效果使眼睛看上去就像是4位7段LED都同时点亮。设计时要注意每位显示的时间间隔,由于一位7段LED的熄灭时间不能超过 100ms,也就是说点亮其它位所用的时间不能超过100ms,这样当有N位的7段LED用来显示时,每一位间隔的时间t就必须符合式子:t100ms/(N-1),本设计中N4,则由式子可以算出t33ms,也就是每一位的时间间隔不能超过33ms。当然时间可以设得稍微短一些。图4 四位七段共阴极数码管引脚图如图5所示为本显示电路4位7段LED数码管显示模块电路图。A、B、C、D、E、F、G依次接P0.0-P0.6,DP接P0.7管脚,同时P1口接入上拉电阻,在P1口
17、没有输出时将P1口电平拉高。1-4为数码管位选的输入,依次接P2.0-P2.3管脚,具体电路如下。图5 数码管显示电路3.5 24C02密码存储电路24C02是电可擦除的PROM,采用256*8-bit的组织结构以及两线串行接口,电压可允许低至1.8V,待机电流和工作电流分别为1uA和1mA,24C02具有页写能力,每页为8字节。其擦写寿命长达100万次,数据可保存100年,完全满足本次设计要求。其具有两线串行接口,完全兼容I2C,本次设计就是采用I2C对24C02进行操作。其引脚图如图6所示。图6 24C02引脚图本次设计A0、A1、A2、WP均接地,SCL接P2.4,SDA接P2.5,如图
18、7所示。图7 24C02密码存储电路4 软件设计4.1 程序流程图主程序流程图如图8所示:图8 主程序流程图子程序流程图如下图9所示:图9 子程序程序流程图4.2 程序设计本设计的程序分为两大块,分别为主程序和中断子程序,子程序处理扫描键盘,判断是那个键被按下,中断类型为外部中断1。其余程序段在主函数里运行,下面为关键程序段落说明。4.2.1 24C02读写模块/总线初始化 void before_start() SDA=1; delay(); SCL=1; delay(); /总线启动 void start() SDA=1; delay(); SCL=1; delay(); SDA=0; d
19、elay(); /应答 void answer() uc i; SCL=1; delay(); while(SDA=1)&(i256)i+; SCL=0; delay(); /总线停止 void stop() SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); /写一个字节 void write(uc db) uc i; uc controldb; controldb=db; for(i=0;i8;i+) controldb=controldb1; SCL=0; delay(); SDA=CY; delay(); SCL=1; delay(); SC
20、L=0; delay(); SDA=1; delay(); /读一个字节 uc read() uc i; uc returndb; SCL=0; delay(); SDA=1; delay(); for(i=0;i8;i+) SCL=1; delay(); returndb=(returndb3&counter255) counter=3;edit_password=100*a+10*b+c;else if(counter=1) edit_password=a;else if(counter=2) edit_password=10*a+b; else if(counter=3) edit_pa
21、ssword=100*a+10*b+c; else if(counter=0)counter=0;edit_password=0;else if(counter=255)counter=0;else if(keyflag=1) /设置键处理if(edit_password=password|edit_password=read_password()flag=1;LED=0;/edit_password=0;else if(keyflag=2) /确认键处理if(flag=0)if(edit_password=password|edit_password=read_password()LED=0
22、;/二极管发光 else if(flag=1)LED=1;tmp1=edit_password/100;tmp2=edit_password%100;before_start(); writebyte(1,tmp1);i_delayms(20); writebyte(2,tmp2);i_delayms(20);flag=0; 4.2.3 数码管显示模块/*数码管显示函数*/ void data_to_display(ui mypassword) uc display3; display0=LEDTABLEmypassword/1000; display1=LEDTABLEmypassword%
23、1000/100; display2=LEDTABLEmypassword%100/10; display3=LEDTABLEmypassword%10; P20=0; P0=display0; delayms(10); P20=1; P21=0; P0=display1; delayms(10); P21=1; P22=0; P0=display2; delayms(10); P22=1; P23=0; P0=display3; delayms(10); P23=1; 5 调试记录与仿真结果分析5.1 调试结果开机后,电子密码锁进入输入密码状态显示0000,按下数字键进行输入见图10,按下删
24、除键后减少一位数字如下图11所示,输入万能密码1234后按下确认键解锁LED发光如图12。按下设置键后设置新密码6666后确认如下图,关机重新开机,输入用户密码6666后LED再次亮起,说明用户密码已经写入24C02,并且可以看出本电路已经满足需求,见图13。 图10 输入密码中图11 删除一位输入图12 输入万能密码1234后解锁LED亮起图13 输入用户自定义密码6666后解锁LED亮起5.2 仿真结果分析通过调试后,发现已经满足题设,在用户开机后输入密码(期间可以使用删除键删除输入),输入完毕后,点击确认键,如果输入密码和万能密码1234或24C02中存储的密码一致,开锁(即LED亮起)
25、,这时可以按下设置键设置新密码,点击确认提交,新密码已经保存,用户可以安心关机了,关机重启后,输入用户自定义密码后,再次解锁,表明题设功能已实现,断电再次上电不会对电子密码锁造成影响,这个是本次设计的核心考虑内容,已经实现。心得体会通过本次课程设计,让我进一步学习了计算机控制技术的一些知识,通过知识的综合运用,顺利的完成了本次课程设计。本次课程设计得到任务以后我就马上在网上查阅了相关资料,由于已经有了一些51系列单片机的开发经验,故本次设计首先想到的就是使用51系列单片机作为控制核心,由于我自己的学习开发板上搭载的是STC公司的单片机,最终敲定使用STC90C51RD+,这个单片机的存储空间很
26、大,这样就不需要考虑程序存储空间不足的问题了。由于设计的程序较长,导致运行的时间比较长,这样就会出现一个问题,一开始考虑将扫描键盘程序直接放到主程序中运行,发现有时候不能正常识别按键(按下某按键后系统不响应),经过排查发现这样设计的不合理性,由于程序较长,有时候当用户按下某个按键的时候主程序没有运行到键盘扫描函数,这样当然不可能正常识别出按键,最终确定将按键扫描程序放到中断子程序中执行,只要有按键按下就会申请中断,中断中处理是那个键按下了,这样以上问题就迎刃而解了。通过本次设计进一步熟练了设计流程,体会到了设计电子密码锁确实不易。总之,经过快两个星期的“奋战”,我从中收获了很多,对我自己来说又
27、是一次历练,同时我也在本次课程设计中体会到了乐趣,从提出一个问题,到没有头绪,在到有思路,最后到解决问题,是一个快乐的过程。参考文献1 于海生编著.计算机控制技术. 机械工业出版社. 2007年2 陈立周、陈宇编著.单片机原理技术及应用. 机械工业出版社. 2007年3 刘红丽编著.传感与检测技术. 国防工业大学出版社. 2007年4 马德骏、张建宏、汤练兵编著.C语言程序设计(第二版). 北京: 科学出版社. 2009年5 李群芳、张士军、黄建编著.单片微型计算机与接口技术(第三版). 北京: 电子工业出版社. 2009年附录1硬件电路图如下:附录2本系统C程序如下: #include #d
28、efine uc unsigned char #define ui unsigned int uc flag=0;/控制标志:0-输入密码;1-设置密码; uc keyflag=0;/0-删除键;1-设置键;2-确认键;3-数字键; uc key=0;/按键值 uc counter=0;/记录数字按键按下次数; ui edit_password=0; ui a=0,b=0,c=0,d=0; ui password=1234;/万能密码 sbit P20=P20; sbit P21=P21; sbit P22=P22; sbit P23=P23; sbit SCL=P24;/串行时钟信号 sbi
29、t SDA=P25;/串行数据输入输出 sbit LED=P26;/发光二极管 /数码管字模,下面为共阴极字模 uc code LEDTABLE= 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f ; /主函数中使用的延时函数 void delayms(ui ms) uc i; for(ms;ms0;ms-) for(i=110;i0;i-); /中断中使用的延时函数 void i_delayms(ui ms) uc i; for(ms;ms0;ms-) for(i=110;i0;i-); /毫秒级延时控制总线 void delay(); /总
30、线初始化 void before_start() SDA=1; delay(); SCL=1; delay(); /总线启动 void start() SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); /应答 void answer() uc i; SCL=1; delay(); while(SDA=1)&(i256)i+; SCL=0; delay(); /总线停止 void stop() SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); /写一个字节 void write(uc db) uc i;
31、uc controldb; controldb=db; for(i=0;i8;i+) controldb=controldb1; SCL=0; delay(); SDA=CY; delay(); SCL=1; delay(); SCL=0; delay(); SDA=1; delay(); /读一个字节 uc read() uc i; uc returndb; SCL=0; delay(); SDA=1; delay(); for(i=0;i8;i+) SCL=1; delay(); returndb=(returndb1)|SDA; SCL=0; delay(); return return
32、db; /将数据写入任意一个地址 void writebyte(uc address,uc mydata) start(); write(0xa0); answer(); write(address); answer(); write(mydata); answer(); stop(); /读取任意地址的一个数据 uc readbyte(uc address) uc retdb; start(); write(0xa0); answer(); write(address); answer(); start(); write(0xa1); answer(); retdb=read(); stop(); return retdb; /*扫描键盘函数*/void scankey() /检测键盘函数 uc temp; P1=0xfe; temp=P1; temp=temp&0xf0; if(temp!=0xf0) i_delayms(10);/去抖动 temp=P1; temp=temp&0xf0; if(temp!=0xf0) temp=P1; switch(temp) case 0x7e: keyflag=3;key=3;counter+;break; case 0xbe: keyfla