打印

单片机断电密码保存电子锁

[复制链接]
2359|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
243280383|  楼主 | 2008-9-15 21:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请尊重原创,引用本文发表者,请注明出处.
作者:彬
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

相关帖子

沙发
emailli| | 2008-9-16 14:04 | 只看该作者

结构设计在哪里?

作为电子密码锁,最关键的结构设计没有的话。基本就没有技术含量了。只能当作学习练手了。

使用特权

评论回复
板凳
243280383|  楼主 | 2008-9-16 22:51 | 只看该作者

不用这么激动

只是想把自己调试过的AT24C02的驱动函数共享出来,我自己测试过了驱动,没有问题.你说的机构设计倒是我没有做,你喜欢就参考下上面的函数,不喜欢,就算了---------

使用特权

评论回复
地板
匠人笔记| | 2008-9-21 13:45 | 只看该作者

ok

ok

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

30

帖子

0

粉丝