当前位置:
文档之家› 51单片机i2c协议示例程序
51单片机i2c协议示例程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P3^5;
sbit scl=P3^4;
void start_bit();
void stop_bit();
void slave_ack();
write_byte(0xa1);
slave_ack();
date=read_byte();
no_ack();
stop_bit();
return date;
}
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=0x40;j>0;j--);
}
sda=1;
else
sda=0;
scl=1;
dat<<=1;
scl=0;
}
}
uchar read_byte()//读一个字节
{
uchar i,dat=0;
sda=1;
for(i=0;i<8;i++)
{
dat<<=1;
scl=1;
if(sda==1)
dat|=0x01;
scl=0;
}
return dat;
void stop_bit()//停止位
{
sda=0;
_nop_();
scl=1;
_nop_();
sda=1;
}
void slave_ack()//应答信号
{
_nop_();
_nop_();
scl=0;
_nop_();;
sda=1;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
stop_bit();
delay(100);
}
uchar read_date(uchar addr)//指定位置读一个字节
{
uchar date;
start_bit();
write_byte(0xa0);
slave_ack();
write_byte(addr);
slave_ack();
start_bit();
}
void write_date(uchar addr,uchar date)//在指定地址写一个字节
{
start_bit();
write_byte(0xa0);
slave_ack();
write_byte(addr);
slave_ack();
write_byte(date);
slave_ack();
while(sda);
//P0=0xfe;
scl=0;
}
void no_ack()//无应答
{
sda=1;
_nop_();
scl=1;
_nop_();
scl=0;
}
void write_byte(uchar dat)//写一个字节
{
uchar i;
scl=0;
for(i=0;i<8;i++)
{
if(dat&0x80)
void no_ack();
void write_byte(uchar dat);
uchar read_byte();
void write_date(uchar addr,uchar date);
uchar read_date(uchar addr);
void delay(uint x);
void main()
{
uchar num;
write_date(0x01,0xaa);
delay(2);
num=read_date(0x01);
P0=num;
while(1);
}
void start_bit()//开始位
{
scl=1;
_nop_();
sda=1;
_nop_(Baidu Nhomakorabea;
sda=0;
_nop_();
scl=0;
}