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

合集下载

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

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

.专业:电子信息工程一、设计内容:数字密码锁二、设计要求:(一)基本要求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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  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;}。

相关文档
最新文档