给个单片机 24C16的读写程序

给个单片机 24C16的读写程序,第1张

//24c16读写驱动程序,

//=-----------------------------------------------------------------------------

--

/*模块调用:

数据:read(unsigned int address)

写数据:write(unsigned int address,unsigned char dd) dd为要写的 数据字节*/

//------------------------------------------------------------------------------

----

sbit sda=P3^0

sbit scl=P3^1

sbit a0=ACC^0 //定义ACC的位,利用ACC *** 作

速度最快

sbit a1=ACC^1

sbit a2=ACC^2

sbit a3=ACC^3

sbit a4=ACC^4

sbit a5=ACC^5

sbit a6=ACC^6

sbit a7=ACC^7

//------------------------------------------------------------------------------

--------

#pragma disable

void s24(void) //起始函数

{

_nop_()

scl=0

sda=1

scl=1

_nop_()

sda=0

_nop_()

_nop_()

scl=0

_nop_()

_nop_()

sda=1

}

//------------------------------------------------------------------------------

-------

#pragma disable

void p24(void) //停止函数

{

sda=0

scl=1

_nop_()

_nop_()

sda=1

}

//------------------------------------------------------------------------------

------

#pragma disable

unsigned char rd24(void) /////////////////从24c16读一字节数据

{ ACC=0x00

sda=1

scl=1a7=sda_nop_()_nop_()_nop_()_nop_()scl=0

scl=1a6=sda_nop_()_nop_()_nop_()_nop_()scl=0

scl=1a5=sda_nop_()_nop_()_nop_()_nop_()scl=0

scl=1a4=sda_nop_()_nop_()_nop_()_nop_()scl=0

scl=1a3=sda_nop_()_nop_()_nop_()_nop_()scl=0

scl=1a2=sda_nop_()_nop_()_nop_()_nop_()scl=0

scl=1a1=sda_nop_()_nop_()_nop_()_nop_()scl=0

scl=1a0=sda_nop_()_nop_()_nop_()_nop_()scl=0

sda=1scl=1_nop_()_nop_()_nop_()_nop_

()scl=0/// ///////////////24c16的一位回答位。

return(ACC)

}

//------------------------------------------------------------------------------

----

#pragma disable

void wd24(unsigned char dd) ////////////////向24c16写一字节数据

{ sda=1

ACC=dd

sda=a7scl=1_nop_()_nop_()_nop_()_nop_()scl=0

sda=a6scl=1_nop_()_nop_()_nop_()_nop_()scl=0

sda=a5scl=1_nop_()_nop_()_nop_()_nop_()scl=0

sda=a4scl=1_nop_()_nop_()_nop_()_nop_()scl=0

sda=a3scl=1_nop_()_nop_()_nop_()_nop_()scl=0

sda=a2scl=1_nop_()_nop_()_nop_()_nop_()scl=0

sda=a1scl=1_nop_()_nop_()_nop_()_nop_()scl=0

sda=a0scl=1_nop_()_nop_()_nop_()_nop_()scl=0

sda=0scl=1//scl=0(在下面程序中)

}

//---------------------------------------------------------------------------

#pragma disable

unsigned char read(unsigned int address)

{

unsigned char dd

s24() ////////////////////////开始条件

wd24(0xa0) /////////////////////////写器件地址(写命令)

_nop_()_nop_()_nop_()_nop_()

scl=0 ///////////////////////////////////接收器件地

址确认信号

wd24(address) //////////////////////////// 写数据地址

_nop_()_nop_()_nop_()_nop_()

scl=0

s24

()///////////////////////////////////开始条件

wd24(0xa1)/////////////////////////////写器件地址(读命

令)

scl=0

dd=rd24() //////////////////////////////////读 一字节

p24() ////////////////////////////////////停止条件

return(dd)

}

//------------------------------------------------------------------------------

--

#pragma disable

void write(unsigned int address,unsigned char dd)

{

s24() /////////////////开始条件

wd24(0xa0) ////////////////////////写器件地址;

scl=0

wd24(address) /////////////////////写数据地址

scl=0

wd24(dd) //////////////////////////写dd数据

scl=0

p24() /////////////////////////停止条件;

}

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

// I2存储器函数区

//

// ============================================================

// SPROM脉冲延时

//

void Sdelay(void)

{

unsigned char n

for(n=4n>0n--)

return

}

// ============================================================

// SPROM开始位

//

void s24XX(void)

{

SDA24XX=1SCK24XX=1

Sdelay()

SDA24XX=0// Tsu:start=4.7uS

Sdelay()

SCK24XX=0// Thd:start=4uS

return

}

// ============================================================

// SPROM停止位

//

void p24XX(void)

{

SDA24XX=0

Sdelay()SCK24XX=1

Sdelay()SDA24XX=1// Tsu:stop=4uS

return

}

// ============================================================

// 写数据到SPROM数据线

// 返回:ACK状态

bit w24XX(unsigned char c)

{

ACC=c

for(c=8c>0c--)

{

SDA24XX=0x80 &ACC// 数据高位送SDA针并左移一位

SCK24XX=1_nop_() // Clock high time

SCK24XX=0

_nop_()

}

SDA24XX=1

_nop_()

SCK24XX=1CY=SDA24XX

_nop_()

SCK24XX=0

Sdelay()

return(CY)

}

// ============================================================

// SPROM字节读

// 参数:地址a

unsigned char rb24XX(unsigned char a)

{

s24XX()

w24XX(0xa0)w24XX(a)

s24XX()w24XX(0xa1)

SDA24XX=1

ACC=0 // 利用ACC返回数据

for(a=0a<8a++) // 使用a变量兼作循环变量

{

SCK24XX=1

ACC+=ACCif(SDA24XX)ACC++// 读相应位

SCK24XX=0

Sdelay()

}

p24XX()

return(ACC)

}

// ============================================================

// SPROM字节写

// 参数: 地址a, 数据d

// 返回: 1表示写失败

bit wb24XX(unsigned char a, unsigned char d)

{

s24XX()

w24XX(0xa0) // 控制字

w24XX(a) // 地址

w24XX(d)p24XX() // 数据

for(a=255a>0a--)

{

s24XX()

if(w24XX(0xa0)==0)break

WDT()

}

p24XX()

return(CY)

}

// SPROM¿ªÊ¼Î»

//

void s24XX(void)

{

SDA24XX=1SCK24XX=1

Sdelay()

SDA24XX=0// Tsu:start=4.7uS

Sdelay()

SCK24XX=0// Thd:start=4uS

return

}

1) 你的写函数,调用时地址是 23 不是 0x23

2) 你的读函数,调用时地址是 0,不是 0x23 , 你写的位置同你读的位置是不同的。

上面两个是比较大的问题。

3)连续读,每读一个字节后要加一个ACK,就是第9个CLK,DAT拉低,就像你写时 每写一个字节调用一次 respons() 读时也要,不过相反。写时是读DAT为低, 读时是89C52把 DAT拉低。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存