基于51单片机的简易电子密码锁

合集下载

简易电子密码锁(基于51单片机)报告

简易电子密码锁(基于51单片机)报告

简易电子密码锁设计&我的设计思想联想到日前在安全技术防范领域,具有防盗报警功能的电子密码控制系统逐渐代替传统的机械式密码控制系统,并结合近期的学习过程和一些参考书籍,完成了简易的电子密码锁设计学习。

电子密码控制是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。

电子密码控制不论性能还是安全性都已大大超过了机械类结,具有良好的应用前景。

一、设计目的与内容设计了一个简易电子密码锁,可按要求从矩阵键盘输入6位数密码如“080874”,输入过程中有按键音提示。

当密码输入正确并按下确认键(“OK”键)后,发光二极管被点亮。

二、工作原理与基本操作过程介绍采用80C51为核心的单片机控制。

利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,进行电子密码锁的设计。

(1)键盘的人工编码给每个按键指定一个按键值,报告设定按键S1~S9对应的按键值分别为“1~9”,S10为数字“0”,S11为“OK”,S12~S16对应的按键值分别为12~16。

(2)根据按键值,指定每个按键对应的输入数字和信息。

如下表为每个按键代表的数字和输入信息。

当键盘扫描程序扫描到S10键被按下时,将其代表的按键值“0”通知CPU,CPU根据事先的规定,就会知道输入的数字是“0”。

矩阵键盘中每个按键所代表的数字和输入信息(3)输入数字和密码对比。

先将设定的密码用一个数组保存,报告中用的密码“080874”和“OK”确认信息可以用如下数组保存:Unsigned char D[ ]={0,8,0,8,7,4,11};在主程序接收到数字和信息后,通过逐位对比的方法进行判断。

输入的数字经对比正确时,程序才会继续顺序执行,否则,程序拒绝继续执行。

(4)执行预期功能。

如果输入密码正确,执行预期功能,报告设计为点亮P3.0口引脚LED。

三、电路图设计(Proteus绘制)四、程序设计(C语言)矩阵式键盘实现的电子密码锁程序#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚sbit sound=P3^7; //将sound位定义为P3.7unsigned char keyval; //储存按键值/************************************************************** 函数功能:延时输出音频**************************************************************/ void delay(void){unsigned char i;for(i=0;i<200;i++);}/************************************************************** 函数功能:软件延时子程序**************************************************************/ void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){unsigned char D[ ]={0,8,0,8,7,4,11}; //设定密码EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0keyval=0xff; //按键值初始化while(keyval!=D[0]) //第一位密码输入不正确,等待;while(keyval!=D[1]) //第二位密码输入不正确,等待;while(keyval!=D[2]) //第三位密码输入不正确,等待;while(keyval!=D[3]) //第四位密码输入不正确,等待;while(keyval!=D[4]) //第五位密码输入不正确,等待;while(keyval!=D[5]) //第六位密码输入不正确,等待;while(keyval!=D[6]) //没有输入“OK”,等待;P3=0xfe; //P3.0引脚输出低电平,点亮LED}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1 //定时器T0的中断编号为1,使用第一组寄存器{unsigned char i;TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=1; //可判断是S1键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=2; //可判断是S2键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=3; //可判断是S3键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=5; //可判断是S5键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=6; //可判断是S6键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=7; //可判断是S7键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=9; //可判断是S9键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=0; //可判断是S10键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=11; //可判断是S11键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=12; //可判断是S12键被按下P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=13; //可判断是S13键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=14; //可判断是S14键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=15; //可判断是S15键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=16; //可判断是S16键被按下for(i=0;i<200;i++) //让P3.7引脚电平不断取反输出音频{sound=0;delay();sound=1;delay();}}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值}五、用Proteus软件进行仿真利用Keil软件进行编译通过后,生成hex文件。

基于51单片机电子密码锁设计PPT

基于51单片机电子密码锁设计PPT

3晶振时钟电路与复位电路
7
晶振时钟电路
复位电路
系统电路图
8
电路PCB板
9
4.软件设计
10
软 件 设 计 流 程 图
5.程序调试
11
调试本程序需要用到KEIL C51,及51开 发板一块及其配套的下载烧录软件
首先打开KEIL C51主程序,新建工程, 新建文本框写入程序,保存,检查是否有语 法错误,经反复检查无误后汇编,生成51单 片机可执行的HEX文件。然后用51开发板相 匹配的烧录软件把HEX文件写入单片机 。
学的精神去解决问题。很多事情看起来是很简单的问题,但实际
做起来去会发现有许多奥妙!这是因为其中蕴含着许多科学的问
题。运用科学的方法去解决问题,这是我这次实训给我带来的思
想上的改变。学习上,使自已在大学所以的知识在这次得到实践
,学到一些书本上无法学到的经验,对电子元件有了进一步的认
识。
电子锁是信息化时代发展的产物,应时而生,我9C51
开锁驱动电路
电磁阀
通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而 达到开锁的目的。本设计通过P3.0接一个3极管驱动继电器打开 电磁阀线圈实现开关门。
当用户输入的密码正确而且是在规定的时间及次数输入之内 ,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁 ,达到开门的目的。
1
89C52
51单片机的电子锁设计 九组 DZ0901
密码锁的功能
2
开关锁,修改密码
还原,记忆
输入密码
目录
3
1.系统设计
2.硬件设计
3.软件设计
4.程序调试
1.系统设计
4
系统总设计结构图

基于51单片机的电子密码锁

基于51单片机的电子密码锁

电子密码锁一、工作原理本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O 线的数目,在按键比较多的时候,通常采用这样方法。

每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N ×M个按键的键盘。

在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。

4×4矩阵键盘的工作原理在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图5所示。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

扫描原理把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。

由于这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,为了避免让8051误判为多次输入同一按键,我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定。

利用51单片机设计一个用16个按键输入,6位数字输出显示的电子时钟。

如图1-1所示。

图1-1按键分布图具体要求和按键功能介绍如下:1. 上电后,6 位数码管显示“—”;2. 设置6 位密码,密码通过键盘输入,按“确定”键确认,如密码正确,将锁打开;3. 密码由用户自己设定,若密码正确即锁被打开,则指示灯被点亮;4. 若密码1 次输入错误,则报警;5. 按Set 键,修改密码;6. 按Cle 键可清除已输入的密码,重新进行输二、系统硬件组成本次设计的主要有键盘,数码管,STC89C52芯片,以及LED灯。

基于51单片机的电子密码锁—1

基于51单片机的电子密码锁—1

基于51单⽚机的电⼦密码锁—1这个程序是为了实现基于51单⽚机的电⼦密码锁,⽬前,程序解决了最重要之⼀的输⼊的密码和保存的正确密码相⽐较的问题。

通过定义了两个数组:uchar table2[6]; //临时密码保存uchar password[6]="123456"; //进门密码将输⼊的密码写⼊到table2[]中有⼀点需要特别注意:因为我写到table2[]数组内的是ASCII值的0-9,⽽ASCII值的0-9对应的符号却是NUT,SOH... (省略)所以在刚开始调试时,LCD1602屏幕输出的总是奇怪的字符,⽽不是我想要的0-9,通过查询ASCLL码表可以知道字符(0-9)对应的数值是48-57,所以我通过定义了⼀个新的数组,uchar smgduan[10]={48,49,50,51,52,53,54,55,56,57};以及lcd_write_data(smgduan[table2[i]]);的⽅式,实现了在LCD上输出字符0-9的功能。

在最后做两个数组⽐较时,开始同样出现了这个情况,因为数字1和字符1对应的ASCII值不同,所以password[i]不等于table2[i],需要进⾏转换,我的⽅式的是password[i]==smgduan[table2[i]];罗⾥吧嗦这个多,主要还是给未来的⾃⼰看看,当初犯得错误多么低级。

---------------------------------------------------分割线-----------------------------------------------------------------------------------下⼀版改进考虑把重复按键选择数字改成矩阵按键,加进些其他的功能。

---------------------------------------------------分割线-----------------------------------------------------------------------------------程序部分:/*这个⽅案是我写基于51单⽚机的电⼦密码锁过程中,未完成全部功能的程序。

基于51单片机简易密码锁设计

基于51单片机简易密码锁设计

易密码锁设计摘要:本设计以单片机STC89C52RC作为密码锁监控装置的检测和控制核心,分为主机控制和从机执行机构(本设重点介绍主机设计),实现钥匙信息在主机上的初步认证注册、密码信息的加密、钥匙丢失报废等功能。

根据51单片机之间的串行通信原理,这便于对密码信息的随机加密和保护。

而且采用键盘输入的电子密码锁具有较高的优势。

采用数字信号编码和二次调制方式,不仅可以实现多路信息的控制,提高信号传输的抗干扰性,减少错误动作,而且功率消耗低;反应速度快、传输效率高、工作稳定可靠等。

软件设计采用自上而下的模块化设计思想,以使系统朝着分布式、小型化方向发展,增强系统的可扩展性和运行的稳定性。

测试结果表明,本系统各项功能已达到本设计的所有要求。

关键词:单片机;智能密码锁;串行通信The Design Of The Simple Password LockAbstract:It can carry out the key information to register in the main on board initial attestation, the password information encrypt etc. Go to correspond by letter the principle according to the string between 51 machines, this is easy to encrypt and protect to the passwords information random. Adopt the numerical signal codes,not only can carry out many controls of the road information, raise the anti- interference that signal deliver, reduce the mistake action,but also the power consume is low,Respond quickly,the efficiency deliver is high, work stable credibility etc. The software design adoption the design thought from top to bottom, to make the system toward wear distribute type,turn to the direction development of small, strengthen the system and can expand the stability and circulate.Test the result enunciation, various functions of this system are already all request of this design.Key Words : singlechip; intelligent password lock; Serial communication;目录概述 (1)1 设计目标 (1)2硬件设计与原理 (2)2.1 设计总框图 (2)2.2 硬件设计分析 (2)2.2.1 电源的设计 (2)2.2.2 单片机最小系统 (3)2.2.3 显示系统 (8)2.2.4 矩阵按键模块 (8)2.2.5 蜂鸣器和指示灯电路 (9)3软件设计与分析 (9)3.1 软件设计的组成 (9)3.2 各部分软件分析 (9)3.2.1 延时子函数 (9)3.2.2 矩阵键盘扫描子函数 (10)3.2.3 检验密码正误子函数 (10)3.2.4锁定,鸣笛程序 (11)3.2.5显示子程序 (11)4软件仿真 (14)4.1 PROTEUS简介 (14)4.2仿真图 (15)总结 (19)参考文献 (20)致谢 (28)附录 (29)述随着人们生活水平的提高,传统的机械锁由于其构造的简单,被撬开的事件屡见不鲜,电子锁保密性高,能够防止不法分子多次试探密码;性价比高,因此,电子锁受到了广大的亲昵。

基于51单片机的电子密码锁设计

基于51单片机的电子密码锁设计

内容摘要近年来,在我国社会经济不断进步和迅猛发展的背景下,人们的生活水平越来越高,更多的人开始享受高质量的生活。

就拿我们家家离不开的锁具来说,从我国古代历史上就有了各种锁的记载和使用,发展到今天人们追求的不单单只是用来锁门的一个工具。

人们对于锁的追求体现在一种心理的安全感和使用过程中的先进技术体验上。

本课题为电子密码锁设计。

该设计采用STC89C51控制器来进行关键部分的运作,主要包括主控部分、显示部分、报警部分、电磁锁控制、红外遥控接收以及电源。

报警选择蜂鸣器。

显示电方案选取LCD1602显示相关信息。

用户可以通过键盘或者红外遥控输入密码数据,系统判断密码数据是否正确,来完成电子密码锁的开和关,键盘具有更改密码的作用。

采用C语言进行软件设计,其开发上手容易,通过单片机的专用Keil设计工具来实现程序文件的执行,系统软件设计完成后,利用Proteus来完成对系统的验证,成功功能验证。

并改善设计,完成系统设计要求。

关键词: STC89C51 密码锁红外遥控第一章绪论1.1研究的目的与意义近年来,在我国社会经济不断进步和迅猛发展的背景下,人们的生活水平越来越高,更多的人开始享受高质量的生活。

就拿我们家家离不开的锁具来说,从我国古代历史上就有了各种锁的记载和使用,发展到今天人们追求的不单单只是用来锁门的一个工具。

人们对于锁的追求体现在一种心理的安全感和使用过程中的先进技术体验上。

所以智能电子锁的发展趋势特别明显,而且在市场上的受众程度也非常高。

这种智能锁根据现代人的生活习惯和生活趋势量身设计,可以通过手机,指纹来控制锁的开关,很方便快捷,而且安全系数相对之前的机械锁高很多。

智能锁的发明和使用很大程度上减少了我们随身携带钥匙和容易丢钥匙的问题,给我们的生活带来更多的安全和便捷,是现代社会发展中必要的产物。

1.2国内外研究现状众所周知,我国是农业大国,近些年,我国的科技发展有了明显的进步,但是电子密码技术还是远远赶不上西方发达国家的步伐。

(完整word版)基于51单片机的智能密码锁

(完整word版)基于51单片机的智能密码锁

单片机的电子密码锁目录第一章绪论......................................................... . (2)1.1电子密码锁简介......................................................... .. (2)1.2电子密码锁设计的背景及意义............................................................................. . (3)第2章总体设计............................................................................. . (3)2.1设计分析............................................................................. (3)2.2系统结构............................................................................. (4)第3章硬件电路设计............................................................................. (5)3.1单片机最小系统设计............................................................................. . (5)3.1.1时钟电路............................................................................. (5)3.1.2 复位电路 ............................................................................ . (6)3.1.3 最小系统 ............................................................................ (6)3.2 矩阵键盘设计 ............................................................................ . (7)3.3 LCD显示模块设计 ............................................................................ (8)3.4 开锁机构 ............................................................................ ............................................... .93.5 报警机构 ............................................................................ ............................................... .103.6 硬件综合设计 ............................................................................ ....................................... .10第4章软件设计 ............................................................................ ........................................ (11)4.1 软件总体设计 ............................................................................ .. (11)4.2 键盘扫描子程序 ............................................................................ ................................... .124.3 定时器中断子程序 ............................................................................ ......................... . (14)4.4 密码输入子程序 ............................................................................ . (15)4.5 报警子程序 ............................................................................ (16)总结 ............................................................................ ................................................................ .17参考文献 ............................................................................ ...................................................... (18)附录程序源代码 ............................................................................ ....................................... . (19)摘要:本文中将要介绍的单片机电子密码锁是一种通过判断密码输入是否正确来控制电路或是芯片的工作状态,进而控制锁的打开和闭合。

基于51单片机多功能电子密码锁

基于51单片机多功能电子密码锁

#include <reg52.h>#define uint unsigned int#define uchar unsigned char#define KEY P3 //键盘输入端口#define No_key 20 //无按键时的返回值#define lcddata P2 //1602的数据输入端口sbit lcden= P1^2。

sbit lcdrs= P1^0。

sbit lcdrw= P1^1。

sbit light= P1^3。

sbit light1= P1^4。

uchar j 。

//用来统计输入个数的全局变量uchar aa。

//用来在定时器中计数的全局变量uchar code table[]= " Hello!"。

uchar code table1[]=" OK! " 。

uchar code table2[]="Enter please:" 。

uchar code key_table[16] ={1,2,3,10,4,5,6,11,7,8,9,12,0,13,14,15}。

uchar password[]={2,0,1,0,9,3} 。

//设定初始密码uchar save[6]。

//保存输入的数据uchar conflag 。

//确认标志uchar lockflag。

//锁键盘标志uchar startflag。

//开始标志void delay(uint z>。

//延时子函数void wright_com(uchar com>。

//写指令函数void wright_data(uchar date> 。

//写数据函数void init(>。

//初始化void display_OK(>。

// 显示OKvoid delete(>。

//删除输入的最后一个数uchar keyscan(> 。

基于51单片机的电子密码锁系统设计制作,电路图+源程序

基于51单片机的电子密码锁系统设计制作,电路图+源程序

基于51单片机的电子密码锁系统设计制作,电路图+源程序这款基于51单片机的电子密码锁系统,单片机用STC89C52RC单片机,电路简单,制作过程中不需要进行调试,支持密码掉电保存功能!密码储存于单片机内部自带的的EEPROM中,不需要外置AT24C01保存密码,是学习电子密码锁比较好的教学试验系统,主要功能如下:1、1602液晶菜单显示。

2、6位密码,密码可重置,重置密码时,先输入原始密密,正确后输入新密码,再交输入新密码,两次输入的密码一致辞时,密码修改成功。

开锁时,密码通过键盘输入,若密码正确,则将锁打开,诺密码不正确时,无法开锁,密码输入错误三次时,蜂鸣器报警并且锁定键盘,10分钟。

3、支持掉电保存密码功能。

单片机中的密码是储存于单片内部的EEPROM中,在密码锁系统断电时,储存在密码锁系统中的密码不会丢失。

4、密码锁系统采用5V继电器模拟开锁过程。

5、输入的正确时,继电器吸合2-3秒,开锁指示灯亮2-3秒,模拟开锁。

6、密码错误报警且有错误提示(显示Error)。

7、密码正确开锁指示。

8、4X4矩阵键盘输入。

9、随时可修改密码存储,支持掉电保存密码功能,功能更为实用。

10、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。

修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。

源程序如下:1. #include<reg52.h>2. #define uint unsigned int3. #define uchar unsigned char4. void key_scan();5. uchar count0,count1,count3,num,n=0,temp,a,j,count4;6. uchar mima[8]; //初始密码存储区7. uchar tab_key[50]; //输入密码存储区8. uchar code table[]={9. 0x3f,0x06,0x5b,0x4f,10. 0x66,0x6d,0x7d,0x07,11. 0x7f,0x6f,0x77,0x7c,12. 0x39,0x5e,0x79,0x71};13. bit enterflag; //确认键按下与否的标志14. bit mimaflag; //密码正确与否的标志15. bit xiugaiflag; //修改密码标志16. bit enter1flag; //修改密码确认键标志17. sbit red=P3^7;18. sbit bell=P3^6;19. sbit rs=P2^0;20. sbit rw=P2^1;21. sbit lcden=P2^2;22. sbit scl=P3^4;23. sbit sda=P3^5;24. uchar code table1[]="input the passco";25. uchar code table2[]="de: --------";26. uchar code table3[]="*";27. uchar code table4[]="right (^_^) ";28. uchar code table5[]="first error";29. uchar code table6[]="second error";30. uchar code table7[]="third error see ";31. uchar code table8[]="u tomorrow (^_^)";32. uchar code table9[]="define the passc";33. uchar code table10[]="ode: --------";34. uchar code table11[]="code is new";35. //******************************键盘消抖函数*******************************36. void delay1()37. { ;; }38. void delay2(uchar x)39. {40. uchar a,b;41. for(a=x;a>0;a--)42. for(b=100;b>0;b--);43. }44.45. void delay(uint z)46. {47. uint x,y;48. for(x=z;x>0;x--)49. for(y=110;y>0;y--);50. }51.52. //****************************e^2room的初始化*******************************53. void start() //开始信号54. {55. sda=1;56. delay1();57. scl=1;58. delay1();59. sda=0;60. delay1();61. }62.63. void stop() //停止64. {65. sda=0;66. delay1();67. scl=1;68. delay1();69. sda=1;70. delay1();71. }72. //****************************应答信号*************************************73. void respond()74. {75. uchar i;76. scl=1;77. delay1();78. while((sda==1)&&(i<250))i++;79. scl=0;80. delay1();81. }82. //*****************************写字节操作函数**********************************83. void write_byte(uchar date)84. {85. uchar i,temp;86. temp=date;87. for(i=0;i<8;i++)88. {89. temp=temp<<1; //保持最高位,左移到进位CY90. scl=0;91. delay1();92. sda=CY;93. delay1();94. scl=1;95. delay1();96. }97. scl=0;98. delay1();99. sda=1;//总线释放100. delay1();101. }102. //*******************************读字节操作函数***************************** 103. uchar read_byte()104. {105. uchar i,k;106. scl=0;107. delay1();108. sda=1;109. delay1();110. for(i=0;i<8;i++)111. {112. scl=1;113. delay1();114. k=(k<<1)|sda; //或运算,放到最低位115. scl=0;116. delay1();117. }118. return k;119. }120. //**********************************写地址函数****************************** 121. void write_add(uchar address,uchar date)122. {123. start();124. write_byte(0xa0);125. respond();126. write_byte(address);127. respond();128. write_byte(date);129. respond();130. stop();131. }132. //*******************************读地址函数************************************* 133. uchar read_add(uchar address)134. {135. uchar date;136. start();137. write_byte(0xa0);138. respond();139. write_byte(address);140. respond();141. start();142. write_byte(0xa1);143. respond();144. date=read_byte();145. stop();146. return date;147. }148. //****************************LCD1602的初始化******************************* 149. void write_com(uchar com)150. {151. rs=0;152. lcden=0;153. P0=com;154. delay(5);155. lcden=1;156. delay(5);157. lcden=0;158. }159.160. void write_date(uchar date)161. {162. rs=1;163. lcden=0;164. P0=date;165. delay(5);166. lcden=1;167. delay(5);168. lcden=0;169. }170.171. //***************************************密码比较函数******************************** 172. bit mimacmp()173. {174. bit flag;175. uchar i;176. for(i=0;i<8;i++)177. {178. if(mima[i]==tab_key[i])179. flag=1;180. else181. {182. flag=0;183. i=8;184. }185. }186. return(flag); //返回flag187. }188.189. ////**********************************LCD显示函数开始**************************************190. void lcd_display()191. {192. uchar i=0;193. write_com(0x80+0x40+8);194. for(i=0;i<n;i++)195. {196. write_date(table3[0]);197. }198. }199.200. //****************************************键盘功能分配函数群开始****************************201. //** 0 ** 1 **2 ** 3**202. //** 4** 5** 6 **7 **203. //**8** 9** 确认(A) **无效(B)204. //**取消(C)**修改密码键(D)**确认修改键(E)**无效(F)205.206. void key_manage1()207. {208. tab_key[n]=0;209. n++;210. if(xiugaiflag==1)211. {212. mima[count4]=0;213. count4++;214. }215. }216.217. void key_manage2()218. {219.220. tab_key[n]=1;221. n++;222. if(xiugaiflag==1)223. {224. mima[count4]=1;225. count4++;226. }227. }228.229. void key_manage3()230. {231.232. tab_key[n]=2;233. n++;234. if(xiugaiflag==1)235. {236. mima[count4]=2;237. count4++;238. }239. }240.241. void key_manage4() 242. {243. tab_key[n]=3; 244. n++;245. if(xiugaiflag==1) 246. {247. mima[count4]=3; 248. count4++;249. }250. }251.252. void key_manage5() 253. {254. tab_key[n]=4; 255. n++;256. if(xiugaiflag==1) 257. {258. mima[count4]=4; 259. count4++;260. }261. }262.263. void key_manage6() 264. {265. tab_key[n]=5; 266. n++;267. if(xiugaiflag==1) 268. {269. mima[count4]=5; 270. count4++;271. }272. }273. void key_manage7() 274. {275. tab_key[n]=6; 276. n++;277. if(xiugaiflag==1) 278. {279. mima[count4]=6; 280. count4++;281. }282. }283. void key_manage8() 284. {285. tab_key[n]=7; 286. n++;287. if(xiugaiflag==1) 288. {289. mima[count4]=7; 290. count4++;291. }292. }293.294. void key_manage9()295. {296. tab_key[n]=8;297. n++;298. if(xiugaiflag==1)299. {300. mima[count4]=8;301. count4++;302. }303. }304. void key_manage10()305. {306. tab_key[n]=9;307. n++;308. if(xiugaiflag==1)309. {310. mima[count4]=9;311. count4++;312. }313. }314. //**********************************确认键**************************************************************315. void key_manage11()316. {317. enterflag=1; //确认键按下318. if(n==8) //只有输入8个密码后按确认才做比较319. mimaflag=mimacmp();320. else321. mimaflag=0;322. if(enterflag==1)323. {324. enterflag=0;325. n=0;326. //用FFFFFFFF清除已经输入的密码327. for(count3=0;count3<8;count3++)328. {329. delay(5);330. tab_key[count3]=0x0f;331. }332.333. TR1=1; //打开计数器1334. count1=0; //定时器1由50MS累计到1S 所用的计数器335. if(mimaflag==1)336. {337. a=0;338.339. write_com(0x01);340. write_com(0x80);341. for(count3=0;count3<16;count3++)342. {343. write_date(table4[count3]); //密码正确,显示RIGHT,绿灯亮344. delay(5);345. }346. }347.348. else349. {350. n=0;351. red=0;352. bell=0;353. a++;354. if(a==1)355. {356. for(count3=0;count3<8;count3++) //ffffffff清除密码357. {358. delay(5);359. tab_key[count3]=0x0f;360. }361. write_com(0x01); 362. write_com(0x80);363. for(count3=0;count3<16;count3++)364. {365. write_date(table5[count3]); //密码错误,显示 first error,红灯亮366. delay(5);367. }368. TR1=1;369. }370. if(a==2)371. {372. for(count3=0;count3<8;count3++) //ffffffff清除密码373. {374. delay(5);375. tab_key[count3]=0x0f;376. }377. write_com(0x01);378. write_com(0x80);379. for(count3=0;count3<16;count3++)380. {381. write_date(table6[count3]); //密码错误,显示SECOND ERROR,红灯亮382. delay(5);383. }384. TR1=1;385. }386.387. if(a==3)388. {389. for(count3=0;count3<8;count3++) //ffffffff清除密码390. {391. delay(5);392. tab_key[count3]=0x0f;393. }394. write_com(0x01);395. write_com(0x80);396. for(count3=0;count3<16;count3++)397. {398. write_date(table7[count3]); //密码错误,显示third error see,红灯亮399. delay(5);400. }401. write_com(0x80+0x40);402. for(count3=0;count3<16;count3++)403. {404. write_date(table8[count3]);//密码错误,显示 U TOMORROW ,红灯亮405. delay(5);406. }407. TR1=0;408.409. }410.411. }412. }413.414. }415. void key_manage12()416. {417. tab_key[n]=11;418. n++; //密码计数清零419.420. }421. //****************************************************取消键********************************************422. void key_manage13()423. {424.425. n=0; //密码计数清零426. write_com(0x80); //指针所指位置427. for(count3=0;count3<16;count3++)428. {429. write_date(table1[count3]); //第一行显示INPUT THE PASSPORD:430. delay(5);431. }432. write_com(0x80+0x40);433. for(count3=0;count3<16;count3++)434. {435. write_date(table2[count3]); //开机显示--------436. delay(5);437. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码438. }439.440. }441. //*******************************************修改密码键********************************** 442. void key_manage14()443. {444. uchar aa=0;445. n=0;446. xiugaiflag=1;447. write_com(0x01);448. write_com(0x80);449. for(count3=0;count3<16;count3++)450. {451. write_date(table9[count3]); //显示define the password452. delay(5);453. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码454. }455. write_com(0x80+0x40);456. for(count3=0;count3<16;count3++)457. {458. write_date(table10[count3]); //显示--------459. delay(5);460. }461. TR0=1;462.463. }464. //******************************************修改密码键的确认键********************************465. void key_manage15()466. {467. n=0;468. enter1flag=1;469. if(enter1flag==1)470. {471. enter1flag=0;472. count4=0;473. for(count3=0;count3<16;count3++)474. {475. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码476. }477. write_com(0x01);478. write_com(0x80);479. for(count3=0;count3<16;count3++)480. {481. write_date(table11[count3]);482. delay(100);483. }484. TR1=1;485. count1=0;486. }487. }488. void key_manage16()489. {490. tab_key[n]=15;491. n++;492. }493.494. //****************************************定时器1的50MS,共延时1秒*****************************495. void time_1() interrupt 3496. {497.498. TH1=(65536-50000)/256;499. TL1=(65536-50000)%256;500. if(count1<20)501. {502. count1++;503. }504. else //计时到1S505. {506. TR1=0;507. count1=0;508. mimaflag=0;509.510. red=1;511. bell=1;512. //显示FFFFFFFF513. write_com(0x01);514. write_com(0x80);515. for(count3=0;count3<16;count3++)516. {517. write_date(table1[count3]); //显示INPUT THE PASSCODE518. delay(5);519. }520. write_com(0x80+0x40);521. for(count3=0;count3<16;count3++)522. {523. write_date(table2[count3]); //开机显示FFFFFFFF524. delay(5);525. }526. }527.528. }529. //***********************************************定时0**********************************************530. void time_0() interrupt 1531. {532.533. TH0=(65536-50000)/256;534. TL0=(65536-50000)%256;535. if(count4<8)536. {537. key_scan();538. }539. else540. {541. TR0=0;542. count4=0;543. }544. }545.546. //初始化函数547. void init()548. {549.550. uchar i;551. lcden=0;552. write_com(0x38); //打开显示模式设置553. write_com(0x0c); //打开显示,光标等等设置未零554. write_com(0x06); //当读或写一个字符后地址指针加一,且光标加一,当写一个字符后整频显示左移,555. write_com(0x01); //清零指令556. write_com(0x80); //指针所指位置557.558. //定时器初始化559. TMOD=0x11; //T0,T1工作方式1560. TH0=(65536-2000)/256;561. TL0=(65536-2000)%256; //T0初始化2MS563. TH1=(65536-50000)/256;564. TL1=(65536-50000)%256; //T1初始化50MS565.566. TR1=0;567. ET1=1;568. EA=1;569. TR0=0;570. ET0=1;571.572. count0=0; //初始没有密码输入,故为零573. enterflag=0; //没有确认键按下574. mimaflag=0; //密码正确与否键先置零575.576. red=1; //红灯不亮577. //************密码存入EPROM中**********************************578. sda=1;579. delay(5);580. scl=1;581. delay(5);582. for(i=0;i<8;i++)583. {584. write_add(i,8);585. delay2(100);586. }587. for(i=0;i<8;i++)588. {589. mima[i]=read_add(i);590. delay(5);591. }592.593. }594. void main()595. { rw=0;596. init();597. write_com(0x80); //指针所指位置598. for(count3=0;count3<16;count3++)599. {600. write_date(table1[count3]); //第一行显示INPUT THE PASSPORD: 601. delay(5);602. }603. write_com(0x80+0x40);604. for(count3=0;count3<16;count3++)605. {606. write_date(table2[count3]); //开机显示FFFFFFFF607. delay(5);608. }609. while(1)610. {611. key_scan(); //调用键盘扫描函数612. lcd_display();613. }614.615. }616. //**************************************************键盘扫描函数开始********************************619. //**********扫描第一行*********620. P1=0xfe;621. temp=P1;622. temp=temp&0xf0;623. if(temp!=0xf0)624. {625. delay(100);626. if(temp!=0xf0)627. {628. temp=P1;629. switch(temp)630. {631. case 0xee:632. key_manage1();633. break;634.635. case 0xde:636. key_manage2();637. break;638.639. case 0xbe:640. key_manage3();641. break;642.643. case 0x7e:644. key_manage4();645. break;646. }647. while(temp!=0xf0)648. {649. temp=P1;650. temp=temp&0xf0;651. }652. }653. }654. //**************************************************扫描第二行***********************************655. P1=0xfd;656. temp=P1;657. temp=temp&0xf0;658. if(temp!=0xf0)659. {660. delay(100);661. if(temp!=0xf0)662. {663. temp=P1;664. switch(temp)665. {666. case 0xed:667. key_manage5();668. break;669.670. case 0xdd:671. key_manage6();674. case 0xbd:675. key_manage7();676. break;677.678. case 0x7d:679. key_manage8();680. break;681. }682. while(temp!=0xf0)683. {684. temp=P1;685. temp=temp&0xf0;686. }687. }688. }689. //*********************************************扫描第三行***********************************690. P1=0xfb;691. temp=P1;692. temp=temp&0xf0;693. if(temp!=0xf0)694. {695. delay(100);696. if(temp!=0xf0)697. {698. temp=P1;699. switch(temp)700. {701. case 0xeb:702. key_manage9();703. break;704.705. case 0xdb:706. key_manage10();707. break;708.709. case 0xbb:710. key_manage11();711. break;712.713. case 0x7b:714. key_manage12();715. break;716. }717. while(temp!=0xf0)718. {719. temp=P1;720. temp=temp&0xf0;721. }722. }723. }724.725. //***************************************************扫描第四行****************************************727. temp=P1;728. temp=temp&0xf0; 729. if(temp!=0xf0) 730. {731. delay(100);732. if(temp!=0xf0) 733. {734. temp=P1;735. switch(temp) 736. {737. case 0xe7:738. key_manage13(); 739. break;740.741. case 0xd7:742. key_manage14(); 743. break;744.745. case 0xb7:746. key_manage15(); 747. break;748.749. case 0x77:750. key_manage16(); 751. break;752. }753. while(temp!=0xf0) 754. {755. temp=P1;756. temp=temp&0xf0; 757. }758. }759. }760. }复制代码。

基于51单片机的密码锁设计报告

基于51单片机的密码锁设计报告

基于51单片机的密码锁设计报告一、引言随着科技的不断发展,安全问题越来越受到人们的关注。

密码锁作为一种常见的安全防护设备,在保护个人财产和隐私方面发挥着重要作用。

本设计报告介绍了一种基于 51 单片机的密码锁系统,该系统具有成本低、可靠性高、操作简单等优点,适用于家庭、办公室等场所。

二、系统总体设计(一)设计目标设计一个基于 51 单片机的密码锁系统,实现以下功能:1、密码输入与验证功能。

2、密码修改功能。

3、错误输入次数限制及报警功能。

4、开锁状态指示功能。

(二)系统组成本系统主要由 51 单片机、矩阵键盘、液晶显示屏(LCD)、电磁锁驱动电路、报警电路等组成。

1、 51 单片机作为核心控制器,负责处理密码输入、验证、修改等操作,并控制其他模块的工作。

2、矩阵键盘用于输入密码和执行相关操作。

3、 LCD 显示屏用于显示系统状态和提示信息。

4、电磁锁驱动电路用于控制电磁锁的开关。

5、报警电路在密码输入错误次数超过限制时发出报警信号。

三、硬件设计(一)51 单片机选型本设计选用 STC89C52 单片机,该单片机具有丰富的 I/O 口资源、较高的性价比和良好的稳定性。

(二)矩阵键盘设计矩阵键盘采用 4×4 行列式结构,通过扫描的方式获取按键值。

(三)LCD 显示屏接口设计选用 1602 液晶显示屏,通过并行接口与单片机连接,实现数据的传输和显示。

(四)电磁锁驱动电路设计电磁锁采用直流电源供电,通过三极管驱动电路控制其开关。

(五)报警电路设计报警电路采用蜂鸣器实现,当密码输入错误次数超过限制时,单片机输出高电平驱动蜂鸣器发声报警。

四、软件设计(一)主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、LCD 初始化等。

然后进入密码输入状态,等待用户输入密码。

用户输入密码后,进行密码验证,如果密码正确,则打开电磁锁,并显示开锁成功信息;如果密码错误,则记录错误次数,并显示错误提示信息。

基于51单片机的电子密码锁---毕业论文

基于51单片机的电子密码锁---毕业论文

目录摘要........................................................... I I Abstract ....................................................... I II1 绪论 (1)2 系统的总体设计和主要元器件介绍 (2)2.1 系统方案论证选择 (2)2.2 系统的总体思路设计 (3)2.3 主要元器件介绍 (3)2.3.1 AT89C51介绍 (3)2.3.2 继电器介绍 (6)2.3.3 LED数码管介绍 (7)2.3.4 矩阵键盘介绍 (7)3、硬件设计 (9)3.1 单片机主控制模块(含晶振、复位基本工作电路) (9)3.2 键盘输入模块 (9)3.3 显示模块 (10)3.4 报警模块 (11)3.5 开锁模块 (11)4、软件设计 (12)4.1 系统程序设计流程图 (12)4.2 系统程序设计 (12)5、系统仿真设计 (17)5.1 Proteus 软件介绍 (17)5.2 Proteus 仿真图 (18)总结 (19)参考文献 (20)附录 (21)致谢 (27)基于单片机的电子密码锁仿真设计摘要电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。

它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。

现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。

本文以AT89C51单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的基本功能,其主要具有如下功能:●密码通过键盘输入,若密码正确,则将锁打开●密码输入错误,蜂鸣器将报警提示●用户可以自由设定密码本密码锁具有设计方法合理,简单易行成本低,安全实用等特点,具有一定的推广价值。

基于51单片机的密码锁(C语言)

基于51单片机的密码锁(C语言)

电路:功能描述,开机无显示。

按下除号,开始输入密码,显示短线,初始密码为0000。

输入完后,按下on/c键,确定。

正确显示open,错误显示err。

=键为取消键,输入密码过程中,按下取消键,数码管全亮1s,然后灭掉。

恢复初始状态。

按下乘号,设置密码,此时数码管显示短线。

输入正确密码后,进入更改密码状态,显示全F。

输入更改后密码,按下on/C键,确认。

PS:1输入任意时刻,都可按等号返回初始状态。

2输入时,数字会相应的显示。

通过Protues仿真,电路图为protues输出的。

送给初学者,学习参考。

#include <reg52.h>#define uint8 unsigned char#define uint16 unsigned int//数码管编码。

uint8 code SEG7LED[26] = {0x3f,0x06,0x5b,0X4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40,0xff,0x3f,0x73,0x79,0x37, //open0x79,0x77,0x77}; //err//变量声明uint8 Ge,Shi,Bai,Qian;//数码管各个位uint8 WeiNum=1;uint8 code P1Pin[9] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};uint8 state=0;//记录密码锁状态,0为待机状态,1为输入密码,2,3为设置密码uint8 InputNum=1;//记录输入密码时,目前密码的位数。

uint8 InPassWord[4];uint8 PassWord[4]={0,0,0,0};//函数声明void initTimer0();void display(uint8 WeiNum);uint8 keyscan();void delayms(uint16 Xms);void password(uint8 key);uint8 Compare(uint8 InPassWord[4]);void main(){uint8 key;initTimer0();while(1){key = keyscan();password(key);}}void initTimer0(){EA = 1;ET0 = 1;TMOD = 0X01;TH0 = (65535-5000)/256;TL0 = (65535-5000)%256;TR0 = 1;}void Timer0() interrupt 1{TH0 = (65535-5000)/256;TL0 = (65535-5000)%256;display(WeiNum);WeiNum ++;if(WeiNum==5)WeiNum = 1;}void display(uint8 WeiNum){switch(WeiNum){case 1:{P2 = 0xff;P0 = SEG7LED[Qian];P2 = 0xfe;break;}case 2:{P2 = 0xff;P0 = SEG7LED[Bai];P2 = 0xfd;break;}case 3:{P2 = 0xff;P0 = SEG7LED[Shi];P2 = 0xfb;break;}case 4:{P2 = 0xff;P0 = SEG7LED[Ge];P2 = 0xf7;break;}default:{P2 = 0xff;P0 = 0xff;P2 = 0xff;break;}}}void delayms(uint16 Xms){uint16 i,j;for(i=Xms;i>0;i--)for(j=110;j>0;j--);}uint8 keyscan(){uint8 i=0;uint8 key8=0xff;uint8 key=0xff;uint8 Button;for(i=0;i<4;i++){P1 = P1Pin[i];Button = P1;if(Button != P1Pin[i]){delayms(5);Button = P1;if(Button != P1Pin[i]){key8 = Button;}while(Button != P1Pin[i]){ Button = P1; }}}switch(key8){//0~9数字键,12确定,14取消,10输入密码,11设置密码。

(完整版)单片机电子密码锁(可以修改设置密码)——基于51单片机毕业论文

(完整版)单片机电子密码锁(可以修改设置密码)——基于51单片机毕业论文

单片机电子密码锁 (可以修改设置密码)――基于51单片机与AT24C02与LCD1602显示其电路图连接如下:本人已经用硬件实验,程序可用。

正确~~本程序特点:装载后读者可以自改密码,然后需要再次载入程 序时:可以把主程序aa=Sendstring(0xa0,1,table2,6)这一句去掉。

然后 程序的电子锁密码就是你个人设置的密码。

LCD1Vour Password* ・・程序代码为:#include<reg51.=P0A 2; sbit led=P3A0; uchar code table2[]="123456";EE J KBBI&flEK■i A A —i n Jll 理・J31mTrr W口 t■ i* TTS -■?TWKamHP —・U1■3TF4 LSl^fc 』 _ W>M. _ _, lJ-p — ...... 』 =]初始密码:〕23456XrMJRirF7.!|一 ■«*丿 r^35 一・4|E -L 凰P?E7TEF3 ■ir^OTTuchar code table[]="Your Password...";void delayms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);},做总线的延时用void delay() 短延时,两个机器周期{;;}void write_com(uchar com){rs=0;rd=0;lcden=0;P2=com;delayms(3);lcden=1;delayms(3);lcden=0;}void write_date(uchar date){rs=1;rd=0;lcden=0;P2=date;delayms(3);lcden=1;delayms(3);lcden=0;}void Display_String(uchar *p,uchar com){ uchar i;write_com(com);for(i=0;i<16;i++){write_date(p[i]);}}void init_lcd(){lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);Display_String(table,0x80);Display_String("Lock OK! ",0xc0);void start() {sda=1;scl=1;delay4us();sda=0;delay4us();scl=0;}void stop(){sda=0;scl=1;delay4us();sda=1;delay4us();scl=0;}void init() 初始化{ sda=1;delay();scl=1;delay();void ack(){sda=0;scl=1; delay4us();scl=0;sda=1;}void noack(){sda=1;scl=1; delay4us();scl=0;sda=0;}uchar recbyte(){uchar i,rd; rd=0x00;sda=1;for(i=0;i<8;i++) {rd<<=1;scl=1;rd|=sda; delay4us(); scl=0;delay4us();}scl=0;delay4us();return rd;}uchar sendbyte(uchar wd){uchar i;bit ack0;for(i=0;i<8;i++){sda=(bit)(wd&0x80);_nop_();_nop_();scl=1;delay4us();scl=0;wd<<=1;}delay4us();sda=1;scl=1;delay4us();ack0=!sda; scl=0;delay4us();return ack0;}uchar Recstring(uchar slave,uchar subaddr,uchar *buffer,uchar n) { uchar i;start();if(!sendbyte(slave)) return 0;if(!sendbyte(subaddr)) return 0;start();if(!sendbyte(slave+1)) return 0;for(i=0;i<n-1;i++){buffer[i]=recbyte();ack();}buffer[n-1]=recbyte();noack();stop();return 1;uchar Sendstring(uchar slave,uchar subaddr,uchar *buffer,uchar n) { uchar i;start();if(!sendbyte(slave)) return 0;if(!sendbyte(subaddr)) return 0; for(i=0;i<n;i++){if(!sendbyte(buffer[i])) return 0;}stop();return 1;}void clear_password(){ uchar i;for(i=0;i<6;i++){Userpassword[i]=' ';} for(i=0;i<16;i++){DSY_BUFFER[i]=' ';}} uchar Keys_Scan()uchar temp,keynum;P1=0x0F;delayms(5);temp=P1A0x0F;switch(temp){case 1:keynum=0;break;case 2:keynum=1;break;case 4:keynum=2;break;case 8:keynum=3;break; break;}P1=0xF0;delayms(5);temp=P1>>4A0x0F;switch(temp){case 1:keynum+=0;break;case 2:keynum+=4;break;case 4:keynum+=8;break;case 8:keynum+=12;break; break;}delayms(600);return keynum;void main(){ uchar temp,i=0,j=0,k=0,n;uchar IS_valid_user;beep=1;init();init_lcd();delayms(5);aa=Sendstring(0xa0,1,table2,6);delayms(5);aa=Recstring(0xa0,1,buffer,6); delayms(10);P1=0x0f;while(1){if(P1!=0x0f){temp=Keys_Scan();switch(temp){case 0: case 1: case 2: case 3: case 4:case 5: case 6: case 7: case 8: case 9:if (i<=5) 密码限制在 6 位以内{Userpassword[i]=temp; DSY_BUFFER[i]='*';Display_String(DSY_BUFFER,0xc0); i++;}break;case 10: 按 A 键开锁for(k=0;k<6;k++) {if(buffer[k]==(Userpassword[k]+48))flag=1;elseflag=0;}if (flag==1){ flag=0;i=0;led=0; 点亮LED clear_password();Display_String("OPEN OK! IS_valid_user =1;",0xc0);j=0;else{j++;led=1; 关闭LEDclear_password();Display_String("ERROR!Have trywrite_com(0xcf);write_date(0x30+j);IS_valid_user=0;}i=0;break;case 11: 按 B 键上锁led=1;clear_password();Display_String(table,0x80);Display_String("Lock OK! i=0;IS_valid_user=0; break;case 12: 按 C 键设置新密码如果是合法用户则提示输入新密码",0xc0);",0xc0);if ( !IS_valid_user){i=0;Display_String("No rights ! ",0xc0); delayms(1000);Display_String("Your Password...",0x80);Display_String("Lock OK! ",0xc0);}else{i=0;Display_String("New Password: ",0x80);Display_String(" ",0xc0); }break;case 13: 按 D 键保存新密码if( !IS_valid_user){ i=0;Display_String("No rights !",0xc0);delayms(1000);Display_String("Your Password...",0x80);Display_String("Lock OK! ",0xc0);else{i = 0;init();delayms(5);for(k=0;k<6;k++){Userpassword[k]=Userpassword[k]+48;} aa=Sendstring(0xa0,1,Userpassword,6); delayms(5);aa=Recstring(0xa0,1,buffer,6); delayms(5); clear_password();Display_String(table,0x00);Display_String("Password Saved! ",0xc0); delayms(1000);Display_String("Do lock agian ? ",0xc0); }break;case 14: 按 E 键消除所有输入i=0;clear_password();Display_String(" ",0xc0); break;case 15: 清除一位if(i!=0)i--;for(n=0;n<i;n++){ DSY_BUFFER1[n]='*';} Display_String(DSY_BUFFER1,0xc0);}P1=0x0f;}if(j==3){ Display_String("THIEF!!!THIEF!!!",0xc0);j=0;beep=0;}。

(完整版)基于51单片机的电子密码锁毕业设计论文

(完整版)基于51单片机的电子密码锁毕业设计论文

(完整版)基于51单⽚机的电⼦密码锁毕业设计论⽂⽬录第1章绪论 (1)1.1电⼦锁的发展状况 (1)1.2设计电⼦密码锁的意义及相关技术指标 (1)第2章总体设计及⽅案论证 (2)2.1单⽚机模块 (2)2.2输⼊键盘模块 (2)2.2.1独⽴式按键 (2)2.2.2矩阵式键盘 (3)2.3数码管显⽰模块 (3)2.3.1 LED静态显⽰⽅式 (3)2.3.2 LED动态显⽰⽅式 (3)2.4电源模块 (3)2.4.1蓄电池供电 (3)2.4.2双路电源供电 (3)2.5开锁电路模块 (4)2.6报警电路模块 (4)2.7最优⽅案 (4)第3章硬件电路设计 (4)3.1输⼊键盘 (4)3.2显⽰数码管 (5)3.3开锁电路 (6)3.4报警电路 (6)3.5电源电路 (7)3.6复位电路 (7)3.7振荡电路 (8)第4章软件设计 (9)4.1主程序流程图及程序 (9)4.2延时⼦程序 (11)4.3修改密码⼦程序 (11)4.4扫描键盘输⼊⼦程序 (11)4.5中断及报警⼦程序 (12)4.6显⽰⼦程序 (13)第5章设计总结 (15)参考⽂献 (16)附录Ⅰ (17)附录Ⅱ (18)第1章绪论1.1电⼦锁的发展状况随着科技的发展,传统的机械锁被破解的概率越来越⾼了,新型的盗贼也学会了与时俱进,通过各种技术⽅法和⼿段即会在短时间内开启结构复杂的机械锁,会不留痕迹的登堂⼊室,给失主和警⽅留下各种不易解惑的疑团。

由此我们想到,要是在机械锁的基础上再装上⼀把电⼦锁,就彻底杜绝了单⼀机械锁易被开启的弊端,从⽽极⼤提⾼门锁的安全防范性能。

当今世界,电⼦锁发展已经到了⾮常⾼的境界,由于电⼦元件特别是单⽚机应⽤在最近⼏年得到空前发展,电⼦锁⽆论是在功能还是在稳定性⽅⾯都有了较⼤的提⾼,在保密性⽅⾯已经做到了密码识别、指纹识别、⼈声识别等。

就整体形势⽽⾔,电⼦锁在国外发展⽐较早,所以应⽤也⽐较⼴泛,主要⽤于家庭门锁,银⾏公司等的财务保险柜锁和政府机关及⾼级宾馆等重要场合的智能控制门锁等。

一种简单基于51单片机的电子密码锁设计应用

一种简单基于51单片机的电子密码锁设计应用

一种简单基于51单片机的电子密码锁设计应用
单片机电子密码锁的背景和设计特点
 在高科技迅速发展的今天,人们已经发明了密码锁、电子锁和激光锁等多种形式。

这些锁在传统钥匙的基础上,利用磁场、声波和光束等多种方式来控制锁的开启和关闭,从而有效地增强了锁的安全性,保护了人们的生命财产和安全,有效地防止盗贼的光顾。

 单片机又称为单片微电脑或者单片微型计算机,它有效的集合了中央处理器、只读存储器、随机存取存储器和输入输出端口等计算机功能部件。

计算机体积庞大,不易携带,导致单片机的应运而生,电子密码锁就是在单片机的外部接上简单的电路,人为的写入程序来完成其核心部分,这样不仅能够缩小锁的体积还能够降低成本,保持精度,并且能够有效的升级和改善电子密码锁。

 单片机密码锁的系统设计
 1、单片机密码锁系统的总设计结构图
 2、单片机开锁机构的设计
 单片机开锁机构的设计是将单片机送入开锁执行的机构,促使电路驱动和电磁锁吸合,进而开锁。

本文设计的电子锁通过P3.0 来接入三极管进而驱动继电器来打开电磁阀线圈进而实现开门和关门。

 根据上面的图形可知,当用户在规定的时间和输入次数内输入的密码正确时,单片密码锁便输出开门的信号,将信号传送到驱动开锁的电路,进而驱。

基于51单片机简易密码锁程序设计

基于51单片机简易密码锁程序设计

基于51单片机简易密码锁程序设计//晶振11.0592MHz,T1每250微秒中断,按键P1.0-P1.7,发光二极管接P3.0-P3.3,p3.4 /*变量的定义:show_val[6]: 显示的值init_val[6]: 密码初始值key_val: 返回按键的值255-表示无按键按下key_index: 当前按键是哪一位密码T1_cnt: 定时器计数溢出数cnt_val_15s: 报警计时的数值cnt_val_5s: 待机时间计时cnt_val_4s: 输入正确,等待4秒清除开锁信号cnt_state: 计时状态error_num: 错误次数led_seg_code:数码管7段码*/#include <reg51.h>#define S1 0xEE;#define S2 0xDE;#define S3 0xBE;#define S4 0x7E;#define S5 0xED;#define S6 0xDD;#define S7 0xBD;#define S8 0x7D;#define S9 0xEB;#define S10 0xDB;#define S11 0xBB;//有源蜂鸣器sbit SPEAK=P3^5;unsigned char data cnt_val_15s,cnt_val_5s,cnt_val_4s,cnt_state;unsigned int data T1_cnt;unsigned char data key_val,key_index,key_val_old;unsigned char data state_val,error_num;unsigned char data show_val[7];char code init_val[6]={1,2,3,4,5,6};char code led_seg_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//--------延时程序----------------void delay(unsigned int i)//延时{ while(--i); }void pw_error()//密码错误信号{int i;for(i=0;i<1000;i++){SPEAK=!SPEAK;delay(1);}}void audio_out()//有源蜂鸣器{ int i;for(i=0;i<5000;i++){SPEAK=!SPEAK;delay(3);}}void init_variant(){unsigned char i;for(i=0;i<7;i++)show_val[i]=11; //led_seg_code[10]=0x00表示数码管不显示任何内容key_index=1; //没有任何输入或清除所有输入时,保存当前键的位置}//---------按键扫描---------------unsigned char scan_key(){unsigned char row,col,key;key=0;P1=0x0f;if(P1==0x0f)return(0xff);delay(10);if(P1==0x0f)return(0xff);switch(P1){case 0x0e:row=0;break;case 0x0d:row=1;break;case 0x0b:row=2;break;case 0x07:row=3;break;}P1=0xf0;switch(P1){case 0xe0:col=0;break;case 0xd0:col=1;break;case 0xb0:col=2;break;case 0x70:col=3;break;}key=row*4+col;while(P1!=0xf0);return(key);}//---------数码管显示--------------- void led_show(){P0=led_seg_code[show_val[1]]; P2=0xdf;delay(500);P0=led_seg_code[show_val[2]]; P2=0xef;delay(500);P0=led_seg_code[show_val[3]]; P2=0xf7;delay(500);P0=led_seg_code[show_val[4]]; P2=0xfb;delay(500);P0=led_seg_code[show_val[5]]; P2=0xfd;delay(500);P0=led_seg_code[show_val[6]];P2=0xfe;delay(500);}//--------定时器T1中断服务程序-----------------void timer1() interrupt 3 //T1中断{T1_cnt++;f(T1_cnt>3999) //如果计数>3999, 计时1sT1_cnt=0;switch (cnt_state){case 1://密码输入正确,需要计时4sif(cnt_val_4s<4){ cnt_val_4s++;}else{ cnt_val_4s=0;init_variant();//密码输入正确,计时到4秒时,清除输入的内容//已开锁信号清零//开锁信号清零cnt_state=0;TR1=0; //停止计时}break;case 2: //密码输入错误3次,计时15sif(cnt_val_15s<15){ cnt_val_15s++;}else{ cnt_val_15s=0;init_variant();//三次密码错误时,计时15秒,清除输入的内容// 清除所有指示和报警cnt_state=0;TR1=0; //停止计时}break;}}}//--------判断键盘输入内容与密码是否一致------unsigned char check_input_pw(){ unsigned char i,k;k=1;for(i=0;i<6;i++){ k=k && (show_val[i]==init_val[i]); }return k;}//---------主程序----------------main(){ //初始化各变量SPEAK=1;P3=0xff;cnt_val_15s=0;cnt_val_5s=0;cnt_val_4s=0;cnt_state=0;//0-待机计时5s状态;1-密码正确,计时4s状态;2-三次密码错误,处于计时15秒状态。

基于51单片机的密码锁设计报告

基于51单片机的密码锁设计报告

基于51单片机的密码锁设计报告基于51单片机的密码锁设计报告一、引言随着人们对个人财产安全的关注日益加深,密码锁作为一种智能识别系统,能够提供比传统机械锁更高的安全性和便利性。

51单片机作为一种常见的微控制器,具有体积小、价格低廉、易于编程和扩展等优点,因此被广泛应用于各种控制系统。

在本设计中,我们将基于51单片机构建一个密码锁系统。

二、系统总体设计本系统主要由51单片机、液晶显示屏(LCD)、矩阵键盘、报警模块和电源模块组成。

其中,51单片机作为主控芯片,负责处理用户输入的密码、控制LCD显示和报警模块。

LCD用于显示用户输入的密码和操作提示信息。

矩阵键盘用于用户输入密码。

报警模块在密码错误时发出警报。

电源模块为系统提供稳定的工作电压。

三、硬件设计1、51单片机:采用AT89C51或STC89C52等常见的51单片机。

2、液晶显示屏:选用1602 LCD,显示效果清晰,操作简单。

3、矩阵键盘:采用4×4键盘,按键布局可根据实际需求调整。

4、报警模块:使用蜂鸣器和LED进行声音和灯光提示。

5、电源模块:为系统提供+5V稳定电压。

四、软件设计本系统的软件设计主要分为以下几个模块:1、密码管理:包括密码设置、密码修改和密码重置等功能。

2、密码验证:在用户输入密码后,系统通过与预设的密码进行比对,判断密码是否正确。

3、系统提示:通过LCD显示操作步骤和提示信息,引导用户正确使用密码锁。

4、报警处理:在密码错误时,启动报警模块,发出警报声音和灯光提示。

五、系统调试与结果在完成硬件设计和软件编程后,我们对系统进行了调试和测试。

结果表明,基于51单片机的密码锁系统能够实现预设的功能,包括密码输入、密码验证、错误提示和报警等。

同时,系统运行稳定,具有良好的可靠性和安全性。

六、结论本设计基于51单片机的密码锁系统,实现了对密码的存储、输入和验证等功能,具有较高的安全性和便利性。

通过扩展报警模块,系统能够有效地应对非法入侵等情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。
4、AT24C02保存密码,支持复位保存,掉电保存功能。
二、按键说明
按键定义图
如图示:采用4X4键盘输入,键盘对应名称如下:
1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D
其中,【0—9】为数字键,用于输入相应的密码,
2、退出并关锁:按下【*】(取消)键,此时锁关闭,所有输入清除。
3、修改密码:在开锁状态下,再次输入正确的密码并按下【#】(确认)键,此时听到两声提示,输入新的六位密码并按【D】(重设)键,再重复输入一次新密码并按【D】,会听到两声提示音,表示重设密码成功,内部保存新密码并存储到AT24C02。(如两次输入的新密码不一样,则重设密码失败)。
【*】号键为取消当前操作
【#】号键为确认
【D】键为修改密码
其它键无功能及定义
三、作用说明:
密码锁初始密码为:000000.
1、开锁:插上电源后,程序自动调入初始密码,此时依次输入:000000,然后按【#】(确认)键,此时锁会打开,可以看到显示open,密码锁打开。(如为自己焊接,请首次使用输入:131420,对密码进行初始化,当显示出现:initpassword,证明密码初始化完成,此时初始密码即为:000000)。
DC电源座1只
自锁开关1只
4.7K色环电阻6只
5V继电器1只
蜂鸣器1只
三极管S85502只
发光二极管红绿各1只(共2只)
导线若干
USB电源线1条
一、实现功能:
1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。
2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
基于51单片机的简易电子密码锁
购买清单电子密码锁元器件清单:
9X15cm万1排阻1只
AT24C02+IC座1套
1602液晶显示屏1个
单排座(16针)1条
单排针(16针)1条
精密可调电阻10K1只
按键17只
12M晶振1只
22P瓷片电容2只
10uF极性电容1只
10K电阻1只
4、报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如3秒内又有按键,3秒再启动。
5、当重置新密码时,新密码会保存于AT24C02存储器里。
四、原理图:
五、框图及流程图:
图3-1系统结构框图
主程序设计流程图如图5-1所示。
相关文档
最新文档