機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
單片機(jī)讀寫24C01的C51程序
單片機(jī)讀寫24C01的C51程序
 更新時(shí)間:2010-1-26 16:55:12  點(diǎn)擊數(shù):0
【字體: 字體顏色
/*--------------------------24C01的IIC 讀寫的c51程序--------------------- 
程序中很多NOP是冗余的,希望讀者能進(jìn)一步精簡(jiǎn),但必須經(jīng)過(guò)驗(yàn)證。 
Atmel 24C01 比較特殊,為簡(jiǎn)約型. 
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ù)說(shuō)明:內(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ù)說(shuō)明:內(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); //寫頁(yè)地址和操作方式 
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); //寫頁(yè)地址和操作方式,對(duì)于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.這是一個(gè)讀寫24C系列EEPROM的程序,已經(jīng)經(jīng)過(guò)本人親自測(cè)試,通過(guò)。。。。 

//************************************* 
//** 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 
//** 進(jìn)行讀寫的字節(jié)數(shù),EEPROM首址,EEPROM控制字節(jié), 
//** 以及EEPROM類型。此程序結(jié)構(gòu)性良好,具有極好的容錯(cuò)性,程序機(jī)器碼也不多:  
//** 以上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;  



//如果你對(duì)本程序或者24C01讀寫還有什么疑問(wèn),歡迎到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時(shí)有應(yīng)答 
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; //型號(hào) 
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行列鍵盤掃描程序
  • 下一篇: 沒(méi)有了
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

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

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

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