微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请教!关于I2C总线发收数据的程序的问题

请教!关于I2C总线发收数据的程序的问题

时间:10-02 整理:3721RD 点击:

以下程序是想通过I2C总线与24C08存储器通信。首先对24C08存储器写入数据,再向24C08存储器读出数据,以该数据来点亮LED灯。
程序如下:
#include<reg52.h>
#include <intrins.h>
sbit scl=P3^4;
sbit sda=P3^5;
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void start()
{
sda=1;
scl=1;   
delay();
sda=0;
delay();
scl=0;
}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ask()
{  unsigned char i;
sda=1;
delay();         
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void write(unsigned char y)
{  unsigned char i;
    for(i=0;i<8;i++)
{
y=y<<1;
sda=CY;
    delay();
scl=1;
    delay();
scl=0;
    delay();
}
}
unsigned char read()
{ unsigned char t=0;
    unsigned char X;
unsigned char i;
    for(i=0;i<8;i++)
{
  scl=1;
     delay();
  X=sda;
     delay();
  t=t<<1;
  t=X|t;
  scl=0;
     delay();
  
}
  return t;
}  
void main()
{
sda=1;
scl=1;
start();
write(0xa0);
ask();
write(3);
ask();
write(0x7f);
ask();
stop();
delay();
start();
write(0xa0);
ask();
write(3);
ask();
start();
write(0xa1);
ask();
P0=read();
delay();
stop();
while(1);
}
最终结果LED灯  P0.0、P0.1不亮,P0.2~0.7都亮,显然结果错误。我写入的数据是 0x7f 而读出来确不是。哪位高手帮忙解答一下?感激不尽!
我的单片机芯片是 AT89S52

你得仔细核对你的操作时序是否正确,判断是没写进去,还是读不出出来,网上源代码也较多,你可以弄个试试!

时序正确啊,写进去了,读不出来。

向24C08芯片写数据后,延时一段时间,才能读数据吧

正解啊!虽说我这个程序也有延时,但是延时不够长,现在改成更长的延时之后就成功了。谢谢!

那你怎么能保证你写进去了哦,至少得通过读验证啊!

这是我的 单片机stc89c52
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit scl=P2^1;
sbit sda=P2^0;
/***************************************************************************
                                                                                                延时函数
**************************************************************************/
void delay()
{ ;; }
void delay1(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
/************************************************************************
                                                                                        初始化函数
*************************************************************************/
void init()
{
        sda=1;
        delay();
        scl=1;
        delay();
}
/*************************************************************************
                                                                                        启动函数
************************************************************************/
void start()
{
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
}
/***************************************************************************
                                                                                停止函数
************************************************************************/
void stop()
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}
/*********************************************************************
                                                                                        应答函数
********************************************************************/
void res()
{
        uchar i=0;
        scl=1;
        delay();
        while((sda==1)&&(i<250))
                i++;
        scl=0;
        delay();       
}
/**********************************************************************
                                                                                        写函数
*********************************************************************/
void write_byte(uchar date)
{
        uchar temp,i;
        temp=date;
        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                scl=0;
                delay();
                sda=CY;
                delay();
                scl=1;
                delay();
        }
        scl=0;
        delay();
        sda=1;
        delay();
}
/*****************************************************************
                                                                                读函数
*****************************************************************/
uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay();
                k=(k<<1)|sda;
                scl=0;
                delay();
        }
        return k;
}
/**************************************************************
                                                                        指定定制写一个字符
***************************************************************/
void write_add(uchar add,uchar date)
{
        start();
        write_byte(0xa0);
        res();
        write_byte(add);
        res();
        write_byte(date);
        res();
        stop();
}
/*************************************************************
                                                                相应地址读字符
**************************************************************/
uchar read_add(uchar add)
{
        uchar date;
        start();
        write_byte(0xa0);
        res();
        write_byte(add);
        res();
        start();
        write_byte(0xa1);
        res();
        date=read_byte();
        return date;
}
/*********************************************************
                                                                                主函数
********************************************************/
void main()
{
        init();
        write_add(0,0xfe);
        delay1(100);
        P1=read_add(0);
        while(1);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top