51单片机i2c协议示例程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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;
}
#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;
}