機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
單片機讀寫24C01的C51程序
單片機讀寫24C01的C51程序
 更新時間:2010-1-26 16:55:12  點擊數(shù):0
【字體: 字體顏色
/*--------------------------24C01的IIC 讀寫的c51程序--------------------- 
程序中很多NOP是冗余的,希望讀者能進一步精簡,但必須經(jīng)過驗證。 
Atmel 24C01 比較特殊,為簡約型. 
51晶振為11.0592MHz 
---------------------------------------------------------------*/ 
#include "reg51.h" 
#include "intrins.h" 

sbit SCL= P1^5; 
sbit SDA= P1^4; 

delay() 

unsigned int i=1200; 
while(i--); 

/*---------------------------------------------------------------------------- 
調(diào)用方式:write_8bit(unsigned char ch) ﹫2001/03/23 
函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。 
------------------------------------------------------------------------------- 
*/ 
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_(); 


/*------------------------------------------------------------------------------ 
調(diào)用方式:void ACK(void) ﹫2001/03/23 
函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。 
------------------------------------------------------------------------------- 
*/ 
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); //發(fā)送數(shù)據(jù) 
ACK(); 
SDA=0; 
_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); 
SDA=1; //STOP 
delay(); 



2.這是一個讀寫24C系列EEPROM的程序,已經(jīng)經(jīng)過本人親自測試,通過。。。! 

//************************************* 
//** M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256 
//** 21c01,24c02:1010A2A1A0R/W; 24C04:1010A2A1P0R/W; 24C08:1010A2P1P0R/W 
//** 24C16:1010P2P1P0R/W; //** 以上6種芯片的讀寫格式為:start-device addr-ack-first word addr-ack-second word addr-ack-data-ack-stop 
//** 進行讀寫的字節(jié)數(shù),EEPROM首址,EEPROM控制字節(jié), 
//** 以及EEPROM類型。此程序結(jié)構(gòu)性良好,具有極好的容錯性,程序機器碼也不多:  
//** 以上5種芯片的讀寫格式為:start-device addr-ack-word addr-ack-data-ack-stop  
//** 24c32-24c512:1010A2A1A0R/W; 24C1024:1010A2A1P0R/W; 24c1024:1010A2A1P0R/W //** 通用的24C01-24C1024共11種EEPROM的字節(jié)讀寫操作程序,  

//**************************24C01讀寫的c51源程序*********************************** 
#i nclude  
#i nclude  
#i nclude  
#i nclude  

sbit SDA =P1^1; 
sbit SCL =P1^4; 
sbit WP =P1^7; 
sbit light =P1^0; 
sbit power =P1^6; 

#define uchar unsigned char 
#define uint unsigned int 

void iic_delay10ms(); 
void iic_delay(void); 
void iic_start(void); 
void iic_stop(void); 
void iic_ack(void); 
void read_byte(void); 
void send_byte(void); 
void initial(void); 
void ok(void); 
void error(void); 
void read_eeprom(void); 
void write_eeprom(void); 
void init(void); 

uchar ack_flag,send_data,receive_data[32];  
uchar rw,type,device_addr,addr[3],num; 

void main(void) 
{  
initial();  
power =0; 
light =0; 

while(1) 
{  
ES =1; 
rw =0x55; 
WP =0; 
while(rw ==0x55); 
ES =0; 
switch(type) 

case 0x01: 
case 0x02: 
case 0x04: 
case 0x08: 
case 0x16:  
type =0x02; 
addr[1] |=0xa0; 
device_addr <<=1; 
addr[1] |=device_addr; 
break; 
default: 
type =0x03; 
addr[2] |=0xa0;  
device_addr <<=1; 
addr[2] |=device_addr;  
}  
if(rw ==0x01) //讀EEPROM 

read_eeprom(); 

else if(rw ==0x00) //寫EEPROM 

write_eeprom(); 

else //error command 
{  
error();  
ACC =0x01; 
SBUF =ACC; 
while(!TI); 
TI =0;  
}  



void read_eeprom(void) 

uchar i; 
WP =1; 
iic_start(); 
for(i=1;i<=type;i++) 

send_data =addr[type-i]; 
send_byte(); 
iic_ack(); 
if(ack_flag ==0x01) 
break; 

if(ack_flag ==0x00) 
{  
iic_start(); 
addr[type-1] |=0x01; 
send_data =addr[type-1]; 
send_byte(); 
iic_ack(); 
if(ack_flag ==0x00) 
{  
for(i=0;i { 
read_byte(); 
SBUF =send_data; 
while(!TI); 
TI =0; 
SDA =0; 
SCL =1; 
iic_delay(); 
SCL =0; 

iic_stop(); 
rw =0x55; 

else 

error(); 
ACC =0x03; 
SBUF =ACC; 
while(!TI); 
TI =0; 


else 
{  
error();  
ACC =0x02; 
SBUF =ACC; 
while(!TI); 
TI =0;  



//如果你對本程序或者24C01讀寫還有什么疑問,歡迎到http://www.51hei.com的論壇去交流。 

void write_eeprom(void) 

uchar i;  
WP =0; 
iic_start(); 
for(i=1;i<=type;i++) 

send_data =addr[type-i]; 
send_byte(); 
iic_ack(); 
if(ack_flag ==0x01) 
break; 

if(ack_flag ==0x00) 

for(i=0;i { 
send_data =receive_data[i]; 
send_byte(); 
iic_ack(); 
iic_delay10ms();  

iic_stop(); 
rw =0x55; 

else 

error(); 
ACC =0x04; 
SBUF =ACC; 
while(!TI); 
TI =0; 




void read_byte(void) 

uchar i,temp=0x80; 
send_data =0x00; 
SCL =0; 
for(i=0;i<8;i++) 
{  
SDA =1; 
SCL =1; 
if(SDA) 
send_data |=temp; 
temp/=2;  
SCL =0; 
iic_delay(); 
}  


void send_byte(void) 

uchar i,temp=0x80; 
for(i=0;i<8;i++) 

if((send_data&temp)==temp) 

SDA =1; //sda=1 

else 

SDA =0; //sda=0 

temp /=2; 
iic_delay(); 
SCL =1; 
iic_delay(); 
SCL =0; 
iic_delay(); 



void iic_start(void) 

SDA =1; 
SCL =1; 
WP =0; 
iic_delay(); 
SDA =0; 
iic_delay(); 
SCL =0; 


void iic_stop(void) 

SDA =0; 
SCL =1; 
iic_delay(); 
SDA =1; 
//WP =1; 


void iic_ack(void) 

ack_flag =0x00; //ack_flag等于0x00時有應答 
SDA =1;  
iic_delay(); 
SCL =1; 
iic_delay(); 
if(SDA) 

ack_flag =0x01; 

SCL =0; 


void iic_delay(void) 
{  
_nop_(); 
_nop_(); 
_nop_(); 
_nop_(); 


void iic_delay10ms(void) 

#pragma ASM 
MOV r6,#200 
MOV r7,#10 
delay: 
nop 
nop 
nop 
djnz r6,delay 
MOV r6,#200 
djnz r7,delay 
#pragma ENDASM  


void initial(void) 
{  
TMOD =0x21; 
TH1 =0xfd; 
TL1 =0xfd; 
TH0 =0xfd; 
TL0 =0xfd; 
SCON =0x50; 
TR1 =1; 
EA =1; 
ES =1; 
ET0 =1;  
PT0 =1; 


void ok(void) 

ACC =0x55; 
SBUF =ACC; 
while(!TI); 
TI =0; 
ACC =0xaa; 
SBUF =ACC; 
while(!TI); 
TI =0;  


void error(void) 

ACC =0xaa; 
SBUF =ACC; 
while(!TI); 
TI =0; 
ACC =0x55; 
SBUF =ACC; 
while(!TI); 
TI =0; 
rw =0x55;  

void es_int(void)interrupt 4 
{  
uchar i; 
RI =0; 
type =SBUF; //型號 
while(!RI); 
RI =0; 
device_addr =SBUF; //器件地址 
for(i=0;i<3;i++) 

while(!RI); 
RI =0; 
addr[2-i] =SBUF; //地址高、中、低位字節(jié) 
}  
while(!RI); 
RI =0; 
num =SBUF; //要操作的字節(jié)數(shù) 
while(!RI); 
RI =0; 
rw =SBUF; 
if(rw ==1) //接收到要讀的命令 

ok(); 

else //接收到要寫的命令 
{  
for(i=0;i { 
while(!RI); 
RI =0; 
receive_data[i]=SBUF; 
}  
ok(); 

//else 
//{ 
// error(); 
//}  

  • 上一篇: C51行列鍵盤掃描程序
  • 下一篇: 沒有了
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1