资源描述
四川师范大学成都学院电子工程系课程设计报告
前言
在我们的日常生活和工作中, 住宅、工作单位的安全措施、公司的档案资料、财务报表和个人相关资料的保管基本上都是用加锁的方式来解决的。如果采用传统机械式的钥匙来开锁,人们出门就需携带许多把钥匙, 非常地不方便, 而且如果钥匙不小心被丢失了,那安全性就会大打折扣。目前,在西方发达国家,电子密码锁技术相对较先进,种类齐全,电子密码锁也已被广泛应用于智能门禁系统中,通过多种更加安全,更加可靠的技术实现大门的管理。
在我国,随着社会科技的进步,锁已发展到了密码锁、磁性锁、电子锁、激光锁、声控锁等等。在传统钥匙的基础上,增加了一组或多组密码,通过不同磁场、光束光波、声波、声音和不同的图像来控制锁的开启,从而大大提高了锁的安全性,使不法之徒无可乘之机,人们也就能对自身财产安全的有了更多保障。
随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于需保密的箱、柜、门等。而且指纹识别器在公共场所使用容易机械损坏,IC卡也丢失或损坏,而且它们其成本较高,在一定程度上限制了这类产品的推广和普及。鉴于目前的技术水平与市场的接受程度,加上电子密码锁它具有成本价格低、低功耗、简单容易操作、安全性高等优点,因而电子密码锁成为了这类电子防盗产品的主流。
在安全技术的领域范围,具有防盗兼报警功能的电子密码锁已逐渐替代了传统机械式的密码锁,它克服了机械锁密码可设密码量少,安全性不高的缺点,使得密码锁不论在性能上还是在技术上都有了很大的提升。随着大规模集成电路技术的发展,尤其是单芯片,微处理器智能锁的出现,它除了具有电子密码锁的功能外,还引入了专家分析系统和智能化的管理,使得密码锁具有更高的可靠性和安全性,它的应用也越来越广泛,因此研究它具有重大的现实意义。
1 电子密码锁的介绍
1.1 电子密码锁的简介
电子密码锁运用电子电路控制机械部分,使两者紧密结合,从而避免了因为机械部分被破坏而导致开锁功能失常的问题,而且连续输入密码错误时还有报警声,大大增加了密码锁的防盗功能。随着人们生活水平的提高,怎样实现家庭防盗的问题也显得尤其的突出,传统的锁由于其构造简单,容易被撬,而电子锁由于具有保密性高、使用灵活性好、安全系数高等优点,受到了很多用户的青睐。
1.1.1 电子密码锁的特点
电子密码锁是一种通过输入密码来控制芯片或是电路工作,从而控制机械的开关是关还是开,来完成锁定和解锁任务的产品。它的种类有很多,例如:简易的电子产品、基于芯片的高性价比产品等。现在广泛应用的电子密码锁是以芯片为核心,通过编程来实现功能的。它的安全性和性能大大超过了传统的机械锁。其特点如下:
« 无活动零件,不会磨损,寿命长;
« 使用灵活性好,不像机械锁必须佩带钥匙才能开锁;
« 电子密码锁操作简单易行,一学即会;
« 密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降;
« 保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。
1.1.2 电子密码锁的发展趋势
目前的门锁一般使用弹子锁,但是它的钥匙是容易遗失;一些保险柜使用的机械锁,其结构更加复杂,成本高,高精密制造,容易出现故障,人们往往需要带很多钥匙,使用极为不便,如果钥匙不慎丢失,它的安全性就会大大降低。为满足人们的需求,使用密码替代钥匙解锁的密码锁应运而生。由于被电子器件所限,以前开发的电子密码锁,保密性差,种类不多,最基本的就是只依靠最简单的模拟电子开关来实现的,制作简单但很不安全,在后为多是使用EDA来实现的,其电路结构复杂,电子元件繁多。也有使用早先的20个引角的2051系列的单片机来实现的,但其密码简单,易被破解。随着电子元件的进一步发展,电子密码锁也出现了很多的种类,功能日益强大,安全保密性更强,使用更加方便,由以前的单密码输入发展到现在的密码加感应元件,用户只有密码或电子钥匙中的一样,是打不开锁的。出于安全、方便等方面的需要许多电子密码锁已相继问世,但这类产品的特点是针对特定有效卡、指纹或声音有效,且不能实现远程控制,只能适用于保密要求高且供个人使用的门、房间等。因为数字、字符、人体生物特征、时间和图形图像等要素均可成为钥匙的电子信息,所以组合使用这些信息能够使电子防盗锁获得更高的保密性,比如现在的一些金库,需要使用复合信息密码的电子防盗锁。组合使用信息也能够使电子防盗锁获得无穷扩展的可能,可以使产品多样化,对用户而言是是再好不过了。由此可以看出组合使用电子信息是电子密码锁今后发展的趋势。
1.2 电子密码锁设计的目标要求
该密码锁设计方法合理,简单易行,成本低,符合用户对一些私人资料信息的加密要求,具有一定的推广价值。该设计的电子密码锁有如下特点:
« 系统设置6位密码,通过键盘输入密码,输入密码后按下确定键。
« 密码可以由用户自己设定,在密码输入正确的前提下,按下设置键,出现提示信息”Your password!“,此时输入新的密码(6位)。
电子密码锁的工作流程图如图1.2-1所示:
初始状态
设定初始密码
输入密码:******
密码是否正确?
N
Y
进入系统
图1.2-1 电子密码锁的工作流程图
1.3 系统主要芯片的选型
1.3.1 主控芯片的选型
AT89C51单片机介绍[1]
AT89C51是一类具有低功耗,高性能CMOS 8位的单片机,其片内含有4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS -51指令系统及80C51引脚结构,芯片内集成了通用的ISP Flash存储单元和8位中P央处理器,很多的嵌入式控制应用系统也在使用AT89S51为它们提供的性价比比较高的解决方案。
AT89C51具有很多的特点,它有40个引脚、4k Bytes Flash片的内程序存储器、128 bytes的随机存储器(RAM)、32个外部输入/输出(I/O)口并且是双向的、5个中断优先级、16位的可编程定时计数器有两个、2个串行全双工通信口和一个看门狗(WDT)电路。片内时钟振荡器AT89C51提供以下标准功能:4k 字节 的Flash 闪速存储器,128 字节的内部 RAM,32 个 I/O 口线,1个看门狗(WDT),有两个数据指针和两个 16 位定时/计数器,有一个 5 向量两级中断结构,还有一个全双工串行通信口,片内振荡器及时钟电路。同时AT89C51 可降至 0Hz 的静态逻辑操作,并且支持两不同软件可选的节电工作模式。空闲方式可以停止 CPU 的工作,但仍然允许 RAM,定时/计数器,串行通信口及中断系统等继续工作。掉电方式保存 RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件的复位。 AT89C51引脚图如下图1.3.1-1所示:
图1.3.1-1 AT89C51引脚图
此外,AT89S51单片机还配置了12MHz的晶振并且可以通过软件来设置它的省电模式。当其处于空闲模式时,CPU可暂停工作,而串行口、外中断、定时计数器以及系统可继续工作,掉电模式下数据保存在RAM中,只有硬件复位或者外中断激活后芯片才又开始工作。另外该芯片有TQFP、PLCC和PDIP这三种不同的封装形式,以满足不同市场的需求。
1.3.2 显示器的选型
采用LCD1602[8]
LCD1602能完整的显示32个英文字符和日文字符,它可以应用在计算器、频率信号发生器、时钟等产品上。LCD1602主要特性:能够显示16*2个字符,芯片工作电压为4.5~5.5V,工作电流2MA(5V)包括背光电流,字符尺寸:2.95*4.35mm,带有英文和日文字符库,使用方便。
LCD1602的端口有8根数据引脚和6根控制引脚以及2根电引脚。控制灵活、方便。采用经典的8086总线结构,使编程控制得以变得更为简单。容易,且不会占用单片机的大量资源。
在选型时,考虑到设计的实际应用以及设计的合理性,LCD1602能显示一些数字和字母,很方便形象,故本设计最终的方案选择的是LCD1602。
1.3.3 密码存储芯片AT24C02
由于51单片机掉电后会丢失数据存储器里的数据,因此必须外加掉电存储电路。并由AT24C02芯片来实现。美国Atmel公司的低功耗CMOS型E2PROM —AT24C02,其内部存储空间有256×8位,可擦写次数10000次以上、工作电压宽在2.5~5.5 V之间、抗干扰能力强、数据不易丢失、写入速度小于10 ms、体积小。它是采用IIC总线串行对数据进行读写,占用的资源和I/O线很少,支持在线进行编程,能够快速方便地进行数据的实时存取。AT24C02运用IIC规程,采用主机(通常为单片机)/从机(AT24C02) 双向通信,二者均可在发送器和接收器状态下工作。主机产生一个串行的时钟信号后,通过引脚SCL控制总线的传送方向,产生停止和开始的条件。主机和从机在接收到一个字节后都必须要发出一个确认的信号ACK。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。
2 电子密码锁的硬件设计
2.1 硬件设计原理
本系统硬件部分包含电源输入电路、复位电路、晶振电路、按键电路、LCD1602显示电路。当系统运行时系统电源电路为系统供电。为了避免系统在不稳定情况下工作所以增加了一个复位电路。按键电路按键输入要执行的指令,LCD显示电路,为人机交互提供了条件。具体的硬件框图如下图2.1-1所示:
图2.1-1 系统框图
2.2 复位电路设计
单片机复位【1】是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。地址锁存信号ALE也为高电平。
根据实际情况选择如图2.2-1所示的复位电路。该电路在基本的复位电路上添加了手动复位按钮,在电源接通瞬间,电容C8上的电压很小,复位后R2下拉电阻的电压基本和电源电压相同, RST此时为高电平,随着电容充电,RST端电压将逐渐下降,当电压降到低于某一数值后,CPU不再复位,由于电容C1很大,可以确保RST在高电平的有效时间比24个振荡周期大,CPU能够顺利复位。为了防止死机时无法顺利复位我增加了手动复位按键加以保障。
图2.2-1 复位电路图
2.3 晶振电路设计
引脚XTAL1【2】和XTAL2【2】与晶体振荡器及电容C1、C2按图图2.3-1所示方式连接。此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。电路中两个电容C1、C2的作用使电路快速振,提高电路的运行速度。
图2.3-1 晶振电路图
2.4 按键电路设计
因为本设计所用到的按键数量较多所以不适合用独立式按键,因此我们引入了矩阵键盘【3】的应用,采用四条I/O线作为行线,四条I/O线作为列线组成键盘。在列线和行线的每个交叉点上设置一个按键。这样矩阵键盘上的按键个数就为16个,这样就能有效地提高系统I/O口的利用率。在单片机中可以用一个P1口实现16个按键功能,本设计中使用的这个4X4键盘不但能完成密码的输入还能作特别功能键使用。并且键盘的每个按键功能在程序设计中设置。由于矩阵键盘中的行、列为多键公用,每个按键都会影响该按键所处的行与列的电平,因此,各按键彼此将相互发生影响,所以必须将行列线信号配合起来,并作适当的处理,这样才能决定闭合键的位置。其按键结构及与单片机引脚接法如图2.4-1所示。按键功能键的具体分布如2.4-2所示。
图2.4-1 按键电路图
0
1
2
3
4
5
6
7
8
9
开锁
上锁
输入新密码
保存新密码
重新输入
未定义
图2.4-2 按键功能分配图
2.5 密码存储电路的设计
如图2.6-1所示,在AT89C51试验开发板上它们都接地,第8脚和第4脚分别为正、负电源,第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,在AT89C51试验开发板上和单片机的P3.3连接,第6脚SCL为串行时钟输入线,在AT89C51试验开发板上和单片机的P3.2连接,第7脚需要接地。
图2.5-1 24C02密码存储电路图
2.6 LCD1602显示电路设计
为了提高密码锁的密码显示效果能力。本设计的显示部分由液晶显示器LCD1602【5】。在没有按键时,显示器处于初始状态。按下开启键显示器就处于开启状态,再按下关闭按键显示器就处于关闭状态。当需要对密码锁进行开锁时,按下开锁按键后通过键盘上的数字键0-9输入密码,此时每按下一个数字键,显示器上就会显示一个*,最多只能输入六个*。当密码输入完成时,按下确认键,如果输入的密码正确的话,显示屏显示“四川师范大学成都学院欢迎您”,如果密码不正确,LCD显示屏会显示“ERROR”,P2.0输出的是高电平,电子密码锁不能被打开。通过LCD显示屏,可以清楚的判断出密码锁所处的状态 。其电路的具体设计如下图2.6-1所示:
图2.6-1 LCD1602显示电路图
2.7 报警电路
报警部分由陶瓷压电发声装置及外围电路组成, 加电后不发声, 当有键按下时, 发/ 叮0 声, 每按一下, 发声一次,单片机的P3. 1 引脚为低电平, 三极管T3 导通。
图2.7-1 蜂鸣器电路图
2.8 系统电路
硬件连接线路:
片机系统”区域中的P0.0~P0.7端口分别连接到“LED1602”区域中的d0—d7”端口上;
2. 把“单片机系统”区域中的P2.0~P2.2端口分别连接到“LED1602”区域中的“RS, RW, E”端口上。
3. 把“单片机系统”区域中的P1.0~P1.7端口分别依次连接到“矩阵键盘”区域中的“行和列”端口上。
3. 把“单片机系统”区域中的P3.2~P3.3端口分别依次连接到“24C02”区域中的“SCK, SDA”端口上。
3. 把“单片机系统”区域中的P3.7端口连接到“蜂鸣器”上。P2.7连接LED灯通过电阻R2接地。
3 电子密码锁的软件设计
3.1 程序设计思路
本设计软件部分要实现的功能分别为:键盘扫描,延时【6】,显示器显示【4】,密码存储等。
电子密码锁工作的主要过程是LCD液晶显示器提示“your password:”,通过键盘输入密码,同时LCD显示密码输入情况,按下确认键后判断密码的正确性,当输入密码多功能电子密码锁的基本要求: a、通过键盘输入密码。c、220V供电下,设计系统所需电源,并考虑掉电后原始数据的保存,总的流程图如下图3.1-1所示:
初始化
调用显示
识别按键
有按键按下?
全部按完?
比较密码
开 始
LED灯亮
开 始
N
N
保存
修改密码
Y
Y
密码正确?
图3.1-1 软件总流程图
3.2 键盘扫描软件设计
键盘扫描【7】流程图如图3.2-1所示,在按键当中,有与输入、开锁、清除、设置、确认的程序相对应的按键,并按顺序与输入的数相比较,当输入正确时,进入密码程序,错误时进行清除,输入两次新密码正确时,可进行重新设置密码,最后确认程序。按键的检测主要是通过查询的方法来实现的,利用按键进行密码的输入及设置。
开 始
行列端口赋值0xf0
读端口,结果相等?
延时10毫秒
保存首次赋值
读端口,两次赋值运算
读端口,结果相等?
查表发出键模
行列端口赋值0x0f
返回
图3.2-1 按键扫描流程图
图3.2-2 24C02读写操作的软件算法流程图
按下输入新密码
输入密码
存入缓冲
再输入一
调用24C02
比较密码
重新输入
调用显示
图3.2-3 2修改密码流程图
4、系统功能及仿真
(一)开锁
(二)LCD1602液晶显示
(三)密码修改
(四)报警
(五)还能添加掉电存储
当给单片机上电后,单片机显示如图:
图4-1仿真图1
当输入密码时,单片机显示如图:
图4-2仿真图2
密码错误的情况下修改密码(即输入新密码)显示如图:
图4-3仿真图3
当输入正确密码时单片机显示如图:
图4-4仿真图4
输入新密码之后保存显示:
图4-5仿真图5
图4-6实物图
5 总 结
以上为本人设计的电子密码锁电路。该电子密码锁设计实现开关锁和修改密码等功能,并具有结构简单、功耗低、成本低等优点,但是设计电子密码锁需要结合实际综合考虑很多因素,因此该电子密码锁设计需要在实际中进一步完善和改进。另外,在系统应用程序方面,该设计只实现了修改密码、开关锁、自动报警等功能,要想在现实生活中推广,还必须针对实际应用场合的需要,进一步完善系统功能的程序。
具有防盗报警功能的电子密码锁代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,密码锁不管在技术上还是在性能上都得到了提高。其经过多次的整理,是一个比较不错的设计,可以满足人们的基本需求,但是因为水平有限,此电路中也存在一定的问题,的设计并不奢望一定能成功,但一定要对已学的各种电子知识能有一定的运用能力,我做设计的目的是希望能检查下对所学知识的运用能力的好坏,并且开始慢慢走上创造的道路,这是非常可贵的一点。
但是在我们设计和调试的过程中,也发现了一些问题,譬如电子密码锁的设计还不够人性化,比如加上语音的提示功能,可能会更有生命力。电路的密码不能忘记,一旦忘记,就难以打开,这可以通过增加电路解决,但那过于复杂。此次程序设计还有一定的漏洞。也许还有其他的一些不足,还请老师给以支持。
6 参考文献
[1] 童诗白.华成英:模拟电子技术基础[第四版].高等教育出版社,2000.3,P3-P7
[2] 张毅刚:单片机原理及应用.高等教育出版社,2003.7,P65-P67
[3] 李全利:单片机原理及接口技术.高等教育出版社,2003.1,P69-P78
[4] 李光飞:单片机课程设计指导.北京航空航天大学出版社,2007.1,P12-P24
[5] 蔡朝洋:单片机控制实习与专题制作.北京航空航天大学出版社,2006.6 ,P30-P41
[6] 陈连坤:单片机原理及接口技术.北京交通大学出版社,2010.5,P55-P57
[7] 李学海:标准8051单片机基础教程.北京航空航天大学出版,2006.1,P57-P60
附录一:原理图
附录二:源程序
22
四川师范大学成都学院电子工程系课程设计报告
//--------------------------- Main.c--------------------------------
// 名称:用1602LCD与24C04设计的电子密码锁
//--------------------------------------------------------------------
// 说明:初始密码由24C04.BIN设定为“123456”。
// 当输入0~9中的数字时可以输入密码,不超过6位数,输入完成后按下A
// 键开锁,密码正确时LED点亮,液晶显示开锁成功。
// 其他键功能是:B上锁C重新输入密码D保存新密码E清除
// 重设密码成功时要求先输入正确的密码成功开锁。
//---------------------------------------------------------------------
#include<reg51.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
//上次按键和当前按键序号,该矩阵中序号范围为0~15,16表示无按键
uchar pre_keyNo=16,keyNo=16;
uchar code Title_Text[]="Your Password..."; //标题字符串
uchar DSY_BUFFER[10]=""; //显示缓冲
uchar UserPasssword[10]=""; //用户输入的密码
void LCD_Init(); //液晶初始化
void Display_String(uchar*str,uchar LineNo); //在液晶指定行显示字符串
void IIC_24C04_Init(); //IIC初始化
void Beep(); //蜂鸣器
uchar RecString(uchar Slave,uchar Subaddr,uchar*Buffer,uchar N); //从IIC读取数据
uchar SendString(uchar Slave,uchar Subaddr,uchar*Buffer,uchar N); //从IIC读取数据
uchar Keys_Scan();
sbit LED_OPEN=P2^7; //开锁亮灯
sbit BEEP=P3^7; //蜂鸣器
//-----------------------------------------------------------------------
//延时
//-----------------------------------------------------------------------
void DelayMS(uint x)
{
uchar i;
whlie(x--) for (i=0;i<120;i++);
}
//------------------------------------------------------------------------
//蜂鸣器子程序
//------------------------------------------------------------------------
void Beep()
{
uchar i;
for (i=0;i<100;i++)
{
DelayMS(1);BEEP=~BEEP;
}
BEEP=0;
}
//-------------------------------------------------------------------------
//清除密码
//-------------------------------------------------------------------------
void Clear_Password()
{
UserPassword[0]='\0';
DSY_BUFFER[0]='\0';
}
//--------------------------------------------------------------------------
//主程序
//--------------------------------------------------------------------------
void main()
{
uchar i=0;
uchar IIC_Password[10];
uchar IS_Valid_User=0;
P0=P1=0xFF;
TMOD=0X02; //TO设置为8位自动重装模式
TH0=175;
TL0=175;
TR0=1; //启动TO
DelayMS(10);
LCD_Init(); //初始化LCD
IIC_24C04_Init(); //初始化24C04
Display_String(Title_Text,0x00);
//24C04的内容已由初始化BIN文件导入
//将24C04中预先写入的密码读入IIC_Password
RecString(0xa0,0,IIC_Password,6);
IIC_Password[6]='\0';
while(1)
{
P1=0xF0;
if(P1!=0xF0) KeyNo=Keys_Scan(); //扫描键盘获取键序号KeyNo
if(Pre_KeyNo!=KeyNo)
{
if(i<10)
{
switch(KeyNo)
{
case 0: case 1: case 2:case 3: case 4:
case 5: case 6: case 7:case 8: case 9:
//如果i为0则执行一次清屏
if(i==0) Display_String(" ",0x40);
UserPassword[i]=KeyNo+'0';
UserPassword[i+1]='\0';
DSY_BUFFER[i]='*';
DSY_BUFFER[i+1]='\0';
Display_String(DSY_BUFFER,0x40);
i++;
break;
case 10://按A键开锁
if(strcmp(UserPassword,IIC_Password)==0)
{
LED_OPEN=0;//点亮LED
Clear_Password();
Display_String("Unlock ok! ",0x40);
IS_Valid_User=1;
}
else
{
LED_OPEN=1; //关闭LED
Clear_Password();
Display_String("ERROR! ",0x40);
IS_Valid_User=0;
}
i=0;
break;
case 11://按B键上锁
LED_OPEN=1;
Clear_Password();
Display_String(Title_Text,0x00);
Display_String(" ",0x40);
i=0;
IS_Valid_User=0;
break;
case 12://按C键设置新密码
//如果是合法用户则提示输入新密码
if(!IS_Valid_User)Display_String("No rights!",0x40);
else
{
i=0;
Display_String("New password: ",0x00);
Display_String(" ",0x40);
}
break;
case 13://按D键保存新密码
if(!IS_Valid_User)Dispay_String("No rights!",0x40);
else
{
SendString(0xa0,0,UserPasssword,6);
//重新读入刚写的密码
RecString(0xa0,0,IIC_Password,6);
IIC_Password[6]='\0';
i=0;
Display_String(Title_Text,0x00);
Display_String("Password saved!",0x40);
}
break;
case 14://按E键消除所有输入
i=0;
Clear_Password();
Display_String(" ",0x40);
}
}
Beep();
Pre_KeyNo=KeyNo;
}
//-------------------------------------------------24C04.c-----------------------------------
//24C04 IIC读/写程序
//-------------------------------------------------------------------------------------------
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Delay4us();{_nop_();_nop_();_nop_();nop_();}
sbit SCL=P3^2; //串行时钟
sbit SDA=P3^3; //串行数据
//-------------------------------------------------------------------------------------------
//起始位
//-------------------------------------------------------------------------------------------
void Start()
{
SDA=1;SCL=1;Delay4us(); SDA=0;Delayus();SCL=0;
}
//-------------------------------------------------------------------------------------------
//停止位
//-------------------------------------------------------------------------------------------
void Stop()
{
SDA=0;SCL=1;Delay4us();SDA=1;Delay4us();SCL=0;
}
//-------------------------------------------------------------------------------------------
//IIC总线初始化
//-------------------------------------------------------------------------------------------
viod IIC_24C04_Init()
{
SCL=0;Stop();
}
//-------------------------------------------------------------------------------------------
//发送应答信号
//-------------------------------------------------------------------------------------------
void ACX()
{
SDA=0;SCL=1;Delay4us();SCL=0;SDA=1;
}
//--------------------------------------------------------------------------------------------
//发送非应答信号
//--------------------------------------------------------------------------------------------
void NO_ACK()
{
SDA=1;SCL=1;Delay4us();SCL=0;SDA=0;
}
//---------------------------------------------------------------------------------------------
//从芯片读取1字节
//---------------------------------------------------------------------------------------------
uchar RedByte()
{
uchar i,rd;
rd=0x00;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;rd<<1;rd|=SDA;Delay4us();SCL=0;Delay4us();
}
SCL=0;
Delay4us();
return rd
展开阅读全文