0

    电子密码锁 说明书.doc

    2023.05.22 | admin | 184次围观

    09机械电子工程2所在学院和系:机械工程学院2012-7-23至2012-8-3综合设计性实验目录1.1电子密码锁的背景与研究意义1.2电子密码锁设计的主要目标2.1系统总体设计2.2主要芯片介绍2.2.1芯片AT89C512.2.2存储芯片AT24C022.2.3LM032L显示器3.1单片机最小系统设计3.2键盘输入模块3.3密码存储模块3.4复位部分3.5晶振部分103.6显示模块103.7开锁部分113.8警报部分134.1系统程序流程图134.2系统仿真电路图144.3显示模块仿真图154.3.1开锁显示仿真154.3.2修改密码显示仿真164.4程序代码17参考文献18附录源代码绪论1.1电子密码锁的背景与研究意义当今社会,安全防盗已成为社会问题,而锁自古以来就是防盗的重要工具,目前国内大部分人使用的还是传统的机械锁。然而,眼下假冒伪劣的机械锁互开率非常高,此外,即使是一把质量过关的机械锁,通过急开锁,甚至可以在不损坏锁的前提下将锁打开。机械锁的这些弊端为电子密码锁的发展提供了很大空间。现今常见的密码锁设计主要有两种方案,一种是中规模集成电路控制的方案,另一种是单片机控制的方案。

    对于采用集成电路控制的方案,其中的编码电子锁电路分为编码电路、控制电路、复位电路、解码电路、防盗报警电路、门铃电路,而电子锁主要由输入元件、电路(包括电源)以及锁体三部分组成。而利用单片机控制的方案,由于单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加掉电存储、声光提示甚至添加遥控控制功能,但其也有一定的局限性,就在于其控制原理的复杂以及要求设计人员具有更加良好的程序设计能力,调试较为繁琐,否则程序一旦跑飞将造成意想不到的损失。1.2电子密码锁设计的主要目标本次设计从2012号,为期12天。设计的密码锁采用单片机为主控芯片,结合外围电路组成电子密码控制系统,密码锁共6位密码电子锁使用说明书,每位的取值范围为0~9,原始密码为六个0,用户可以自行设定和修改密码。用户想要打开锁,必先通过提供的键盘输入正确的密码才可以,密码输入错误有提示;6位密码同时输入正确,锁才能打开。另外系统能够存储密码,因此电子密码锁保密性强、灵活性高。其具体特点如下:密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。系统总体设计和主要芯片介绍2.1系统总体设计本设计主要由单片机AT89C51、矩阵键盘、液晶显示器和密码存储等部分组成。

    其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可。系统整体框图如图2-1所示。图2-1系统结构框图各模块功能如下:1.键盘输入模块:分为密码输入按键与几个功能按键,用于完成密码锁输入功能。2.液晶显示模块:用于完成对系统状态显示及操作提示功能。3.密码存储模块:用于完成掉电存储功能,使修改的密码断电后仍能保存。4.开锁电路:应用继电器及发光二极管模拟开锁,完成开锁及开锁提示。报警电路:密码输入错误会发出蜂鸣声。主控芯片AT80C51键盘输入模块开锁电路报警电路密码存储模块键盘输入模块液晶显示模块2.2主要芯片介绍2.2.1芯片AT89C51本次毕业设计选用的是AT89C51,AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

    由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51主要特性:与MCS-51兼容4K字节可编程FLASH存储器1288位内部RAM6.32可编程I/O两个16位定时器/计数器8.5个中断源编程串行通道10.低功耗的闲置和掉电模式11.振荡器和时钟电路AT89C51单片机引脚如图2-2所示。图2-2AT89C51芯片管脚2.2.2存储芯片AT24C02AT24C02是美国Atmel公司的低功耗CMOS型EPROM,内含2568位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)、抗干扰能力强、数据不易丢失、体积小等特点。而且他是采用了IC总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程电子锁使用说明书,进行数据实时的存取十分方便。AT24C02中带有的片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。

    IC总线是一种用于IC器件之间连接的二线制总线。他通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。AT24C02正是运用了IC规程,使用主/从机双向通信,主机(通常为单片机)和从机(AT24C02)均可工作于接收器和发送器状态。主机产生串行时钟信号(通过SCL引脚)并发出控制字,控制总线的传送方向,并产生开始和停止的条件。无论是主机还是从机,接收到一个字节后必须发出一个确认信号ACK。AT24C02的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向。仿真过程中用24C02C代替芯片AT24C02。管脚如图2-3所示。管脚描述:SCL为串行时钟:串行时钟输入管脚用于产生器件所有数据发送或接收的时钟这是一个输入管脚。SDL为串行数据/地址:双向串行数据/地址管脚用于器件所有数据的发送或接收SDL,是一个开漏输出管脚可与其它开漏输出或集电极开路输出进行线或。A0、A1、A2为器件地址输入端:当使用24C02时最大可级联8个器件,如果只有一个24C02被总线寻址,这三个地址输入脚A0、A1、A2可悬空或连接到VSS。

    WP为写保护:如果WP管脚连接到VCC所有的内容都被写保护只能读当WP,管脚连接到VSS或悬空,允许器件进行正常的读/写操作。图2-3AT24C02引脚图2.2.3LM032L显示器现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。LM032LLCD显示模块具有体积小,功耗低,显示内容丰富等特点。LM032L型LCD可以显示2行20个字符,有8位数据总线D0~D7和RS,RW,E三个控制端口,工作电压为5V,并且具有字符对比度调节功能。接口信号说明:LM032L 型LCD 的接口信号说明如表2-4 所示。 表2-4LM032L 型LCD 的接口信号说明 VSS电源地 D1双向数据线 VDD+5V 电源 D2双向数据线 VEE液晶显示偏压信号 第10 D3双向数据线 RS数据/命令选择端 第11 D4双向数据线 选择端第12 D5双向数据线 D6双向数据线 D0双向数据线 第14 D7双向数据线 基本操作程序: 读状态:令RS=L,RW=L, 输出:D0~D7=状态字读数据:令RS=H,RW=H, 输出:无写指令:令RS=L,RW=L,D0~D7=指令码,E=高脉冲 输出:D0~D7=数据 写数据:令RS=H,RW=L, D0~D7=数据, E=高脉冲 输出:无 硬件设计本系统外围电路包括键盘输入部分、密码存储部分、复位部分、显示部分、报警部分、 开锁部分组成,根据实际情况键盘输入部分选择44矩阵键盘,显示部分选择字符型液晶显 示LCD LM032L,密码存储部分选用AT24C02芯片来完成。

    3.1 单片机最小系统设计 主控芯片AT89C51的XTAL2,XTAL1引脚外接上12MHz石英晶体以及30 pF电容C2和C3.构 成并联谐振电路,在 RST 脚上外接按键与上电复位电路,在 VCC 引脚接上+5V 电压,EA 脚上 接高电平,VSS(GND)接地,就构成了单片机最小系统,如图 3-1 所示。接通+5 电源后,用示波器检测XTAL2 有无脉冲信号,在ALE/PROG 上检测到12/6MHz 的脉冲,系统就可以进行工 图3-1AT89S51 最小系统结构图 3.2键盘输入模块 由于本设计所用到的按键数量较多而不适合用独立按键式键盘。所以采用的是矩阵式 按键键盘,它由行和列组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由 键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。本设计中使用的这个44键盘 不但能完成密码的输入还能作特别功能键使用。键盘的每个按键功能在程序设计中设置。键 盘如图3-2所示。 图3-2 键盘输入模块 3.3 密码存储模块 如图 3-3 所示。AT24C02 脚是三条地址线,用于确定芯片的硬件地址,在AT89C51 试验开发板上它们都接地。

    AT24C02 中带有片内地址寄存器。每写入或读出一个数 据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操 作方式读取。为降低总的写入时间,一次操作可写入多达8 个字节的数据。 图3-3密码存储电路 3.4 复位部分 单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状 态开始工作。当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电 平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。根据 应用的要求,复位操作通常有两种基本形式:上电复位和开关复位。本设计采用手动复位, 手动(开关)复位电路图3-4所示。 图3-4 复位电路 10 3.5 晶振部分 晶振电路如图4-5所示。AT89S52引脚XTAL1和XTAL2与晶体振荡器及电容C1、C2按图示方 式连接。晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器, 振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz 之间,电容C1、C2取值范围在5~30pF之间。

    根据实际情况,本设计中采用12MHZ作为系统的 外部晶振,电容取值为20pF。其电路图如图3-5所示。 图3-5 晶振电路 3.6 显示模块 显示部分由液晶显示器LCD LM032L取代普通的数码管完成。开锁时,按下键盘上的开锁 按键后,利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*, 输入多少位就显示多少个*。当密码输入完成时,按下确认键,如果输入的密码正确的话, LCD 显示“CORRECT!”,单片机其中P3.3引脚会输出高电平,使三极管Q3导通,LED灯D1亮,电 磁铁吸合,继电器开关跳转,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“WRONG PASSWORD”,P3.3输出的是低电平,电子密码锁不能打开。通过LCD显示屏,可以清楚地判 断出密码锁所处的状态。电路图如图3-6所示。 11 图3-6 显示电路 3.7 开锁部分 开锁控制电路的功能是当输入正确的密码后将锁打开。系统使用单片机其中一引脚线 发出信号,经三极管放大后,由继电器驱动电磁阀动作将锁打开。用户通过键盘任意设置密 码,并储存在E PROM中作为锁码指令。只有用户操作键盘时,单片机的电源端才能得到一定电压的电源,否则,单片机处于节电工作方式。

    开锁步骤如下:首先按下键盘上的开锁按键, 然后利用键盘上的数字键0-9输入密码,最后按下确认键。当用户输入密码后,单片机自动 识别密码,如果密码不符,则报警。只有当密码正确,单片机才能使继电器处于开锁状态。 具体电路如图3-7所示。 12 图3-7 开锁电路 3.8 警报部分 警报控制电路的功能是当输入错误的密码后,P3.5口输出电平由低变高,此时蜂 鸣器将发出刺耳蜂鸣声,做出报警提示,报警电路如图3-8所示。 图3-8 警报电路图 13 系统软件设计4.1 系统程序流程图 主程序设计流程图如图4-1 所示。 图4-1 主程序流程图 开始 输入‘1’或‘2’ 判断 输入密码判断 开锁成功输入原始密码 判断 输入新密码再次输入密码 密码修改成功 错误提示 144.2 系统仿真电路图 本次设计用Keil-51 单片机开发软件编写C 语言程序代码,生成用于烧录至单片机的Hex 文件,用单片机仿真软件Proteus7.8 进行软件仿真,仿真电路如图4-2 所示。 图4-2 系统仿真图 15 4.3 显示模块仿真图 4.3.1 开锁显示仿真 当从键盘输入数字‘1’时显示开锁提示,输入六位密码,当密码与设置的密码匹配时, 开锁电路中的LED D1亮,显示器提示如图4-3所示。

    图4-3 开锁成功仿真图 输入六位密码,当密码与设置的密码不相匹配时,显示器提示如图4-4所示。 图4-4 开锁失败仿真图 16 4.3.2 修改密码显示仿真 当从键盘输入数字‘2’时显示修改密码提示,输入六位密码,当输入的密码与原密码 不匹配时,显示器提示如图4-5所示。 图4-5 输入密码与原密码不匹配仿真显示图 输入六位密码,当输入的密码与原密码匹配时,显示器提示如图4-6所示。 图4-5 输入密码与原密码匹配仿真显示图 17 输入新密码,当两次输入新的密码相同时,显示器提示如图4-6所示。 图4-6 密码修改成功显示图 输入新密码,当两次输入新的密码不相同时,显示器提示如图4-7所示。 图4-7 密码修改失败显示图 4.4 程序代码 本次设计用Keil-51 单片机开发软件编写C 语言程序代码,代码见附录。 18 参考文献 [1]楼然苗,李光飞.单片机课程设计指导[M].北京:北京航空航天大学出版社,2007. [2]张毅刚.单片机原理及应用[M].北京:高等教育出版社,2004. [3]李强 .51 系列单片机应用软件编程技术[M].北京:北京航空航天大学出版社,2009. [4]段玉生,王艳丹,何丽静.电工电子技术与EDA 基础( )[M].北京:清华大学出版社,2004. [5]吴黎明. 单片机原理及应用技术[M].北京:科学出版社,2006. [6]尹志强.机电一体化系统课程设计指导书[M].北京:机械工业出版社,2007. 19 附录 源代码 源代码如下: #include #include #include #define uchar unsigned char #define C02_write 0xa0 #define C02_read 0xa1 #define no0 0x28 #define no1 0x14 #define no2 0x24 #define no3 0x44 #define no4 0x12 #define no5 0x22 #define no6 0x42 #define no7 0x11 #define no8 0x21 #define no9 0x41 #define enter 0x88 #define backspace 0x81 #define lcm_write_cmd_add XBYTE[0x80FF] #define lcm_write_data_add XBYTE[0x81FF] #define lcm_read_busy_add XBYTE[0x82FF] #define lcm_read_data_add XBYTE[0x83FF] uchar idata temp5_password[6]={0x00,0x00,0x00,0x00,0x00,0x00}; uchar idata key_code[]={no0,no1,no3,no4,no5,no6,no7,no8,no9}; sbit SCL=P3^0; sbit SDA=P3^1; sbit i=P3^2; sbit D=P3^3; sbit S=P3^5; bit ack; uchar int_counter_1; unsigned int int_counter_2; void delayms(uchar voidlongdelay(uchar unsignedint voidlcm_wait() voidlcm_write_cmd(uchar lcm_cmd) lcm_wait();lcm_write_cmd_add=lcm_cmd; voidlcm_write_data(uchar lcm_data) lcm_wait();lcm_write_data_add=lcm_data; ucharlcm_read_data(void) ucharlcm_data; lcm_wait(); lcm_data=lcm_read_data_add; return(lcm_data); voidlcm_setxy(uchar x,uchar 21void lcm_write_string(uchar *string) voidlcm_roll_display(uchar *string,uchar ucharcounter; lcm_write_cmd(0x06); lcm_setxy(0,y); while(string[counter]!=´\0´) lcm_write_data(string[counter]);counter++; (counter==19)lcm_setxy(19,y); longdelay(2); lcm_write_cmd(0x07);lcm_setxy(19,y); while(string[counter]!=´\0´) lcm_write_data(string[counter]);counter++; (counter==19)lcm_setxy(19,y); longdelay(2); voidlcm_init() delayms(20);lcm_write_cmd_add=0x38; delayms(4); lcm_write_cmd_add=0x38; delayms(1); lcm_write_cmd_add=0x38; lcm_write_cmd(0x38); 22 lcm_write_cmd(0x0f); lcm_write_cmd(0x01); lcm_write_cmd(0x06); voidI2C_start(void) SDA=1;SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); voidI2C_stop(void) SDA=0;SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); 23void I2C_ackownledge(void) SDA=0;_nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); voidI2C_no_ackownledge(void) SDA=1;_nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); voidI2C_sendB(uchar byte) ucharcounter; for(counter=0;counter

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论