找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3874|回复: 7
收起左侧

AT24C02都出来的数一直不变是什么原因???求大神指点,经测试1602显示是没问题的

[复制链接]
回帖奖励 30 黑币 回复本帖可获得 30 黑币奖励! 每人限 1 次
ID:301302 发表于 2018-4-17 10:45 | 显示全部楼层 |阅读模式
#define uchar unsigned char
#define uint unsigned int
sbit SCK=P3^6;       //串行时钟输入
sbit SDA=P3^7;      //串行数据输入/输出
void Start()//起始信号
{
SDA=1;
delay5us();//延时要大于4.7us,取5u
SCK=1;
delay5us();
SDA=0;
delay5us();
}
void Stop()//结束信号
{
SDA=0;
delay5us();//延时要大于4.7us,取5us
SCK=1;
delay5us();
SDA=1;
delay5us();
}
void Ack()//应答信号
{
SDA=0;
SCK=0;
delay5us();
SCK=1;
delay5us();
SCK=0;
}
/*SCK在高电平期间,SDA被拉为低电平表示应答*/
bit WaitAck()//等待应答信号
{
SDA=1;//释放总线
delay5us();
SCK=1;
delay5us();
if(SDA)//无应答
{
  SCK=0;
  Stop();
  return 0;
}
else
{
  SCK=0;
  return 1;
}
}
void InputOneByte(uchar dat)//写入一个字节AT24C02
{
uchar iVal;
for(iVal=0;iVal<8;iVal++)
{
  SCK=0;
  delay5us();
  SDA=(dat & 0x80)>>7;//将数据的最高位放入SAD,如0011 0010
  //则将末位0送入SDA
  delay5us();
  SCK=1;
  dat<<=1;//数据左移一位,准备存第二位数
}
SCK=0;
}
uchar OutputOneByte()//读取一个字节
{
uchar iVal;
uchar x;//保存读取到的值
SDA=1;//释放总线,以让SDA线转由接收设备(AT24C02)控制
for(iVal=0;iVal<8;iVal++)
{
  SCK=0;
  delay5us();
  SCK=1;
  delay5us();
  x<<=1;//从低位开始读
  if(SDA)
   x |= 0x01;//将SDA上的数据通过按位“或“运算存入x中
}
SCK=0;
return x;
}
void WriteAddAndDate(uchar add,uchar dat)
{
Start();//启动
InputOneByte(0xA0);//写入器件AT24C02地址
WaitAck();//等待器件应答
InputOneByte(add);//存放数据的地址
WaitAck();//等待器件应答
InputOneByte(dat);//要保存的数据
WaitAck();//等待器件应答
Stop();
}
uchar ReadDataFromDatAdd(uchar DatAdd)//从某个地址读取数据
{
uchar Data;
Start();
InputOneByte(0xA0);//写入器件AT24C02地址
WaitAck();//等待器件应答
InputOneByte(DatAdd);//存放数据的地址
WaitAck();//等待器件应答
Start();
InputOneByte(0xA1);//读取数据的器件地址
WaitAck();//等待器件应答
Data=OutputOneByte();//d读取数据
Stop();
return Data;
}
void main()
{
  float AT;
/**********AT24C02转换***********/
  LCD_Initial();
  GotoXY(0,0);//设定显示位置
  WriteAddAndDate(0X01,0X85);
  AT=ReadDataFromDatAdd(0X00);
  sprintf(table2,"The data is:%f",AT);//将数据写入table2中
  Print(table2);//打印
  while(1);
}
回复

使用道具 举报

ID:303735 发表于 2018-4-17 15:22 | 显示全部楼层
我之前也遇到这样的情况,软件工程师也说不出啥原因,后面把24C02的通讯脚上拉电阻加10K就可以了。不知是不是你没接上拉电阻。
回复

使用道具 举报

ID:301302 发表于 2018-4-18 19:15 | 显示全部楼层
liqingyong 发表于 2018-4-17 15:22
我之前也遇到这样的情况,软件工程师也说不出啥原因,后面把24C02的通讯脚上拉电阻加10K就可以了。不知是不 ...

加上了,很烦[
回复

使用道具 举报

ID:285031 发表于 2018-5-6 11:53 | 显示全部楼层
两个问题,
一是AT24C02芯片连接要有电阻。
二是每写完数据要有10ms的延时,用于芯片把数据转化成不可擦除的。这段时间芯片不会响应读写信号。

附录是datasheet,重点应该高亮了。主要看时序和write/read operation

00_AT24C02A.pdf

184.52 KB, 下载次数: 19

芯片手册

回复

使用道具 举报

ID:268717 发表于 2018-10-2 16:52 | 显示全部楼层
读出来的数据是I5对吧?
回复

使用道具 举报

ID:211052 发表于 2018-10-2 22:37 | 显示全部楼层
单步走,走到口线输出的地方停下量下口线电压。或者用示波器看波形。
回复

使用道具 举报

ID:387733 发表于 2018-10-3 07:57 | 显示全部楼层
/*SCK在高电平期间,SDA被拉为低电平表示应答*/
这个是错误的,这个是START的定义。

360截图17110701372624.png

可参考单片机论坛  http://www.51hei.com/bbs/dpj-136469-1.html
回复

使用道具 举报

ID:63090 发表于 2018-10-4 21:57 | 显示全部楼层
先检查硬件是否接线正确,再检查软件程序接口调动对不对,如果都正确,就是软件时序处理不当导致的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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