#include<reg52.h>
#define uchar unsigned char //宏定义
sbit sda=P2^0; // 定义位操作
sbit scl=P2^1;
sbit diola=P2^6; //锁存器片选
void delay() //短时间延迟
{ ; ;
}
void start() //开始信号
{ sda=1; /*在时钟线为高电平时,数据线从高电平变为低电平
*/
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //终止信号
{sda=0;
delay(); /* 在时钟线为高电平时,数据线从低电平变为高电平 */
scl=1;
delay();
sda=1;
delay();
}
void respone() //应答信号
{ uchar i;
scl=1;
delay();
while((sda==1)&&(i<255))i++; /*时钟线信号为高有效时,判断数据线 数据线为低表示接受方产生应答信号
若没产生则等待一段时间后默认为已经接受到数据*/
scl=0; //时钟线拉低,使得数据线数据可变更
delay();
}
void write(uchar datas) //写一个字节数据
{ uchar temp,i;
temp=datas; //将要写的数据传送给temps
delay();
for(i=0;i<8;i++) //写8次数据,每次一位
{
temp=temp<<1; //数据左移将高位溢出给CY
scl=0; //scl为高时sda 必须先稳定而且不能改变
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0; //数据传送结束则拉高sda,拉低scl信号
delay();
sda=1;
delay();
}
uchar read() //读一个字节数据
{ uchar i,j,k;
scl=0;
delay();
sda=1;
delay(); //将scl与sda分别置于常态即分别为低和高
for(i=0;i<8;i++)
{ scl=1; //scl为高,读取sda上数据给j
delay();
j=sda;
delay();
k=(k<<1)|j; //将已读取的数据左移并与读得的数据相或
scl=0; //时钟无效
delay();
}
delay();
return k;
}
void init()//初始化
{ /*将数据与时钟初始化*/
scl=1;
delay();
sda=1;
delay();
}
void write_add(uchar address,uchar adata)//在指定的地址上写数据
{ start(); //开始信号
write(0xa0); //写设备的地址与传送方向,
// 主机向从机写为0,反之为1。
//24c02的器件前四位为0x1010后三位则根据器件接的方式而定 最后一位为传送方向
respone(); //应答信号
write(address); //写数据存储的地址
respone();
write(adata);//写一个字节数据
respone();
stop(); //停止传送
}
uchar read_add(uchar address)//在给定地址读数据
{ uchar s;
start(); //开始信号
write(0xa0); //写设备的地址与传送方向
respone();
write(address); //写数据存储的地址
respone();
start(); //开始信号
write(0xa1);//从机向主机写数据
respone();
s=read(); //读取数据线上数据
stop(); //读完停止
return s; //返回值
}
void main() //主函数
{ uchar i;
diola=1; //锁存器有效,选中工作
init(); //初始化
write_add(4,0xf0); //在地址四中写数据0xf0
while(i!=255)i++; //等待一段时间
P1=read_add(5); //读取地址4中数据
while(1); //停留
}