at24c16程序怎么写

at24c16程序怎么写,第1张

AT24c16是EEROM,与传统的片外EPROM有所区别.当然你前面说的,用单片机任意两只脚作为输入和输出是对的,读取程序就是需要IIC协议,这个得自己来写,这程序一时半会也不说清楚的。当然你不会也可以叫别人给你写的。单片机是不会自动寻找EEROM的,这需要你的单片机程序配合,也就是你单片机程序让它寻址它就寻址。

另外,站长团上有产品团购,便宜有保证

没什么太大的不同,AT24C02 读写时要指定地址 A2 A1 A0 ,这就是芯片上这3支管脚的接法,而 AT24C16 不用指定地址但是因为容量比较大因此要选定所要读写的页(PAGE)。

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( 地址 ,数据)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11078960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存