? 程序中很多NOP是冗余的,希望讀者能進一步精簡,但必須經過驗證。
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--);
}
/*----------------------------------------------------------------------------
調用方式: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();
}
2.這是一個讀寫24C系列EEPROM的程序,已經經過本人親自測試,通過!!!!!
//*************************************
//** 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
//** 進行讀寫的字節數,EEPROM首址,EEPROM控制字節,
//** 以及EEPROM類型。此程序結構性良好,具有極好的容錯性,程序機器碼也不多:
//** 以上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的字節讀寫操作程序,
//**************************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
評論
查看更多