网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月25日漏签0天
单片机学习吧 关注:25,479贴子:43,967
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 0回复贴,共1页
<<返回单片机学习吧
>0< 加载中...

I2C通信这有点问题 想问一下各位大佬各位大佬

  • 只看楼主
  • 收藏

  • 回复
  • Carey丶J
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

# include <reg52.h>
# include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define AT24C02_ADDR 0xa0//AT24C02地址
/*I2C IO口定义*/
sbit SDA = P2^0;
sbit SCL = P2^1;
/*5us延时*/
void delay_5us()
{
_nop_();
}
/*1Ms延时*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/*I2C初始化*/
void I2C_init()
{
SDA = 1;
_nop_();
SCL = 1;
_nop_();
}
/*I2C起始信号*/
void I2C_Start()
{
SCL = 1;
_nop_();
SDA = 1;
delay_5us();
SDA = 0;
delay_5us();
}
/*I2C终止信号*/
void I2C_Stop()
{
SDA = 0;
_nop_();
SCL = 1;
delay_5us();
SDA = 1;
delay_5us();
}
/*主机发送应答*/
void Master_ACK(bit i)
{
SCL = 0; // 拉低时钟总线允许SDA数据总线上的数据变化
_nop_(); // 让总线稳定
if (i) //如果i = 1 那么拉低数据总线 表示主机应答
{
SDA = 0;
}
else
{
SDA = 1; //发送非应答
}
_nop_();//让总线稳定
SCL = 1;//拉高时钟总线 让从机从SDA线上读走 主机的应答信号
delay_5us();
SCL = 0;//拉低时钟总线, 占用总线继续通信
_nop_();
SDA = 1;//释放SDA数据总线。
_nop_();
}
/*检测从机应答*/
bit Test_ACK()
{
SCL = 1;
delay_5us();
if (SDA)
{
SCL = 0;
_nop_();
I2C_Stop();
return(0);
}
else
{
SCL = 0;
_nop_();
return(1);
}
}
/*发送一个字节*/
void I2C_send_byte(uchar byte)
{
uchar i;
for(i = 0 ; i < 8 ; i++)
{
SCL = 0;
_nop_();
if (byte & 0x80)
{
SDA = 1;
_nop_();
}
else
{
SDA = 0;
_nop_();
}
SCL = 1;
_nop_();
byte <<= 1;// 0101 0100B
}
SCL = 0;
_nop_();
SDA = 1;
_nop_();
}
/*I2C 读一字节*/
uchar I2C_read_byte()
{
uchar dat,i;
SCL = 0;
_nop_();
SDA = 1;
_nop_();
for(i = 0 ; i < 8 ; i++)
{
SCL = 1;
_nop_();
if (SDA)
{
dat |= 0x01; //
}
else
{
dat &= 0xfe;//1111 1110
}
_nop_();
SCL = 0 ;
_nop_();
if(i < 7)
{
dat = dat << 1;
}
}
return(dat);
}
/*I2C发送数据*/
bit I2C_TransmitData(uchar ADDR, DAT)
{
I2C_Start();
I2C_send_byte(AT24C02_ADDR+0);
if (!Test_ACK())
{
return(0);
}
I2C_send_byte(ADDR);
if (!Test_ACK())
{
return(0);
}
I2C_send_byte(DAT);
if (!Test_ACK())
{
return(0);
}
I2C_Stop();
return(1);
}
/*I2C接收数据*/
uchar I2C_ReceiveData(uchar ADDR)
{
uchar DAT;
I2C_Start();
I2C_send_byte(AT24C02_ADDR+0);
if (!Test_ACK())
{
return(0);
}
I2C_send_byte(ADDR);
Master_ACK(0);
I2C_Start();
I2C_send_byte(AT24C02_ADDR+1);
if (!Test_ACK())
{
return(0);
}
DAT = I2C_read_byte();
Master_ACK(0);
I2C_Stop();
return(DAT);
}
void main()
{
I2C_init();//I2C初始化
if(!I2C_TransmitData(255,0xf0));//往AT24C02第255个单元中写入数据0XF0
{
P1 = 0;
}
delay(5);
/**/
P1 = I2C_ReceiveData(255);//从AT24C02第255个单元中读取数据
while(1);
}


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 0回复贴,共1页
<<返回单片机学习吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示