1、福建电力职业技术学院课程设计课程名称:智能仪器题目:电子密码锁专业班次:09(三)电气2姓名:陈佳乐学号:200902123240(35号)指导教师:张继伟学期:20102011学年第二学期日期:2011.6目录福建电力职业技术学院1引言1第一章,设计内容及要求31.1 设计的初始条件及主要任务31.2 设计思路4第二章.模块硬件电路设计41. 1单片机最小系统52. 2矩阵键盘53. 31602液晶显TF6第三章.模块软件程序设计63.1矩阵键盘键值读取73.21602液晶显示模块73. 3延时模块73. 4密码读取模块73 .5密码设置模块84 .6密码比拟模块83. 7声光状态模块8第四
2、章.模块组合103.1 硬件电路排查103.2 软件代码排查104. 3综合逻辑功能检测10第五章.总结11参考文献12附录I.整体设计器件清单13附录2.数字式密码电子锁电路设计原理图14附录3.数字式密码电子锁程序源代码15引言随着人们生活水平的提高和平安意识的加强,对平安的要求也就越来越高。锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要平安可靠的防盗,又要使用方便,这也是制锁者长期以来研制的主题。随着电子技术的开展,各类电子产品应运而生,电子密码锁就是其中之一。据有关资料介绍,电子密码锁的研究从20世纪30年代就开始了,在一些特殊场所早就有所应用。这种锁是通过键盘输入一组密码完成
3、开锁过程。研究这种锁的初衷,就是为提高锁的平安性。由于电子锁的密钥量(密码量)极大,可以与机械锁配合使用,并且可以防止因钥匙被仿制而留下平安隐患。电子锁只需记住一组密码,无需携带金属钥匙,免除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。电子锁的种类繁多,例如数码锁,指纹锁,磁卡锁,IC卡锁,生物锁等。但较实用的还是按键式电子密码锁。20世纪80年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,本钱较高,是适合使用在平安性要求较高的场合,且需要有电源提供能量,使用还局限在一定范围,难以普及,所以对它的研究一直没有明显进展。目前,在西方兴旺国家,密码锁技术相对先进,种类齐全
4、电子密码锁已被广泛应用于智能门禁系统中,通过多种更加平安,更加可靠的技术实现大门的管理。在我国密码锁整体水平尚处于国际上70年代左右,电子密码锁的本钱还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国内有几个厂生产供给市场。但国内自行研制开发的电子锁,其市场结构尚未形成,应用还不广泛。国内的不少企业也引进了世界上先进的技术,开展前景非常可观。希望通过不断的努力,使电子密码锁在我国也能得到广泛应用。第一章.设计内容及要求1.1 设计的初始条件及主要任务课程设计中,锁体用LED代替(如“绿灯亮”表示开锁,“红灯亮”表示闭锁)。其密码为方4位(或8位)二进制代码(代
5、码自设定)。开锁指令为串行输入码,当开锁密码与存储密码一致时,锁被翻开。当开锁密码与存储密码不一致时,可重复进行,假设连续三次未将锁翻开,电路那么报警并实现自锁。(报警动作为响1分钟,停10秒)选择电路方案,完成对确定方案电路的设计。计算电路元件参数与元件选择、并画出总体电路原理图,阐述根本原理。安装调试设计电路。1.2 设计思路本次的设计任务,运用集成逻辑器件组成的门电路1也可以完成,但是考虑到输入信号的数量、逻辑判断的复杂度可以预知其数字逻辑电路会是相当复杂的。而运用具有可以写入程序,按程序完成相关逻辑判断、电平控制的单片机芯片那么会大大降低系统的复杂度,因此基于单片机来完成此次设计成为了
6、总体设计方案的首选。采用以单片机为核心的控制方案由于单片机种类繁多,各种型号都有其一定的应用环境,因此在选用时要多加比拟,合理选择,以期获得最正确的性价比。一般来说在选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最根本的比方:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。基于以上因素,结合本次设计任务的特点,本设计选用单片机STC89C51作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的
7、准确性,实现根本的密码锁信号判断、状态保存、电平控制的功能。2设计从总体可以分为硬件与软件两个局部。在硬件局部中,由单片机最小系统、矩阵键盘、1602液晶显示、声光显示这几个局部,其相关控制关系如图12在软件局部中,由矩阵键盘键值读取、1602液晶显示函数、延时模块、密码读取模块、密码设置模块、密码比拟模块、声光状态模块,等几局部组成。图1.2硬件模块关系2.1单片机最小系统第二章.模块硬件电路设计此为一个单片机最小系统,其有po-P3四组 I/O 口,可以进行相关的电平状态读取与控制操作。 开关SW-RST为复位开关,当其接通,单片机RST9 复位端至于高电位,满足一定时长后,单片时机进 行
8、复位操作,重新开始工作。Yl CL2、C1.3组 成了单片机的振荡电路,为单片机系统提供稳定可 靠地时钟信号,协助单片机完成相关操作。Header9 为一组排阻,座位上拉电阻。图2.1为单片机的程序烧录串口电路。由于STC89C52使用串口方式下载力图2.1 MAX232串口程序下程序下载的处理工作。3TEXTAC7 33: .fTEXT.R4 -:CS .47QrC6 .47pf .小- XTAL1XTAL2RSTPOXVADO P0.1/AD1 P02/AQ2 P0.3/AD3 POMAD4 Po 知ADS P0S/AD6 P07/AD7Ol2.34S67 Pl/P1P1P1Pl明明P2
9、0XA8 P21ZA9P2 2/A10 P2.3/A11 P24 伏12P2.5/A13 P2 6XA14P2 7/A15P3.ORXD P3.1/TXD P3.24NT0 P3.3N1P3.4f0P3,5ff1P3 6 恒;P3 7而LStAI89C51图2.2单片机最小系统2.2 矩阵键盘本设计准备使用4X4键盘,对应的电路如图2.309输入相应的数字;在输入密码是LR分别实现输入位置的左右移动,B为退格键,C为去除键,清楚当前所有的输入字符,S为功能扩展键,暂时未定义,E为确认键由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式
10、键盘,按键位于行列的交叉点上,密码锁的密码由键盘图2.34X4矩阵键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。图2.4 1602液晶显2.3 1602液晶显示图2.4为1602液晶的引脚分布。1,2为液晶显示供电,3接滑动变阻器改变3的相对电位,调节显示比照度。4,5,6为液晶的控制端,调节工作状态。714为液晶的数据输入端,15、16为液晶背光的电源接口。17,18可以悬空不接。2.4 尸光显ZF光显示有红绿两种颜色的发光二极管组成,负极接单片机引脚,正极结一个限流电阻后接地。当单片机输出高电平,其不亮,当单片机输出低电平,二极管点亮。(图略)声信号告警有长鸣蜂鸣器与一个三极管、
11、电阻组成,三极管在单片机的控制下驱动蜂鸣器正常工作。长鸣蜂鸣器,在给予有效电平时可以不间断的以一定的频率发出蜂鸣。如图2.5。第三章.模块软件程序设计3.1 矩阵键盘键值读取矩阵键盘接Pl口,行接低4位,列接高4为。先让行为高,列为低,假设有键按下,那么所在行为低,得到按键的所在行数,之后令Pl口,行为低,列为高,运用相似的方法得到所按键的所在列数,及确定按键位置,返回键值。由于机械键盘会出现信号抖动的情况,固在发现有按键后延时5毫秒再次确定,假设让有按键,证明按键稳定,否那么认为接收到的是抖动信号,不予处理。3.2 1602液晶显ZF模块1602具有三个工作状态控制端,调节他们的上下变化配合
12、数据口的信息,可以显示2X16的字母或者数字,通过子函数可以实现检测初始化LCD、写指令到LCD、LCD状态、LCD清屏、输入一个字节数据到LCD、LCD光标定位到X处、LCD光标归位、输入一个字符到LCD、输入一个字符串到LCD等功能。43.3 延时模块一个程序会有许多地方需要进行延时操作,例如矩阵键盘的消抖延时。一般延时可以通过空循环与中断响应两种方法进行。由于本程序对于时间精度要求不高,故使用相对简单的空循环的方法进行延时。进过实验,单片机每空循环110次耗时1ms。故用两次循环,里面一次空循环110,外面的一次由输入决定循环次数,这样就会进行输入数值时长的延时。43.4 密码读取模块首
13、先预读入密码的字符数组清零,显示位置清空,然后读取键值。先判断此时是否是在第九个键值输入了数字键值,如果是不响应重新读入,这样可以防止读入字符串溢出,造成密码读取错误。然后通过switch语句5处理键值(字母键值),并将读取位置、显示位置进行相关调整;如果输入的是数字有效键值,存入当前指向的字符数组空间,其后将键值变量清零准备读取下一个键值。进行循环读取,直到成功读取8位密码或者因为输入了确定键提前完成读取工作。在系统进行初始化时,要求设置密码。整体思路是要求读取一组密码,保存在临时空间,然后再次读取密码,如果相同,证明设置成功,将新密码覆盖进标准密码数组里,如果两次的密码不同,显示错误信息,
14、要求重新输入。图3.1密码设置模块3.6 密码比拟模块图3.2密码比拟模块该模块将输入密码字符串与设定密码字符串比拟。如果相同,执行开锁动作并将输入错误次数清零;如果不同,累计错误次数,如果是第三次输入错误,系统锁死并发出声光告警;如果小于三次,显示密码错误信息,返回密码输入环节。逻辑框图如图3.23.7 声光状态模块本模块通过读取相关控制变量,控制声光部件的状态。当闭锁状态点亮红灯,开锁状态点亮绿灯;当需要进行异常告警时,利用延时函数周期性的变换蜂鸣器的响静。鸣响状态下,响250ms,停250ms;鸣响状态保持50s后,静止10s,后继续进入鸣响状态,如此反复。第四章.模块组合调试按照前述模
15、块进行设计,制作实物电路、编写软件程序代码,然后进行相关调试。4.1 硬件电路排查由于本次设计的线路相对较多,易发生焊接错误,故应该先进行硬件电路的排查。首先检查相关器件引脚连接是否正确可靠;其次检测各导线间是否有错误的相邻短路;然后检查所有开关是否正常控制电路闭合,最后给声光部件有效电平观察其是否能正常工作。经过检测,发现几处线路短路错误,已处理修正。4.2 软件代码排查检测函数中是否有错误的函数调用,变量错误使用,是否存在控制错误造成相关模块的衔接问题。其后利用ProteUS然见软件进行模拟进一步需找错误并改成。经过排查,修改程序中的已发现错误。4.3 综合逻辑功能检测表4.1程序代码烧录
16、进硬件系统中进行总体综合测试。相关流程如下:序号测试内容具体操作状态1系统初始化,1.CD显示系统上电,调节显示局部的滑动变阻器,调节LCD显示比照度正确进入密码设置状态1.CD显示正常2验证键盘按键进行有序的按键操作,观察LCD显示器状态,确认键盘是否正常可以通过矩阵键盘完成正确的键值输入3密码读入、设置密码模块、密码比拟模块检测进行两次密码设置操作,先进行错误设置,后进行正确设置密码操作模块可以正确的对相应数组进行正确处理4验证密码模块与声光模块的配合先进行正确密码输入,然后屡次进行屡次错误密码输入系统的函数间调度、衔接操作正确,未发现错误。5测试密码模块可靠性屡次输入密码,随机性的决定密
17、码的正误,看系统响应状态系统的密码模块可靠,在且只在连续三次错误时进行异常告警。通过以上的排查调试工作,成功修正了已发现的硬件软件错误。上面的测试工程根本覆盖了系统的所有可能操作,说明系统的可靠性相对较高,但不排除让存在极端情况下的系统漏洞,然而这种情况很少出现,此时可以忽略不计。第五章,总结本次课程设计不仅仅是对于一学期数字电子技术课程学习的一个简单考核,更是是我们在数电方向、电子方向继续学习深造的一个无尽动力。在完成课程设计的过程中,遇到了许多当初设想不同的难题,例如对于键盘的扫描,密码的储存调用修改等等。有许多问题都是有许多中解法,但是要从大局出发,有一个系统的思想,合理的安排布局,恰当
18、的使用硬件、软件资源,尽量减少不必要的部件,降低系统的复杂度;同时又要尽量全面的考虑系统的各种情况,防止系统功能设计或者是使用者错误操作所引起的系统错误;更重要的是要把设计与实际应用相结合,在现有水平可以到达的前提,尽力将设计贴近实际需要,实现用户所需要的功能。这些都是这次课程设计给我带来的收获,也是我今后学习、工作的珍贵经验。参考文献1伍时和等.数字电子技术根底.北京:清华大学出版社,2009.4.2张天凡等.51单片机C语言开发详解.北京:电子工业出版社,2008.6.3马忠梅等.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,2007.1.4梅丽凤等.单片机原理及接口技术.北京
19、清华大学出版社;北京交通大学出版社,2004.25谭浩强.C程序设计(第三版).北京:清华大学出版社,2005.7.附录L整体设计器件清单名称型号数量备注单片机芯片STC89C521通讯芯片MAX2321串行接口DB91石英晶振12M1瓷片电容3321054电解电容4.7uf1电位器IOK1电阻IK4IOK1IOK排阻1LED红色2绿色1长鸣蜂鸣瑞1三极管85501LCD显示模块10621按键开关17自锁开关1排针假设干导线假设干万用表1电工工具1套附录2数字式密码电子锁电路设计原理图- JZLJZLJZLJZLfO 011: (Z1 q., , .JZL.,Q.fO 01-J=L. r-0
20、 0 JE., ,r-* , 0-0pp0X1-卜: : :二;:二二: . CiriOTAL TS A1C51B1-TVF- Y23卫万H E FGF-*_, , , rO o, .1 19 CXTAlIFOffADO FlIrtHFD2AD212。诩MMttDlFOSfADSFOUADSRBTHUMWF2ff8F2.W9P22K10WP23M1MEP14M12瑟P2S0P2fiUPZJfiMSPlflF3ff)P1.1urnP12MIPIJ门 JrHTTPfFimPfSnsrP1P3WM.?PlWir附录3数字式密码电子锁程序源代码#includenreg5l.hincludestring
21、h/LCD的数据口数据读、写操作后,AC数据读、写操作后,AC数据读、写操作,画面平数据读、写操作,画#defineLCD_DATAPO输入方式设置#defineLCD_AC_AUTOJNCREMENT0x06自动增一#defineLCD_AC_AUTO_DECREASE0x04自动减一#defineLCD_MOVE_ENABLE0x05移#defineLCD_MOVE_DISENABLE0x04面不动设置显示、光标及闪烁开、关#defineLCD_DISPLAY_ONOxOC显示开#defineLCD_DISPLAY_OFF0x08显不关#defineLCD_CURSOR_ONOxOA光标
22、显示#defineLCD_CURSOR_OFF0x08光标不显示#defineLCD_CURSOR_BLINK_ON0x09光标闪烁#defineLCD_CURSOR_BLINK_OFF0x08光标不闪烁光标、画面移动,不影响DDRAM#defineLCD_LEFT_MOVE0x18/LCD显示左移一位#defineLCD_RIGHT_MOVEOxlC/LCD显示右移一位#defineLCD_CURSOR_LEFT_MOVE0x10光标左移一位#defineLCD_CURSOR_RIGHT_MOVE0x14光标右移一位工作方式设置两行显示单行显示#defineLCD_DISPLAY_DOUBL
23、E_LINEOx38#defineLCD_DISPLAY_SINGLE_LINE0x30unsignedcharcodetab4f4=T,2,3,C,4t,5767B,),7,8,9,S),L,O,R,E;unsignedcharinput-password9=0,0,0,0,0,0,0,0,0);unsignedcharnormal_password9=12345678;unsignedchartemp_normal_password9=12345678;unsignedcharIock=O,miss=0,key=0;为锁状态、连续错误次数、读入键值sbitbeep=P32;sbitLEDR
24、P34;sbitLEDE=P36;sbitLCD_BUSY=LCD_DATAA7;sbitLCD.RW=P20;sbitLCD.RS=P21;sbitLCD.EN=P22;/键盘键值表临时读入密码数组密码存储数组临时设定密码数组系统环境变量分别蜂鸣器控制变量开锁指示灯控制变量闭锁指示灯控制变量/LCD忙信号位/LCD读写控制/LCD存放器选择/LCD使能信号*/voidLCD_cls(void);voidLCD_write_data(unsignedchar);voidLCDJnitial(Void);voidLCD_set_position(unsignedchar);voidLCD_pr
25、ints(unsignedchar*);voiddidi();voidverify_password ();voidLoad();voidFirst();voidread_password ();voidSet_password();voiddelay(unsigned char a);unsigned charkbscan();void LCD_check_busy(void) (while(l)蜂鸣报警模块函数开锁判断模块函数初始化函数读入密码模块函数设定密码模块函数毫秒延时模块函数键盘扫描模块函数检测LCD状态voidLCD_printc(unsignedchar);1.CD_EN=O;
26、1.CD_RS=O;1.CD_RW=1;1.CD_DATA=Oxff;1.CD_EN=1;if(!LCD_BUSY)break;)1.CD_EN=0;voidLCD_cls(void)/LCD清屏(1.CD_check_busy();1.CD_RS=0;1.CD_RW=0;1.CD.DATA=1;1.CD_EN=1;1.CD_EN=0;voidLCD_write_instruction(unsignedcharLCDJnstruction)写指令到LCD(1.CD_check_busy();1.CD.RS=0;1.CD_RW=0;1.CD_DATA=LCDJnstruction;1.CD_EN
27、1;1.CD_EN=O;)voidLCD_write_data(unsignedcharLCD.data)输出一个字节数据到1.CD(1.CD_check_busy();1.CD_RS=1;1.CD_RW=0;LCD_DATA=LCD_data;1.CD_EN=1;1.CD_EN=O;voidLCD_set_position(unsignedcharx)(1.CD_write_instruction(0x80+x);)*voidLCD_go_home(void)(1.CD_write_instruction(LCD_GO_HOME);)*/voidLCD_printc(unsignedcha
28、rlcd_data)1.CD1.CD_write_data(lcd_data);)voidLCD_prints(unsignedchar*lcd_string)1.CDunsignedchari=0;while(lcd_stringi!=OxOO)(1.CD_write_data(lcd_stringi);i+;/LCD光标定位至Jx处/LCD光标归位输出一个字符到输出一个字符串到voidLCDJnitial(Void)初始化LCDLCD_write_instruction(LCD_AC_AUTOJNCREMENT|LCD_MOVE_DISENABLE);1.CD_write_instruct
29、ion(LCD_DISPLAY_ON|LCD_CURSOR_OFF);1.CD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);1.CD_cls();voiddelay(unsigned char a)unsigned char i;while(a-)unsigned char code kbscan()键盘扫描模块函数unsigned char hang,lie;if(Pl!=0x0f) delay (5);if(Pl! =OxOf)软件消抖判断是否有按键Switch(PlcfcOxOf)case 0x0e:hang=0;break; case OxOd
30、hang= 1 ;break; case 0x0b:hang=2;break; case 7:hang=3;break;扫描行Pl=OxfO;Pl=Oxft);SWitCh(Pl &OxfO)case OxeO:lie=O;break; case OxdOilie=I ;break; case 0xb0:lie=2;break; case 0x70:lie=3;break;扫描列Pl=OxOf;while(Pl!=OxOf);key=tabhanglie;)elsekey=0;return(key);)voidLoad()unsignedchari;beep=1;1.EDR=O;1.EDE=
31、I;key=0;Pl=Oxft);PO=Oxff;for(i=0;i9;i+)input-passwordi=,0,;normaLpassword9=0,;LCDJnitialO;1.CD_set_position(1);1.CD-prints(Why,sElectron*1);LCD_set_position(0x40);1.CD-prints(uCipherLock);while(kbscan()=0);return;)voidfirst()/确定按键键值无按键初始化函数系统变量数组清零提示信息LCD显示按任意值返回while(kbscan()=0);1.CD_cls();return;v
32、oid read_password()读入密码模块函数unsignedchari=0;LCD_set_position(0x40);LCD_prints();for(i=0;i9;i+)input-passwordi=,0,;读入密码数组初始化for(i=0;i=0&key0)i-;break;读入位置左移caseR:if(i0;i-)input-passwordi=,0,;input-passwordi=0,;break;清空读入内容caseB:if(i0)(i;input_passwordi=0;LCD_set_position(0x44+i);LCD_printc(,);)进行退格操作b
33、reak;case,S:break;功能键处理default:input_passwordi=key;有效数字密码保存1.CD_set_position(0x44+i);1.CD_printc(input_passwordi+);)key=O;键值清零void Set_password()(unsigned char i,j;/设定密码模块函数局部循环、判断变量while(l)1.CD_cIs();1.CD_set_position(1);1.CD-prints(uSetPassword11);1.CD_set_position(0x40);1.CD_prints(,);提起信息显示read_
34、password();读入密码stmcpy(temp_noimal_password,input_password,9);/i码保存在临时设定密码数组for(i=0;i9;i+)input-passwordi=,0,;读入密码数组初始化1.CD_set_position(0x44);while(kbscan()=O);1.CD_cls();1.CD_set_position(1);1.CD-prints(,Inputagain);read_password();进行设定密码确认j=strcmp(input_password,temp_normal_password)=0;/lJ断两次密码是否相
35、同for(i=0;i9;i+)input-passwordi=,0,;Jif(j)1.CD_cls();1.CD_set_position(2);1.CD-prints(,SetPassword*);1.CD_set_position(0x42);1.CD-prints(,Successfully);strncpy(normal_password,temp_noimal_password,9);for(i=0;i9;i+)temp-normaLpasswordi=,0,;while(kbscan()=O);break;如果相同保存密码进行提示else1.CD_cls();1.CD_set_po
36、sition(1);for(i=0;i9;i+)temp-normaLpasswordi=,0,;)1.CD_prints(Passwordsis);1.CD_set_position(0x43);1.CD-prints(ndifference);while(kbscan()=O);continue;如果不同放弃密码并返开锁判断模块函数判断是否开锁回重新设定voidverify_password()unsignedchari;Iock=(strcmp(input_password,normal_password)=0);if(lock=l)1.CD_cls();1.CD_set_positio
37、n(5);LCD,prints(,Unlock);1.CD_set_position(0x42);1.CD-prints(,Successfully);1.EDR=1;LEDE=O;miss=0;while(kbscan()=O);1.CD_cls();1.CD_set_position(1);1.CD_prints(uPressanykey);1.CD_set_position(0x43);1.CD-prints(utolockup);while(kbscan()=0);Iock=O;1.EDR=O;LEDE=1;)else(miss=miss+l;if(miss3);else(1.CD_c
38、ls();1.CD_set_position(3);1.CD_printScWaming!);didi();)1.CD_cls();1.CD_set_position(1);1.CD_prints(uPasswordError);while(kbscan()=O);1.CD_cls();1.CD_set_position(4);1.CD_prints(Inputthe);1.CD_set_position(0x40);1.CD_prints(,passwordagainu);while(kbscan()=O);判断是否进行异常告警异常告警提示密码错误并返回/输入密码数组初始化/蜂鸣报警模块函数蜂鸣50s响 25OmS静 250ms停响IOsfor(i=0;iavxF3N11ERymP3V112fr1,一4一IE产乒IE声0;:三1SF2s?P3JBV-Ir46Lo-L6=AYrA一一一门二:r.I时间设计任务完成情况教师签名5月30日至31日图书馆查阅资料及上网查找相关资料6月1日至6月2进行工程编程6月3日至6月7口进行仿真测试,及修改6月8日至6月10H完善课程设计指导教师意见及成绩评定对学生设计过程、设计质量的评分依据总评成绩指导教师(签名):年月日教研室及系审定意见教