?? atmel 24c01.txt
字號:
用【 小 | 中 | 大 】字體瀏覽
C51編程:不知哪位大蝦有完全正確的用C51寫的24C01的讀寫程序,能給小弟一份嗎,不勝感謝,我的E-MAIL:AXIAXI520@SINA.COM [axiaxi520] [11次] 01-10-16 下午 02:43:27
我在網上找的,挺好用.好像在www.mcu51.com [matao403] [8次] 01-10-16 下午 02:51:53
24C01 [zlingzi] [18次] 01-10-16 下午 03:07:38
以前的帖子上有24C02的,你要不要?
要啊,但是不知道好不好用啊,先發給我好嗎,謝謝了! [axiaxi520] [5次] 01-10-16 下午 03:37:46
24c01與24C02不同,24C01(atmel)是簡約型的.以下是讀寫程序.多年以來,數據奔騰而過,從未錯過 [半夜開車] [36次] 01-10-16 下午 03:47:59
/*------------------------------------------------------------------------------
為了安全起見,程序中很多NOP是冗余的,希望讀者能進一步精簡,但必須經過驗證。
Atmel 24C01 比較特殊,為簡約型.
51晶振為11.0592MHz
〖參考〗<a href=http://www.c51bbs.com target=_blank>http://www.c51bbs.com</a>
〖版本〗V1.00A Build 0918
-----------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
sbit SCL= P1^5;
sbit SDA= P1^4;
delay()
{
unsigned int i=1200;
while(i--);
}
/*----------------------------------------------------------------------------
調用方式:write_8bit(unsigned char ch) ﹫2001/03/23
函數說明:內函數,私有,用戶不直接調用。
-------------------------------------------------------------------------------
*/
void write_8bit(unsigned char ch)
{
unsigned char i=8;
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
while (i--)
{
SDA=(bit)(ch&0x80);
_nop_();_nop_();_nop_();_nop_();_nop_();
ch<<=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*------------------------------------------------------------------------------
調用方式:void ACK(void) ﹫2001/03/23
函數說明:內函數,私有,用戶不直接調用。
-------------------------------------------------------------------------------
*/
void ACK(void)
{
unsigned char time_1;
SDA=1;
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
time_1=5;
while(SDA) {if (!time_1) break;} //ACK
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
unsigned char ReadIIC_24C01(unsigned char address)
{
unsigned char ddata=0;
unsigned char i=8;
SCL=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
SCL=0; //START
write_8bit( (address<<1) | 0x01); //寫頁地址和操作方式
ACK();
while (i--)
{
SDA=1;
ddata<<=1;
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
if (SDA) ddata|=0x01;
}
SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1; //STOP
delay();
return ddata;
}
void WriteIIC_24C01(unsigned char address,unsigned char ddata)
{
SCL=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
SCL=0; //START
write_8bit( (address<<1) & 0xfe); //寫頁地址和操作方式,對于24C32-
24C256,page不起作用
ACK();
write_8bit(ddata); //發送數據
ACK();
SDA=0;
_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1; //STOP
delay();
}
24C02 [zlingzi] [41次] 01-10-16 下午 03:53:42
#include <stdio.h>
#include <absacc.h>
sbit led=P1^0;
sbit led2=P1^1;
sbit scl=P3^5; //24c02 SCL
sbit sda=P3^4; //24c02 SDA
sbit DOG=P1^7; //狗
uchar x24c02_read(uchar address); //從24c02的地址address中讀取一個字節數據
void x24c02_write(uchar address,uchar info);
//向24c02的address地址中寫入一字節數據info
void x24c02_init(); //24c02初始化子程序
void delay1(uchar x);
void flash();
void x24c01_init();
void start();
void stop();
void writex(uchar j);
uchar readx();
void clock();
void delay1(uchar x)
{
uint i;
for(i=0;i<x;i++);
DOG=~DOG;
}
void flash()
{
uchar u;
DOG=~DOG;
}
void x24c02_init()
{
scl=1; flash(); sda=1; flash();
}
void start()
{
sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
}
void stop()
{
sda=0; flash(); scl=1; flash(); sda=1; flash();
}
void writex(uchar j)
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++){
temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();
}
scl=0; flash(); sda=1; flash();
}
uchar readx()
{
uchar i,j,k=0;
scl=0; flash(); sda=1;
for (i=0;i<8;i++){
flash(); scl=1; flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j; scl=0;
}
flash(); return(k);
}
void clock()
{
uchar i=0;
scl=1; flash();
while ((sda==1)&&(i<255))i++;
scl=0; flash();
}
uchar x24c02_read(uchar address)
{
uchar i;
start(); writex(0xa0);
clock(); writex(address);
clock(); start();
writex(0xa1); clock();
i=readx(); stop();
delay1(10);
return(i);
}
void x24c02_write(uchar address,uchar info)
{
EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
EA=1;
delay1(50);
}
//====================================================================//
main (){
uchar data a=2,b=10,c=0;
x24c02_init();
x24c02_write(a,b);
delay1(200);
c=x24c02_read(a);
if(c==b)led=0;
led2=0;
}
//===================================================================//
點擊這里回復這篇貼子>>
_____________________________________________________________________________
Copyright?,C51BBS論壇 2000-2002
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -