请尊重原创,引用本文发表者,请注明出处. 作者:彬 qq:243280383 870035775 邮箱: 870035775@QQ.COM 博客: http://blog.sina.com.cn/vision243280383
单片机断电密码保存电子锁 (2008-09-15 11:02:08) 作品简介:电子密码锁是集计算机技术、电子技术、数字密码技术为一体的机电一体化高科技产品,具有安全性高,使用方便等优点。本论文从电子密码锁系统的功能,硬件电路设计,软件设计分别论述这一系统。通过使用单片机AT89S52作为控制核心,连接外部存储器AT24C02,实现密码断电保存,制作一种密码锁。 下面共享AT24C02的驱动程序: (AT24C02的三个引脚都接地 所以写入的地址是0xa0 ,写容许引脚接地) void Start(void) / { Sda=0; Scl=1; _nop_ (); //根据时序图尽心延时 _nop_ (); _nop_ (); _nop_ (); Sda=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); } void Ack(void) { Sda=0; _nop_ (); _nop_ (); //延时 根据时序图 _nop_ (); _nop_ (); Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=0; } void NoAck(void) { Sda=1; _nop_ (); //根据时序图进行延时 _nop_ (); _nop_ (); _nop_ (); Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=0; } void Send(uchar Data) { uchar BitCounter=8; uchar temp; do { temp=Data; Scl=0; _nop_ (); _nop_ (); _nop_ (); _nop_ (); if((temp&0x80)==0x80) Sda=1; else Sda=0; //如果最高位是0就发送0 Scl=1; temp=Data<<1; Data=temp; BitCounter--; //没发完一位数据就减一 }while(BitCounter); //如果发送完8位后跳出循环 Scl=0; //释放总线 } uchar Read(void) { uchar temp=0; uchar temp1=0; uchar BitCounter=8; //定义从存储器读出的数据位数 Sda=1; do{ Scl=0; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); if(Sda) temp=temp|0x01; else temp=temp&0xfe; if(BitCounter-1) { temp1=temp<<1; //逐位的读出 temp=temp1; } BitCounter--; }while(BitCounter); //读出8位后跳出循环 return(temp); //返回读出的数据 } void WrToROM(uchar Data,uchar Address) //向存储器写一字节的数据 函数 { uchar i=0; Start(); //调用起始条件函数 Send(0xa0); // 发送命令,准备写入数据到存储器,让存储器做好准备 Ack(); // 调用应答函数 Send(Address); // 先发送要写入数据的的存储器内存地址 Ack(); // 调用应答函数 Send(Data); // 开始发送要写入到存储器中的数据 Ack(); // 调用应答函数 Stop(); // 调用停止发送函数,表示发送完毕 } uchar RdFromROM(uchar Address) // 从存储器读出一字节的数据 { uchar i; Start(); //调用起始条件函数 Send(0xa0); // 让存储器准备接受命令 Ack(); Send(Address); // 发送要读出来的数据地址 Ack(); Start(); // 重新调用起始函数 Send(0xa1); // 发送读出数据的命令 Ack(); i=Read ( ); // 开始读出数据 Scl=0; NoAck(); // 读出数据成功。返回信号成功信号给存储器 Stop(); return (i); // 返回读出的数据 }
相关链接:http://blog.sina.com.cn/vision243280383 |