📄 at24c01.bak
字号:
#include <at892051.h>
#define uchar unsigned char
#define uint unsigned int
#define AddWr 0xae /*器件地址选择及写标志*/
#define AddRd 0xaf /*器件地址选择及读标志*/
/*有关全局变量*/
sbit SDA = P3^5; /*串行数据*/
sbit SCL = P3^4; /*串行时钟*/
sbit WP = P3^3; /*硬件写保护*/
sbit A7 = ACC^7;
sbit A6 = ACC^6;
sbit A5 = ACC^5;
sbit A4 = ACC^4;
sbit A3 = ACC^3;
sbit A2 = ACC^2;
sbit A1 = ACC^1;
sbit A0 = ACC^0;
//----------------------------------------------------------------
//延时9.8uS,11.0592M晶振标准延时程序
//----------------------------------------------------------------
/*void delay_10uS(void)
{
uchar i;
for(i=0;i<1;i++);
}*/
//----------------------------------------------------------------
//延时4.3uS,11.0592M晶振标准延时程序
//----------------------------------------------------------------
void delay_4uS(void)
{
;
}
void mDelay(uchar j)
{
uchar i;
while(j>0)
{
i = 0;
j--;
while(i<114) i++;
}
}
//----------------------------------------------------------------
/*发送起始条件*/
//----------------------------------------------------------------
void Start_01(void) /*起始条件*/
{
SDA=1;
SCL=1;
delay_4uS();
SDA=0;
delay_4uS();
}
//----------------------------------------------------------------
/*停止条件*/
//----------------------------------------------------------------
void Stop_01(void)
{
SDA=0;
SCL=1;
delay_4uS();
SDA=1;
delay_4uS();
}
//----------------------------------------------------------------
/*应答位*/
//----------------------------------------------------------------
void Ack(void)
{
SDA=0;
delay_4uS();
SCL=1;
delay_4uS();
SCL=0;
}
//----------------------------------------------------------------
/*反向应答位*/
//----------------------------------------------------------------
void NoAck(void)
{
SDA=1;
delay_4uS();
SCL=1;
delay_4uS();
SCL=0;
}
//----------------------------------------------------------------
/*发送数据子程序,Data为要求发送的数据*/
//----------------------------------------------------------------
void Send_01(uchar Data)
{
uchar i; /*位数控制*/
ACC = Data;
for(i=0;i<8;i++)
{
SCL=0;
delay_4uS();
SDA = A7;
ACC = ACC<<1;
SCL=1;
delay_4uS();
}
SCL=0;
}
//-----------------------------------------------------------------------------
/*读一个字节的数据,并返回该字节值*/
//-----------------------------------------------------------------------------
uchar Read_01(void)
{
uchar temp=0;
uchar i;
SDA=1;
for(i=0;i<8;i++)
{
SCL=0;
delay_4uS();
SCL=1;
A1 = SDA;
ACC = ACC<<1;
delay_4uS();
}
temp = ACC;
return(temp);
}
//----------------------------------------------------------------
//数据块写入,传递参数:数据块首址、写入地址、数据块长度
//---------------------------------------------------------------
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
uchar data i;
uchar data *PData;
WP = 0;
PData=Data;
for(i=0;i<Num;i++)
{
Start_01(); /*发送启动信号*/
Send_01(AddWr); /*发送SLA+W*/
Ack();
Send_01(Address+i); /*发送地址*/
Ack();
Send_01(*(PData+i));
Ack();
Stop_01();
mDelay(20);
}
WP = 1;
}
//----------------------------------------------------------------
//数据块读出,传递参数:数据块首址、读出地址、数据块长度
//---------------------------------------------------------------
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start_01();
Send_01(0xa0);
Ack();
Send_01(Address+i);
Ack();
Start_01();
Send_01(0xa1);
Ack();
*(PData+i)=Read_01();
SCL=0;
NoAck();
Stop_01();
}
}
//-------------------------------------------
//串口发送子程序,条件:TI=1,ES=0;
//---------------------------------------------
void ser_send(uchar a)
{
while(TI==0);
SBUF = a;
TI=0;
}
/*=============================================================================
*Name :SysInit
*Descripton :sysem initialization
*Status :Done
=============================================================================*/
void SysInit(void)
{
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD = 0x21; /* T0工作于方式1,十六位定时器,T1工作于方式2 */
TH1 = 0xff; /* TH1: reload value for 1200 baud @ 16MHz */
TL1 = 0xff;
PCON = PCON|0x80;
TL0 = 0x3f;
TH0 = 0xfe;
TR1 = 1; /* TR1: timer 1 run */
TR0 = 1; /* TR0: timer 0 run */
IE = 0x82;
mDelay(1);
mDelay(5);
mDelay(10);
mDelay(50);
mDelay(100);
mDelay(200);
}
void main()
{
uchar Number[4]={1,2,3,4};
SysInit();
mDelay(1);
WP= 1; //将AT24C01A写保护
WrToROM(Number,4,4); /*将初始化后的数值写入EEPROM*/
mDelay(20);
Number[0]=0;
Number[1]=0;
Number[2]=0;
Number[3]=0; /*将数组中的值清掉,以验证读出的数是否正确*/
RdFromROM(Number,4,4);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -