单片机课程设计报告电子密码锁完整版

合集下载

单片机数字密码锁课程设计报告

单片机数字密码锁课程设计报告

.专业:电子信息工程一、设计内容:数字密码锁二、设计要求:(一)基本要求1、利用889C51作为控制器组成一数字型码锁。

2、开锁动作用LED管模拟。

3、开锁代码由小健盘输入,且同时有4位LED显示器上显出来,当你输入的四位数字与原存的密码完全相同时,则将锁打开。

4、密码可由小键盘输入进行改写。

5、修改密码,必须在30秒内完成,否则将发出报警号。

6、锁门与否,可由一开关控制,每次按Enter键时,89C51根据此开关的状态决定锁住或打开。

(二)扩展功能1、键盘增加退格键、清除键和复位键。

2、三次输入密码不正确,系统将锁定,输入代码将无效。

按复位键后,将解除锁定。

三、设计所需硬件及结构图:(一)硬件:AT69C52,8255A,MAX232,2803,按钮键盘,电容,排阻若干(二)硬件结构图:6位数码管AT89C52 8255A小键盘发光二极管四、程序流程图五、软件软程序代码PA EQU 7CFFH;A 口地址PB EQU 7DFFH;B 口地址CTR EQU 7FFFH;控制字地址YR1 EQU 30H;密码存储单元YR2 EQU 31H;YR3 EQU 32HYR4 EQU 33HNEW1 EQU 45H;用户输入密码存储单元NEW2 EQU 46HNEW3 EQU 47HNEW4 EQU 48HLOCK_TIMES EQU 35HORG 0000HJMP START_00ORG 0100H ;START_00:MOV YR1,#1H;初始密码为1234 MOV YR2,#2HMOV YR3,#3HCLR 02HMOV YR4,#4H;修改MAIN:MOV IE,#86H;开定时器0和外部中断1的中断SETB IT1LCALL KEYJB 02H,START;已经开始计时就不要再开始了MOV 50H,#08H;若是12mhz来算则R7应为0FFH,R3应为0F4HMOV 51H,#06HMOV TMOD,#01H;定时器定时工作方式1MOV TH0,#15HMOV TL0,#0AHSETB 02H;开始计时标志置1SJMP STARTSTART:MOV DPTR,#CTRMOV A,#80HMOVX @DPTR,ACLR PSW.1 ;PSW.1是是否进入重设密码功能的标志位,为0则没进入;反之则进入。

51单片机课程设计 电子密码锁

51单片机课程设计 电子密码锁

华中师范大学武汉传媒学院传媒技术学院电子信息工程2011仅发布百度文库,版权所有.基于单片机的密码锁的设计1设计题目:电子密码锁要求采用AT89S51单片机为主控芯片,通过软件程序组成电子密码锁系统2设计框图3方案设计课题设计目标本设计采用AT89S51单片机为主控芯片,通过软件程序组成电子密码锁系统,能够实现:1.正确输入密码前提下,开锁提示;2.错误输入密码情况下,蜂鸣器报警;3.密码可以根据用户需要更改;4.断电存储功能主控部分的选择选用单片机作为系统的核心部件,实现控制与处理的功能。

单片机具有资源丰富、速度快、编程容易等优点。

利用单片机内部的随机存储器(RAM)和只读存储器(ROM)及其引脚资源,外接液晶显示(LCD),键盘输入等实现数据的处理传输和显示功能,基本上能实现设计指标。

密码输入方式的选择由各按键组成的矩阵键盘每条行线和列线都对应一条I/O口线,键位设在行线和列线的交叉点,当一个键按下就会有某一条行线与某一条列线接触,只要确定接触的是哪两条线,即哪两个I/O口线,就可以确定哪一个键被触动。

行线设计成上拉口线,初始时被置高电位,列线悬空,初始置低。

通过不断读行线口线,或者中断方式触发键位扫描。

当发现有键按下,将列线逐一置低,其他列线置高,读行线口线。

当某条列线置低时,某条行线也被拉低,则确定这两条线的交点处的按钮被按下。

每个按键都可通过程序赋予功能,从而完成密码识别。

4 硬件原图设计5程序流程图主程序流程图键功能程序流程图开锁程序流程图6仿真图7制作本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。

其中矩阵键盘用于输入数字密码和进行各种功能的实现。

由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈。

电子密码锁单片机课程设计

电子密码锁单片机课程设计

电子密码锁单片机课程设计一、课程目标知识目标:1. 学生理解单片机的基本原理,掌握其编程方法;2. 学生掌握电子密码锁的工作原理,了解其电路组成;3. 学生了解数字输入输出接口的使用,能运用相关知识进行密码锁设计。

技能目标:1. 学生能运用C语言进行单片机编程,实现电子密码锁的功能;2. 学生能够运用仿真软件对设计的电子密码锁进行调试与优化;3. 学生能够运用所学知识,解决实际电子密码锁单片机课程设计过程中遇到的问题。

情感态度价值观目标:1. 学生培养对单片机及电子技术的兴趣,提高学习积极性;2. 学生培养团队协作精神,提高沟通与协作能力;3. 学生培养创新意识,提高动手实践能力,增强自信心。

课程性质:本课程为实践性较强的课程,要求学生在理解理论知识的基础上,动手实践,完成电子密码锁单片机课程设计。

学生特点:学生处于高年级阶段,已具备一定的单片机编程和电子技术基础,具备独立思考和解决问题的能力。

教学要求:教师应注重理论与实践相结合,引导学生主动参与,培养学生的创新能力和实践能力。

在教学过程中,关注学生的学习进度和需求,及时调整教学策略,确保课程目标的达成。

通过本课程的学习,使学生能够将所学知识应用于实际项目中,提高综合运用能力。

二、教学内容1. 单片机基础理论:包括单片机结构、工作原理、编程语言(C语言)等,对应教材第1章至第3章内容。

- 单片机内部结构及功能;- 单片机工作原理及指令系统;- C语言编程基础及单片机程序设计方法。

2. 电子密码锁原理与设计:包括密码锁电路组成、工作原理、设计方法等,对应教材第4章内容。

- 电子密码锁电路组成及各部分功能;- 电子密码锁工作原理及设计要求;- 数字输入输出接口的使用及编程。

3. 单片机编程与调试:包括编程环境搭建、程序编写、仿真调试等,对应教材第5章内容。

- 编程环境(如Keil)的安装与使用;- 单片机程序编写、编译、下载;- 仿真软件(如Proteus)的使用及调试技巧。

单片机课程设计__电子密码锁报告

单片机课程设计__电子密码锁报告

基于单片机控制的电子密码锁摘要:本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。

系统能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。

除上述基本的密码锁功能外,还具有调电存储、声光提示等功能,依据实际的情况还可以添加遥控功能。

本系统成本低廉,功能实用关键词:AT89S51,AT24C02, 电子密码锁,矩阵键盘一、引言随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。

设计本课题时构思了两种方案:一种是用以AT89s51为核心的单片机控制方案;另一种是用以74LS112双JK触发器构成的数字逻辑电路控制方案。

考虑到数字电路方案原理过于简单,而且不能满足现在的安全需求,所以本文采用前一种方案。

二、方案论证与比较方案一:采用数字电路控制。

其原理方框图如图1-1所示。

图2-1 数字密码锁电路方案采用数字密码锁电路的好处就是设计简单。

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

电路由两大部分组成:密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。

密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。

方案二:采用一种是用以AT89S51为核心的单片机控制方案。

利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。

单片机密码锁课题设计报告

单片机密码锁课题设计报告

单片机开发与应用工程报告题目:电子密码锁设计学号:学生姓名:专业:信息工程年级:2010级课程名称:单片机开发与应用工程训练指导老师:年月日一、设计目的:用单片机实现一个电子密码锁二、设计要求:设计一个电子密码锁系统,用4位数码管显示设定密码.输入密码正确时,用绿色发光管显示。

错误时,用红色发光管闪动显示。

三次输入错误,发出蜂鸣报警。

可进行密码修改。

a)4位数码管显示:设置密码时显示数字,输入密码时显示“----”b)存储密码功能:密码设置及修改c)报警功能:蜂鸣器报警加红色发光管闪烁显示三、设计分析【系统的主要功能】本课题实际是设计一个电子密码锁,可以设置4位密码,用2个发光二极管和一个蜂鸣器来显示输入密码的错误与正确,另外还可以有秒表的功能。

一、时间模块:正常状态显示时钟,小时和分钟。

24小时制循环。

在温度模块时,长按set键,切换进入时间模块。

1、在时钟正常显示状态下按动KSET按钮,进入时钟调整:1)调整位闪烁,此时按动KADD键进行递增,按动KSUB键进行递减2)循环按动KSET键,调整位循环闪烁,一圈以后回到正常时钟状态3)在调整时钟状态按动KFUN键,确认时钟调整有效,并保存2、时钟正常状态按动KFUN键进入倒顺计时1)上电后首次进入计时状态则为默认的正向计时,此时时间不能调整,最大计时为99秒,计时精度为0.01秒2)在停止计时状态持续按动KSET键1秒,可进行倒顺计时转换3)倒计时状态默认的时间为30分钟,最大可定时100分钟,计时精度为1秒4)在倒计时状态复位情况下,可通过按动KADD或KSUB键进行时间的递增或递减调整,调整步长为10秒。

当数值小于10以后,下调步长为1秒。

5)在计时状态停止时按动KFUN键可复位计时时间6)按动KFUN键可启动或停止计时7)在计时过程中按动KADD或KSUB键,可暂停计时和连续计时8)倒顺计时的任意情况下按动KSET键,可退出计时回到正常的时钟状态二、密码模块:如果没得存储芯片或者存储芯片坏了上电时就自动进入时钟模块1、上电时显示----,红灯亮起,系统锁定2、输入正确密码,按Kfun键确认,红绿灯亮起,系统开放10秒然后红灯熄灭3、双灯亮起时,按动Kset键,相应位闪烁,按动Kadd或Ksub进行密码修改4、密码修改后,按动Kfun键,确定密码修改完成,嘟嘟嘟蜂鸣三声,红灯熄灭,系统显示----5、单灯亮时,需要输入正确密码,亮起双灯才能修改密码6、长按Kset键,系统锁定,红灯亮起【硬件电路分析】1.晶振电路单片机晶振的作用是为系统提供基本的时钟信号。

单片机课程设计 电子密码锁

单片机课程设计   电子密码锁

第1章设计目的1.利用所学单片机的理论知识进行软硬件整体设计,锻炼学生理论联系实际、提高我们的综合应用能力。

2.我们这次的课程设计是以单片机为基础,设计出一个具有一定功能的电子密码锁。

3.掌握一些重要芯片的功能特性及使用方法,并能运用其组合成一个简单的单片机机应用系统。

4.锻炼同学们的动手能力和独立思考的能力,巩固理论知识,加深对课堂内容的理解。

5.培养同学们对单片机的兴趣,通过课程设计调动同学们的积极性,使更多的人将来能在单片机领域有所建树。

第2章设计要求及总体思路2.1设计要求1、密码的设定,此密码是固定在程序存储器ROM中,假设预设的密“12345”共5位密码。

2、密码的输入:采用两个按键来完成密码的输入,其中一个按键为功能键,另一个按键为数字键。

在密码都已经输入完毕并且确认功能键之后,才能完成密码的输入过程。

然后进入密码的判断比较处理状态并给出相应的处理过程。

3、按键禁止功能:初始化时,允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态是在3次密码输入不正确的情况下发生的。

2.2 总体思路系统总体设计方案框图如下:图2-1一般而言,要实现相同的功能,硬件复杂的系统其软件一般较简单,而软件复杂的系统其硬件一般相对简单,本着经济性的原则,我们应该尽可能少用硬件,根据这个设计理念和设计要求,本单片机系统的设计思路如下:1)电子密码锁所用的数据的存储和运算用单片机来完。

2)因为没有专用的输入键盘,所以按键输入用计算器输入键盘代替。

按键密码从P3口输入。

3)用六位显示器显示五位密码,显示器选择动态扫描,用P0口作段控,用P2口作位控。

4)开锁信号从P1.1口输出,报警信号从P1.0口输出。

5) 按键分为功能键和数字键,具体如表2-1。

6)输入五位密码后按确认键,系统验证密码是否正确,若密码正确,则产生开锁信号,若接连三次输入错误密码,则产生报警信号。

7) 当错误输入某位密码时,可按删除键进行删除,也可按清零键对所输入的数进行整体清除。

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

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

单片机课程设计密码锁设计在当今社会,安全问题越来越受到人们的重视,密码锁作为一种常见的安全防护设备,在保护个人财产和隐私方面发挥着重要作用。

本次单片机课程设计的任务就是设计一款基于单片机的密码锁。

一、设计要求本次设计的密码锁需要具备以下功能:1、能够设置和修改 4 位数字密码。

2、输入密码正确时,锁打开,并有相应的指示灯提示。

3、输入密码错误时,有错误提示,且错误次数超过 3 次则报警。

4、具备密码重置功能。

二、系统方案设计1、硬件设计单片机选型:选择 STC89C52 单片机作为核心控制器,其具有性能稳定、价格低廉、易于编程等优点。

输入模块:采用 4×4 矩阵键盘作为密码输入设备,可方便地输入数字和功能按键。

显示模块:选用 1602 液晶显示屏,用于显示密码输入状态、提示信息等。

存储模块:使用 EEPROM 芯片 AT24C02 来存储密码,以保证断电后密码不丢失。

报警模块:当密码输入错误次数超过 3 次时,通过蜂鸣器发出报警声音。

2、软件设计主程序:负责系统的初始化、键盘扫描、密码输入处理、密码验证、显示控制等。

键盘扫描程序:检测矩阵键盘上的按键动作,并将按键值返回给主程序。

密码处理程序:包括密码设置、修改、存储和验证等功能。

显示程序:控制 1602 液晶显示屏的显示内容。

三、硬件电路设计1、单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振为单片机提供时钟信号,复位电路用于系统的初始化。

2、矩阵键盘电路由16 个按键组成 4×4 矩阵,通过行线和列线的扫描来确定按键值。

3、显示电路1602 液晶显示屏通过数据总线和控制总线与单片机相连,实现数据的传输和显示控制。

4、存储电路AT24C02 通过 I2C 总线与单片机进行通信,用于存储密码数据。

5、报警电路蜂鸣器通过三极管驱动,当单片机输出高电平时,蜂鸣器发声报警。

四、软件程序设计1、主程序流程系统初始化,包括单片机端口初始化、液晶显示屏初始化、EEPROM 初始化等。

单片机课程设计 电子密码锁的设计

单片机课程设计 电子密码锁的设计

目录摘要----------------------------------------------------------- 3 关键字------------------------------------------------------------------------------------- 3 第一章前言----------------------------------------------------------------------------- 3 第二章基本功能设计--------------------------------------------------------------- 4⏹ 2.1 实验任务----------------------------------------------------------------- 4⏹ 2.2基本设计------------------------------------------------------------------ 4⏹ 2.3 系统框图-------------------------------------------------------------- -- 5 第三章硬件设计----------------------------------------------------------------------- 5 3.1硬件工作接线口---------------------------------------------------------------- 5 3.2 LED显示器结构与原理------------------------------------------------------- 6 3.3复位电路----------------------------------------------------------------------------- 6 3.4按键方式--------------------------------------------------------------------------- 7 3.5电路原理图------------------------------------------------------------------------- 8 3.6 元器件清单-------------------------------------------------------------------------9第四章软件设计-------------------------------------------------------------------- 10 4.1软件结构---------------------------------------------------------------------------------- 10 4.2源程序--------------------------------------------------------------------------------------12 第五章心得体会----------------------------------------------------------------------- 13 第六章参考文献----------------------------------------------------------------------- 14【摘要】电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,我们采取的是单片机,它具有超大规模集成电路技术,有极强的数据处理能力,I/O口多以它为核心设计的密码锁,结构小,功能强,现在很多单位甚至家里的各个家用电器,还有保险箱都需要它。

单片机电子密码锁课程设计

单片机电子密码锁课程设计

基于单片机的电子密码锁设计一、设计要求和条件1.1 设计要求根据单片机开发板所提供的元件特性和硬件电路,编写相关的程序,通过实验开发板实现电子密码锁在LCD1602上显示的功能。

1.搭建proteus仿真电路图平台,模拟单片机要实现的功能;2.焊接单片机系统开发板;3.编写程序,实现密码锁相关功能;4.下载并调试程序,实现密码锁的具体功能。

1.2 设计目的1.熟练掌握KEIL软件的使用方法;2.熟练掌握PROTEUS软件的使用方法;3.掌握单片机I/O接口的工作原理;4.掌握中断系统的工作原理;5.掌握液晶LCD1602的工作原理及编程方法;6.掌握蜂鸣器的编程使用;7.掌握行列式键盘的工作原理及编程使用方法;8.掌握单片机的ISP下载使用方法。

1.3 功能概述本设计是基于单片机的密码锁设计方案,根据要求,给出了该单片机密码锁的硬件电路和软件程序,同时给出了硬件设计方案、软件流程图、C 语言源程序及详细注释等内容,由于单片机实验板上的矩阵键盘为3*3的,则规定0-5号键为数字键,6-8号键为功能键,其中该密码锁的具体功能介绍如下:(1)按“8”号键则输入密码,初始密码为012345,在LCD1602上显示密码值为“******”(密码是保密的),输完6位后键盘就锁定,在LCD1602上显示密码是否正确,若输入的密码长度小于6位,则1602等待密码输入。

(2)若密码输入正确后,则绿色的发光二极管亮表示开锁,并且1602上显示“you are right!”,等待是否修改密码。

(3)密码输入错误时显示“code is wrong”,接着会给你第二、第三次机会输入密码,如果三次密码都错误时,发出“叮咚”的报警声,且红色报警指示灯不停闪烁,按复位键清除报警。

(4)按“7”号键表示若密码不小心输入时,可以删除输入错误的密码。

(5)按“6”修改密码,要求输入原密码是正确的,然后按该键后,蓝色密码修改指示灯会亮,并且1602上会显示“Input new code”,输入正确要求再次输入,两次输入一致提示“Modify right!!!”并返回主菜单。

单片机课程设计之电子密码锁

单片机课程设计之电子密码锁

课程设计(综合实验)报告( 2009 -- 2010 年度第二学期)名称:微处理器系统课程设计题目:电子密码锁设计院系:电子与通信工程系班级:电子0702班学号: 0201学生姓名:白羽峰指导教师:张宁设计周数: 1周成绩:日期: 2010 年 7 月单片机课程设计之电子密码锁一、课程设计要求1.通过键盘输入密码。

密码正确与错误进行相应的音乐提示,与液晶显示提示。

3次按下错误密码则锁死,禁止信号输入。

2.通过超级密码(长度为16位)进入密码修改模式,进行密码修正,用户密码长度为8位。

二、实验目的进一步的掌握使用ICC进行编程以及程序调试,熟悉并掌握AVR单片机片上外设功能及其使用,熟练掌握单片机学习板上矩阵键盘、1602液晶、蜂鸣器、EEPROM (AT24C02)等外设的使用以及和单片机间的通信。

三、设计思路利用EEPROM(AT24C02)掉电不丢失的特性设计电子密码锁,先向AT24C02中写入一组数据作为密码(密码设定),然后进入密码输入界面,输入密码并进行密码真伪判别,密码真伪有不同对应的提示,表现在液晶显示和蜂鸣器鸣响上,出现三次密码输入错误则锁死,不能进行任何操作,只能关闭电源重新开始。

四、实验源程序代码如下:#include <>#include <>#include <>#define uchar unsigned char#define uint unsigned int#define LCD_EN BIT(PC3)#define LCD_RS BIT(PC2)//EEPROM控制寄存器位定义:#define EERE 0 //读#define EEWE 1 //写#define EEMWE 2 //总写入#define WWRIE 3 //中断uint add[8]={0x0100,0x0101,0x0110,0x0111,0x1000,0x1001,0x1010,0x1011};uchar sc[16]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38, 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38}; uchar title[]={"Code:"};uchar title1[]={"Hint:"};uchar title2[]={"Error!"};uchar title3[]={"OK!"};uchar title8[]={"Hello!I like AVR"};uchar title4[]={"Warnning!"};uchar title5[]={"Super Code:"};uchar title6[]={"Input New Code:"};uchar title7[]={"Set Code:"};uint xians[]={0};uchar key_flag;unsigned data_temp;void_init(void){DDRB=0xff; //定义B口输出PORTB=0xff;}void eeprom_w(uint eeadd, uchar eedata){while(EECR&(1 << EEWE)); //写等待EEAR=eeadd; //设置写入地址EEDR=eedata; //设置写入数据EECR|=(1<<EEMWE); //总写入允许EECR|=(1 << EEWE); //开始写入}char eeprom_r(uint eeadd){while(EECR&(1 << EEWE)); //写等待EEAR=eeadd; //设置读入地址EECR|=(1<<EERE); //读命令return EEDR; //返回数据}void delay_1ms(void){uint i;for (i=0;i<1140;i++);}void delay(uint n){uint i=0;for (i=0;i<n;i++)delay_1ms();}void LCD_Write_half_char(void){PORTC &= 0x0F; //portc0~3=0PORTC |= (data_temp<<4)&0xF0; //send LOW 4bitPORTC |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD delay(2);PORTC &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD PORTC &= 0X0F;delay(2);}void LCD_write_char(uint command,uint data){PORTC &= ~LCD_EN;if (command == 0)PORTC &=~LCD_RS; //RS=0 发送命令elsePORTC |=LCD_RS; //RS=1 发送数据data_temp = data;data_temp=data_temp >>4;LCD_Write_half_char();data_temp = data;LCD_Write_half_char();delay(1);}void LCD_init(void)LCD_write_char(0,0x38);delay(1);LCD_write_char(0,0x02);delay(1);LCD_write_char(0,0x28); // 显示模式设置(不检测忙信号) delay(1);LCD_write_char(0,0x08); // 显示关闭delay(1);LCD_write_char(0,0x01); // 显示清屏delay(1);LCD_write_char(0,0x06); // 显示光标移动设置delay(1);LCD_write_char(0,0x0c); // 显示开及光标设置delay(5);}uchar key_read(void){ uchar i;DDRA = 0x0E; //获取列地址PORTA = 0x0E;i = PINA;DDRA = 0xf0; //获取行地址PORTA = 0xf0;i |= PINA;DDRA = 0x00; //输出复位switch (i) //将按键码转换成键值{case 0x7d: return 0x31;case 0xbd: return 0x32;case 0xdd: return 0x33;case 0xed: return 0x34;case 0x7b: return 0x35;case 0xbb: return 0x36;case 0xdb: return 0x37;case 0xeb: return 0x38;case 0x77: return 0x2a;case 0xb7: return 0x39;case 0xd7: return 0x30;case 0xe7: return 0x23;default : return 0x00;delay(10);}}void chush(void){uchar i=0,k,j,temp=0x00,m,n;uchar x[8]={0};uint add1[8]={0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c};DDRC=0xff;PORTC=0x00;LCD_init();LCD_write_char(0,0x80);for(k=0;k<5;k++)LCD_write_char(1,title[k]);LCD_write_char(0,0x80+0x40);for(j=0;j<5;j++)LCD_write_char(1,title1[j]);}void main(void){uchar i=0,k,j,temp=0x00,m,n,l,w=0,y=0,z,v,t=0,dkz;uchar x[8]={0},dec[8]={0},p[16]={0},c[8]={0};uint add1[8]={0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c};uint add2[16]={0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9, 0xca,0xcb,0xcc,0xcd,0xce,0xcf};DDRD=0xFF;PORTD=0xF0;DDRC=0xff;PORTC=0x00;LCD_init();LCD_write_char(0,0x80);for(k=0;k<9;k++)LCD_write_char(1,title7[k]);while(i<8){c[i]=key_read();if(c[i]!=0&&c[i]!=temp){LCD_write_char(0,add2[i]);LCD_write_char(1,0x2a);temp=key_read();i++;}/*delay(2);dkz=PIND;if(dkz==0x70){i=8;}*/}if(i==8){ temp=0;i=0;for(m=0;m<8;m++){void_init();eeprom_w(add[m],c[m]); //将数据写入EEPROM中的单元 PORTB=eeprom_r(add[m]);//读取EEPROM中的数据,送显dec[m]=eeprom_r(add[m]);delay(20);}}while(1){delay(2);dkz=PIND;if(dkz==0xE0){LCD_write_char(0,0x01); // 显示清屏LCD_write_char(0,0x80);for(k=0;k<5;k++)LCD_write_char(1,title[k]);LCD_write_char(0,0x80+0x40);for(j=0;j<5;j++)LCD_write_char(1,title1[j]);}x[i]=key_read();if(x[i]!=0&&x[i]!=temp){LCD_write_char(0,add1[i]);LCD_write_char(1,0x2a);temp=key_read();i++;}if(i==8){ temp=0;i=0;for(m=0;m<8;m++){if(x[m]==dec[m]){w++;}}if(w==8){LCD_write_char(0,0x80+0x45);for(n=0;n<3;n++)LCD_write_char(1,title3[n]);PORTD^=BIT(5);delay(100);PORTD^=BIT(5);w=0;delay(200);LCD_write_char(0,0x01); // 显示清屏LCD_write_char(0,0x80);for(k=0;k<16;k++)LCD_write_char(1,title8[k]);}else{LCD_write_char(0,0x80+0x45);for(n=0;n<6;n++)LCD_write_char(1,title2[n]);for(l=0;l<6;l++){PORTD^=BIT(5);delay(50);}y++;}}if(y==3){y=0;LCD_write_char(0,0x01); // 显示清屏LCD_write_char(0,0x80);for(z=0;z<9;z++)LCD_write_char(1,title4[z]);dkz=PIND;while(dkz==0xF0||dkz==0x70);}delay(2);dkz=PIND;if(dkz==0x70){chush();}else if(dkz==0xB0){LCD_write_char(0,0x01); // 显示清屏 LCD_write_char(0,0x80);for(z=0;z<11;z++)LCD_write_char(1,title5[z]);while(i<16){p[i]=key_read();if(p[i]!=0&&p[i]!=temp){LCD_write_char(0,add2[i]);LCD_write_char(1,0x2a);temp=key_read();i++;}}if(i==16){ temp=0;i=0;for(m=0;m<16;m++){if(p[m]==sc[m]){t++;}}}if(t==16){LCD_write_char(0,0x01); // 显示清屏LCD_write_char(0,0x80);for(z=0;z<15;z++)LCD_write_char(1,title6[z]);while(i<8){c[i]=key_read();if(c[i]!=0&&c[i]!=temp){LCD_write_char(0,add2[i]);LCD_write_char(1,0x2a);temp=key_read();i++;}}if(i==8){ temp=0;i=0;for(m=0;m<8;m++){void_init();eeprom_w(add[m],c[m]); //将数据写入EEPROM中的0x0100单元PORTB=eeprom_r(add[m]);//读取EEPROM中0x0100单元的数据,送显dec[m]=eeprom_r(add[m]);delay(20);}}}}}}五、实验心得通过本次课程设计,我对使用ICC进行编程以及程序调试有了进一步的掌握,并且对AVR单片机片上外设功能及其使用有了一个清晰的了解,较熟悉的掌握了单片机学习板上矩阵键盘、1602液晶、蜂鸣器、EEPROM(AT24C02)等外设的使用以及和单片机间的通信。

单片机课程设计-电子密码锁-实验报告-

单片机课程设计-电子密码锁-实验报告-

单片机课程设计电子密码锁实验报告学院:电子信息工程学院班级:自***姓名:***学号:******指导教师:***单片机课程设计电子密码锁实验报告(一)实验目的1、了解电子密码锁工作原理和八段LED数码管显示原理。

2、掌握LED数码管显示器与单片机接口电路设计方法。

3、掌握实现密码锁功能的编程方法。

(二)设计实现功能(1)由程序设定初始密码,密码输入正确时锁打开,指示灯亮,发出“叮咚”的声音;密码输入不正确时,指示灯闪亮四次,发出“嘀嘀嘀滴”报警声。

(2)具有保护密码的功能,输入密码在数码管上显示可改为“88888”的方式,防止别人偷窥密码。

(3)具有修改密码的功能,密码输入错误可按DEL键进行删除。

(4)具有防止多次试探密码的电子密码锁并加报警功能,密码输入错误超过三次,将一直发出“滴滴滴滴。

”报警声。

(5)具有设定新密码的功能,输入密码后按CHG键,密码将被重新设定。

(三)整体电路设计思路核心用单片机AT89S52来实现此实验的要求。

用4*4键盘来输入密码。

每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接V CC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

用8个7段数码管来显示密码。

数码管的显示用扫描的方式,利用动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。

单片机电子密码锁课程设计

单片机电子密码锁课程设计

单片机电子密码锁课程设计一、课程目标知识目标:1. 让学生理解单片机的基本原理和功能,掌握电子密码锁的基本工作原理。

2. 使学生掌握电子密码锁设计中涉及的编程知识,如C语言基础、寄存器操作等。

3. 帮助学生了解电子密码锁电路的组成,熟悉相关电子元器件的使用。

技能目标:1. 培养学生运用所学知识设计并实现一个简单的单片机电子密码锁的能力。

2. 提高学生动手实践能力,学会使用编程软件、烧录器和相关调试工具。

3. 培养学生团队协作和问题解决能力,学会分析电子密码锁故障并找出解决办法。

情感态度价值观目标:1. 激发学生对电子制作的兴趣,培养创新意识和动手能力。

2. 培养学生严谨的科学态度,注重实验数据和实验结果的准确性。

3. 引导学生关注单片机技术在日常生活中的应用,提高对科技的认识和热爱。

本课程针对高年级学生,他们在之前的学习中已经具备了一定的电子和编程基础。

因此,课程设计将注重实践操作,以项目为导向,让学生在动手实践中巩固知识,提高技能。

通过本课程的学习,学生将能够独立设计并实现一个具有实用价值的单片机电子密码锁,提升解决实际问题的能力。

二、教学内容1. 单片机基础原理:回顾单片机的组成、工作原理,重点讲解51单片机的内部结构、时钟电路和复位电路。

教材章节:第三章《单片机原理与接口技术》2. C语言编程基础:介绍C语言在单片机编程中的应用,讲解数据类型、运算符、控制语句等基本语法。

教材章节:第四章《单片机C语言编程》3. 电子密码锁原理:讲解电子密码锁的基本工作原理,分析锁体的电路组成和功能。

教材章节:第七章《单片机应用实例》4. 硬件设计:学习并设计电子密码锁的硬件电路,包括键盘输入、显示模块、锁驱动电路等。

教材章节:第五章《单片机接口技术》5. 软件设计:编写电子密码锁的控制程序,实现密码输入、校验、开锁等功能。

教材章节:第四章《单片机C语言编程》6. 系统调试与优化:学习使用调试工具,对电子密码锁系统进行调试和优化。

北京交大单片机课程设计电子密码锁设计报告

北京交大单片机课程设计电子密码锁设计报告

单片机原理与应用课程设计报告-电子密码锁目录:1密码锁简介:2系统硬件电路设计单片机电路图显示电路图键盘电路图3芯片介绍MAX7219的,管脚功能,操作指令,与单片机的连接4程序设计框架5在课程设计中遇到的困难及解决办法与心得体会6程序1,电子密码锁简介:我使用MCS51系列单片机设计电路,运用汇编语言编程,达到用键盘输入密码,修改密码,报警并即时显示的目的。

MCS51系列单片机使用起来灵活,应用广泛。

它的直接并行互连具有一定的实用价值,能简化许多应用系统的硬件设计。

它还具有性能稳定、工作可靠、价格低廉等特点。

我是利用MCS51单片机系列AT89S52为依托,利用一块扩展4 X 4 键盘输入密码,显示器采用MAX7219控制共阴极四位数码管和蜂鸣器。

最终使密码锁能够实现以下功能:1、密码锁上电或复位后初始密码为0000,管理员密码是1105;2、输入密码:按“输入”键后可输入4位密码,按“确认”键后进行比较,当与设定密码或管理员密码一致时绿灯亮,输入正确;否则红灯亮,输入错误。

当连续3次输入错误时,红灯亮一段时间,期间发出报警的蜂鸣声,且键盘在此期间锁定。

10秒后退出报警系统,返回初始状态。

3、修改密码:按“修改”键后,要先输入当前设定密码或管理员密码才可修改,否则退出修改模块。

当输入正确后,绿灯亮,可以修改密码。

首先输入4位数字,绿灯亮;然后再输入4位数字,当两次输入一致时,绿灯亮,修改成功。

否则,红灯亮,修改未成功,需要继续输入4位数字,只有连续输入的4位数字一致时,绿灯亮,修改成功。

退出修改密码模块。

4、存在的问题:当复位或断电后,修改后的密码会丢失电路设计图,包括电源,复位开关,单片机,和LED蜂鸣器显示芯片与数码管的电路设计图注意,这里我采用的4联共阴的数码管,所以要去掉两条线键盘连接图,4X4其中0-9是数字输入键,输入的是相应的数字,A 为输入键,B 为修改密码键,C 为确认键。

3、主要芯片介绍3.1 MAX7219MAX7219是一种高集成化的串行输入/输出的共阴极LED显示驱动器。

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

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

单片机课程设计题目基于单片机的电子密码锁设计郑州科技学院单片机课程设计任务书一、设计题目基于单片机的电子密码锁设计二、设计任务与要求(1)本设计为防止密码被窃取在输入密码时屏幕上显示8。

(2)设计开锁密码位为六位密码的电子密码锁。

(3)能够在密码正确时显示“1HELLO”,密码错误时显示“2ERROR”,输入密码的位数时显示为8的个数。

(4)4×4的矩阵键盘中包括0-9的数字键确认键和消除键的功能键。

(5)本产品具备报警功能,当输入密码错误时蜂鸣器响(6)在密码输入过程中,若输入错误,可以利用“C”键删除刚才输入的错误的数字。

在输入密码的过程中可以随时对输入的密码进行修改。

三、主要参考文献[1] 何宏主编.单片机原理与接口技术.[M]北京:国防工业出版社. 2006.07[2] 赵益、徐晓林、周振峰. 电子密码锁的系统原理. [M]北京:清华大学出版社. 2003.[3] 张培仁.基于C语言编程MCS- 51单片机原理与应用.北京:清华大学出版社. 2002. 12四、设计时间2015 年01月16日至2015 年01月16 日指导教师签名:年月日目录1 电子密码锁的背景 (1)2 总体设计方案的确定 (2)2.1 电子密码锁设计要求 (2)2.2 总体设计方案选定 (2)3 系统硬件设计 (3)3.1 设计原理 (3)3.2 单片机STC89C52简介 (3)3.4七段数码管显示器部分 (7)3.5 键盘设计 (8)3.6 蜂鸣器模块 (8)4 系统软件设计 (9)4.1 主程序模块 (9)5 系统制作及调试 (11)5.1 焊接注意事项 (11)5.2 硬件调试问题及解决方法 (11)6 结论 (12)参考文献 (13)附录1:实物图 (14)附录2:元件清单 (15)附录3:电路原理图 (16)附录4:程序 (17)1 电子密码锁的背景随着社会物质财富的日益增长,如何实现家庭防盗这一问题也变的尤其的突出,而锁自古以来就是把守门户的铁将军,人们对它要求甚高,即要安全可靠地防盗,又要使用方便。

单片机课程设计报告电子密码锁

单片机课程设计报告电子密码锁

单片机与嵌入式系统作品设计报告专业:电子信息科学与技术学生姓名:学号:指导教师:完成日期:2013 年12 月25 日目录1 绪论 (2)1.1本设计所要实现的目标 (2)1.2设计方案简介 (2)2 系统总体方案设计 (2)设计框图 (2)3硬件系统构成 (3)3.1电源输入电路 (3)3.2键盘输入电路 (3)3.3密码存储电路 (4)3.4复位电路 (4)3.5晶振电路 (5)3.6显示电路 (5)3.7报警电路 (6)3.8开锁电路 (6)4 软件系统设计 (7)4.1主程序流程图 (8)结论 (8)附录1硬件原理图 (8)附录2 C语言程序 (9)121 绪论1.1 本设计所要实现的目标本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。

密码可以有用户自己修改设定,锁打开后才能修改密码。

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

1.2 设计方案简介采用以单片机为核心的控制方案一般来说在选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O 口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。

在开发过程中单片机还受到:开发工具、编程器、开发成本、开发人员的适应性、技术支持和服务等等因素。

基于以上因素本设计选用单片机80C51作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O 端口,及其控制的准确性,实现基本的密码锁功能。

在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示作用。

单片机课程设计报告电子密码锁

单片机课程设计报告电子密码锁

单片机课程设计报告电子密码锁This manuscript was revised on November 28, 2020山东交通学院单片机原理与应用课程设计院(部):轨道交通学院班级:自动化121学生姓名:学号:指导教师:时间: 2015.6.1—2015.6.12课程设计任务书题目电子密码锁设计系 (部) 轨道交通学院专业班级自动化121学生姓名学号06 月 01 日至 06 月 12 日共 2 周指导教师(签字)系主任(签字)年月日目录3.总体设计 (2)44.5密码比较模块 (6) (6) (8) (9)附录 (10)摘要设计运用了ATMEL公司的AT89S52芯片系统,将微处理器、总线、蜂鸣器、矩阵键盘、存储器和I/O口等硬件集中一块电路板上,通过读取键盘输入的数据(密码)并储存到ATMEL912 24C08存储器中,然后判断之后键盘输入的数据与已存储的数据是否相同来决定打开密码箱或锁键盘或报警。

在keil4软件中编程,系统可实现6位密码的处理,并通过控制步进电机控制密码箱门的电子锁,同时还可以修改改密码。

利用单片机系统制作的密码箱安全性能更高,更易操作且体积小。

关键词:单片机、密码锁、修改密码1.设计要求本实验将实现六位数的电子密码锁。

要求使用4X4 行列式键盘作为输入,并用LCD 实时显示。

具体要求如下:1. 开机时LCD显示“welcome to use”,初始化密码为“123456”,密码可以更改。

2. 按下“10”,开始则显示“Enter Please:”。

3. 随时可以输入数值,并在LCD上实时显示‘*’。

当键入数值时,为了保密按从左到右依次显示‘*’,可键入值为0~9。

4. 按下“13”键,则表示确定键按下,进行密码对比。

如相符则在LCD第一行显示“Open the door!”,同时指示灯亮起并且步进电机旋转一定的角度;如不符,则LCD第一行显示“Wrong password!”,并且蜂鸣器同时提示一下。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计报告电子密码锁HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】山东交通学院单片机原理与应用课程设计院(部):轨道交通学院班级:自动化121学生姓名:学号:指导教师:时间:—课程设计任务书题目电子密码锁设计系 (部) 轨道交通学院专业班级自动化121学生姓名学号06 月 01 日至 06 月 12 日共 2 周指导教师(签字)系主任(签字)年月日目录3.总体设计 (2)4密码比较模块 (6) (6) (8) (9)附录 (10)摘要设计运用了ATMEL公司的AT89S52芯片系统,将微处理器、总线、蜂鸣器、矩阵键盘、存储器和I/O口等硬件集中一块电路板上,通过读取键盘输入的数据(密码)并储存到ATMEL912 24C08存储器中,然后判断之后键盘输入的数据与已存储的数据是否相同来决定打开密码箱或锁键盘或报警。

在keil4软件中编程,系统可实现6位密码的处理,并通过控制步进电机控制密码箱门的电子锁,同时还可以修改改密码。

利用单片机系统制作的密码箱安全性能更高,更易操作且体积小。

关键词:单片机、密码锁、修改密码1.设计要求本实验将实现六位数的电子密码锁。

要求使用4X4 行列式键盘作为输入,并用LCD 实时显示。

具体要求如下:1. 开机时LCD显示“welcome to use”,初始化密码为“123456”,密码可以更改。

2. 按下“10”,开始则显示“Enter Please:”。

3. 随时可以输入数值,并在LCD上实时显示‘*’。

当键入数值时,为了保密按从左到右依次显示‘*’,可键入值为0~9。

4. 按下“13”键,则表示确定键按下,进行密码对比。

如相符则在LCD第一行显示“Open the door!”,同时指示灯亮起并且步进电机旋转一定的角度;如不符,则LCD第一行显示“Wrong password!”,并且蜂鸣器同时提示一下。

如果密码连续三次错误则蜂鸣器连续响5下,并且持续5秒不能进行任何操作 5.在开锁状态下按下“12”键,进入修改密码状态,LCD同时提示“Enter new code!”。

为删除按键,出入之后可以进行删除。

按键为关闭按键,只有在打开状态下才可以关闭,按下之后LCD显示“Close the door!”。

2.功能概述此设计分为四个功能模块。

第一模块:按键输入模块,用于密码的输入以及其他的密码操作按键。

第二模块:LCD模块,是与使用者交流的界面,用于显示各种状态下的内容。

第三模块:步进电机模块,用于控制密码锁的打开与关闭。

第四模块:24C08模块,用于储存输入的密码并读出来。

3.总体设计本次设计作品的主要构成部分包括80C51单片机、LCD1602、24C08、矩阵按键、LED 等、蜂鸣器。

如图1总体仿真图,图2实物图。

图1 总体电路图图2 密码锁实物图4.硬件设计矩阵按键设计如图3所示矩阵按键由P1口控制,了加强密码的保密性,采用一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),从而提高了密码的保密性,同时也能减少与单片机接口时所占用的I/O口线的数目,节省了单片机的宝贵资源,在按键比较多的时候,通常采用这种方法。

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

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

当确认有按键按下后,下一步就是要识别哪一个按键被按下。

对键的识别方法通常有两种:一种是通用的组行扫描查询法;另一种是速度较快的线反转法。

此系统中,我们采用线反转法。

首先辨别键盘中有无按键被按下,在单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。

具体方法是:向行线输出全扫描字00H,把全部列线置成低电平,然后将列线的电平状态读入累加器A中。

如果有按键被按下,总会有一根行线电瓶被拉至低电平从而使行线不全为1。

判断键盘中哪一个按键被按下通常是通过将列线逐列至低电平后,检查行输入状态来实现的。

方法是:依次给列线送低电平,然后检查所有行线状态,如果全为1,则所按下的按键不在此列;如果不全为1,则所按下的按键必在此列,而且是在与零电平行线相交的交点上的那个按键。

图3 矩阵按键电路LCD显示设计显示电路是为了给使用者以提示而设置的,显示部分由液晶显示器LCD1602(如图4所示)取代普通的数码管完成。

P0口作为数据传输口、、分别连接RS、RW、E。

开锁时,按下键盘上的开锁按键后,利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。

当密码输入完成时,如果输入的密码正确的话, LCD显示“open the dore!”。

如果密码不正确,LCD显示屏会显示“Wrong password!”,同时红灯亮起。

通过LCD显示屏,可以清楚地判断出密码锁所处的状态。

图4 LCD显示屏步进电机模块设计步进电机是一种将电脉冲转化为角位移的执行机构。

通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度步进角。

您可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。

当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。

每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。

当通电状态的改变完成一个循环时,转子转过一个齿距。

四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A...),双(双相绕组通电)四拍(AB-BC-?CD-DA-AB-...),八拍(A-AB-B-BC-C-CD-D-DA-A...)。

如图4所示。

由ULN2003来控制,ULN2003的1、2、3、4引脚分别连接、、、口。

图5 步进电机模块密码修改设计AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,具有工作电压宽(~)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。

下面是它的电路图。

图5中AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。

在AT89C51试验开发板上它们都接地,第8脚和第4脚分别为正、负电源。

第5脚SDA 为串行数据输入/输出,数据通过这条双向I2C 总线串行传送,在AT89C51试验开发板上和单片机的连接。

第6脚SCL 为串行时钟输入线,在AT89C51试验开发板上和单片机的连接。

SDA 和SCL 都需要和正电源间各接一个的电阻上拉。

第7脚需要接地。

通过使用24C02便可以实现对密码的储存于读取进一步实现密码锁的改密码功能。

图6 AT24C02密码比较设计该模块将输入密码字符串与设定密码字符串比较。

如果相同,执行开锁动作并将输入错误次数清零;如果不同,累计错误次数,如果是第三次输入错误,系统锁死并发出声光告警;如果小于三次,显示密码错误信息,返回密码输入环节。

逻辑框图如图6所示。

图7 密码比较流程图 5.软件设计及流程图 系统的软件设计采用汇编语言编码。

设计方法是先用文本编辑器编写源码,然后用软件Keil C51编译,如果没有错误,可连接生成.HEX 格式的文件。

如果有错误则无法连接,但可在生成的.OBJ 文件中找到代码错误的地方,便于修改。

当然也可以直接在Keil 中编码。

生成的HEX 文件是记录文本行的ASCII 文本文件,在HEX 文件中,每一行是一个HEX 记录,由十六进制数组成的机器码或者数据常量。

HEX 文件经常被用于将程序或数据传输存储到ROM 、EPROM ,大多数编程器和模拟器使用HEX 文件。

图8 单片机控制总体电路 图7为单片机控制总体电路,图8软件运行流程图。

图9 软件运行流程图 6.个人体会 通过这次课程设计,让我更加深刻了解课本知识,和以往对知识的疏忽得以补充,在设计过程中遇到一些模糊的操作和专业用语,比如说单片机定时器,以及中断的选择,通过对单片机的操作实现自己设计的功能, 在使用手册时,有的数据很难查出,但是这些问题经过这次设计,都一一得以解决,我相信单片机这本书中还有很多我为搞清楚的问题,但是这次的课程设计给我相当的基础知识,为我以后工作打下了严实的基础。

虽然这次课程是那么短暂的2周时间,我感觉到这些天我的所学胜过我这一学期所学,这次任务原则上是设计,其实就是一次大的作业,是让我对课本知识的巩固和应用,对程序的设计,修改以及调试,使我做事的耐心和仔细程度得以提高。

课程设计是培训学生运用本专业所学的理论知识和专业知识来分析解决实际问题的重要教学环节,是对三年所学知识的复习和巩固。

同样,也促使了同学们的相互探讨,相互学习。

因 此 , 我 们 必 须 认 真 、谨 慎 、踏 实、一步一步 的 完 成 设 计。

如 果 时 间 可 以 重来,我可能会认真的去学习和研究,也可能会自己独立的完成一个项目,我相信无论是谁看到自己做出的成果时心里一定会很兴奋。

模块启动验证密码判断错误次数显示错误并且锁定10秒 发出报警 系统锁死 作出相应 的动作 连续错误次数小于三次 密码正确 密码错误此次设计让我明白了一个很深刻的道理:团队精神固然很重要,但人往往还是要靠自己的努力,自己亲身去经历,这样自己的心里才会踏实,学到的东西才会更多。

参考文献[1] 马建国、孟宪元.电子设计自动化技术基础.机械工业出版社.2004.[2]姜威.实用电子系统设计基础.北京理工大学出版社.2008.[3]张靖武.单片机系统的PROTEUS设计与仿真.电子工业出版社.2007.[4] 孙福成.KEIL C项目教程.西安电子科技大学出版社.2012.[5] 张毅刚.单片机原理及接口技术.人民邮电出版社.2008.8.附录:源程序#include<>#include <>#define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B#define OP_WRITE 0xa0 // 器件地址以及写入操作,0xa1即为1010 0000B#define uint unsigned int#define uchar unsigned char#define KEY P1#define No_key 20#define lcddata P0sbit SDA=P3^5; //将串行数据总线SDA位定义在为引脚sbit SCL=P3^4; //将串行时钟总线SDA位定义在为引脚sbit lcden=P2^2;sbit lcdrs=P2^0;sbit lcdrw=P2^1;sbit light=P2^3;sbit light1=P2^4;sbit deng=P3^7;sbit BEEP= P3^6;uchar j,z,y,j1,j2; //h使用修改后的密码开锁标志位uchar n=0,h=0; //中间标志位用于传递信息保证密码修改过后按复位按键密码修改标志位不改变uchar aa;uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //反转编码uchar code table[] ="Welcome to use!";uchar code table1[]="Open the door! ";uchar code table2[]="Enter Please: ";uchar code table3[]="Close the door!";uchar code table4[]="Wrong password!";uchar code table5[]="Enter new code!";uchar code table6[]="New code finish";uchar code key_table[16]={1,2,3,10,4,5,6,11,7,8,9,12,0,13,14,15};uchar Password[]={1,2,3,4,5,6}; //设置的初始密码uchar save[15];uchar mima[15];uchar conflag; //确认标志uchar lockflag; //键盘锁定标志uchar startflag; //开始标志uchar open; //门打开标志位uchar begain; //开始标志void delay1(uint t);void delay(uint z);void wright_com(uchar com); //写命令函数void wright_data(uchar date); //写数据函数void init(); //初始化函数void display_open(); //显示open the doorvoid display_close(); //显示close the doorvoid display_wrong();void display_newcode(); //显示输入新密码void display_codefinish(); // 显示新密码成功void delete(); //删除输入的最后一个数uchar keyscan(); //带返回值的键盘扫描程序void enter_code(uchar t); //void enter_code1(uchar t);void enter_code2(uchar t);void confirm(); //确认密码对不对,把输入的数据与密码逐一对比void confirm1();void succeed_an(); //密码正确时的响应void fail_an(); //密码失败时的响应void alarm(); //发出警报声void reset(); //复位函数void reset_save();void display_enter(); //显示输入void motor_ffw();void motor_rev();/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){uchar i,n;for(i=0;i<10;i++)for(n=0;n<33;n++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delaynms(uint n){uchar i;for(i=0;i<n;i++)delay1ms();}void start() // 开始位{SDA = 1; //SDA初始化为高电平“1”SCL = 1; //开始数据传送时,要求SCL为高电平“1”_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA = 0; //SDA的下降沿被认为是开始信号_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)}void stop() // 停止位{SDA = 0; //SDA初始化为低电平“0”_nSCL = 1; //结束数据传送时,要求SCL为高电平“1”_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA = 1; //SDA的上升沿被认为是结束信号_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA=0;SCL=0;}//**********从AT24Cxx读取数据********unsigned char ReadData()// 从AT24Cxx移入数据到MCU{unsigned char i;unsigned char x; //储存从AT24Cxx中读出的数据for(i = 0; i < 8; i++){SCL = 1; //SCL置为高电平x<<=1; //将x中的各二进位向左移一位x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存入x中SCL = 0; //在SCL的下降沿读出数据}return(x); //将读取的数据返回}//*******函数功能:向AT24Cxx的当前地址写入数据********//在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0bit WriteCurrent(unsigned char y){unsigned char i;bit ack_bit; //储存应答位for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(y&0x80); //通过按位“与”运算将最高位数据送到S//因为传送时高位在前,低位在后_nop_(); //等待一个机器周期SCL = 1; //在SCL的上升沿将数据写入AT24Cxx_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 0; //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲y <<= 1; //将y中的各二进位向左移一位}SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA 线,//以让SDA线转由接收设备(AT24Cxx)控制_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 1; //根据上述规定,SCL应为高电平_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节//若送高电平,表示没有接收到,传送异常SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)return ack_bit; // 返回AT24Cxx应答位}//***************向AT24Cxx中的指定地址写入数据*****************)void WriteSet(unsigned char add, unsigned char dat)// 在指定地址addr处写入数据WriteCurrent{start(); //开始数据传递WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要对其写入数据WriteCurrent(add); //写入指定地址WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据stop(); //停止数据传递delaynms(4); //1个字节的写入周期为1ms, 最好延时1ms以上}unsigned char ReadCurrent() //从AT24Cxx中的当前地址读取数据{unsigned char x;start(); //开始数据传递WriteCurrent(OP_READ); //选择要操作的AT24Cxx芯片,并告知要读其数据x=ReadData(); //将读取的数据存入xstop(); //停止数据传递return x; //返回读取的数据}unsigned char ReadSet(unsigned char set_addr) //从AT24Cxx中的指定地址读取数据{start(); //开始数据传递WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要对其写入数据WriteCurrent(set_addr); //写入指定地址return(ReadCurrent()); //从指定地址读出数据并返回}void gaimima() //****改密码程序****{uchar temp,i;SDA=1;SCL=1;if(z==1){while(1){temp=keyscan();enter_code(temp);if(temp==13){for(i=0;i<6;i++){WriteSet(i,save[i]);delaynms(10);}for(i=0;i<6;i++){mima[i]=ReadSet(i);delaynms(10);}display_codefinish();reset_save();break;}if(temp==14){delete();}}}}void main(void){uchar temp;y=0;open=1; //open门开关标志位 1为关闭 0为打开while(1){init();if(h==1){deng=0;}while(1){begain=0;if(lockflag){temp=keyscan(); //按键期间也要进行键盘扫描if(temp!=No_key) //重新计时三秒{aa=0; //重新在定时器中计数}}else{temp=keyscan(); //反复扫描输入,等待随时输入if(temp!=No_key) //有按键按下才能进行下一步{if(temp==10&&open==1){reset();startflag=1; //开始标志位}if(startflag){if(h==0) //更改密码前的密码确认{enter_code(temp); //每扫描一次键盘就要进行一次处理保存输入的数值if(temp==13&&open==1) //按下确认键进行密码确认{confirm(); //进行确认判断if(conflag){succeed_an(); //密码正确作出相应的反应open=0;z=1;reset_save();}else{fail_an(); //密码错误作出相应的反应}}}else //更改密码后的密码确认{enter_code(temp); //每扫描一次键盘就要进行一次处理保存输入的数值if(temp==13&&open==1) //按下确认键进行密码确认{confirm1(); //进行确认判断if(conflag){succeed_an(); //密码正确作出相应的反应open=0;z=1;}else{fail_an(); //密码错误作出相应的反应}}}if(temp==14){delete();}if(temp==12&&z==1){reset();display_newcode();gaimima();h=1; // 改密码成功标志位用于以后选择密码对比}if(temp==15&&z==1){uchar r;open=1;display_close();for(r=0;r<18;r++){motor_rev(); //电机反转}}}}}if(temp==11&&begain==0&&open==1){begain=1;break;}}}}void motor_rev() //电机反转函数{uchar i;uint j;z=0;for (j=0; j<8; j++) //转1×n圈{for (i=0; i<8; i++) //一个周期转45度{P3 = REV[i]; //取数据delay1(2); //调节转速}}}void motor_ffw() //电机转动函数{uchar i;uint j;for (j=0; j<8; j++) //转1*n圈{for (i=0; i<8; i++) //一个周期转45度{P3 = FFW[i]; //取数据delay1(2); //调节转速}}}void display_enter() //显示enter{uchar num;wright_com(0x80);for(num=0;num<15;num++){wright_data(table2[num]);}}void display_close() //显示close{uchar num;wright_com(0x80);for(num=0;num<15;num++){wright_data(table3[num]);}}void display_open() //显示open{uchar num;wright_com(0x80);for(num=0;num<15;num++){wright_data(table1[num]);}}void display_wrong() //显示wrong{uchar num;wright_com(0x80);for(num=0;num<15;num++){wright_data(table4[num]);}}void display_newcode() //显示输入新密码{uchar num;wright_com(0x80);for(num=0;num<15;num++){wright_data(table5[num]);}}void display_codefinish() //显示新密码完成{uchar num;wright_com(0x80);for(num=0;num<15;num++){wright_data(table6[num]);}}void delete() //删除最后一个{wright_com(0x80+0x40+j-1); //确定删除对象wright_data(' '); //显示空格即为删除save[--j]=0; //删除后数据清零wright_com(0x80+0x40+j); //为下次输入数据时写好位置}void reset() //复位函数{uchar num;display_enter();wright_com(0x80+0x40); //擦除屏幕上的显示for(num=0;num<15;num++){save[num]=0; //对输入的数值进行清零wright_data(' ');}wright_com(0x80+0x40);lockflag=0;conflag=0;j=0;}void reset_save(){uchar num;wright_com(0x80+0x40); //擦除屏幕上的显示for(num=0;num<15;num++){save[num]=0; //对输入的数值进行清零wright_data(' ');}wright_com(0x80+0x40);}void succeed_an() //输入密码正确进行响应的函数{uchar r;light=0;display_open();for(r=0;r<18;r++){motor_ffw(); //电机正转}delay(1000);light=1;}void fail_an() //输入密码错误进行响应的函数{uchar j,i=0;while(1){light1=0;display_wrong();for(j=3000;j>0;j--) //蜂鸣器响大约500MS{BEEP = ~BEEP;delay(1); //延时500US 发出大约1KHZ频率的响声}BEEP=1; //蜂鸣器不响delay(500);light1=1;break;}y++;if(y==3){while(1){light1=0;display_wrong();for(j=3000;j>0;j--) //蜂鸣器响大约500MS{BEEP = ~BEEP;delay(1); //延时500US 发出大约1KHZ频率的响声}BEEP=1; //蜂鸣器不响delay(500);light1=1;i++;if(i==4){break;}}lockflag=1;}}void enter_code(uchar t) //输入密码并在屏幕上显示星号{if(t>=0&&t<10){if(j==0){wright_com(0x80+0x40);wright_data('*');}else{wright_data('*');}save[j++]=t;}}void confirm() //校对密码以确定是否正确函数{uchar k;for(k=0;k<6;k++){if(Password[k]!=save[k]){break;}}if(k==6){conflag=1;}}void confirm1() //校对密码以确定是否正确函数{uchar k;for(k=0;k<6;k++){if(save[k]!=mima[k]){break;}}if(k==6){conflag=1;}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(lockflag){y=0;aa++;light1=0;if(aa>=200){aa=0;light1=1;lockflag=0;}}}void init() //初始化{uchar num;open=1;TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1;TR0=1;lcdrw=0;lcden=0;wright_com(0x38);wright_com(0x0c);wright_com(0x01);wright_com(0x80);for(num=0;num<15;num++){wright_data(table[num]);delay(1);}}void wright_com(uchar com) //1602写入指令{lcdrs=0;lcddata=com;delay(1);lcden=1;delay(1);lcden=0;}void wright_data(uchar date) //1602写入数据{lcdrs=1;lcddata=date;delay(1);lcden=1;delay(1);lcden=0;}void delay1(uint t){uint k;while(t--){for(k=0; k<125; k++){ }}}void delay(uint z){uint y;for(;z>0;z--)for(y=110;y>0;y--);}uchar keyscan() //4*4按键扫描函数{uchar temp,num=No_key;//第一行KEY=0xfe;temp=KEY;temp=temp&0xf0; //读出高四位while(temp!=0xf0){delay(10);temp=KEY;temp=temp&0xf0;while(temp!=0xf0){temp=KEY;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=10;break;}while(temp!=0xf0) //等待松手{temp=KEY;temp=temp&0xf0;}}}//第二行KEY=0xfd;temp=KEY;temp=temp&0xf0; //读出高四位while(temp!=0xf0){delay(10);temp=KEY;temp=temp&0xf0;while(temp!=0xf0){temp=KEY;switch(temp){case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:num=6;break;case 0x7d:num=11;break;}while(temp!=0xf0) //等待松手{temp=KEY;temp=temp&0xf0;}}}//第三行KEY=0xfb;temp=KEY;temp=temp&0xf0; //读出高四位while(temp!=0xf0){delay(10);temp=KEY;temp=temp&0xf0;while(temp!=0xf0){temp=KEY;switch(temp){case 0xeb:num=7;break;case 0xdb:num=8;break;case 0xbb:num=9;break;case 0x7b:num=12;break;}while(temp!=0xf0) //等待松手{temp=KEY;temp=temp&0xf0;}}}//第四行KEY=0xf7;temp=KEY;temp=temp&0xf0; //读出高四位while(temp!=0xf0){delay(10);temp=KEY;temp=temp&0xf0;while(temp!=0xf0){temp=KEY;switch(temp){case 0xe7:num=0;break;case 0xd7:num=13;break;case 0xb7:num=14;break;case 0x77:num=15;break;}while(temp!=0xf0) //等待松手{temp=KEY;temp=temp&0xf0;}}}return num;}。

相关文档
最新文档