基于单片机的电子密码锁设计_单片机课程设计报告

时间:2024.4.20

目  录

1、  引言…………………………………………………………… 1

2、  设计要求……………………………………………………… 2

3、  硬件电路设计…………………………………………………  3

     3.1  设计方案的选择……………………………………………  3

     3.2  主要元器件简介……………………………………………  4

3.3  硬件系统结构………………………………………………  8

4、  程序设计………………………………………………………  13

5、  总结……………………………………………………………  15

参考文献……………………………………………………………… 16

附件一:电路原理图及作品实物图………………………………… 17

附件二:程序清单…………………………………………………… 18


1、引言

1.1  单片机密码锁课程设计报告摘要

随着电子产品向智能化和微型化的不断发展,单片机已成为电子产品研制和开发中首选的控制器。随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,安全性能低,无法满足人们的需要。针对这些锁具给人们带来的不便若使用机械式钥匙开锁,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。

电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁。其特点如下:

1) 保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。

2) 密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。

3) 误码输入保护,当输入密码多次错误时,报警系统自动启动。

4) 无活动零件,不会磨损,寿命长。

5) 使用灵活性好,不像机械锁必须佩带钥匙才能开锁。

6) 电子密码锁操作简单易行,一学即会。

随着电子元件的进一步发展,电子密码锁也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的单密码输入发展到现在的,密码加感应元件,实现了真真的电子加密,用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提高出现了越来越多的电子密码锁。

由于数字、字符、图形图像、人体生物特征和时间等要素均可成为钥匙的电子信息,组合使用这些信息能够使电子防盗锁获得高度的保密性,如防范森严的金库,需要使用复合信息密码的电子防盗锁,这样对盗贼而言是“道高一尺、魔高一丈”。组合使用信息也能够使电子防盗锁获得无穷扩展的可能,使产品多样化,对用户而言是“千挑百选、自得其所”。可以看出组合使用电子信息是电子密码锁以后发展的趋势。

本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。系统能完成开锁、超次锁定、管理员解密、修改用户密码的功能。除上述基本的密码锁功能外,还具有掉电存储、声光提示等功能,依据实际的情况还可以添加其他功能。本系统成本低廉,功能实用。

1.2   关键词

单片机    密码锁    课程设计   报警


2、设计要求

2.1   设计任务

    设计一种基于单片机的密码锁。

2.2  设计要求

1)密码用键盘输入(4~8位);

2)用户可预置密码(4~8位),并永久保存;

3)用LED数码管或LCD显示密码值,密码设置成功或开锁后显示“******”;

4)密码输入成功后,开锁(用绿色的LED亮);密码输入错误时数码管或LCD提示错误信息,并且红色的LED亮;三次输入错误后,扬声器报警;

2.3  设计报告要求

说明设计作品的功能、特点、应用范围;

方案对比,确定方案。

电路设计、电路工作原理、技术指标测试;

编程方法、程序框图及关键程序清单。

课程设计总结。


3、硬件电路设计

3.1  设计方案的选择

3.1.1   方案一:采用数字电路控制

用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过10秒(一般情况下,用户不会超过10秒,若用户觉得不便,还可以修改)电路将报警20秒,若电路连续报警三次,电路将锁定键盘2分钟,防止他人的非法操作。采用数字电路设计的方案好处就是设计简单但控制的准确性和灵活性差。故不采用。

 

3.1.2   方案二:采用以单片机为核心的控制方案

由于单片机种类繁多,各种型号都有其一定的应用环境,因此在选用时要多加比较,合理选择,以期获得最佳的性价比。一般来说在选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。在开发过程中单片机还受到:开发工具、编程器、开发成本、开发人员的适应性、技术支持和服务等等因素。基于以上因素本设计选用单片机STC89C52作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示作用。当用户需要开锁时,先按键盘开锁键之后按键盘的数字键0-9输入密码。密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后可以设置新密码。新密码输入无误后按确认键使新密码将得到存储,密码修改成功。

可以看出方案二控制灵活准确性好且保密性强还具有扩展功能,根据现实生活的需要此次设计采用此方案。


3.2  主要元器件简介

3.2.1  主控芯片   单片机STC89C52

   1、宏基公司生产的STC89系列单片机,高速、低功耗、新增在系统/在应用可编程(ISP,IAP)功能。

2、特点:40个引脚,8k Bytes Flash片内程序存储器,512 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,片内时钟振荡器。STC89C52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。

STC89C52芯片引脚

3、STC89C52引脚功能说明:

Vcc:电源电压

GND:地

P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口,作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端口。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号校验期间,P1接收低8位地址。

P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流I。在访问8位地址的外部数据存储器(如执行:MOVX @Ri 指令)时,P2口线上的内(也即特殊功能寄存器,在整个访问期间不改变。Flash 编程或校验时,P2也接收高位地址和其它控制信号。

P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端口时,被外部拉低的P3口将用上拉电阻输出电流I。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。

RST:复位输入。当振荡工作时,RST引脚出现两个机器周期上高电平将使单片机复位。WDT益出将使该引脚输出高电平,设置SFR AUXR 的 DISRTO 位(地址8EH)可打开或关闭该功能。DISRTO 位缺省为RESET输出高电平打开状态。

ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出的正脉冲信号,因此它可对外输出时钟或用于定时目地,要注意的是:第当访问外部数据存储器时将跳过一个ALE脉冲。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位禁位后,只有一条MOVX 和MOVC指令ALE才会被激活。此外,该引脚伎被微弱拉高,单片机执行外部程序时,应设置ALE无效。

PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当STC89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,高有两次有效的PSEN信号。

EA/VPP:外部访问允许。欲使CPU公访问外部程序存储器(地址0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程电压Vpp。

XTAL1:振荡器反相放大器及内部时钟发生器的输入端。

XTAL2:振荡器反相放大器的输出端。


3.2.2  外部存储芯片  AT24C02(ATMLU830)

AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5 V)、擦写次数多(大于10000次)、写入速度快(小于10 ms)、抗干扰能力强、数据不易丢失、体积小等特点。而且他是采用了I2C总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存取十分方便。AT24C02中带有的片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。I2C总线是一种用于IC器件之间连接的二线制总线。他通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。 AT24C02正是运用了I2C规程,使用主/从机双向通信,主机(通常为单片机)和从机(AT24C02)均可工作于接收器和发送器状态。主机产生串行时钟信号(通过SCL引脚)并发出控制字,控制总线的传送方向,并产生开始和停止的条件。无论是主机还是从机,接收到一个字节后必须发出一个确认信号ACK。AT24C02的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向。

注:本设计采用的是同功能芯片ATMLU830,只命名方式不同,其功能与24C02完全相同。

AT24C02引脚图

管脚描述

A0 A1 A2:器件地址选择

SDA:串行数据/地址

SCL:串行时钟

WP:写保护

Vcc:+1.8V  6.0V 工作电压

GND:地

AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。在STC89C52的作品板上,第8脚和第4脚分别为正、负电源。第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,和单片机的P3.5连接。第6脚SCL为串行时钟输入线,和单片机的P3.4连接。SDA和SCL都需要和正电源间各接一个4.7K的电阻上拉。第7脚需要接地。


3.2.3  显示器件  LCD1602液晶显示器

现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。

1602型LCD的接口信号说明

1602型LCD的主要技术参数如下表所示:

                       1602型LCD的主要技术参数

基本操作程序:

读状态:输入:RS=L,RW=L,  E=H                         输出:D0~D7=状态字

读数据:输入:RS=H,RW=H, E=H                               输出:无

写指令:输入:RS=L,RW=L, D0~D7=指令码,E=高脉冲   输出:D0~D7=数据

写数据:输入:RS=H,RW=L, D0~D7=数据,  E=高脉冲   输出:无


3.3  硬件系统结构

3.3.1  设计原理

本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,当然也可以用继电器的常开触点去控制电磁铁吸合线圈。

本系统共有两部分构成,即硬件部分与软件部分。其中硬件部分由电源输入部分、键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报警部分、开锁部分组成,软件部分对应的由主程序、初始化程序、LCD显示程序、键盘扫描程序、启动程序、关闭程序、密码设置程序、EEPROM读写程序和延时程序等组成。

                            单片机电子密码锁原理框图


3.3.2  硬件总体构成

在确定了选用什么型号的单片机后,就要确定在外围电路,其外围电路包括电源输入部分、键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报警部分、开锁部分组成,根据实际情况键盘输入部分选择4*4矩阵键盘,显示部分选择字符型液晶显示LCD1602,密码存储部分选用AT24C02芯片来完成。其原理图如(附录一)所示。

3.3.2.1 电源部分

密码锁主控制部分电源需要用5V直流电源供电,本设计直接留出电源端提供外置电源输入接口,可以使用外置5V稳压直流电源供电,亦可以使用电脑USB接口供电。

3.3.2.2   键盘输入部分

由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。本设计中使用的这个4*4键盘不但能完成密码的输入还能作特别功能键使用,设置功能等。键盘的每个按键功能在程序设计中设置。其大体功能(看键盘按键上的标记)及与单片机引脚接法如下图所示:

键盘输入部分原理图


3.3.2.3  密码外存部分

用EPROM芯片AT24C02存储密码。AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5 V)、擦写次数多(大于10000次)、写入速度快(小于10 ms)、抗干扰能力强、数据不易丢失、体积小等特点。而且他是采用了I2C总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存取十分方便。AT24C02中带有的片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。I2C总线是一种用于IC器件之间连接的二线制总线。他通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。AT24C02正是运用了I2C规程,使用主/从机双向通信,主机(通常为单片机)和从机(AT24C02)均可工作于接收器和发送器状态。主机产生串行时钟信号(通过SCL引脚)并发出控制字,控制总线的传送方向,并产生开始和停止的条件。无论是主机还是从机,接收到一个字节后必须发出一个确认信号ACK。AT24C02的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向 。其接线如下图所示:

                        密码存储电路原理图

3.3.2.4  复位部分

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。地址锁存信号ALE也为高电平。根据实际情况选择如图4-6所示的复位电路。该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C1上的电压很小,复位下拉电阻 上的电压接近电源电压,即RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电压小于某一数值后,CPU脱离复位状态,由于电容C1足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。增加手动复位按键是为了避免死机时无法可靠复位。当复位按键按下后电容C1通过R放电。当电容C1放电结束后,RST端的电位为高电平。由于RST为高电平,CPU处于复位状态,松手后,电容C1充电,RST端电位下降,CPU脱离复位状态。R5的作用在于限制按键按下瞬间电容C1的放电电流,避免产生火花,以保护按键触电。

复位电路原理图

3.3.2.5   晶振部分

STC89C52引脚XTAL1和XTAL2与晶体振荡器及电容C按下图所示方式连接。晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C1、C2取值范围在5~30pF之间。根据实际情况,本设计中采用12MHZ做为系统的外部晶振。电容取值为30pF。

晶振电路原理图


3.3.2.6   显示部分

为了提高密码锁的密码显示效果能力。本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。只有接通电源后,显示器才处于开启状态。否则显示器将一直处于初始状态,当需要对密码锁进行开锁时,按下键盘上的OPEN按键后利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。当密码输入完成时,按下确认OK键,然后用LCD显示相关的提示信息。以下是显示部分接线图。

显示电路原理图

3.3.2.7   受控开锁部分

此处利用声光模拟密码锁电路得控制效果,当密码输入正确时,绿灯亮,反之则红灯亮,连续输入错误则蜂鸣器鸣叫报警。在实际应用中可将绿灯换成电磁阀来实现电能向动能的转换来实现实际的问题。

                           声光指示电路

4、程序设计

本系统软件设计由主程序、初始化程序、LCD显示程序、键盘扫描程序、键功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。

主要程序设计流程图如下所示:

4.1   主程序流程图


4.2    密码操作流程图

     

密码设置流程图                            开锁操作流程图

4.3    按键功能流程图


5、总结

本设计从经济实用的角度出发,采用宏基公司生产的STC89系列STC89C52单片机与低功耗CMOS型E2PROM AT24C02作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、报警、开锁等电路并用C语言编写主控芯片的控制程序,设计了一款可以多次更改密码具有报警功能的电子密码锁。设计基本可行可以达到设计目地。使用单片机制作的电子密码锁具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点,可应用于住宅、办公室的保险箱及档案柜等需要防盗的场所,有一定的实用性。该电路设计还具有按键有效提示,输入错误提示,控制开锁电平,控制报警电路,修改密码等多种功能。由于设计此电路的时间较仓促,其中还有些许未考虑周全的因素,还需要继续的改进和完善。


参考文献

[1] 石文轩,宋薇.基于单片机MCS一51的智能密码锁设计[M].武汉工程职业技术学院学报,2004,(01);

[2] 祖龙起,刘仁杰.一种新型可编程密码锁[J].大连轻工业学院学报,2002,(01);

[3] 叶启明.单片机制作的新型安全密码锁[J].家庭电子,2005,(10);

[4] 郭海英.基于单片机的电子安全密码锁的设计[M].现代电子技术,2005,(13);

[5] 李明喜.新型电子密码锁的设计[J].机电产品开发与创新,2004,(03);

[6] 董继成.一种新型安全的单片机密码锁[J].电子技术,2004,(03);

[7] 祖龙起,刘仁杰,孙乃凌.一种新颖的电子密码锁[J].电子世界,2001,(10);

[8] 李明喜.新型电子密码锁的设计[J].机电产品开发与创新,2004,(03);

[9] 杨茂涛.一种电子密码锁的实现[J].福建电脑,2004,(08);

[10] 瞿贵荣.实用电子密码锁[J].家庭电子,2000,(07);

[11] ATmega.ATmega8L-8AC,2006,(01);

[12] Wireless World,1998,vol、84,No、1509,p69;

[13] 王千.实用电子电路大全[M],电子工业出版社,2001,p101;

[14] 何立民.单片机应用技术选编[M],北京:北京航空大学出版社,1998;

[15] 李华.MCS-51系列单片机使用接口技术[M],北京航空航天大学出版社,1993;

[16] 彭为.单片机典型系统设计实例精讲[M],北京:电子工业出版社,2006;

[17] 潘永雄.新编单片机原理与应用[M],西安:西安电子科技大学出版社,2003;

[18] 童诗白,华成英,模拟电子技术基础[M],北京:高等教育出版社,2000;

[19] 阎石主.数字电子技术基础[M],北京:高等教育出版社,1998;

[20] 樊昌信,曹丽娜.通信原理[M],北京:国防工业出版社,2007;

[21] 李瀚荪.电路分析基础[M],北京:高等教育出版社1991;


附件一:电路原理图作品实物图

                               1、电路原理图


2、作品实物图


附件三:程序清单

主程序


//**********家庭电子锁 ************/

//**********C语言版***************/

//**********20##年 1月************/

#include <REG52.H>

#include <string.h>

#include <port.h>

#include <1602.h>

#include <24c02.h>

#include<keyscan.h>

uchar code  a0[]={"Password Setting"};

uchar code a1[]={"welcome to here"} ;

uchar code  a2[]={"input password:"};

uchar code a4[]={"input length:"};

uchar code a5[]={"wait for ......"};

uchar code a6[]={"secret is saving"};

uchar code a7[]={"wait for ......"};

uchar code a8[]={"secret is OK"};

uchar code a9[] ={"Setting completed"};

uchar code a10[] ={"secret is ERROR"};

uchar code a11[] ={"setting serect"};

uchar code b1[]={"Families lock"};

uchar code b2[]={"Password"};

uchar code  c1[]={"Open the door  "};

uchar code  c2[]={"Welcome host   "};

uchar code  c3[]={"who are you ?  " };

uchar code  c4[]={"I don't know you"};

uchar code  c5[]={"Password ERROR!"};

bit FLAG1,FLAG2,FLAG3,FALG4;

uchar idata set1[11]={0,0,0,0,0,0,0,0,0,0,0};

uchar idata set2[11]={0,0,0,0,0,0,0,0,0,0,0};

 enum jian{enter=10,cancel,open,setserect} ;

/////////////////////////////////////////

//     用户密码设置user(); 

// 密码输入  inputserect() 

// 开锁显示  OPENLOCK()

//密码读入readserect() 

//*******************密码读入 

 void readserect()

 { int i;

 for(i=0;i<read_random(20);i++)

         {

       set1[i]= read_random(i) ;

    }

 }

 void yanzh1()

 {

 clear();

 write1602(0,0,a8);

 write1602(0,1,a5);

 delay(1000);

 clear();

 write1602(0,0,c1);

 write1602(0,1,c2);

    delay(1000);

    delay(1000);

       clear();

 }

  void yanzh2()

 {

 

 write1602(0,0,a10);

 write1602(0,1,a5);

 delay(1000);

 write1602(0,0,c3);

 write1602(0,1,c4);

   delay(1000);

    delay(1000);

              clear();

 }

 void clear1()

 { int i;

 for(i=0;i<16;i++)

 {wcom(0xc0+i);

 wdata(0x20);}

 }

///////////////////////////////////////////////////////

// 开锁函数

void openlock()

{

uchar i=0,m,j=0;

 m=read_random(20) ;

readserect();

next:  key=18;

i=0;

j++;

 while(key==18)

           //矩阵键盘

{

 while(flag)

   keydown();

   flag=1;

if(key!=18) {

 wcom(0xc0+i)      ;//显示输入密码

 wdata('*');

 set2[i]=key+0x30;

 i++;

 }

 if(key==enter){ key=0;i=0;}

 else

 key=18;

  }

 for(i=0;i<m;i++)

 if(set1[i]!=set2[i]&&j!=3) {for(i=0;i<m;i++) set2[i]=0; RED=0;  GREEN=1; clear();  write1602( 0,0, c5); delay(1000);clear(); write1602( 0,0, a2); goto next;    }

 

 if(j==3) {j=0;clear(); yanzh2();BEEP=0;RED=0; GREEN=1;}

 else

 { yanzh1(); GREEN=0;RED=1;  }

}

///////////////////////////////////////////////////

///////////////////////////////////////////////////

useserect()

{

uchar i=0 ;

write1602(0,0,a0);

    write1602(0,1,a5);

       delay(1000);

       clear();

write1602(0,0,a2);

           key=18;

         while(key==18)

           //矩阵键盘

{  while(flag)

   keydown();

   flag=1;

 if(key!=18) {

 wcom(0xc0+i)      ;//显示输入密码

 wdata(key+0x30);

 write_byte(i,key+0x30); //密码存储 

 i++;

 }

 write_byte(20,i-1); //密码存储 

if(key==enter) key=0;

 else

 key=18;

  }

  clear();

  write1602(0,0,a6);

  write1602(0,1,a7);

       delay(1000);

       clear();

}

/////////////////////////////////////////////////// 

void main()

 {

/////显初始化

 init();

while(1)

 {

write1602(0,0,b1);

write1602(0,1,a1);

   while(flag)

   keydown();

   flag=1;

switch(key)

  {

 case   open:            { clear();  write1602( 0,0, a2);        openlock();    break; }

 case  setserect :  {          useserect();    break; }

  }

  }


单片机引脚定义:

sbit  RS  =  P1^0;       //RS数据命令选择端,高电平数据,低电平命令

sbit RW   = P1^1;      //RW读写选择端,高电平读操作,低电平写操作

sbit  E =   P1^2;      //E使能控制端,E高电平跳变为低电平时LCD执行命令

sbit SDA = P3^5;

sbit SCL = P3^4;

sbit  DB       = P2;             //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

sbit date1602 =P0;

sbit k1= P3^6;

sbit k2=  P3^7;

sbit k3=  P1^5;

sbit BEEP=P1^3;  //报警器

sbit RED=P1^5;

sbit GREEN=P1^4;


24C02存取程序C代码


#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define OP_WRITE 0xa0          // 器件地址以及写入操作

#define OP_READ  0xa1           // 器件地址以及读取操作

void  delayNOP() {_nop_();_nop_();_nop_();_nop_();}

void delayms(uint ms) 

// 延时子程序

{

   uchar k;

   while(ms--)

   {

      for(k = 0; k < 90; k++);

   }

}

/**********************************************************/

void start()

 //开始位

{

   SDA = 1;

   SCL = 1;

   delayNOP();

   SDA = 0;

   delayNOP();

   SCL = 0;

}

/**********************************************************/

void stop()

 // 停止位

{

   SDA = 0;

   delayNOP();

   SCL = 1;

   delayNOP();

   SDA = 1;

}

/********************************************写操作*************/

uchar shin()

// 从AT24C02移出数据到MCU

{

   uchar i,read_data;

   for(i = 0; i < 8; i++)

   {

    SCL = 1;

    read_data <<= 1;

    read_data |= SDA;

    SCL = 0;

   }

    return(read_data);

}

/*************************************************读操作*********/

bit shout(uchar write_data) 

// 从MCU移出数据到AT24C02

{

   uchar i;

   bit ack_bit;

   for(i = 0; i < 8; i++)   // 循环移入8个位

   {

     SDA = (bit)(write_data & 0x80);

    _nop_();

    SCL = 1;

    delayNOP();

    SCL = 0;

    write_data <<= 1;

   }

   SDA = 1;                     // 读取应答

   delayNOP();

   SCL = 1;

   delayNOP();

   ack_bit = SDA;

   SCL = 0;

   return ack_bit;            // 返回AT24C02应答位

}

/**********************************************************/

void write_byte(uchar addr, uchar write_data)

// 在指定地址addr处写入数据write_data

{

   start();

   shout(OP_WRITE);

   shout(addr);

   shout(write_data);

   stop();

   delayms(10);          // 写入周期

}

/**********************************************************/

/**********************************************************/

uchar read_current()

// 在当前地址读取

{

   uchar read_data;

   start();

   shout(OP_READ);

   read_data = shin();

   stop();

   return read_data;

}

/**********************************************************/

uchar read_random(uchar random_addr)

// 在指定地址读取

{

   start();

   shout(OP_WRITE);

   shout(random_addr);

   return(read_current());

}

/*********************************************************

 void write_byte( uchar addr, uchar write_data); //在任意地址传送数据

 void fill_byte(uchar fill_size,uchar fill_data); //填充数据初始化

 uchar read_random(uchar random_addr);// 在指定地址读取*///////////////////////////////////////


1602基本操作头文件:


/******LCD1602基本操作函数********/

/**********************************/

#define uchar unsigned char

 delay(int x)

{

int tt ,i;

for(tt=1;tt<=x;tt++)

for(i=1;i<125;i++);

  }

 //写指令

void wcom(char com)

{

RS=0;

RW=0;

E=1;

P0 =com;

delay(5);

E=0;

}

//写数据

void wdata(char  data1)

{RS=1;RW=0;

E=1;

P0=data1;

delay(5);

E=0;

}

 void clear()

{ wcom (0x01);}

void rehome()

 { wcom(0x02); }

void  mode(bit x)

 {if(x==1)wcom(0x38);          //两行5*8 mode

 else wcom(0x34);  }         //一行5*10 mode}

void on_off(bit x)

{

  if(x==1)wcom(0x0f);           //显示开,光标开,光标闪烁

  else wcom(0x0c);             //显示开,光标关

}

//按指定位置显示一个字符

void OutputInformation(uchar X, uchar Y, uchar DData)

 {

  Y &= 0x1;

  X &= 0xF;

  if (Y) X = X |0x40;

            X = X |0x80;

wcom(X) ;

 wdata(DData);

 }

 void  writeone(uchar X )

 {

  

 wcom(0xc0+X)    ;

 wdata('*');

 }

//按指定位置显示一串字符 

void write1602(uchar X, uchar Y, uchar code *DData)

{

  uchar ListLength,j;

  ListLength = strlen(DData);

  Y &= 0x1;

  X &= 0xF;

      if (X <= 0xF)

        {

         for(j=0;j<ListLength;j++)

            {

             OutputInformation(X, Y, DData[j]);

             X++;}

  }

}

void init()

{

clear();          //清屏

rehome();

mode(1);          //模式设置

on_off(0);         //显示设置

wcom(0x06);    //移动方式

}



键盘扫描模块程序:

//键盘扫描4*4


#include <intrins.h>

#define     uchar unsigned char

#define     uint unsigned int

 uchar lk=0;

uchar key=0,key1=0,key2=0,key3=0,flag=1;

unsigned char code key_code[]={ 0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77 };

uchar  keyscan()

{uchar  scan1,scan2,keycode,j;

P2=0xf0;

scan1=P2;

   if((scan1&0xf0)!=0xf0)           //判键是否按下

   {       BEEP=0;

     delayms(30);                   //延时30ms

     scan1=P2;

     if((scan1&0xf0)!=0xf0)         //二次判键是否按下

     {

        P2=0x0f;

        scan2=P2;

        keycode=scan1|scan2;         //组合成键编码

        for(j=0;j<=15;j++)

        {

           if(keycode== key_code[j])  //查表得键值

           {  scan1=P2;

                  while(scan1!=0x0f)

                     scan1=P2;

                     flag=0;

                      BEEP=1;

               return(j);

               

           

           }

        }

     }

   }

else 

{P2=0xff;

return (16); }

}

  void  keydown()

{uchar temp;

 P2=0x0f;

 temp =P2;

if((temp&0x0f)!=0x0f)

{key= keyscan(); }

}

void dananjian( uchar jiemian,uchar kongzhi,uchar kongzhi1)

{

if(k1==0)

{

 delay(10);

 if(k1==0)

 key1++;   clear();

  if(key1==jiemian) key1=0;

 while(k1==0);

}

   if(k2==0)

{

 delay(10);

 if(k2==0)

 key2++;

    clear();

 if(key2==kongzhi) key2=0;

 while(k2==0);

}

   if(k3==0)

{

 delay(10);

 if(k3==0)

 key3++;

 if(key3==kongzhi1) key3=0;

 while(k3==0);

}

}


更多相关推荐:
基于单片机的电子密码锁设计开题报告

毕业设计论文任务书题目基于单片机的电子密码锁设计学生姓名郭飞学号20xx14110301系别物理与电子信息工程系专业电子信息科学与技术届别20xx届指导教师丁淑芳职称博士20xx年10月16日注本任务书一式三份...

基于单片机密码锁毕业设计开题报告

毕业设计论文开题报告开题报告基于单片机的电子密码锁设计一题目背景和意义随着人们生活水平的提高如何实现家庭防盗这一问题也变的尤其的突出传统的机械锁由于其构造的简单被撬的事件屡见不鲜电子密码锁是由电子电路控制锁体的...

基于单片机控制的电子密码锁的设计 开题报告

枣庄学院本科生毕业设计论文开题报告题目基于单片机的电子密码锁设计姓名学号年级专业指导教师姓名高珊职称学科枣庄学院教务处制20xx年2月25日说明一开题报告前的准备毕业设计论文题目确定后学生应尽快征求导师意见讨论...

基于单片机的电子密码锁开题报告

大学本科毕业设计论文开题报告题目基于单片机的电子密码锁设计指导教师院系部电信学院专业班级学号姓名日期20xx0305教务处印制一选题的目的意义和研究现状二设计方案及预期结果三研究进度四主要参考文献五指导教师意见

基于51单片机的电子密码锁设计开题报告

基于单片机的电子密码锁设计开题报告一毕业论文代写课题背景和意义在日常的生活和工作中住宅与部门的安全防范单位的文件档案财务报表以及一些个人资料的保存多以加锁的办法来解决若使用传统的机械式钥匙开锁人们常需携带多把钥...

基于单片机的电子密码锁设计开题报告

基于单片机的电子密码锁设计开题报告一毕业论文代写课题背景和意义在日常的生活和工作中住宅与部门的安全防范单位的文件档案财务报表以及一些个人资料的保存多以加锁的办法来解决若使用传统的机械式钥匙开锁人们常需携带多把钥...

基于单片机的电子防盗密码锁的设计开题报告

东北林业大学本科毕业设计开题报告论文题目基于单片机的电子防盗密码锁的设计学生指导教师宋讲师专业班级电子信息工程20xx级3班学院机电工程学院20xx年1月5日2注纸张填写不够可另加附页3

电子密码锁的设计 开题报告

科学技术学院毕业设计(论文)开题报告题目:电子密码锁的设计学科部:信息学科部专业:电子信息工程班级:084电子学号:xxx姓名:xxx指导教师:胡斐填表日期:20xx年11月21日一、选题的依据及意义:单片机,…

基于51单片机的电子密码锁开题报告

和市场认可程度看使用最为广泛的是键盘式电子密码锁保险柜和金库还有一部分应用于保管箱和运钞车在其他技术领域还有遥控式电子密码锁以及卡片式密码锁等由于这种自生自长随身携带的钥匙优点突出因此这种锁很快度过了性能不太稳...

基于单片机的电子密码锁毕业设计(论文)开题报告

毕业设计论文开题报告学生姓名朱德涛学号1402100129所在学院电子与信息工程学院专业电子信息工程设计论文题目基于单片机的电子密码锁的设计指导教师毛钱萍20xx年1月10日开题报告填写要求1开题报告含文献综述...

基于51单片机的电子密码锁设计毕业论文任务书开题报告表

贵阳学院学生开题报告表

基于AT89C51单片机的数字电压表设计开题报告

南京理工大学泰州科技学院毕业设计论文开题报告学生姓名专业学号06020xx4电气工程及其自动化设计论文题目基于AT89C51单片机数字电压表设计指导教师20xx年3月15日开题报告填写要求1开题报告含文献综述作...

基于单片机的电子密码锁设计开题报告(16篇)