📄 at24c02.c
字号:
//*****************************************************************
//MCU:AT892051
//EEPROM:AT24C02
//11.0592M晶振
//测试程序,绝对好用
//对PC波特率56000(呵呵,快了对程序影响小,但会出误码)
//******************************************************************
#include <at892051.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define AddWr 0xa0 /*器件地址选择及写标志*/
#define AddRd 0xa1 /*器件地址选择及读标志*/
/*有关全局变量*/
uchar bdata buffer;
sbit SDA = P3^5; /*串行数据*/
sbit SCL = P3^4; /*串行时钟*/
sbit WP = P3^3; /*硬件写保护*/
sbit B7 = buffer^7;
sbit B6 = buffer^6;
sbit B5 = buffer^5;
sbit B4 = buffer^4;
sbit B3 = buffer^3;
sbit B2 = buffer^2;
sbit B1 = buffer^1;
sbit B0 = buffer^0;
//----------------------------------------------------------------
//延时4.3uS,11.0592M晶振标准延时程序
//----------------------------------------------------------------
void delay_4uS(void)
{
;
}
//----------------------------------------------------------------
//延时j毫秒程序,11.0592M晶振非标准延时程序
//----------------------------------------------------------------
void mS_Delay(uchar j)
{
uchar i;
while(j>0)
{
i = 0;
j--;
while(i<114) i++;
}
}
//----------------------------------------------------------------
/*发送起始条件*/
//----------------------------------------------------------------
void Start_01(void) /*起始条件*/
{
do{
SDA=1;
SCL=1;
}while(!(SDA&&SCL)); //检测总线是否可用
delay_4uS();
SDA=0;
delay_4uS();
SCL=0;
}
//----------------------------------------------------------------
/*停止条件*/
//----------------------------------------------------------------
void Stop_01(void)
{
SDA=0;
SCL=1;
delay_4uS();
SDA=1;
_nop_();
_nop_();
}
//----------------------------------------------------------------
//检测应答位
//----------------------------------------------------------------
void Ack(void)
{
SDA = 1;
SCL=1;
_nop_();
_nop_();
while(SDA);
SCL=0;
}
//----------------------------------------------------------------
/*反向应答位*/
//----------------------------------------------------------------
void NoAck(void)
{
SDA=1;
delay_4uS();
SCL=1;
delay_4uS();
SCL=0;
}
//----------------------------------------------------------------
/*发送数据子程序,Data为要求发送的数据*/
//----------------------------------------------------------------
void Send_01(void)
{
uchar i; /*位数控制*/
for(i=0;i<8;i++)
{
SDA = B7;
buffer = buffer<<1;
delay_4uS();
SCL=1;
delay_4uS();
SCL = 0;
}
}
//-----------------------------------------------------------------------------
//读一个字节的数据,并返回该字节值,虽然资料说是负跳沿读出数据,
//可是在SCL高电平时读出才是正确的
//-----------------------------------------------------------------------------
void Read_01(void)
{
uchar i;
SDA=1;
for(i=0;i<8;i++)
{
buffer = buffer<<1;
SCL=1;
_nop_();
_nop_();
B0 = SDA;
_nop_();
SCL=0;
_nop_();
_nop_();
}
}
//----------------------------------------------------------------
//数据块写入,传递参数:数据块首址、写入地址、数据块长度
//---------------------------------------------------------------
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(); /*发送启动信号*/
buffer = AddWr;
Send_01(); /*选择器件*/
Ack();
buffer = Address+i;
Send_01(); /*发送地址*/
Ack();
buffer = *(PData+i);
Send_01();
Ack();
Stop_01();
mS_Delay(15);
}
WP = 1;
}
//----------------------------------------------------------------
//数据块读出,传递参数:数据块首址、读出地址、数据块长度
//---------------------------------------------------------------
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start_01();
buffer = AddWr;
Send_01();
Ack();
buffer = Address+i;
Send_01();
Ack();
Start_01();
buffer = AddRd;
Send_01();
Ack();
Read_01();
*(PData+i)= buffer;
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)
{
mS_Delay(1);
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 = 0x80;
P1 = 0X00;
}
void main()
{
uchar Number[50]={0};
uchar i;
SysInit();
WP= 1;
for(i=0;i<50;i++)
{
Number[i]=i;
}
WrToROM(Number,0,50); /*将初始化后的数值写入EEPROM*/
mS_Delay(20);
for(i=0;i<50;i++)
{
Number[i]=i+50;
}
WrToROM(Number,50,50); /*将初始化后的数值写入EEPROM*/
mS_Delay(20);
for(i=0;i<50;i++)
{
Number[i]=i+100;
}
WrToROM(Number,100,50); //将初始化后的数值写入EEPROM
mS_Delay(20);
for(i=0;i<50;i++)
{
Number[i]=i+150;
}
WrToROM(Number,150,50); //将初始化后的数值写入EEPROM
mS_Delay(20);
for(i=0;i<50;i++)
{
Number[i]=i+200;
}
WrToROM(Number,200,50); //将初始化后的数值写入EEPROM
mS_Delay(20);
for(i=0;i<255;i++)
{
RdFromROM(Number,i,1);
TI = 1;
ser_send(Number[0]);
}
WP= 1; //将AT24C01A写保护
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -