没有合适的资源?快使用搜索试试~ 我知道了~
AT24C01~AT24C256通用读写程序(C51
需积分: 32 38 下载量 177 浏览量
2013-04-05
14:10:36
上传
评论 3
收藏 6KB TXT 举报
温馨提示
AT24C01~AT24C256通用读写程序(C51),为AT24C01~AT24C256的读写程序,各人可根据自己的需要应用。 在buf1中填入需要写入的内容,buf2的大小可根据需要定义。 addr可根据使用的芯片选择,可从任何位置读写,只要在该芯片的范围内。 enumer=ATxxx,根据使用的芯片赋值。各函数中的形式参数不需改变。 本程序只要在调用的程序中定义实际参数即可,下述各子程序不必改动
资源推荐
资源详情
资源评论
AT24C01~AT24C256通用读写程序(C51)
/* 以下为AT24C01~AT24C256的读写程序,各人可根据自己的需要应用。
在buf1中填入需要写入的内容,buf2的大小可根据需要定义。
addr可根据使用的芯片选择,可从任何位置读写,只要在该芯片的范围内。
enumer=ATxxx,根据使用的芯片赋值。各函数中的形式参数不需改变。
本程序只要在调用的程序中定义实际参数即可,下述各子程序不必改动。*/
#include <reg52.h>
#include <intrins.h>
#define ERROR 10 //允许ERROR的最大次数
sbit SDA=P3^0;
sbit SCL=P3^1;
enum eepromtype {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};/*器件的型号*/
enum eepromtype enumer; //定义一个枚举变量
unsigned char code buf1 []={1,3,5,7,9,10,11,12,13,15}; /* 发送缓冲区 */
unsigned char buf2 [10]; /* 接收缓冲区 */
/* 一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,
此程序有五个入口条件,分别为读写数据缓冲区指针,
进行读写的字节数,EEPROM首址,EEPROM控制字节,
以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:
DataBuff为读写数据输入/输出缓冲区的首址
Length 为要读写数据的字节数量
Addr 为EEPROM的片内地址 AT24256为0~32767
Control 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
enumer为枚举变量,需为AT2401至AT24256中的一种,分别对应AT24C01至AT24C256;
函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
ERROR为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
SDA和SCL由用户自定义,这里暂定义为P3^0和P3^1; */
/* 以下为AT24C01~AT24C256的读写程序,各人可根据自己的需要应用。
在buf1中填入需要写入的内容,buf2的大小可根据需要定义。
addr可根据使用的芯片选择,可从任何位置读写,只要在该芯片的范围内。
enumer=ATxxx,根据使用的芯片赋值。各函数中的形式参数不需改变。
本程序只要在调用的程序中定义实际参数即可,下述各子程序不必改动。*/
#include <reg52.h>
#include <intrins.h>
#define ERROR 10 //允许ERROR的最大次数
sbit SDA=P3^0;
sbit SCL=P3^1;
enum eepromtype {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};/*器件的型号*/
enum eepromtype enumer; //定义一个枚举变量
unsigned char code buf1 []={1,3,5,7,9,10,11,12,13,15}; /* 发送缓冲区 */
unsigned char buf2 [10]; /* 接收缓冲区 */
/* 一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,
此程序有五个入口条件,分别为读写数据缓冲区指针,
进行读写的字节数,EEPROM首址,EEPROM控制字节,
以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:
DataBuff为读写数据输入/输出缓冲区的首址
Length 为要读写数据的字节数量
Addr 为EEPROM的片内地址 AT24256为0~32767
Control 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
enumer为枚举变量,需为AT2401至AT24256中的一种,分别对应AT24C01至AT24C256;
函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
ERROR为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
SDA和SCL由用户自定义,这里暂定义为P3^0和P3^1; */
/*对于1K位,2K位,4K位,8K位,16K位芯片采用一个8位长的字节地址码,对于32K位以上
的采用2个8位长的字节地址码直接寻址,而4K位,8K位,16K位配合页面地址来寻址*/
/* ----- AT24C01~AT24C256 的读写程序 ------ */
bit RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,
unsigned char Control,enum eepromtype enumer)
{ void Delay(unsigned char DelayCount); /* 延时 */
void Start(void); /* 启动总线 */
void Stop(void); /* 停止IIC总线 */
bit RecAck(void); /* 检查应答位 */
void NoAck(void); /* 不对IIC总线产生应答 */
void Ack(void); /* 对IIC总线产生应答 */
unsigned char Receive(void); /* 从IIC总线上读数据子程序 */
void Send(unsigned char sendbyte); /* 向IIC总线写数据 */
unsigned char data j,i=ERROR;
bit errorflag=1; /* 出错标志 */
while(i--)
{ Start(); /* 启动总线 */
Send(Control & 0xfe); /* 向IIC总线写数据,器件地址 */
if(RecAck()) continue; /* 如写不正确结束本次循环 */
if(enumer > AT2416)
{ Send((unsigned char)(Addr >> 8));//把整型数据转换为字符型数据:弃高取低,只取低8位.如果容量大于32K位,使用16位地址寻址,写入高八位地址
if(RecAck()) continue;
}
Send((unsigned char)Addr); /* 向IIC总线写数据 */
if(RecAck()) continue; /* 如写正确结束本次循环 */
if(!(Control & 0x01)) //判断是读器件还是写器件
{ j=Length;
errorflag=0; /* 清错误特征位 */
的采用2个8位长的字节地址码直接寻址,而4K位,8K位,16K位配合页面地址来寻址*/
/* ----- AT24C01~AT24C256 的读写程序 ------ */
bit RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,
unsigned char Control,enum eepromtype enumer)
{ void Delay(unsigned char DelayCount); /* 延时 */
void Start(void); /* 启动总线 */
void Stop(void); /* 停止IIC总线 */
bit RecAck(void); /* 检查应答位 */
void NoAck(void); /* 不对IIC总线产生应答 */
void Ack(void); /* 对IIC总线产生应答 */
unsigned char Receive(void); /* 从IIC总线上读数据子程序 */
void Send(unsigned char sendbyte); /* 向IIC总线写数据 */
unsigned char data j,i=ERROR;
bit errorflag=1; /* 出错标志 */
while(i--)
{ Start(); /* 启动总线 */
Send(Control & 0xfe); /* 向IIC总线写数据,器件地址 */
if(RecAck()) continue; /* 如写不正确结束本次循环 */
if(enumer > AT2416)
{ Send((unsigned char)(Addr >> 8));//把整型数据转换为字符型数据:弃高取低,只取低8位.如果容量大于32K位,使用16位地址寻址,写入高八位地址
if(RecAck()) continue;
}
Send((unsigned char)Addr); /* 向IIC总线写数据 */
if(RecAck()) continue; /* 如写正确结束本次循环 */
if(!(Control & 0x01)) //判断是读器件还是写器件
{ j=Length;
errorflag=0; /* 清错误特征位 */
剩余6页未读,继续阅读
资源评论
zxp2013
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Autosar学习视频10-19节
- stm32小车.zip
- AshampooUnInstaller v15.00.22 Portable一款强大的卸载工具,彻底、智能著称阿香婆强制卸载软件.rar
- Ashampoo WinOptimizer v27.00.05 阿香婆一款专业的垃圾清理、碎片整理启动项管理系统优化工具.rar
- misc设备驱动 正点原子阿尔法
- youleng-wms JAVA开发的WMS源码可以借签学习 数据库MYSQL
- 385大神asp.net三层设计停车场管理系统毕业课程源码设计+参考论文
- 数据集,训练数据集,深度学习
- 384大神asp.net基于三层汽车进销存销售管理系统毕业课程源码设计
- AutoSAR基础学习资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功