[求助] i2c c51程序 怎么没预期设计的效果 请看看!!!

无泪的哭泣   2011-4-23 13:18 楼主
#include
#include
#define  uchar  unsigned  char
#define  uint   unsigned  int

sbit sda=P2^1;
sbit scl=P2^2;

void delay(void)
{
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
}

void delay0()
{
        uint i=30000;
        while(i--)
        ;
}

void init(void)
{
        sda=1;
        scl=1;
}

void start(void)
{
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
}

void stop(void)
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}

void ack(void)
{
        uchar i;
        scl=1;
        delay();
        while((sda==1)&&(i<200))
        i++;
        sda=0;
        delay();
}

void noack(void)
{
        scl=1;
        delay();
        sda=1;
        delay();
        scl=0;
        delay();
}

void i2cwr_byte(uchar dat)
{
        uchar i;
        scl=0;
        for(i=0;i<8;i++)
        {
            scl=1;
                if(dat&0x80)
                {
                        sda=1;
                }
                else
                {
                        sda=0;
                }
                dat=dat<<1;
                delay();
                scl=1;
                delay();
                scl=0;
                delay();
        }
        sda=1;
        delay();
}

uchar i2cre_byte(void)
{
         uchar i;
         uchar value;
         scl=0;
         delay();
         scl=1;
         delay();
         for(i=0;i<8;i++)
         {
                 scl=1;
                delay();                       
                value=value<<1;
                if(sda)
                {
                        value++;
                }
                scl=0;
                delay();
         }
         return value;
}

void main()
{
        init();
        start();
        i2cwr_byte(0xa0);
        ack();
        i2cwr_byte(10);
        ack();                         
        i2cwr_byte(0x55);
        ack();
        stop();
        delay0();

        init();
        start();
        i2cwr_byte(0xa0);
        ack();
        i2cwr_byte(10);
        ack();               
        start();
        i2cwr_byte(0xa1);
        ack();
        P1=i2cre_byte();
        noack();
        stop();       
}

回复评论 (3)

你想要什么效果
点赞  2011-4-23 19:27

怎么感觉时序不对呀

 

点赞  2023-6-5 14:58

如果你能使用step-step的调试模式,就可以和示波器一起来调试你的代码,每执行一行代码,你用示波器观察DATA和CLK线上的电平是否是你期望的值,若不是,表明哪里有问题,便可定位到有问题的语句。

 

点赞  2023-10-16 11:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复