基于51单片机电子密码锁设计.doc
摘要自从人类开始制造锁以来长期所使用的锁都是机械锁,通俗的讲就是弹子芯锁。而传统的弹子芯锁,由于其本身锁芯密齿的有限加之开锁工具钥匙的容易复制性,使得其安全性大大降低,随着人们生活质量的提高,如何实现安全有效的防盗这一问题受到越来越多人的关注。传统的机械锁由于安全性能太差,被撬的事件屡见不鲜,相比之下,电子密码锁因其保密性强,使用灵活性好,安全系数高,受到了广大用户的欢迎。电子密码锁作为一种新型的锁,不仅拥有海量的密齿,通常从10000到10000000不等,还省去了传统机械锁的钥匙,使用者只要记得其密码,便可以开启,从而大大提高了防盗功能,本文主要设计了一种以单片机89C51为核心的电子密码锁,详细的介绍了该电子密码锁完整的设计过程以及外围的开锁电路和报警电路的设计。电子密码锁主要由三部分组成:键盘接口电路、电子密码锁的控制电路、输出八段显示电路。键盘接口电路包括时序产生电路、键盘扫描电路、弹抖消除电路、键盘译码电路。电子密码锁控制电路设计包括数字按键的数字输入、存储和清除、功能按键的功能设计、移位寄存器的设计和控制、密码清除、变更、存储、报警信号产生电路密码核对、解除电锁电路。输出八段显示电路包括数据选择电路、八段显示器扫描电路。关键词:电子密码锁,89C51,键盘接口,输出八段显示Abstract Ever since mankind started making locks since locks are used in long-term mechanical lock, the popular talk is marbles core lock. The traditional marbles core lock cylinder due to its own limited addition fine-toothed tool for unlocking the key to easy reproduction, so their safety is greatly reduced, as people improve the quality of life, how to achieve safe and effective anti-theft problem by growing concern. Because traditional mechanical locks poor safety performance, was a common occurrence pry contrast, electronic locks for its confidentiality, use good flexibility, high safety factor, the majority of users. Electronic code lock as a new type of lock, not only has a mass of fine-toothed, usually ranging from 10,000 to 10,000,000, also eliminates the traditional mechanical key to the lock, the user just remember their password, they can open, thus greatly improving anti-theft feature, this paper designed a 89C51 microcontroller core with an electronic lock, a detailed description of the complete electronic locks to unlock the design process and the external circuit and alarm circuit. Electronic code lock consists of three parts: the keyboard interface circuit, electronic lock control circuit, the output Ba Duan display circuit. Keyboard interface circuit including the timing generating circuit, the keyboard scanning circuit, bounce elimination circuit, the keyboard decoder circuit. Electronic code lock control circuit design, including digital key digital input, storage and clean, functional design of function keys, shift register design and control, password remove, change, to step down, storage, alarm signal generating circuit password check, the lifting power locks circuit. Ba Duan display circuit including the output data selection circuit, eight out display scanning circuit. Keywords: electronic code lock, 89C51, keyboard interface, the output shows eight out目录第一章 绪 论41.1几种常见的密码锁41.2研究背景41.3国内外研究现状和发展趋势51.4本文研究的主要内容5第二章 方案论证62.1方案62.2功能设计及其设计思路7第三章 电路的功能单元设计73.1 AT89C51单片机介绍73.1.1AT89C51芯片简介73.1.2 引脚说明83.2开锁机构113.3按键电路设计123.4显示电路设计133.5 AT24C02掉电存储单元的设计143.5.1AT24C02143.5.2掉电存储电路153.6密码锁的电源电路设计153.7设计整体电路图16第四章 程序设计174.1主程序流程图174.2详细程序18结束语28第一章 绪 论1.1几种常见的密码锁1.普通密码锁 目前最常用机械锁,这种锁结构简单、使用方便、价格便宜,但在使用中暴露了很多缺点:(1)机械锁是靠金属制成的,通过钥匙上的不同齿形与锁芯的配合来工作的,安全性较低;(2)钥匙一旦丢失,无论谁捡到钥匙都可将门打开2.机械密码锁 该型锁将解锁密码以机械装定的形式存储在装置的鉴别机构上,在装置的外围设立密码操作键。密码的输入,产生相应的鉴别动作,即正确的密码输入,鉴别机构产生开锁动作:错误的密码输入,鉴别机构的部件将发生错位或不做出响应。机械密码锁采用机械加工(如精密机械加I微细加工)制作,皮实、耐用,电磁干扰、外界的异常信号很难启动鉴别机构。但机械密码锁通常包含多个较复杂的机、电功能组件,装置微小型化需借助先进的制造技术与装配工艺,制造周期长、成本高,机电接口及测试也有一定难度。3.电磁卡片式密码锁 该型锁类似于机械锁,利用光电耦合或电磁感应的原理,将密钥信息预先置于卡片内,加工好的卡片充当钥匙,开锁时将卡片插入锁内或近距离感应就能将锁打开。该锁的优点是:成本较低;授权用户一人一卡,可联微机,有开门记录。缺点是:卡片设备有磨损,寿命较短;卡片容易复制,不易双向控制;磁卡内存储的信息容易因外界磁场干扰而错乱,以致卡片(钥匙)无效。4.指纹密码锁 该类锁通过检验人员生物特征(如指纹)等方式来识别开锁。管理员利用采样控制软件,通过指纹采集仪采集、保存指纹;识别软件依赖指纹库识别开锁者的身份,通过外围设备显示、打印和存储。指纹具有唯一性和终身不变性的特点,一直被当作身份鉴定的可靠手段,从是否允许非法开启角度来说,安全性极好;但从使用是否方便的角度看,对安装环境和使用者的要求很高,安装位置与使用者身高之间必须满足一定的关系;同一个人,在指纹划伤,或任何被用于开锁的识别部位有损伤的情况下,可能产生错误识别而无法开锁。1.2研究背景 在人们的日常生活中,锁被广泛使用,人们常用锁来锁一些贵重物品乃至自己的家门,目的就是为了提高安全性。常见的锁有普通机械锁、机械密码锁、电磁卡锁、指纹(虹膜)锁等。而普通的机械锁极容易被强行破坏,安全系数不高;机械密码锁虽然安全系数高但造价相对较高,目前在保险柜上应用较多;电磁卡锁由于磁卡信息极易受外界干扰而失磁导致无法开锁,而指纹(虹膜)锁虽然安全性很好,但会因手指划伤虹膜充血等收到限制。通过分析我们不难发现传统密码锁或多或少存在一些不足从而降低了其保密的安全性,因此研究一种新型的密码锁是具有有很高的现实需求性。随着电子科技的发展,将电子芯片跟传统机械锁结合起来设计成一种新型的密码锁而电子密码锁作为一种新型的锁已经成功,即电子密码锁。 在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁。电子密码锁与传统密码锁想比较,拥有海量的密齿,通常从10000到10000000不等,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。 从是否方便的角度看,电子密码锁省去了传统机械锁的钥匙,电磁卡锁的磁卡,使用者只要记得其密码,便可以开启,从而大大提高了其适用性。因此电子密码锁的具有较高的研究价值。1.3国内外研究现状和发展趋势 早在80年代,日本产生了最早的电子密码锁。随着日本经济复苏,电子行业的快速发展,一些利用简单的门电路设计的密码锁出现了。这类电路安全性差,容易破解。到了90年代,美国、意大利、德国、日本、加拿大、韩国以及我国的台湾、香港等地的微电子技术的进步和通信技术的发展为密码锁提供了技术上的基础,从而推动密码锁走向实际应用的阶段。我国于90年代初开始对密码锁进行初步的探索。到目前为止,在此领域虽已有较大的发展,采用各种电路进行设计的比较多,技术也相当先进,电子技术发展至今已达到相当高的水平,电子密码锁技术已十分成熟。1.4本文研究的主要内容本文的主要研究方向是电子密码锁的具体设计,设计一种电子密码锁的控制系统电路。使得密码锁具有以下功能:开机输入密码,密码正确则电磁锁打开;如果第一次输入的密码不正确,允许再输入两次密码,在这个过程中,如果密码正确则电子锁打开,如果在这个过程中密码依旧不正确,则锁定键盘的输入功能,并且蜂鸣器报警。为了方便设计,将密码锁的开启跟锁定用发光二极管来代替,绿色发光二极管亮表示密码锁开启,红色发光耳机管亮表示密码锁锁定。也就是将其功能转化为:1.开机输入密码,密码正确绿灯亮,表示开锁;2.密码输入错误红灯亮,表示密码错误;3.连续三次输入密码不正确则锁定键盘,并报警凤鸣。本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。密码可以由用户自己修改设定,锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。第二章 方案论证2.1方案 方案:设计选用单片机AT89S51作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接四位七段数码管显示器用于显示作用。当用户需要开锁时,先按键盘开锁键之后按键盘的数字键09输入密码。密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后输入原来的密码,只有当输入的原密码正确后才能设置新密码。新密码输入无误后按确认键使新密码将得到存储,密码修改成功。其原理如图2.2所示。输入错误锁定键盘 矩阵键盘控制 AT89C51单片机延时报警控制电路开锁控制电路AT24C02掉电存储指示电路显示电路图2.2单片机控制方案可以看出该方案控制灵活准确性好且保密性强还具有扩展功能,还可以方便的对系统进行升级。2.2功能设计及其设计思路 本次设计使用ATMEL公司的AT 89C51实现一基于单片机的电子密码锁的设计,其主要具有如下功能:(1) 设置4位密码,密码通过键盘输入,若密码正确,则将锁打开。(2)密码可以由用户自己修改设定(只支持4位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。(3)报警、锁定键盘功能。密码输入错误数码显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。 电子密码锁的设计主要由三部分组成:4×4矩阵键盘接口电路、密码锁的控制电路、输出八段显示电路。另外系统还有LED提示灯,报警蜂鸣器等。 密码锁设计的关键问题是实现密码的输入、清楚、更改、开锁等功能:(1)密码输入功能:按下一个数字键,数字即从左边开始显示,直到按下四位密码后,显示器即显示四位数。(2)密码清除功能:当按下清除键时,清除前面输入的所有值,并清除所有显示。(3)密码更改功能:将输入的值作为新的密码。(4)开锁功能:当按下开锁键,系统将输入与密码进行检查核对,如果正确锁打开,否则不打开。第三章 电路的功能单元设计3.1 AT89C51单片机介绍3.1.1AT89C51芯片简介AT89C51是一种低功耗、高性能的片内含有4KB快闪可编程/擦除只读存储器的8位CMOS微控制器,使用高密度、非易失存储技术制造,并且与80C51引脚和指令系统完全兼容。【1】刘和平.刘跃.单片机原理及应用.重庆.重庆大学出版社,2004主要性能:与MCS-51 微控制器产品系列兼容。 片内有4KB可在线重复编程的快闪擦写存储器存储数据保存时间为10年。宽工作电压范围:Vcc可为2.7V到6V全静态工作;可从0Hz至16MHz 程序存储器具有3级加密保护 128*8位内部RAM 32条可编程I/O线、两个16位定时器/计数器、中断结构具有5个中断源和2个优先级、可编程全双工串行通道、空闲状态维持低功耗和掉电状态保存存储内容。【2】张立科.单片机典型外围器件及应用实例.北京.人民邮电出版社,200689C51单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上。如果按功能划分,它由如下功能部件组成,即微处理器、数据存储器、程序存储器、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器。它们都是通过片内单一总线连接而成,其基本结构依旧是CPU加上外围芯片的传统结构模式。但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式。微处理器、数据存储器、程序存储器、并行I/O口、串行口、定时器/计数器、中断系统各部分功能及说明类似于8051单片机内部结构说明。【3】陈明荧.89C51单片机课程设计实训教材.北京.清华大学出版社,2004特殊功能寄存器共有21个,用于对片内的各功能的部件进行管理、控制、监视。实际上是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。 由上可见,【4】刘瑞新.单片机原理及应用教程.北京.机械工业出版社,200389C51单片机的硬件结构具有功能部件种类全,功能强等特点。特别值得一提的是该单片机CPU中的位处理器,它实际上是一个完整的1位微计算机,这个1位微计算机有自己的CPU、位寄存器、I/O口和指令集。1位机在开关决策、逻辑电路仿真、过程控制方面非常有效;而8位机在数据采集,运算处理方面有明显的长处。MCS-51单片机中8位机和1位机的硬件资源复合在一起,二者相辅相承,它是单片机技术上的一个突破,这也是MCS-51单片机设计的精美之处。3.1.2 引脚说明【5】求是科技.单片机.人民邮电大学出版社,2005图3.1是标准的40引脚双列直插式集成电路芯片。P00P01P10P02P03P04P05P06P07P20P21P22P23P24P25P26P27P11P12P13P14P15P16P17P30/RXDP31/TXDP32/INT0P33/INT1P34/T0P35/T1X1X2RESET/VPP/P37/P36ALE/PSENAT89C511234567810111213141519189393837363534333221222324252627283117162930图3.1 AT89C51引脚图P00P07 P0口8位双向口线(在引脚的3932号端子)。P10P17 P1口8位双向口线(在引脚的18号端子)。P20P27 P2口8位双向口线(在引脚的2128号端子)。P30P37 P3口8位双向口线(在引脚的1017号端子)。1.P0口有三个功能:【6】李朝青.单片机原理及接口技术.北京.北京航空航天大学出版社,2002(1)外部扩展存储器时,用作数据总线(如图中的D0D7为数据总线接口)(2)外部扩展存储器时,用作地址总线(如图中的A0A7为地址总线接口)(3)不扩展时,可做一般的I/O口使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。2.P1口功能:P1口只做I/O口使用,其内部有上拉电阻。3.P2口有两个功能:(1)扩展外部存储器时,当作地址总线使用(2)做一般I/O口使用,其内部有上拉电阻4.P3口有两个功能:除了作为I/O口使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置。当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果P0口作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。5.ALE/PROG 地址锁存控制信号:在系统扩展时,ALE用于控制把P0口的输出低8位地址送锁存器锁存起来,以实现低位地址和数据的隔离。 PROG为编程脉冲的输入端,在89C51单片机内部有一个4KB的程序存储器(ROM),ROM的作用就是用来存放用户需要执行的程序的,那么我们是怎样把编写好的程序存入进这个ROM中的呢?实际上是通过编程脉冲输入才能写进去的,这个脉冲的输入端口就是PROG。6.PSEN 外部程序存储器读选通信号:在读外部ROM时PSEN低电平有效,以实现外部ROM单元的读操作:(1)内部ROM读取时,PSEN不动作;(2)外部ROM读取时,在每个机器周期会动作两次;(3)外部RAM读取时,两个PSEN脉冲被跳过不会输出;(4)外接ROM时,与ROM的EA脚相接。7.EA/VPP 访问程序存储器控制信号:(1)接高电平时:CPU读取内部程序存储器(ROM)(2)接低电平时:CPU读取外部程序存储器(ROM)。8031单片机内部是没有ROM的,那么在应用8031单片机时,这个脚是一直接低电平的。8.RST 复位信号:当输入的信号连续2个机器周期以上高电平时即为有效,用以完成单片机的复位初始化操作,当复位后程序计数器PC=0000H,即复位后将从程序存储器的0000H单元读取第一条指令码。9.XTAL1和XTAL2 :外接晶振引脚。当使用芯片内部时钟时,此二引脚用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。10.VCC:电源端接+5V电压输入。11.GND:接地端。3.2开锁机构 通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的。其原理如图3.2.所示。单片机微控制器开锁驱动电路电磁锁密码正确?Y返回N 图3.2密码锁开锁机构示意图当用户输入的密码正确输入的话,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的。其实际电路如图3.2所示。 电路驱动和开锁两级组成。由R、T组成驱动电路,其中T可以选择普通的小功率三极管如9014、9018都可以满足要求。其中D、C是为了消除电磁锁可能产生的反向高电压以及可能产生的电磁干扰。T可选用中功率的三极管如8050,电磁锁的选用要视情况而定,但是吸合力要足够且由一定的余量。在本次设计中,基于节省材料的原则,暂时用发光二极管代替电磁锁,红色发光管亮,表示无法开锁;绿色发光管亮,表示开锁。3.3按键电路设计由于设计要求使用矩阵键盘,所以本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目,在按键比较多的时候,通常采用这样方法。其原理如图3.4所示。【7】饶庆和.89C51单片机实用技术.北京.人民邮电出版社,2003图3.4行列式键盘原理电路图每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。 在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。 当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。 对照图3.3所示的4*4键盘,说明线反转个工作原理。首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。 判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。3.4显示电路设计 显示电路我们采用七段数码管进行设计,七段数码管的码型和真值表如图3.5和图3.6所示:【8】清华大学电子学教研组.闫石.数字电路基础.高等教育出版社,2008 七段数码管真值表g f e d c b a段码数字0 1 1 1 1 1 10 0 0 0 1 1 01 0 1 1 0 1 11 0 0 1 1 1 11 1 0 0 1 1 01 1 0 1 1 0 11 1 1 1 1 0 10 0 0 0 1 1 11 1 1 1 1 1 11 1 0 1 1 1 11 1 1 0 1 1 11 1 1 1 1 0 00 1 1 1 0 0 11 0 1 1 1 1 01 1 1 1 0 0 11 1 1 0 0 0 13fg06h6bh4fh66h6dh7dh07h7fh6fh77h7ch39h5eh79h71h 0a1 2 3fb 4 5g 6ec 7 8dpd 9 图3.5 七段数码管 A B C D E F图3.6七段数码管真值表本系统设计的显示电路是为了给使用者以提示而设置的。考虑到节约成本,使用最少的电子元器件,本系统的显示采用并行显示的方式,即使用单片机的P00-P07作为段选码口,P20-P23为位选码口。就可以完成单片机的显示功能,显示电路采用四位七段数码管来进行设计,电路原理图如图3.7所示。【9】李华.MCS-51系列单片机使用接口技术.北京航空航天大学出版社,1993图3.7四位七段数码管显示电路的电路原理图 从单片机P00-P07输出的信号是四位七段数码管的段选信号,直接送到七段数码管的段选地址中,控制七段数码管显示的码型;从单片机20-P23输出的信号是四位七段数码管的位选信号,送到四位七段数码管的片选地址中,控制四位七段数码管的显示个数和哪一个管子显示。 电路设定:当程序检测在5分钟内没有按键操作的时候,就关闭显示。这个功能使用程序来实现的,一旦没有按键动作就启动一个定时器,检测在5分钟内没有按键动作的时候,启动一个程序,关闭显示,这样可以达到节省电能的目的。3.5 AT24C02掉电存储单元的设计3.5.1AT24C02 掉电存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C02是ATMEL公司开发的可擦除存储芯片,AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。 采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。其电路如图3.8所示。VDDAT24C02 A1A2WPSDAA3VSSSCL图3.8 AT24C023.5.2掉电存储电路 采用AT24C02设计的掉电存储电路如图3.9所示VCCAT24C02VDD P35A2WPA1P36P37SDAVSSA3SCL图3.9 掉电存储电路原理图 图中R是上拉电阻,其作用是减少AT24C02的静态功耗,由于AT24C02的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(移位脉冲)和SDA(数据/地址)与单片机传送数据。 每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。3.6密码锁的电源电路设计本设计电源采用USB下载器供电3.7设计整体电路图图3.14整体设计电路图第四章 程序设计4.1主程序流程图 主程序主要完成初始化、设置中断向量、检查有无按键按下、以及调用显示等等。主程序的流程图如4.1下所示。【10】王忠飞.胥芳 MCS-51单片机原理及嵌入式系统应用.西安电大出版社,2007开始初始化有键按下?调用显示启动定时识别按键全部按完?超时?比较密码开门开始自动清除>3次?锁定报警NNYYYYNN图4.1 主程序流程图4.2详细程序程序正文#include <reg51.h>#define uchar unsigned char #define uint unsigned int sbit scl =P36;sbit sda =P37;int num,select=0x01;int pa,pb,pc,pd,npa,npb,npc,npd;bit isOpen=0, displayinfo=0;uchar x=0x0F;int flagcount=16;int a=16,b=16,c=16,d=16,flag=0,t=0;uchar code no21=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xA0,0x83,0xA7,0xA1,0x84,0x8E,0xFF,0x23,0x0C,0x84,0x2B;void delay(uint ms) uint i=0;while (ms-) for (i=0;i<120;i+);/行列式键盘 /int scan(uchar x) if (x=0x0F) return 0; else delay(1); if (x=0x0F) return 0; else return 1;void count(uchar x) int i=3,j=3; uchar p; p=0x0Fx; while (p!=0x01) p=p>>1; i-; P1=0xF0; x=P1; p=0xF0x; while (p!=0x80) p=p<<1; j-; P1=0x0F; num=4*i+j;void display(int k) P0=nok; P2=select; delay(3); select=select<<1; if (select=0x10) select=0x01; P2=0x00;void displayopen() display(17); display(18); display(19); display(20);/24C02读写驱动程序/延时/void flash() ; ; void x24c02_init() /24c02初始化子程序scl=1; /拉高 flash(); /延时 sda=1; flash();/同上 void start() /启动I2C总线sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();void stop() /停止I2C总线sda=0; flash(); scl=1; flash(); sda=1; flash(); void writex(uchar j) /写一个字节 uchar i,temp; temp=j; for (i=0;i<8;i+)temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();scl=0; flash(); sda=1; flash();uchar readx() /读一个字节uchar i,j,k=0;scl=0; flash(); sda=1; for (i=0;i<8;i+) flash(); scl=1; flash();if (sda=1) j=1;else j=0;k=(k<<1)|j;scl=0;flash(); return(k);void clock() /I2C总线时钟,在此作第个时钟scl=1; flash();while (sda=1);/如果SDA为0即收到应答则跳过,为1则等应答scl=0; flash();/从24c02的地址address中读取一个字节数据/uchar x24c02_read(uchar address)uchar i;start(); writex(0xa0);clock();/第9个时钟writex(address);/选中24C02clock(); start();writex(0xa1); /选中24C02中的存储器地址 clock();i=readx(); stop();delay(1);return(i);/向24c02的address地址中写入一字节数据info/void x24c02_write(uc