24c16 串行 EEPROM 如何使用? 急急

ciniddvon 2003-08-01 05:17:10
我需要 24c16 串行 EEPROM 的使用方法
(24C08)
最好是 C语言的 程序!
有哪位高人 请指教
有地方学习请指点
最好是 给我个 例子!(c)

谢谢各位的关顾!
66分
...全文
288 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ciniddvon 2003-08-02
  • 打赏
  • 举报
回复
楼上的 同事 我运行了 你的程序,时间太长!
你可以看一下 你的楼上 ,那个程序不错,不知道 没有延时可以吗?
可惜他的程序 不知道为什么我 16个字节可以 一起读写,当,48字节一起读写就不可以了
不过我已经 得到满意的 答案 谢谢各位
有什么再请教高手们!
qq:27783492
yuqianyi 2003-08-02
  • 打赏
  • 举报
回复
这是24C01的C51程序与24C16大同小异
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define addwr 0xa0 /*Æ÷¼þµØÖ·Ñ¡Ôñ¼°Ð´±êÖ¾*/
#define addrd 0xa1 /*Æ÷¼þµØÖ·Ñ¡Ôñ¼°¶Á±êÖ¾*/
/*ÓйØÈ«¾Ö±äÁ¿*/
sbit sda= P1^1; /*´®ÐÐÊý¾Ý*/
sbit scl= P1^0; /*´®ÐÐʱÖÓ*/

void delay(uint tmp)
{ uint i;
for(i=0;i<tmp;i++);
}

void start(void) /*ÆðʼÌõ¼þ*/
{
sda=1;
scl=1;
delay(6);
sda=0;
delay(6);
}

void stop(void) /*Í£Ö¹Ìõ¼þ*/
{
sda=0;
scl=1;
delay(6);
sda=1;
delay(6);
}
void ack(void) /*Ó¦´ðλ*/
{
sda=0;
delay(6);
scl=1;
delay(6);
scl=0;
}

void noack(void) /*·´ÏòÓ¦´ðλ*/
{
sda=1;
delay(6);
scl=1;
delay(6);
scl=0;
}

bit cack(void)/*Ó¦´ð¼ì²é*/
{
bit btmp;
sda=1;
scl=1;
_nop_ ();
_nop_ ();
btmp=sda;
scl=0;
return(btmp);
}

void send(uchar dat) /*·¢ËÍÊý¾Ý×Ó³ÌÐò,DataΪҪÇó·¢Ë͵ÄÊý¾Ý*/
{ bit btmp;
uchar tmp,i; /*Öмä±äÁ¿¿ØÖÆ*/
tmp=dat;
for(i=0;i<8;i++)
{scl=0;
delay(6);
btmp=(bit)((tmp>>(7-i))&0x01);
sda=btmp;
scl=1;
delay(1);
}
scl=0;
}


uchar read(void) /*¶ÁÒ»¸ö×Ö½ÚµÄÊý¾Ý,²¢·µ»Ø¸Ã×Ö½ÚÖµ*/
{
uchar tmp=0;
bit btmp;
uchar i;
sda=1;
for(i=0;i<8;i++)
{
scl=0;
delay(6);
scl=1;
delay(6);
btmp=sda;
tmp=tmp+(((uchar)btmp)<<(7-i));
}
return(tmp);
}

void wronebyt(uchar addr,uchar dat)
{bit btmp;
start(); /*·¢ËÍÆô¶¯ÐźÅ*/
send(addwr); /*·¢ËÍSLA+W*/
do {btmp=cack();}while(btmp==1);
send(addr); /*·¢Ë͵ØÖ·*/
do {btmp=cack();}while(btmp==1);
send(dat);
do {btmp=cack();}while(btmp==1);
stop();
delay(2000);
}

uchar rdonebyt(uchar addr)
{bit btmp;
uchar i,tmp;
start();
send(addwr);
do {btmp=cack();}while(btmp==1);
send(addr);
do {btmp=cack();}while(btmp==1);
start();
send(addrd);
do {btmp=cack();}while(btmp==1);
tmp=Read();
scl=0;
noack();
stop();
return(tmp);
}



void main()
{uchar tmp;
wronebyt(0,3);
tmp=rdonebyt(0);

}

tony1976 2003-08-01
  • 打赏
  • 举报
回复
去看看吧
  • 打赏
  • 举报
回复
这是24c02的程序
24c16原理一样
http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=167229
ciniddvon 2003-08-01
  • 打赏
  • 举报
回复
有没有C51 程序啊

是不是我如果是使用 2416 需要地址 送地址 需要 少送一个啊
syl79 2003-08-01
  • 打赏
  • 举报
回复
这是CSI24C256的程序,与24C08是兼容的,最多你再把地址由2字节变为1字节。

I2CCSI EQU 0a0h ;CSI FLASH I2C address
;--------------------------------------------------------------------------
; CSI function
; input r2 : address of data
; r3 : data
;--------------------------------------------------------------------------

CSIWE: mov b,r2
lcall I2CSTT
mov a,#I2CCSI
lcall I2CSENB
jz CSIWE2
mov a,#00h
lcall I2CSENB
jz CSIWE2
mov a,r2
lcall I2CSENB
jz CSIWE2
mov a,r3
lcall I2CSENB
jz CSIWE2
lcall I2CSTP
mov r2,#14h
CSIWE1: mov r3,#00h
djnz r3,$
djnz r2,CSIWE1
CSIWE2: mov r2,b
ret

;--------------------------------------------------------------------------
; CSI function
; input r2 : address of data
; output a : data
;--------------------------------------------------------------------------

CSIRD: mov b,r2
lcall I2CSTT
mov a,#I2CCSI
lcall I2CSENB
jz CSIRD1
mov a,#00h
lcall I2CSENB
jz CSIRD1
mov a,r2
lcall I2CSENB
jz CSIRD1
lcall I2CSTT
mov a,#I2CCSI
setb acc.0
lcall I2CSENB
jz CSIRD1
mov a,#00h
lcall I2CRCVB
lcall I2CSTP
CSIRD1: mov r2,b
ret
;--------------------------------------------------------------------------
; i2c function, start a cycle
;--------------------------------------------------------------------------

I2CSTT: setb SDA
nop
setb SCL
nop ;establish time > 4.7us
nop
nop
nop
nop
clr SDA
nop ;lock time > 4us
nop
nop
nop
nop
clr SCL ;lock I2C bus
ret

;--------------------------------------------------------------------------
; i2c function, stop a cycle
;--------------------------------------------------------------------------

I2CSTP: clr SDA
nop
setb SCL
nop
nop
nop
nop
nop
setb SDA
nop
nop
nop
nop
ret

;--------------------------------------------------------------------------
; i2c function
; parameter passed by acc
; if success, acc = 1 else 0
;--------------------------------------------------------------------------

I2CSENB:push b
mov b,r7
push b
mov r7,#08h
I2CSEN1:rlc a
jc I2CSEN2
clr SDA
sjmp I2CSEN3
I2CSEN2:setb SDA
nop
I2CSEN3:nop
setb SCL
nop
nop
nop
nop
nop
clr SCL
djnz r7,I2CSEN1
nop
nop
setb SDA ;pull high, ready to reveice ack signal
nop
nop
setb SCL
nop
nop
mov a,#00h
jb SDA,I2CSEN4
mov a,#01h
I2CSEN4:nop
clr SCL
pop b
mov r7,b
pop b
ret

;--------------------------------------------------------------------------
; i2c function
; parameter passed by acc
; if acc = 1, emit ack. receive data in acc
;--------------------------------------------------------------------------

I2CRCVB:push b
mov b,r7
push b
setb SDA
mov b,a
mov a,#00h
mov r7,#08h ;a byte = 8 bits
I2CRCV1:nop
clr SCL
nop
nop
nop
nop
nop
setb SCL
nop
nop
clr c
jnb SDA,I2CRCV2 ;read data
setb c
I2CRCV2:rlc a
nop
nop
djnz r7,I2CRCV1
clr SCL ;emit ack signal
mov r7,a
mov a,b
clr SDA
jnz I2CRCV3
setb SDA
I2CRCV3:nop
nop
setb SCL
nop
nop
nop
nop
nop
clr SCL
mov a,r7
pop b
mov r7,b
pop b
ret
syl79 2003-08-01
  • 打赏
  • 举报
回复
这是CSI24C256的程序,与24C08是兼容的,最多你再把地址由2字节变为1字节。

I2CCSI EQU 0a0h ;CSI FLASH I2C address
;--------------------------------------------------------------------------
; CSI function
; input r2 : address of data
; r3 : data
;--------------------------------------------------------------------------

CSIWE: mov b,r2
lcall I2CSTT
mov a,#I2CCSI
lcall I2CSENB
jz CSIWE2
mov a,#00h
lcall I2CSENB
jz CSIWE2
mov a,r2
lcall I2CSENB
jz CSIWE2
mov a,r3
lcall I2CSENB
jz CSIWE2
lcall I2CSTP
mov r2,#14h
CSIWE1: mov r3,#00h
djnz r3,$
djnz r2,CSIWE1
CSIWE2: mov r2,b
ret

;--------------------------------------------------------------------------
; CSI function
; input r2 : address of data
; output a : data
;--------------------------------------------------------------------------

CSIRD: mov b,r2
lcall I2CSTT
mov a,#I2CCSI
lcall I2CSENB
jz CSIRD1
mov a,#00h
lcall I2CSENB
jz CSIRD1
mov a,r2
lcall I2CSENB
jz CSIRD1
lcall I2CSTT
mov a,#I2CCSI
setb acc.0
lcall I2CSENB
jz CSIRD1
mov a,#00h
lcall I2CRCVB
lcall I2CSTP
CSIRD1: mov r2,b
ret
;--------------------------------------------------------------------------
; i2c function, start a cycle
;--------------------------------------------------------------------------

I2CSTT: setb SDA
nop
setb SCL
nop ;establish time > 4.7us
nop
nop
nop
nop
clr SDA
nop ;lock time > 4us
nop
nop
nop
nop
clr SCL ;lock I2C bus
ret

;--------------------------------------------------------------------------
; i2c function, stop a cycle
;--------------------------------------------------------------------------

I2CSTP: clr SDA
nop
setb SCL
nop
nop
nop
nop
nop
setb SDA
nop
nop
nop
nop
ret

;--------------------------------------------------------------------------
; i2c function
; parameter passed by acc
; if success, acc = 1 else 0
;--------------------------------------------------------------------------

I2CSENB:push b
mov b,r7
push b
mov r7,#08h
I2CSEN1:rlc a
jc I2CSEN2
clr SDA
sjmp I2CSEN3
I2CSEN2:setb SDA
nop
I2CSEN3:nop
setb SCL
nop
nop
nop
nop
nop
clr SCL
djnz r7,I2CSEN1
nop
nop
setb SDA ;pull high, ready to reveice ack signal
nop
nop
setb SCL
nop
nop
mov a,#00h
jb SDA,I2CSEN4
mov a,#01h
I2CSEN4:nop
clr SCL
pop b
mov r7,b
pop b
ret

;--------------------------------------------------------------------------
; i2c function
; parameter passed by acc
; if acc = 1, emit ack. receive data in acc
;--------------------------------------------------------------------------

I2CRCVB:push b
mov b,r7
push b
setb SDA
mov b,a
mov a,#00h
mov r7,#08h ;a byte = 8 bits
I2CRCV1:nop
clr SCL
nop
nop
nop
nop
nop
setb SCL
nop
nop
clr c
jnb SDA,I2CRCV2 ;read data
setb c
I2CRCV2:rlc a
nop
nop
djnz r7,I2CRCV1
clr SCL ;emit ack signal
mov r7,a
mov a,b
clr SDA
jnz I2CRCV3
setb SDA
I2CRCV3:nop
nop
setb SCL
nop
nop
nop
nop
nop
clr SCL
mov a,r7
pop b
mov r7,b
pop b
ret

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧