微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 一个用I2C总线点LED灯的程序,为什么不行?

一个用I2C总线点LED灯的程序,为什么不行?

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit SCL=P2^1;
sbit SDA=P2^0;
#define SCL_SET SCL=1
#define SCL_CLR SCL=0
#define SDA_SET SDA=1
#define SDA_CLR SDA=0
void Delay(uint cnt)
{
        while(--cnt);
}
void start()
{
        SDA_SET;
        Delay(1);
        SCL_SET;
        Delay(5);
        SDA_CLR;
}
void stop()
{
        SDA_CLR;
        Delay(1);
        SCL_SET;
        Delay(5);
        SDA_SET;  
}
void ack()
{
        SDA_CLR;
        SCL_SET;
        Delay(1);
        SCL_CLR;
}
void noAck()
{
        SDA_SET;
        SCL_SET;
        Delay(1);
        SCL_CLR;
}
void send(uchar Data)
{
        uchar i=0;
        uchar temp=0;
        temp=Data;
        for(i=0; i<8; i++)
        {
                SCL_CLR;
                Delay(1);
                if(temp&0x80) SDA_SET;
                else SDA_CLR;
                Delay(1);
                SCL_SET;
                Delay(1);
                temp<<=1;
        }
        SCL_CLR;
}
uchar recive()
{
        uchar i=0;
        uchar temp=0;
        SDA_SET;
        for(i=0; i<8; i++)
        {
                SCL_CLR;
                Delay(1);
                SCL_SET;
                Delay(2);
                if(SDA) temp|=0x01;
                else temp&=0xfe;
                if(i<7)   temp<<=1;
        }
        SCL_CLR;
        return temp;
}

void main()
{        
               start();
                send(0xa0);
                ack();
                send(23);
                ack();
                send(0xfe);
                   ack();
                stop();
                Delay(100);
                   start();
                   send(0xa0);
                ack();
                send(23);
                ack();
                start();
                   send(0xa1);
                ack();
                   P1=recive();
                noAck();
                stop();
                while(1);          
}  
————————————————
求指导!         

我学了好几天I2C总线操作了,看了不少例程,感觉不同人都有不一样的写法,可是自己动手时总是会出问题。好不容易搞出来了,感觉像是碰巧写对的,因为换种方法又不行了,希望前辈们不吝指教!

I2C的响应时间都是比较长的,很多都是4us左右,你的delay延时的太短了。
其实I2C时序很严格,程序应该都很类似的吧。

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

网站地图

Top