找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3286|回复: 9
打印 上一主题 下一主题
收起左侧

i2c通信求助

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>
#define uchar unsigned char
#define slavewriteaddr 0x90  //定义从机写控制字节
#define slavereadaddr 0x91   //定义从机读控制字节
typedef unsigned char uint8
;uint8 date;
sbit SDA=P2^0;               //定义I2C通信的数据线
sbit SCL=P2^1;               //定义I2C通信的时钟线
sbit DS1302=P2^4;            //定义DS1302的复位引脚
void delay(uchar x)     //延时xms函数
{
uchar i,j;
for(i=x;i>0;i--)
   for(j=110;j>0;j--);
}
void init_ser()        //串口初始化,设置通信速率9600
{
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ET1=0;
}
void I2C_start()       //I2C起始信号
{
SCL=1;
delay(1);
SDA=1;
delay(1);
SDA=0;
delay(1);
SCL=0;
}
void I2C_init()       //I2C初始化信号
{
SDA=1;
delay(1);
SCL=1;
delay(1);
}
void I2C_stop()       //I2C结束信号
{
SDA=0;
delay(1);
SCL=1;
delay(1);
SDA=1;
delay(1);
SCL=0;
delay(1);
}
uint8 I2C_writebyte(uint8 y)      //I2C写(发送)一个字节,y为待发送的字节数据
{
uchar i;
for(i=0;i<8;i++)
{
  SCL=0;
  delay(1);
  if(bit(y&0x80))
  SDA|=0x01;
  else
  SDA&=0xfe;
  delay(1);
  SCL=1;
  delay(1);
  y<<=1;
}
SDA=1;
delay(1);
SCL=1;
delay(1);
SDA=0;
delay(1);
SCL=0;
delay(1);

}
uchar I2C_readbyte()            //I2C读(接收)一个字节 ,y用于储存读到的字节数据
{
uchar i;
uint8 y;
for(i=0;i<8;i++)
{
  SDA=1;                            //释放数据总线
  SCL=0;
  y<<=1;
  if(SDA)
   y|=0x01;
  delay(1);
  SCL=1;
}
return y;
SCL=0;
delay(1);
SDA=1;
delay(1);
SCL=1;
delay(1);
SCL=0;
delay(1);

}
uchar readtype(uchar addr)          //I2C从PCF8591的某个通道读取数据
{
I2C_start();
I2C_writebyte(slavewriteaddr);
delay(1);
I2C_writebyte(addr);
delay(1);
I2C_start();
I2C_writebyte(slavereadaddr);
delay(1);
date=I2C_readbyte();
I2C_stop();
return date;
}
void UART_send(uint8 date)            //I2C从PCF8591读到的数据发送到串口缓存
{
SBUF=date;
while(!TI);
TI=0;
}
void main()                           //主函数
{
I2C_init();
init_ser();
DS1302=0;
while(1)
{
readtype(0x42);                       //从PCF8591通道2读取数据,并设置串口输出使能和单通道输入
UART_send(date);
delay(100);
}
}

各位大虾,好
我做串口调试时,用的PCF8591怎么读取的数据一直是ff?请大神们帮我解答下,万分感谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:141391 发表于 2016-10-5 19:49 | 只看该作者
我当时也是ff,后来发现是器件的地址写错了,你是不是看别人的视屏自己写的程序,你得看看自己板子上的地址是什么,这样才行
回复

使用道具 举报

板凳
ID:141391 发表于 2016-10-5 19:51 | 只看该作者
你需要看看自己板子上pcf这个芯片的地址是不是正确的,有可能和你写的不一样哦
回复

使用道具 举报

地板
ID:141385 发表于 2016-10-6 10:09 | 只看该作者
对的,我看了下按照我的理解重新写的程序,我检查了好多遍都没发现错误,并且还把开始,结束的部分放到其他程序里面检查也没错误
回复

使用道具 举报

5#
ID:141385 发表于 2016-10-6 10:11 | 只看该作者
我就怀疑是不是发送和接收有问题,我也对照时序表仔细的检查还是没发现,我再检查下芯片地址看看


谢谢大虾指点,万分感谢呀
回复

使用道具 举报

6#
ID:141385 发表于 2016-10-6 10:26 | 只看该作者
PCF芯片的地址是正确的,现在好疑惑呀
大虾能否帮忙看看发送和接收的,谢谢啦\(^o^)/~
回复

使用道具 举报

7#
ID:141385 发表于 2016-10-6 11:01 | 只看该作者
wujie 发表于 2016-10-5 19:51
你需要看看自己板子上pcf这个芯片的地址是不是正确的,有可能和你写的不一样哦

芯片地址是对的,现在就是不知道哪里出问题了,我估计是发送和接收那里,可是不知道怎么测试
回复

使用道具 举报

8#
ID:111634 发表于 2016-10-7 18:53 | 只看该作者
本帖最后由 zl2168 于 2016-10-7 18:54 编辑

实例85  PCF8591 I2C串行A-D(1602显示)


Proteus仿真一下,确认有效。
实例85 PCF8591 I2C串行A-D.rar (57.96 KB, 下载次数: 9)


以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1


书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

9#
ID:111634 发表于 2016-10-7 18:55 | 只看该作者
本帖最后由 zl2168 于 2016-10-7 18:57 编辑

实例49  读写AT24C02


Proteus仿真一下,确认有效。
实例49 读写IIC AT24C02.rar (38.96 KB, 下载次数: 6)


以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

10#
ID:141385 发表于 2016-10-8 19:02 | 只看该作者
zl2168 发表于 2016-10-7 18:53
实例85  PCF8591 I2C串行A-D(1602显示)

谢谢大虾了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表