用c语言实现24LC256读写Word格式文档下载.docx

上传人:b****6 文档编号:20705415 上传时间:2023-01-25 格式:DOCX 页数:19 大小:19.80KB
下载 相关 举报
用c语言实现24LC256读写Word格式文档下载.docx_第1页
第1页 / 共19页
用c语言实现24LC256读写Word格式文档下载.docx_第2页
第2页 / 共19页
用c语言实现24LC256读写Word格式文档下载.docx_第3页
第3页 / 共19页
用c语言实现24LC256读写Word格式文档下载.docx_第4页
第4页 / 共19页
用c语言实现24LC256读写Word格式文档下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

用c语言实现24LC256读写Word格式文档下载.docx

《用c语言实现24LC256读写Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《用c语言实现24LC256读写Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。

用c语言实现24LC256读写Word格式文档下载.docx

//数据发送等待过程

voidi2c_datain() 

//读取24LC256时,不是读的最后一个字节时使用

RCEN=1;

receive=SSPBUF;

ACKDT=0;

ACKEN=1;

voidi2c_datainlast() 

//读取最后一个字节,或只读取24lc256中一个字节

ACKDT=1;

voidi2c_error()

i2c_stop();

return;

voidwrite(unsignedintaddr,unsignedchardata,unsignedintn)//向iic写入一字节数据地址,数据,字节个数

i2c_start();

SSPBUF=0xA0;

//EEPROM寻址码和写操作命令码

i2c_dataout();

//发送

if(ACKSTAT)

i2c_error();

//无应答,错误!

elseif(!

ACKSTAT)

SSPBUF=addr/256;

//高eeaddr/256,取eeprom数据地址高字节

SSPBUF=addr%256;

//低eeaddr%256,取eeprom数据地址低字节

for(i=0;

i<

N;

++I)

{

if(ACKSTAT)//应答

SSPBUF=data;

//eedata 

入eeprom的数据

//发送

}

//产生停止位,启动eeprom内部些过程

if(!

ACKSTAT)break;

}while(ACKSTAT);

unsignedintcurrent_read(void)//currentaddressreadok!

SSPBUF=0xA1;

//寻址命令码0xA0和读命令

i2c_datainlast();

return((unsignedint)receive);

unsignedintrandom_read(unsignedinteepromaddress)

SSPBUF=eepromaddress/256;

SSPBUF=eepromaddress%256;

i2c_restart();

voidi2c_init()

SSPSTAT=0x00;

TRISC=0xD8;

SSPADD=19;

SSPIE=0;

SSPCON=0x28;

实例1

/* 

51系列单片机在使用时,有时需要模拟I2C总线_nbsp;

*/

这里举出一个实例(读写串行EEPROM芯片at24C02_nbsp;

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

/*Name:

AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数*/

/*Language:

C51单片机编程语言 

/*Platform:

Win98,IntelCeleron433Processor,伟福仿真器,仿真8751 

/*Author:

StephenZhu 

javasdk@ 

/*Date:

2003广朿1旿5朿2旿5朿9旿nbsp;

/*Version:

1.1.1 

/*Others:

None 

#include<

string.h>

reg52.h>

intrins.h>

#defineDELAY_TIME60/*经实验,不要小于50!

否则可能造成时序混乱*/

#defineTRUE1

#defineFALSE0

sbitSCL=P1^7;

/*假设由P1.7和P1.6控制*/

sbitSDA=P1^6;

/**********Definition 函数定义************/

voidDELAY(unsignedintt)/*延时函数*/

{

while(t!

=0)

t--;

}

voidI2C_Start(void)

/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/

SDA=1;

SCL=1;

DELAY(DELAY_TIME);

SDA=0;

SCL=0;

voidI2C_Stop(void)

/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/

voidSEND_0(void) 

/*SENDACK*/

/*发逿,在SCL为高电平时使SDA信号为低*/

voidSEND_1(void)

/*发逿,在SCL为高电平时使SDA信号为高*/

bitCheck_Acknowledge(void)

/*发送完一个字节后检验设备的应答信号*/

DELAY(DELAY_TIME/2);

F0=SDA;

if(F0==1)

returnFALSE;

returnTRUE;

voidWriteI2CByte(charb)reentrant

/*向I2C总线写一个字芿/

chari;

i<

8;

i++)

if((b<

<

i)&

0x80)

SEND_1();

else

SEND_0();

charReadI2CByte(void)reentrant

/*从I2C总线读一个字芿/

charb=0,i;

/*释放总线*/

/*接受数据*/

DELAY(10);

b=b<

1;

b=b|0x01;

returnb;

/**********以下为读冿4c02的函敿*********/

voidWrite_One_Byte(charaddr,charthedata)

{

bitacktemp=1;

/*writeabytetomem*/

I2C_Start();

WriteI2CByte(0xa0);

acktemp=Check_Acknowledge();

WriteI2CByte(addr);

/*address*/

WriteI2CByte(thedata);

/*thedata*/

I2C_Stop();

}

voidWrite_A_Page(char*buffer,charaddr)

bitwrtmp;

inti;

/*writeapagetoat24c02*/

7;

WriteI2CByte(buffer[i]);

Check_Acknowledge())

charRead_One_Byte(charaddr)

charmydata;

/*readabytefrommem*/

WriteI2CByte(0xa1);

mydata=ReadI2CByte();

returnmydata;

voidRead_N_Bytes(char*buffer,charn,charaddr)

inti=0;

/*read8bytesfrommem*/

n;

buffer[i]=ReadI2CByte();

if(i!

=n-1)

/*发送应筿/

/*发送非应答*/

voidmain()

charmybyte;

charmyarray[8];

charmyarray2[8];

charrdarray[16];

myarray[i]=i;

myarray2[i]=i+0x08;

Write_One_Byte(0x20,0x28);

Write_A_Page(myarray,0x10);

Write_A_Page(myarray2,0x18);

mybyte=Read_One_Byte(0x20);

Read_N_Bytes(rdarray,16,0x10);

==================================================================================================

实例2

/**********************************I2C总线驱动*************************************

模块名:

I2C总线驱动 

型号:

I2C

创建人:

陈曦 

日期_005-6-15

修改人:

日期_005-6-19

功能描述_/p>

此模块包括发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,能很

方便的与用户程序进行连接并扩展?

br>

需要注意的是,函数是采用延时方法产甿SCL脉冲,对高晶振频率要做一定的修改!

在写E2PROM的时候一定要延时!

_br>

说明_/p>

1us机器周期,晶振频率要小于12MHz

返回1则操作成功,返回0则操作失败?

sla为器件从地址,suba为器件子地址?

/p>

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

#include 

"

AT89X52.h"

<

#define 

_Nop() 

_nop_() 

//定义空指仿/p>

sbit 

SDA=P1^3;

//模拟I2C数据传输使br>

SCL 

=P1^2;

//模拟I2C时钟控制使/p>

bit 

bdata 

I2C_Ack;

//应答标志使/p>

/************************************I2C_Start************************************

函数名:

void 

I2C_Start()

入口_br>

出口_/p>

功能描述:

启动I2C总线,即发送I2C初始条件

调用函数_nbsp;

全局变量_/p>

创建者:

修改者:

日期_/p>

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

SDA 

=1;

//发送起始条件的数据信号

_Nop();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1