#define uchar unsigned char
#define uint unsigned int
sbit SCK=P3^6; //串行时钟输入
sbit SDA=P3^7; //串行数据输入/输出
void Start()//起始信号
{
SDA=1;
delay5us();//延时要大于4.7us,取5u
SCK=1;
delay5us();
SDA=0;
delay5us();
}
void Stop()//结束信号
{
SDA=0;
delay5us();//延时要大于4.7us,取5us
SCK=1;
delay5us();
SDA=1;
delay5us();
}
void Ack()//应答信号
{
SDA=0;
SCK=0;
delay5us();
SCK=1;
delay5us();
SCK=0;
}
/*SCK在高电平期间,SDA被拉为低电平表示应答*/
bit WaitAck()//等待应答信号
{
SDA=1;//释放总线
delay5us();
SCK=1;
delay5us();
if(SDA)//无应答
{
SCK=0;
Stop();
return 0;
}
else
{
SCK=0;
return 1;
}
}
void InputOneByte(uchar dat)//写入一个字节AT24C02
{
uchar iVal;
for(iVal=0;iVal<8;iVal++)
{
SCK=0;
delay5us();
SDA=(dat & 0x80)>>7;//将数据的最高位放入SAD,如0011 0010
//则将末位0送入SDA
delay5us();
SCK=1;
dat<<=1;//数据左移一位,准备存第二位数
}
SCK=0;
}
uchar OutputOneByte()//读取一个字节
{
uchar iVal;
uchar x;//保存读取到的值
SDA=1;//释放总线,以让SDA线转由接收设备(AT24C02)控制
for(iVal=0;iVal<8;iVal++)
{
SCK=0;
delay5us();
SCK=1;
delay5us();
x<<=1;//从低位开始读
if(SDA)
x |= 0x01;//将SDA上的数据通过按位“或“运算存入x中
}
SCK=0;
return x;
}
void WriteAddAndDate(uchar add,uchar dat)
{
Start();//启动
InputOneByte(0xA0);//写入器件AT24C02地址
WaitAck();//等待器件应答
InputOneByte(add);//存放数据的地址
WaitAck();//等待器件应答
InputOneByte(dat);//要保存的数据
WaitAck();//等待器件应答
Stop();
}
uchar ReadDataFromDatAdd(uchar DatAdd)//从某个地址读取数据
{
uchar Data;
Start();
InputOneByte(0xA0);//写入器件AT24C02地址
WaitAck();//等待器件应答
InputOneByte(DatAdd);//存放数据的地址
WaitAck();//等待器件应答
Start();
InputOneByte(0xA1);//读取数据的器件地址
WaitAck();//等待器件应答
Data=OutputOneByte();//d读取数据
Stop();
return Data;
}
void main()
{
float AT;
/**********AT24C02转换***********/
LCD_Initial();
GotoXY(0,0);//设定显示位置
WriteAddAndDate(0X01,0X85);
AT=ReadDataFromDatAdd(0X00);
sprintf(table2,"The data is:%f",AT);//将数据写入table2中
Print(table2);//打印
while(1);
}
|