zoukankan      html  css  js  c++  java
  • 实现AT24C02的数据读写操作

    源:实现AT24C02的数据读写操作

    /***************************************************************
    功能:11:32 2008-6-27
    作者:SG
    时间:2004-03-15
    版本:V1.0
    ***************************************************************/
    
    #include "INTRINS.H"
    #include "reg52.h"
    
    #define  WriteDeviceAddress 0xa0 //写驱动地址指令
    #define  ReadDeviceAddress 0xa1  //读驱动地址指令
    
    sbit AT24C02_SCL = 0xa4;
    sbit AT24C02_SDA = 0xa5;
    
    /*-------------------------------------------------------------
    功能:发起始信号
    ------------------------------------------------------------*/
    void Start_Cond()
    {
        AT24C02_SCL = 0;
        _nop_();
        AT24C02_SDA = 1;
        _nop_();
        AT24C02_SCL = 1;
        _nop_();
        AT24C02_SDA = 0;
        _nop_();
    }
    
    /*-------------------------------------------------------------
    功能:发停止信号
    ------------------------------------------------------------*/
    void Stop_Cond()
    {
        AT24C02_SCL = 0;
        _nop_();
        AT24C02_SDA = 0;
        _nop_();
        AT24C02_SCL = 1;
        _nop_();
        AT24C02_SDA = 1;
        _nop_();
    }
    
    /*-------------------------------------------------------------
    功能:发确认信号
    ------------------------------------------------------------*/
    void Ack()
    {
        AT24C02_SCL = 0;
        _nop_();
        AT24C02_SDA = 0;
        AT24C02_SCL = 1;
        _nop_();
        AT24C02_SCL = 0;
        _nop_();
        AT24C02_SDA = 1;
    }
    
    /*-------------------------------------------------------------
    功能:发无确认信号
    ------------------------------------------------------------*/
    void NoAck()
    {
        AT24C02_SCL = 0;
        _nop_();
        AT24C02_SDA = 1;
        _nop_();
        AT24C02_SCL = 1;
        _nop_();
        AT24C02_SCL = 0;
        _nop_();
    }
    
    /*-------------------------------------------------------------
    功能:写一个字节数据
    ------------------------------------------------------------*/
    bit Write8Bit(unsigned char input)
    {
        unsigned char i;
        for (i=0;i<8;i++)
        { 
            AT24C02_SCL = 0;
            input <<= 1;
            AT24C02_SDA = CY;
            AT24C02_SCL = 1;
            
        }
        AT24C02_SCL = 0;
        _nop_();
        AT24C02_SDA = 1;
        AT24C02_SCL = 1;
        _nop_();
        CY = AT24C02_SDA;
        return(CY) ;
    }
    
    /*-------------------------------------------------------------
    功能:读一个字节数据
    ------------------------------------------------------------*/
    unsigned char Read8Bit()
    {
        unsigned char temp,rbyte=0;
        for (temp = 8;temp != 0;temp--)
        {
            AT24C02_SCL = 0;
            _nop_();
            rbyte = (rbyte << 1) | AT24C02_SDA;
            AT24C02_SCL = 1;
            _nop_();
        }
        return rbyte;
    }
    
    /*-------------------------------------------------------------
    功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针
    nContent开头的往下内容。
    ------------------------------------------------------------*/
    bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )
    {
        unsigned char Addr;
        Addr = nAddr;
        Start_Cond();                        //写开始信号
        Write8Bit(WriteDeviceAddress);      //写驱动地址
        Write8Bit(Addr);                    //写从EEPROM中读的开始地址
        Start_Cond();                        //写开始信号
        Write8Bit(ReadDeviceAddress);        //写读数据指令
        while(--nLen)
        {
            *nContent=Read8Bit();              //读出内容
            nContent++;                        //指针加1
            Ack();                            //发确认信号
        }                                   
        *nContent=Read8Bit();               //读一字节
        NoAck();                            //没有确认信号
        Stop_Cond();                        //发停止信号
        return(0);                            //返回
    }
    
    /*-------------------------------------------------------------
    功能:初始化EEPROM子程序内容为FF
    ------------------------------------------------------------*/
    bit Init_Flash ( unsigned int nPage ) //    8 Byte/1Page init 0xFF 
    {
        unsigned char nLen;
        unsigned char Addr;
        nLen=8;
        Addr=8 *nPage;
        
        Start_Cond();
        Write8Bit(WriteDeviceAddress);
        Write8Bit(Addr);
        for(;nLen!=0;nLen--)
        {
            if(Write8Bit(0xff)) break;    //if Write8Bit() Return 1 Write Flase
        }
        Stop_Cond();
            return(CY);
    }
    
    /*-------------------------------------------------------------
    功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针
    nContent开头的往下内容。
    ------------------------------------------------------------*/
    bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)
    {
        unsigned char i,temp;
        unsigned char Addr;
        Addr = nAddr;
        Start_Cond();                    //写开始信号
        Write8Bit(WriteDeviceAddress);    //写驱动地址
        Write8Bit(Addr);                //写从EEPROM中写的开始地址 
        for(i = 0;i < nLen;i++)
        {
            if(Addr%8==0)                //每页8字节  //换页
            {
                Stop_Cond();
                _nop_();
                Start_Cond();
                Write8Bit(WriteDeviceAddress);
                Write8Bit(Addr);
            }
            temp = *nContent;
            if(Write8Bit(temp)) break;    //CY
            nContent++;
            Addr++;
        }
        Stop_Cond();                    //发停止信号
        return(CY);
    }
    
    /*-------------------------------------------------------------
    主程序
    功能:实现存储器EEPROM AT24C02的数据读写操作
    ------------------------------------------------------------*/
    void main()
    {
        unsigned char dat[16],i;
        
        Read_Flash(dat,0,16);    //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中  
        Init_Flash(0);            //将AT24C02的第0页初始化为FF
        Read_Flash(dat,0,16);    //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中
        
        for(i = 0;i < 16;i++ )
        {
             dat[i] = i;        //对数组dat初始化为0---F
        }     
        Write_Flash(dat,0,16);    //将dat数组中的数据写入AT24C02中地址从0开始
        Read_Flash(dat,1,16);    //读出AT24C02中从地址1开始依次往后16个字节放入dat数组中
        while(1)
        {
            i = 9;
        }
    }
  • 相关阅读:
    Network Flows(借助ortools)
    【转】一张图看懂IaaS, PaaS和SaaS的区别
    论文中的一些符号 O(big-Oh) Ω(big-omega) Θ(big-theta)
    最大流问题
    4 Mininet测量路径的损耗率
    3 Mininet命令延伸实验拓展
    2 Mininet可视化应用
    快速定位问题
    软中断与软中断的排查
    系统出现大量不可中断进程与僵尸进程
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/4384762.html
Copyright © 2011-2022 走看看