课程设计(论文)基于单片机的密码锁设计.doc

上传人:文库蛋蛋多 文档编号:3993458 上传时间:2023-03-30 格式:DOC 页数:29 大小:352KB
返回 下载 相关 举报
课程设计(论文)基于单片机的密码锁设计.doc_第1页
第1页 / 共29页
课程设计(论文)基于单片机的密码锁设计.doc_第2页
第2页 / 共29页
课程设计(论文)基于单片机的密码锁设计.doc_第3页
第3页 / 共29页
课程设计(论文)基于单片机的密码锁设计.doc_第4页
第4页 / 共29页
课程设计(论文)基于单片机的密码锁设计.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《课程设计(论文)基于单片机的密码锁设计.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于单片机的密码锁设计.doc(29页珍藏版)》请在三一办公上搜索。

1、摘 要数字密码锁是使用数字密码进行开锁的锁具,它的特点是不用钥匙、无锁孔、机械转动、不易损坏、不磨损、不易被破译、可多次更换密码、换号不换锁。调查显示,多数人希望使用安全方便又不需要钥匙的数字锁具,而目前数字密码锁还没有普及。因此,数字密码锁具有极为广阔的市场前景。本设计是基于单片机的电子密码锁设计,系统由AT89S52与EEPROM器件AT24C02作为主控芯片与数据存储单元,结合外围的键盘输入、LCD显示、蜂鸣器报警等模块实现多用户密码锁,主要包括一下功能:在账户名与密码匹配情况下提示解锁;密码错误时有错误提示,管理员账户可新建账户等功能。关键词:电子密码锁;多用户AbstractDigi

2、tal lock is a kind of lock that open without keys. It can changed the password as your wish. According to some report, most people show great interesting in this kind of lock without keys. But it is not widely used. so it having great market prospect.This design a code lock is based on MCU AT89S52 a

3、nd EEPROM AT24C02 cooperated with keyboard 、LCD display and beeper scheme. Its main function is making the lock open while the ID and the PIN are right and providing a multiple user system that the administrator can create new user in the system. Keywords: Electronic lock ;Multiple users目 录引言11 课题设计

4、目标12 总体设计方案12.1 设计思路12.2 方案确立13 硬件电路方框图23.1 单片机及其最小系统23.1.1 复位电路的设计23.1.2 时钟电路的设计23.2 密码锁电路33.2.1 按键电路的设计33.2.2 报警控制电路的设计43.2.3 LCD显示电路43.2.4 AT24C02掉电存储单元的设计54 程序设计54.1 模块介绍54.2 重要程序说明75 课程设计总结9谢 辞11参考文献12附 录13附录一:实物图13附录二:程序清单14引言数字密码锁是二十一世纪制锁业的一次革命。密码锁的特点是不用钥匙、无锁孔、机械传动、不易损坏、不磨损、不易被破译、可多次更换密码、换号不换

5、锁、一把锁多个密码,具有防拨、防砸、防撬、防堵等功能,安装门锁时不破坏原门。“数字密码锁”是利用数字密码来开启的锁具,其重复概率仅为十万分之一,有着很高的安全性;而旋芯式锁具使用不够安全。通过对社会各阶层千余人的调查,百分之百的人都愿意一身轻松没有任何顾虑的出入家门,都愿意用上一种既安全方便又不用钥匙的锁具,对目前身上挂着的串串钥匙无可奈何。但现在又没有一种锁具可使人摆脱钥匙的束缚。因此,设计数字密码锁的市场发展前景极为广阔。1 课题设计目标本设计采用MCS-51系列单片机AT89S52作为主控芯片,结合外围电路,设计密码锁控制系统,能够实现:(1)具备账户管理功能的密码锁系统,在输入密码,开

6、锁、解锁时均有声音提示。(2)根据用户权限提供不同的操作支持,管理员账户可以新建用户账号,修改管理密码,普通账户只提供修改密码服务。2 总体设计方案2.1 设计思路该电路是一种采用以AT89S52为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能根据实际需要添加调电存储、声光提示功能。2.2 方案确立(1)为了实现密码的保密性,采用一个44的矩阵式键盘可以任意设置用户密码,从而提高了密码的保密性。(2)为了确保密码锁的持久性,采用了AT24C02为核心的掉电存储单元,确保了密码锁在意外掉电情况下仍然能够起到记住密码的功能。(3)

7、采用LCD显示单元,提高了可读性 ,提供良好的人机界面。3 硬件电路方框图电路由两大部分组成:AT89S51单片机及其外围电路和密码锁电路。AT89S52单片机及其外围电路包含:AT89S52单片机、时钟电路、复位电路。密码锁电路包含:矩阵键盘输入、LCD指示电路、报警控制电路、AT24C02掉电存储电路。其原理方框图如图1所示。AT89S52单片机及其外围电路AT24C02掉电存储矩阵键盘控制LCD显示电路报警控制电路图1系统原理框图3.1 单片机及其最小系统3.1.1 复位电路的设计复位是单片机的初始化操作。单片机启运运行时,都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始

8、状态,并从这个状态开始工作。因而,复位是一个很重要的操作方式。但单片机本身是不能自动进行复位的,必须配合相应的外部电路才能实现。该复位电路采用按键电平复位式复位电路。当单片机已在运行当中时,按下复位键S后松开,在复位引脚RET(9脚)脚持续出现24个振荡器脉冲周期(即2个机器周期)的高电平信号将使单片机复位。也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。如图2所示。图2 复位电路3.1.2 时钟电路的设计时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在统一的时序脉冲的驱动下的进行的,如果单片机的时钟电路停止工作(晶振停振),那么单片机也就停止运行了。当采用内部时钟时

9、,连接方法如下图所示,在晶振引脚XTAL1(19脚)和XTAL2(18脚)引脚之间接入一个12MHZ晶振,两个引脚对地分别再接入一个电容即可产生所需的时钟信号,电容的容量一般在几十皮法,如22PF。如图3所示。图3 时钟电路3.2 密码锁电路3.2.1 按键电路的设计图4 按键电路如上图所示,每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要4条行线和4条列线,即可组成具有44个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对

10、键的识别采用的是速度较快的线反转法。对照图4所示的44键盘,说明线反转个工作原理。首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查询所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。3.2.2 报警控制电路的设计该电路采

11、用单频声音报警电路,实现单频音报警的接口电路比较简单,其发音元件通常可采用压电蜂鸣器,当在蜂鸣器两引脚上加315V直流工作电压,就能产生3kHZ左右的蜂鸣振荡音响。压电式蜂鸣器结构简单、耗电少,更适于在单片机系统中应用。压电式蜂鸣器,约需10mA的驱动电流,可在某端口接上一只三极管和电阻组成的驱动电路来驱动,P.3.7接三极管基极输入端,当P3.7输出高电平“0”时,三极管导通,蜂鸣器的通电而发音,当P3.7输出低电平“0”时,三极管截止,蜂鸣器停止发音。如图6所示:图6 报警控制电路3.2.3 LCD显示电路本系统设计的显示电路是为了给使用者以提示而设置的。因为系统具有账户管理系统,使用LC

12、D可以为用户提供更友好的人机界面,故选用LCD1602作为显示器件。 图 7显示器原理图3.2.4 AT24C02掉电存储单元的设计掉电存储单元的作用是在电源断开的时候,存储当前设定的密码及账户信息。AT24C02是ATMEL公司的2KB字节的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。其电路如图8所示。图8 掉电存储电路原理图图中R10、R11是上拉电阻,其作用是减少AT24C02的静态功耗,由于AT24C02的数据线和地址线是复用的

13、,采用串口的方式传送数据,所以只用两根线SCL(移位脉冲)和SDA(数据/地址)与单片机传送数据。每当设定一次密码,系统就自动调用存储程序,将密码信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的密码信息,读到缓存单元中,供主程序使用。4 程序设计4.1 模块介绍本设计将密码锁软件分为以下几个模块(程序见附录程序清单):(1)主程序模块主程序主要完成系统及外围电路的初始化,控制LCD根据按键操作进行各个状态的转化,实现密码锁的人机交互界面。(2)键盘驱动及键盘输入程序主要包括键盘扫描的程序,根据按键的布局进行符合操作习惯的键值映射,键盘操作到数据的转换。(3)LCD16

14、02驱动包括液晶屏的初始化程序和字符显示,字符串显示等基本函数,供主程序调用(4)AT24C02存取程序包括I2C总线的读写时序模拟控制及读写程序(5)蜂鸣器控制程序包括蜂鸣器长响和短响,作为提示音。主程序流程图如图11所示:输入一致?输入IDID存在?N解锁成功提示输入密码ID不存在Y显示修改密码提示修改密码从EEPROM中读取账户信息密码设置成功提示并将密码保存到EEPROM中密码错误提示管理员?正确?管理员操作输入用户ID及密码输入新密码及重复新建用户设置完成返回主界面密码设置成功提示并将密码保存到EEPROM中开始返回主界面图11 主程序流程图4.2 重要程序说明(1)AT24C02读

15、取程序本设计采用6位密码故选取长度为32位的 unsigned long 数据类型作为密码的存储格式,根据I2C总线的特点,每次可读取8位数据,所以需要根据驱动提供的字节读取函数编写账户信息存储程序,代码如下:unsigned long read_long(unsigned char address) /读取函数 int b4; unsigned long c=0; address=address*4; /每个数据为32位,每一个地址对应8位数据,故需要进行地址转换 int i;for(i=0;i=3;i+)bi=read_random(address); /驱动中读取的任意地址中字节的函数a

16、ddress+;for(i=0;i=3;i+) /将读出的四个8位变量转换成一个32位的变量c+=b3-i;if(i!=3)c=c8;return c; void write_long(unsigned char address,unsigned long write_data)int i;address=address*4;for(i=0;i8; address+;(2)数据输入程序程序的作用是将键盘输入的六个数转换成6位数值,并在按键按下时控制蜂鸣器声音提示,还包含有退格和确认功能,源程序如下:/line 为输入行在LCD的行,visual控制输入键盘输入是否可见unsigned long

17、 datainput(char line,char visual) unsigned long temp=0;char k=0xff;int j=0;while(j=0&k=9&j=1&k=C) /输入有字符且退格键被按下 j-; lcd_char_write(counter+j,line,_);temp=temp/100; beep(); if(k=OK&j=5) /输入完成且按下确认键 beep(); break; stat+; /输入完成后控制转入下一个状态,通知主程序输入结束,转入下一状态 k=0xff; return temp/10;5 课程设计总结本次课程设计综合运用了单片机及其外

18、围电路的知识,硬件方面涉及到单片机最小系统的设计,矩阵键盘的设计、LCD显示器LCD1602的电路设计以及I2C总线器件AT24C02应用电路的设计,在程序方面涉及到矩阵键盘、LCD1602、I2C数据读取的驱动程序设计,并基于驱动程序提供的顶层函数根据密码锁人机界面的需要设计了键值映射,输入键值到数值的转换,I2C总线读取长整形变量等相关函数,实现底层驱动到用户界面的接口。在设计的过程中对C语言程序与汇编程序的混合编程及混合调用有和更深入的了解,并认识到相对于一般软件设计丰富的系统资源来说,单片机中的程序资源是非常少的,因此在嵌入式软件开发中特别要注意系统资源的高效利用,如在使用变量时要根据

19、变量的范围定义变量的类型,选择适合的数据类型,可以有效的节约系统资源,因此最终选择密码的存储方式时没有选用字符类型作为存储每一个数值的存储,而是将数值类型换为32位整形数值进行存储,相对于字符存储的48位来说32位占用更少的空间,提高代码的重用性也是节约系统资源的一种有效方法,将需要多次使用的程序,如本次设计中的输入子程序,应该编写成函数的形式,再进行调用,这样可以节约出很多的程序空间。本次设计的密码锁系统由于代码空间限制,只完成了多用户密码锁的基本功能:可设置多个账户,使用各自的6位账户和6位密码开锁,具有按键音、解锁提示,错误提示等。本设计还可以加入输入密码错误次数检测,当大于设定的次数后

20、对密码锁进行锁定。在账户管理系统中还可以加入所以用户ID的查看功能,开锁历史查看功能。在账户信息的存取过程中可以进行一定的加密运算,以提高系统的安全性,加大通过其他设备读取存储芯片中的数据破解密码锁的难度。本次设计完成的是密码锁系统的控制部分,只有开锁相关的声光提示、并没有真正的实现机械上的解锁功能,加入继电器和相关的机械部分后可实现真正的实用密码锁。谢 辞本论文是在张法全老师的悉心指导下完成的,自由选题的方式让我有了这个深入学习单片机的机会,他对论文格式的严格要求,我不仅学会了理工类论文的一般格式,更让我深刻的感受到工科的严谨与务实。同时还要感谢资源丰富的互联网为我学习单片机相关知识提供了一

21、个良好的资源平台。在课程设计进行的过程中,得到二院科协提供的制版设备支持,在此表示感谢。特别要感谢的是舍友提供的51单片机下载器,给程序调试工作带来的极大方便。参考文献1 张天凡. 完全手册-51单片机C语言开发详解M.电子工业出版社,20082 李群芳. 单片微型计算机与接口技术M.北京:电子工业出版社,20083 赵景波. Protel DXP实用教程M.人民邮电出版社,20094 丁明亮,唐前辉. 51单片机应用设计与仿真-基于Keil C与ProteusM. 北京航空航天大学出版社,20095 Atmel.AT89S51 Data Sheet6 ShareWave.LCD1602器件手

22、册7 Atmel. AT24C02 Data Sheet附 录附录一:实物图附录二:程序清单(1)主程序/*主程序,调用各功能模块控制密码锁工作流程*/#include#include#include#include#include#define counter 5#define U_Addr0 0#define P_Addr0 1#define U_Addr1 2#define P_Addr1 3unsigned long user2=999999,0;/用于存储账户信息unsigned long pin2 =9999,0;char stat=0,level;void input_scree

23、n(void) /输入界面 lcd_command_write(0x01,1);/清屏 lcd_printf(0,0, ID:_); lcd_printf(0,1, PIN:_);void failed_screen()lcd_printf(0,0,Failed!);/lcd_printf(0,1,Try Again!);/BEEP=0;/delay_long(1000);/BEEP=1;beep_long();lcd_command_write(0x01,1);/清屏stat=0;void main(void)unsigned long u_temp,p_temp,p_temp1;int j

24、=0,k; EA=1;lcd_system_reset();/初始化LCD1602 WP=0; while(1) if(stat=0) /initial stat=0 set to stat=1 user1=read_long(U_Addr1); pin1=read_long(P_Addr1); input_screen(); stat+; if(stat=1) /input user u_temp=datainput(0,1); if(stat=2) /finish user input set stat=3 for(level=0;level); break; if(level=2) /c

25、heck ID lcd_printf(0,0,ID is not exist); /no exist /lcd_printf(0,1,Try again!); beep_long(); stat=0; else stat+; /add if(stat=3) /pin input p_temp=datainput(1,0);if(stat=4) /pin check if(p_temp=pinlevel) lcd_command_write(0x01,1);/清屏 lcd_printf(0,1,Unlocked!); beep_long();stat+; else failed_screen()

26、;if(stat=5) /account opt if(level=0) /admin options lcd_command_write(0x01,1);/清屏 lcd_printf(0,0,1.set PassWord); lcd_printf(0,1,2.New ID); stat+; else /user options lcd_printf(0,1,1.Set PassWord); stat+; if(stat=6) k=k2f(key_scan(); if(k=1) /user opt stat+; else if(level=0&k=2) /admin stat=9是进入新建账号

27、模式 input_screen(); stat=stat+3; if(stat=7) lcd_command_write(0x01,1);/清屏 lcd_printf(0,0,new:_);lcd_printf(0,1, re :_); stat+; if(stat=8)p_temp1=datainput(0,0); lcd_char_write(0,1,); p_temp=datainput(1,0); if(p_temp1=p_temp) /pinlevel=p_temp1; if(level=0) /write_long(P_Addr0,p_temp1); pin0=p_temp1; e

28、lse write_long(P_Addr1,p_temp1); lcd_command_write(0x01,1);/清屏 lcd_printf(0,1,Set finished!); beep_long(); stat=0;else lcd_printf(0,0,Set failed !); /lcd_printf(0,1,Try again!);/ p_temp1=0;/ p_temp2=0; beep_long(); stat=7; if(stat=9) u_temp=datainput(0,1); lcd_char_write(0,1,); p_temp=datainput(1,0)

29、; write_long(U_Addr1,u_temp); write_long(P_Addr1,p_temp); lcd_printf(0,1,Set finished!); beep_long(); stat=0; /while(1) end /main end(2)LCD1602驱动/*/*LCD1602相关驱动程序 lcd1602.h */*/#ifndef _LCD1602_h_#define _LCD1602_h_#define uint unsigned int#define uchar unsigned char#define lcd_data_port P0sbit lcd_

30、rs_port=P20;sbit lcd_rw_port=P21; sbit lcd_en_port=P22;void delay1(uchar ms)int j;while(ms-)for(j=0;j100;j+);void delay_long(unsigned char ms) /长延时 int j; while(j50) delay1(ms); j+; void lcd_busy_wait()/忙等待lcd_data_port = 0xff;lcd_rs_port=0;lcd_rw_port=1;lcd_en_port=1;delay1(5);/while(lcd_data_port&

31、0x80);lcd_en_port=0;void lcd_command_write(uchar command_data,bit flag)/LCD1602命令字写入用于写入控制字if(flag) lcd_busy_wait();lcd_rs_port=0;lcd_rw_port=0;lcd_en_port=0;lcd_data_port=command_data;delay1(5);lcd_en_port=1;lcd_en_port=0;void lcd_system_reset()/LCD1602初始化程序delay1(15);lcd_command_write(0x38,0);dela

32、y1(5);lcd_command_write(0x38,0);delay1(5);lcd_command_write(0x38,0);delay1(5);lcd_command_write(0x38,1);lcd_command_write(0x08,1);lcd_command_write(0x01,1);/清屏lcd_command_write(0x06,1);lcd_command_write(0x0c,1);void lcd_char_write(uchar x_pos,y_pos,lcd_data)/LCD1602输入某一位置要显示的字符x_pos=x_pos&0x0f;/16xx

33、液晶x的范围是015y_pos=y_pos&0x01;/y的范围是01if(y_pos) x_pos=x_pos+0x40;x_pos=x_pos+0x80;lcd_command_write(x_pos,0);lcd_busy_wait();lcd_rs_port=1;lcd_rw_port=0;lcd_en_port=0;lcd_data_port=lcd_data;delay1(5);lcd_en_port=1;lcd_en_port=0;void lcd_printf(int x0,int y0,uchar* string) /从位置x0,y0开始显示一个字符串 for(;x0=0xf

34、&*string!=0;x0+) lcd_char_write(x0,y0,*string); string+; #endif(3)44键盘驱动#ifndef _KEY_h_#define _KEY_h_#define p_key P1#define C 21 /定义退格键键值#define OK 22 /定义确认键键值/*按键扫描函数*/描 述:对4*4键盘进行扫描,程序只适合4*4键盘使用,/ 键盘占用一组完整的i/o口,在使用这个程序前/ 要宏定义p_key为用户实际连接键盘的i/o口 / #define p_key Pn;/(n=0、1、2、3)/*unsigned char key_

35、scan(void) unsigned char j,key,key_buf=0; p_key=0xff; /检测是否有建按下/ p_key=0xf0; key=p_key; if(key=0xf0) return(0xff);/没按键按下,返回0xff /有按下,延时去抖/ delay1(50); /确认是否有建按下/ p_key=0xf0; key=p_key; if(key=0xf0) return(0xff);/没按键按下,返回0xff /真的有按键按下,扫描是哪一行有按键按下/ for(j=0;j4;j+) key=p_key&(0x10j); if (key) key=p_key; else key_buf=j*4; p_key=(0x10j);/第j行的按键按下了,第j行输出0,其他的i/o口输出1 /扫描是第j行的哪个按键按下/ for(j=0;j4;j+) key=p_key&(115) return 0

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号