#include<reg52.h>
#define uchar unsigned char
sbit sda=P3^5; //数据
sbit scl=P3^4; //时钟
uchar a;
void delay() //延时
{ ;; }
void start() //开始信号 在scl时钟高电平时数据sda由高到低跳变
{
sda=1;
scl=1;
delay(); //延时
sda=0;
delay(); //延时
}
void stop() //停止 在scl时钟高电平时数据sda由低到高跳变
{
sda=0;
scl=1;
delay(); //延时
sda=1;
delay(); //延时
}
void respons() //应答 在scl时钟高电平时检测数据sda由高到低跳变,经过几个周期无应答自动跳过
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++; //当i=250时无应答自动跳过
scl=0;
delay();
}
void init() //初始化
{
sda=1;
scl=1;
delay(); //延时
}
void write_byte(uchar date) //写一个字节
{
uchar i,temp;
temp=date;
for(i=0;i<8;i ++) //循环8次写入一个字节
{
temp=temp<<1; //temp中的数据左移,最高位移入CY存储器中,低位补零
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_byte() //读取一个字节
{
uchar i,k;
scl=0;
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda; //k左移低位用sda代替(左移完后与sda与运算),循环8次,取出完整的字节
scl=0;
delay();
}
return k; //返回k值
}
void delay1(uchar x) //延时函数
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_add(uchar address,uchar date) //完整的写字节过程
{
start(); //开始信号
write_byte(0xa0); //发送片选并选择写
respons(); //应答
write_byte(address); //发送要写入的地址
respons(); //应答
write_byte(date); //发送要写入的数据
respons(); //应答
stop(); //停止
}
uchar read_add(uchar address) //完整的读字节过程
{
uchar date;
start(); //开始信号
write_byte(0xa0); //发送片选并选择写
respons(); //应答
write_byte(address); //发送要读取的地址
respons(); //应答
start(); //开始信号
write_byte(0xa1); //发送片选并选择读
respons(); //应答
date=read_byte(); //读取数据
stop(); //停止
return date; //返回date
}
void main()
{
init(); //初始化
write_add(23,0x5a); //在位置23中写入5a
delay1(100); //延时函数
P1=read_add(23); //在位置23中读取数据并对P!口赋值
while(1);
}
全部程序51hei下载地址:
24c02例程.zip
(20.52 KB, 下载次数: 57)
|