求助AT24C16与51单片机的应用(附上原理图还有程序)小弟定会感激不尽

如题所述


AT24C08和16是差不多的,单片机部分的原理图就不用了吧。以下是AT24Cxx是H函数

#ifndef __AT24C08_H__

#define __AT24C08_H__

#include "delay.h"

#defineOP_READ0xa1// 器件地址以及读取操作,0xa1即为1010 0001B

#defineOP_WRITE 0xa0// 器件地址以及写入操作,0xa1即为1010 0000B

sbit SCL=P3^1;         //将串行时钟总线SDA位定义在为P3.1引脚

sbit SDA=P3^2;          //将串行数据总线SDA位定义在为P3.2引脚

/*************************************************************

函数名称:start

函数功能:开始传送函数

入口参数:无

返回值  :无

*************************************************************/

void start( void )

{

SDA = 1;    //SDA初始化为高电平“1”

    SCL = 1;    //开始数据传送时,要求SCL为高电平“1”

_nop_();    //等待一个机器周期

_nop_();    //等待一个机器周期

_nop_();    //等待一个机器周期

_nop_();    //等待一个机器周期

SDA = 0;    //SDA的下降沿被认为是开始信号

_nop_();    //等待一个机器周期

_nop_();    //等待一个机器周期

_nop_();    //等待一个机器周期

_nop_();    //等待一个机器周期

SCL = 0;    //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递) 

}

/*************************************************************

函数名称:stop

函数功能:传送结束函数

入口参数:无

返回值  :无

*************************************************************/

void stop( void )

{

SDA = 0;     //SDA初始化为低电平“0”_n

SCL = 1;     //结束数据传送时,要求SCL为高电平“1”

_nop_();     //等待一个机器周期

_nop_();     //等待一个机器周期

_nop_();     //等待一个机器周期

_nop_();     //等待一个机器周期

SDA = 1;    //SDA的上升沿被认为是结束信号

_nop_();     //等待一个机器周期

_nop_();     //等待一个机器周期

_nop_();     //等待一个机器周期

_nop_();     //等待一个机器周期

SDA=0;

SCL=0;

}

/*************************************************************

函数名称:ReadData

函数功能:从AT24Cxx读取数据,从AT24Cxx移入数据到MCU

入口参数:无

返回值  :ReadData()

*************************************************************/

unsigned char ReadData()

{

unsigned char i;

unsigned char x;   //储存从AT24Cxx中读出的数据

for(i = 0; i < 8; i++)

{

SCL = 1;                //SCL置为高电平

x<<=1;                  //将x中的各二进位向左移一位

x|=(unsigned char)SDA;  //将SDA上的数据通过按位“或“运算存入x中

SCL = 0;                        //在SCL的下降沿读出数据

}

return(x);                //将读取的数据返回

}

/*************************************************************

函数名称:WriteCurrent

函数功能:向AT24Cxx的当前地址写入数据,在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0

入口参数:y--储存待写入的数据

返回值  :WriteCurrent()

*************************************************************/

bit WriteCurrent(unsigned char y)

{

unsigned char i;

bit ack_bit;               //储存应答位

for(i = 0; i < 8; i++)// 循环移入8个位

{

    SDA = (bit)(y&0x80);   //通过按位“与”运算将最高位数据送到S

                                  //因为传送时高位在前,低位在后

_nop_();            //等待一个机器周期   

   SCL = 1;            //在SCL的上升沿将数据写入AT24Cxx     

   _nop_();            //等待一个机器周期 

  _nop_();             //等待一个机器周期       

  SCL = 0;            //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲

y <<= 1;           //将y中的各二进位向左移一位

}

SDA = 1;  // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,

                //以让SDA线转由接收设备(AT24Cxx)控制

_nop_();        //等待一个机器周期 

_nop_();        //等待一个机器周期 

SCL = 1;       //根据上述规定,SCL应为高电平

_nop_();       //等待一个机器周期 

_nop_();       //等待一个机器周期 

_nop_();       //等待一个机器周期 

_nop_();       //等待一个机器周期 

ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节

               //若送高电平,表示没有接收到,传送异常

SCL = 0;       //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)

return  ack_bit;// 返回AT24Cxx应答位

}

/***************************************************

函数名称:WriteSet

函数功能:向AT24Cxx中的指定地址写入数据

入口参数:add (储存指定的地址);dat(储存待写入的数据)

返回  值:无

***************************************************/

void WriteSet(unsigned char add, unsigned char dat)

// 在指定地址addr处写入数据WriteCurrent

{

start();               //开始数据传递

WriteCurrent(OP_WRITE);  //选择要操作的AT24Cxx芯片,并告知要对其写入数据

WriteCurrent(add);       //写入指定地址

WriteCurrent(dat);       //向当前地址(上面指定的地址)写入数据

stop();                //停止数据传递

delayNms(4);       //1个字节的写入周期为1ms, 最好延时1ms以上

}

/***************************************************

函数名称:ReadCurrent

函数功能:从AT24Cxx中的当前地址读取数据

入口参数:无

出口参数:x (储存读出的数据) 

***************************************************/

unsigned char ReadCurrent( void )

{

unsigned char x;

start();               //开始数据传递

WriteCurrent(OP_READ);   //选择要操作的AT24Cxx芯片,并告知要读其数据

x=ReadData();         //将读取的数据存入x

stop();                //停止数据传递

return x;              //返回读取的数据

}

/***************************************************

函数名称:ReadSet

函数功能:从AT24Cxx中的指定地址读取数据

入口参数:set_addr

出口参数:x 

***************************************************/

unsigned char ReadSet(unsigned char set_addr)

// 在指定地址读取

{

start();                      //开始数据传递

WriteCurrent(OP_WRITE);       //选择要操作的AT24Cxx芯片,并告知要对其写入数据

WriteCurrent(set_addr);       //写入指定地址

return(ReadCurrent());        //从指定地址读出数据并返回

}

#endif

怎么调用?这样   WriteSet( 地址 ,数据);

温馨提示:答案为网友推荐,仅供参考
相似回答