电子密码锁

更新时间:2024-04-22 06:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机原理与应用技术 课程设计报告(论文)

基于单片机控制的电子密码锁

专业班级:_ _ ___ 姓 名:___ _ _ ___ __ _ 时 间: _ _ 指导教师:__ _

2012年4月20 日

目录

摘要 ....................................................... 2 关键词: ................................................... 2 1 引言 ..................................................... 2 2 总体设计方案 ............................................. 2 2.1 设计思路方案确立 ..................................... 2 2.2 设计方框图 ........................................... 3 3 设计原理分析 ............................................. 3 3.1 AT89S51性能简介 ..................................... 3 3.2 存储芯片AT24C02 ..................................... 4 3.3 8位双向数据总线收/发器(缓冲器)74LS245 ............. 5 3.4 电路总体构成 ........................................ 6 3.5 复位部位 ............................................ 6 3.6 晶振部分 ............................................ 7 3.7 主模块流程图 ........................................ 8 3.8 键盘模块流程图 ...................................... 9 3.9 密码修改流程图 ..................................... 10 3.10 密码判断流程图 .................................... 11 结束语 .................................................... 12 参考文献 .................................................. 12 附录:总程序 ............................................... 13

1

基于单片机控制的电子密码锁

摘要:本系统由单片机系统、矩阵键盘、数码管显示、密码存储、复位电路、晶振电路、开锁部分和报警系统组成。系统能完成开锁、超时报警、修改用户密码基本的密码锁的功能。矩阵键盘主要判断键盘上有无键按下、去抖动影响、逐列扫描键盘以确定被按键的位置号即行列号、形成键值并将键值存入指定的数据缓冲区中、判断闭合的键是否释放等功能。密码修改部分要求密码要输入两次,程序将两次输入的密码比较一致时,即用此密码代替原先的密码,如果两次输入的密码不一致,则重复操作。这样就避免了修改密码的随机性。自动报警部分是三次输入的密码不一致就会发生报警信息,这样能有效的避免一些不法分子的行为,保护自身的利益。 关键词:电子密码、单片机、矩阵键盘、数码管、24C02

1 引言

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

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

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

3) 误码输入保护,当输入密码多次错误时,报警系统自动启动。 4) 无活动零件,不会磨损,寿命长。

5) 使用灵活性好,不像机械锁必须佩带钥匙才能开锁。 6) 电子密码锁操作简单易行,一学即会。

本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。密码可以由用户自己修改设定,锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。

2 总体设计方案

2.1 设计思路方案确立

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

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

2

密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示作用。当用户需要开锁时,先按键盘开锁键之后按键盘的数字键0-9输入密码。密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后输入原来的密码,只有当输入的原密码正确后才能设置新密码。新密码输入无误后按确认键使新密码将得到存储,密码修改成功。

2.2 设计方框图

矩阵键盘控制

密码存储电路 复位电路

报警电路

开锁电路

晶振电路

显示电路 AT89S51 单片机 图2.2 总体设计框图

3 设计原理分析

主控芯片AT89S51

AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。 3.1 AT89S51性能简介

AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。 此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

3

图3-1 AT89S51 芯片引脚图

其主要功能特性:

兼容MCS-51指令系统 4k可反复擦写(>1000次)ISP Flash ROM 32个双向I/O口 4.5-5.5V工作电压 2个16位可编程定时/计数器 时钟频率0-33MHz 全双工UART串行中断口线 128x8 bit内部RAM 2个外部中断源 低功耗空闲和省电模式 中断唤醒省电模式 3级加密位

看门狗(WDT)电路 软件设置空闲和省电功能 3.2 存储芯片AT24C02

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

SOIC PDIP

图3-2 AT24C02的两种引脚图

4

图3-3 AT24C02的电路接线图

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

24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。

3.3 8位双向数据总线收/发器(缓冲器)74LS245

74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。74LS245还具有双向三态功能,既可以输出,也可以输入数据。当89C51单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。当片选端/CE低电平有效时,DIR=“0”,信号由 B 向 A 传输;(接收)DIR=“1”,信号由 A 向 B 传输;(发送)当CE为高电平时,A、B均为高阻态。由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。P0口与74LS245输入端相连,E端接地,保证数据线畅通。89C51的/RD和/PSEN相与后接DIR,使得RD且PSEN有效时,74LS245输入(P0.1←D1),其它时间处于输出(P0.1→D1)。

图3-4 74LS245的引脚图图

5

3.5 复位部位

3.4 电路总体构成

图4-2 电路原理图

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。地址锁存信号ALE也为高电平。

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

根据实际情况选择如图4-6所示的复位电路。该电路在最简单的复位电路下增加了手动复位按

6

键,在接通电源瞬间,电容C1上的电压很小,复位下拉电阻RST上的电压接近电源电压,即RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电压小于某一数值后,CPU脱离复位状态,由于电容C1足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。增加手动复位按键是为了避免死机时无法可靠复位。当复位按键按下后电容C1通过R5放电。当电容C1放电结束后,RST端的电位由R5与R6分压比决定。由于R5<

图4-6 复位电路原理图

3.6 晶振部分

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

图4-7 晶振电路原理图

7

3.7 主模块流程图

该模块的功能包括定时器及数据缓冲区初始化、本机初始密码设置、及键盘扫描模块,密码比较和设置模块调用等功能。

图3.1 主模块流程图

8

3.8 键盘模块流程图

该模块具备判断键盘上有无键按下、去抖动影响、逐列扫描键盘以确定被按键的位置号即行列号、形成键值并将键值存入指定的数据缓冲区中、判断闭合的键是否释放等功能。

键功能子程序Y键值=“0--9”N键值=“开锁”N键值=“清除”N键值=“设置”N密码输入程序Y开锁程序Y清除程序Y设置程序键值=“确认”N子程序返回Y确认程序

图3.2 键盘模块流程图

9

3.9 密码修改流程图

该模块的功能是修改设置密码。密码修改程序要求先输入源密码,只有输入正确的情况才能修改密码,而且要求输入两次密码,程序将两次输入的密码比较一致时,才能用刚输入的密码代替原先的密码,如果两次输入的密码不一致,则修改密码不成功。这样就避免了修改密码的随机性。

设置程序 初始化 按下设置键 输旧密码 确认程序 N 所输入旧密码正确? Y 输新密码 Y 确认程序 再次输新密码 确认程序 N 两次新密码输入相同? Y 设置成功 报警程序 返回 次数>3? 输入次数加1 N

图3.3 密码修改流程图

10

3.10 密码判断流程图

该模块的功能是将键盘输入的密码与设定的密码进行比较,如果密码正确则开锁;若不正确,则密码输入次数计数单元计数如达不到3次,返回键盘扫描模块;若计数已达3次,则调用自动报警模块。

开锁程序 初始化 按开锁键 输入密码 确认程序 N 所输入密码正确? N Y Y 报警程序 次数>3? 输入次数加1 开锁成功

图3.4 密码判断流程图

返回

11

结束语

在大学学习的这段期间内,知识是通过一门门独立的课程传授给我们的。而实际问题能够顺利的得到解决,不但需要多方面的知识,而且还需要对这些知识综合地加以运用。所以此次毕业设计既是学习的过程,也是实践的过程,不仅对所学的知识加以了巩固和延伸。也让我学会慎密、全面的考虑问题,抓住主要矛盾加以解决的思维方法和围绕问题多方设法以求得解决的顽强意志。

大学生活使我从一个懵懂无知的少年变成了可以勇敢面对人生的强者,无论是在思想上还是在专业课的学习上,电子电气系的老师和同学们给予了我极大的帮助,在这里我要对老师们无私的关怀和帮助表示衷心的感谢!对帮助过我的同学们表示真挚的感谢!

参考文献

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

[2] 祖龙起,刘仁杰.一种新型可编程密码锁[J].大连轻工业学院学报,2002,(01); [3] 叶启明.单片机制作的新型安全密码锁[J].家庭电子,2005,(10);

[4] 郭海英.基于单片机的电子安全密码锁的设计[M].现代电子技术,2005,(13); [5] 李明喜.新型电子密码锁的设计[J].机电产品开发与创新,2004,(03); [6] 董继成.一种新型安全的单片机密码锁[J].电子技术,2004,(03); [7] 祖龙起,刘仁杰,孙乃凌.一种新颖的电子密码锁[J].电子世界,2001,(10); [8] 李明喜.新型电子密码锁的设计[J].机电产品开发与创新,2004,(03); [9] 杨茂涛.一种电子密码锁的实现[J].福建电脑,2004,(08); [10] 瞿贵荣.实用电子密码锁[J].家庭电子,2000,(07); [11] ATmega.ATmega8L-8AC,2006,(01);

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

[13] 王千.实用电子电路大全[M],电子工业出版社,2001,p101; [14] 何立民.单片机应用技术选编[M],北京:北京航空大学出版社,1998; [15] 李华.MCS-51系列单片机使用接口技术[M],北京航空航天大学出版社,1993; [16] 彭为.单片机典型系统设计实例精讲[M],北京:电子工业出版社,2006; [17] 潘永雄.新编单片机原理与应用[M],西安:西安电子科技大学出版社,2003; [18] 童诗白,华成英,模拟电子技术基础[M],北京:高等教育出版社,2000;

12

附录:总程序

KEY_CNT EQU 53H ;输入密码个数 KEY_ALL EQU 54H ;输入密码总次数 CUOWU EQU 55H ;输入密码错误次数 JIAN EQU 56H

SLA DATA 50H ;器件地址字 SUBA DATA 51H ;器件子地址

NUMBYTE DATA 52H ;读/写字节数 SDA BIT P3.7

SCL BIT P3.6 ;I2C总线定义

MTD EQU 30H ;发送数据缓存区首地址(30H-3FH) MRD EQU 40H ;接收数据缓存区首地址(40H-4FH) ;************************************* ORG 00H AJMP START1 ORG 0060H

START1: MOV 30H,#02H MOV 31H,#03H MOV 32H,#04H MOV 33H,#05H MOV 34H,#06H MOV 35H,#07H ACALL XOFF

;************************************* A0: MOV CUOWU,#00H A2: MOV KEY_CNT,#00H A1: LCALL JIANZHI JZ A1

;*********************************************************** ;判断键值功能

;以下为按键处理程序,对不同的按键作出响应

;*********************************************************** CJNE A,#0BH,J1 ;是否为清除键 MOV R1,KEY_CNT CJNE R1,#00H,J2 LCALL MUSIC AJMP A0

J2: LCALL JIANF ;清除一位密码 DEC KEY_CNT LCALL XIANSHI AJMP A1

J1: CJNE A,#0AH,J3 ;判断是否是未定义的键 LCALL MUSIC

13

J3: J4: J5: J6: L: J9: J8: MOV P2,#0C0H AJMP A0

CJNE A,#0DH,J4 LCALL MUSIC MOV P2,#0C0H AJMP A0

CJNE A,#0EH,J5 ;判断是否为返回键 LCALL MUSIC AJMP L

CJNE A,#0CH,J6 ;判断是否要改密码 MOV P2,#0C0H LJMP GAIMI

CJNE A,#0FH,J7 ;判断是否为确认键 MOV R1,KEY_CNT

CJNE R1,#06H,J8 ;判断输入密码位数是否正确 MOV A,30H ;比较密码 CJNE A,#2,J9 MOV A,31H CJNE A,#3,J9 MOV A,32H CJNE A,#4,J9 MOV A,33H CJNE A,#5,J9 MOV A,34H CJNE A,#6,J9 MOV A,35H CJNE A,#7,J9 CLR P3.0 ;密码正确,LED灯亮 LCALL X888 INC KEY_ALL LCALL DELAY ;灯亮一会 LCALL DELAY ;灯亮一会 LCALL DELAY ;灯亮一会 SETB P3.0 LCALL XOFF LJMP A0

LCALL MUSIC ;密码输错 INC CUOWU

MOV A,CUOWU CJNE A,#03H,T LCALL MUSIC1

LJMP SUODING ;连续三次错误锁定 LCALL MUSIC ;密码位数错误 LJMP A0

14

J7: INC KEY_CNT ;按下数字键,输入密码 MOV A,KEY_CNT CJNE A,#07H,K1 ;输入密码 INC CUOWU MOV A,CUOWU CJNE A,#03H,T ;连续三次错误锁定 LCALL MUSIC1 LJMP SUODING K1: LCALL JIAF LCALL XIANSHI LJMP A1 T: ACALL XOFF LJMP A2 S: LJMP A0

;******************************************************************** ;显示子程序

;******************************************************************** XOFF: MOV R7,#0FFH MOV P0,#0C0H MOV P2,#06H ACALL DELAY5MS MOV P2,#08EH MOV P0,#01H ACALL DELAY5MS RET

X888: MOV P2,#080H MOV P0,#00H ACALL DLY_S RET

X666: MOV P2,#082H MOV P0,#00H ACALL DLY_S RET

;显示总共输入密码个数

XIANSHI:MOV DPTR,#TABLE MOV A,KEY_CNT MOVC A,@A+DPTR MOV P2,A MOV P0,#06H RET

TABLE: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH ;显示总共输密码正确次数

;********************************************************************

15

;键盘扫描程序,计算键值存入JIAN

;******************************************************************** JIANZHI:NOP

L1: MOV R3,#0F7H ;键盘行扫描的初值(扫描第一行,也就是P2.3口的一行) MOV R1,#00H ;TABLE2的取码指针 L2: MOV A,R3 MOV P1,A MOV A,P1 MOV R4,A SETB C ;C=1 MOV R5,#04H ;列扫描数 L3: RLC A JNC KEYIN ;C=0表示有按键(列扫描)(第一次扫描到的是P2.7口的一列,结合P2.3口第一行。就是二进制0000全不亮) INC R1 DJNZ R5,L3 ;4个扫描完毕 MOV A,R3 ;扫描下一个 SETB C ;使右移时,移入\ RRC A MOV R3,A JC L2 ;4个行扫描完毕否 JMP L1

KEYIN: MOV R7,#10 ;消除抖动10毫秒(晶振为1MHZ) D2: MOV R6,#248 DJNZ R6,$ DJNZ R7,D2 D3: MOV A,P1 ;读入的键盘值是否与R4相等 XRL A,R4 JZ D3 ;按键松开否 MOV A,R1 MOV DPTR,#TABLE2 MOVC A,@A+DPTR ;取键值 MOV JIAN,A RET

TABLE2: DB 0CH,0DH,0EH,0FH,08H,09H,0AH,0BH DB 04H,05H,06H,07H,00H,01H,02H,03H

;******************************************************************* ;蜂鸣器输出声响子程序

;******************************************************************** MUSIC: MOV R5,#060H ;控制音长 MIC: CPL P3.1 ACALL DELAY5MS ;控制音调 DJNZ R5,MIC

16

RET MUSIC1: ACALL MUSIC LCALL MUSIC LCALL MUSIC LCALL MUSIC LCALL MUSIC LCALL MUSIC RET

;******************************************************************** ;延时子程序

;******************************************************************** DELAY5MS: MOV R7,#3H DELAY0: MOV R6,#40H DELAY1: DJNZ R6,DELAY1 DJNZ R7,DELAY0 RET

DLY_S: MOV R7,#02H DL: MOV R6,#0FFH DL1: DJNZ R6,DL1 DJNZ R7,DL RET

DELAY: ;误差 0us MOV R7,#0A7H

DL11: MOV R6,#0ABH DL0: MOV R5,#10H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL11 NOP RET

;******************************************************************* ;密码清除和输入

;******************************************************************* ;清除密码

JIANF: MOV A,34H MOV 35H,A MOV A,33H MOV 34H,A MOV A,32H MOV 33H,A MOV A,31H MOV 32H,A MOV A,30H

17

MOV 31H,A MOV 30H,#00H RET ;输入密码

JIAF: MOV A,31H MOV 30H,A MOV A,32H MOV 31H,A MOV A,33H MOV 32H,A MOV A,34H MOV 33H,A MOV A,35H MOV 34H,A MOV 35H,JIAN RET

;*********************************************************** ;锁定,输入管理员指令才有效

;*********************************************************** SUODING:MOV KEY_CNT,#00H LCALL X666 SUODIN: LCALL MUSIC G: LCALL JIANZHI JZ G CJNE A,#0CH,Q3 LJMP SUODING Q3: CJNE A,#0AH,Q1 ;判断按键 LJMP SUODING Q1: CJNE A,#0EH,Q2 LJMP SUODING Q2: CJNE A,#0DH,Q4 LJMP SUODING Q4: CJNE A,#0BH,Q5 ;是否是清除键 INC KEY_CNT MOV R1,KEY_CNT CJNE R1,#00H,Q6 LJMP SUODING Q6: ACALL JIANF DEC KEY_CNT ACALL XIANSHI LJMP SUODIN

Q5: CJNE A,#0FH,Q7 ;是否是确认键 MOV R1,KEY_CNT CJNE R1,#06H,SUODING

18

MOV A,30H ;比较密码 CJNE A,#06H,SUODING MOV A,31H CJNE A,#05H,SUODING MOV A,32H CJNE A,#04H,SUODING MOV A,33H CJNE A,#03H,SUODING MOV A,34H CJNE A,#02H,SUODING MOV A,35H CJNE A,#01H,SUODING LJMP START1 Q7: INC KEY_CNT ;按下数字键,输入密码 MOV A,KEY_CNT CJNE A,#07H,K2 ;输入密码 LJMP SUODING K2: LCALL JIAF ACALL XIANSHI LJMP SUODIN

;******************************************************************** ;改密码程序

;******************************************************************** GAIMI:

;******************************************************************* ;名称:IWRNBYTE

;描述:向器件指定子地址写N个数据

;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE ;******************************************************************** IWRNBYTE:

MOV R3,NUMBYTE

LCALL START ;启动总线 MOV A,SLA

LCALL WRBYTE ;发送器件地址字 LCALL CACK

JNB ACK,RETWRN ;无应答则退出 MOV A,SUBA ;指定子地址 LCALL WRBYTE LCALL CACK MOV R1,#MTD WRDA: MOV A,@R1

LCALL WRBYTE ;开始写入数据 LCALL CACK

JNB ACK,IWRNBYTE

19

INC R1

DJNZ R3,WRDA ;判断是否写完 RETWRN: LCALL STOP RET

;******************************************************************** ;名称:IRDNBYTE

;描述:从器件指定子地址读取N个数据

;入口参数:器件地址字SLA,子地址SUBA,接收数据缓存区MRD,接收字节数NUMBYTE ;******************************************************************** IRDNBYTE:

MOV R3,NUMBYTE LCALL START MOV A,SLA

LCALL WRBYTE ;发送器件地址字 LCALL CACK

JNB ACK,RETRDN

MOV A,SUBA ;指定子地址 LCALL WRBYTE LCALL CACK

LCALL START ;重新启动总线 MOV A,SLA

INC A ;准备进行读操作 LCALL WRBYTE LCALL CACK

JNB ACK,IRDNBYTE MOV R1,#MRD

RON1: LCALL RDBYTE ;读操作开始 MOV @R1,A DJNZ R3,SACK

LCALL MNACK ;最后一字节发非应答位 RETRDN: LCALL STOP RET

SACK: LCALL MACK INC R1 SJMP RON1

;******************************************************************** ;名称:STRRT

;描述:启动I2C总线子程序—发送I2C总线起始条件

;******************************************************************** START: SETB SDA ;发送起始条件数据信号 NOP ;起始条件建立时间大于4.7us SETB SCL ;发送起始条件的时钟信号 NOP NOP

20

NOP NOP

NOP ;起始条件锁定时间大于4.7us CLR SDA ;发送起始信号 NOP NOP NOP

NOP ;起始条件锁定时间大于4.7us

CLR SCL ;钳住I2C总线,准备发送或接收数据 NOP RET

;******************************************************************** ;名称:STOP

;描述:停止I2C总线子程序—发送I2C总线停止条件

;******************************************************************** STOP: CLR SDA ;发送停止条件的数据信号 NOP NOP

SETB SCL ;发送停止条件的时钟信号 NOP NOP NOP NOP

NOP ;起始条件建立时间大于4.7us SETB SDA ;发送I2C总线停止信号 NOP NOP NOP NOP

NOP ;延迟时间大于4.7us RET

;******************************************************************** ;名称:MACK

;描述:发送应答信号子程序

;******************************************************************** MACK: CLR SDA ;将SDA置0 NOP NOP

SETB SCL NOP NOP NOP NOP

NOP ;保持数据时间,大于4.7us

21

CLR SCL NOP NOP RET

;******************************************************************** ;名称:MNACK

;描述:发送非应答信号子程序

;******************************************************************** MNACK: SETB SDA ;将SDA置1 NOP NOP

SETB SCL NOP NOP NOP NOP NOP

CLR SCL ;保持数据时间,大于4.7us NOP NOP RET

;******************************************************************** ;名称:CACK

;描述:检查应答位子程序,返回值:ACK=1时表示有应答

;******************************************************************** CACK: SETB SDA NOP NOP

SETB SCL CLR ACK NOP NOP

MOV C,SDA JC CEND

SETB ACK ;判断应答位 CEND: NOP CLR SCL NOP RET

;******************************************************************** ;名称:WRBYTE

;描述:发送字节子程序,字节数据放入ACC

;******************************************************************** WRBYTE: MOV R0,#08H

22

WLP: RLC A ;取数据位 JC WRI

SJMP WRO ;判断数据位 WLP1: DJNZ R0,WLP NOP RET

WRI: SETB SDA ;发送1 NOP

SETB SCL NOP NOP NOP NOP NOP

CLR SCL SJMP WLP1

WRO: CLR SDA ;发送0 NOP

SETB SCL NOP NOP NOP NOP NOP

CLR SCL SJMP WLP1

;******************************************************************** ;名称:RDBYTE

;描述:读取字节子程序,读出的数据存放在ACC

;******************************************************************** RDBYTE: MOV R0,#08H RLP: SETB SDA NOP

SETB SCL ;时钟线为高,接收数据位 NOP NOP

MOV C,SDA ;读取数据位 MOV A,R2

CLR SCL ;将SCL拉低,时间大于4.7us RLC A ;进行数据位的处理 MOV R2,A NOP NOP NOP

23

DJNZ R0,RLP ;未够8位,继续读入 RET

;向24C01C中写数据,数据存放在24C01C中30H开始的16个字节中 XIE: MOV SLA,#0A0H ;24C01C地址字,写操作 MOV SUBA,#30H ;目标地址 MOV NUMBYTE,#16;字节数 LCALL IWRNBYTE ;写数据 RET

;从24C01C中读数据,数据送AT89C51中40H开始的16个字节中 DU: MOV SLA,#0A0H ;24C01C地址字,伪写入操作 MOV SUBA,#30H ;目标地址 MOV NUMBYTE,#16 ;字节数 LCALL IRDNBYTE ;写数据 RET END

24

本文来源:https://www.bwwdw.com/article/unwp.html

Top