电子开发网
您的位置电子开发网>嵌入式系统>

连接多个相同地址I2C设备的C51程序

时间:2007-12-13   来源:   作者:大炮   点击:……  字体大小:【

本人初学C,曾为这个问题大伤脑筋^_^,就是一个单片机系统有两个以上的相同地址的I2C设备,无法用两个同一对SDA/SCL引脚,

#include "stc89c51.h"
#include "iic.h"

sbit scl0=P3^5;
sbit sda0 = P3^4;
sbit scl1= P3^3;
sbit sda1 = P3^2;
//这里只写了两个I2C设备,如果需要可以再加上 sbit scl2=xx; sbit sda2=xx; 实际上多个设备的scl脚可以共用

unsigned char iic_delay_time = 8;

void scl(device,value);
void sda(device,value);
bit sdasense(char device);

// delay
void iic_delay(unsigned char m)
{
    unsigned char n;
    for(n=0;n<m;n++);
}

//
void scl(device,value)
{
    if (device==0)        //设备1
        scl1=value;
    if (device==1)        //设备2
        scl2=value;
}
void sda(device,value)
{
    if (device==0)        //设备1
        sda1=value;
    if (device==1)        //设备2
        sda2=value;
}

bit sdasense(char device)
{
switch(device)
    {
        case 1: return sda1;
            break;
        case 2: return sda2;
            break;
    }
}

//启动I2C总线的函数,当scl为高电平时使sda产生一个负跳变
void iic_start(device)
{
    sda(device,1);
    scl(device,1);
    iic_delay(iic_delay_time);
    sda(device,0);
    iic_delay(iic_delay_time);
    scl(device,0);
    iic_delay(iic_delay_time/2);
}

//终止I2C总线,当scl为高电平时使sda产生一个正跳变
void iic_stop(device)
{
    scl(device,0);
    sda(device,0);
    scl(device,1);
    iic_delay(iic_delay_time);
    sda(device,1);
    iic_delay(iic_delay_time);
}

//发送应答信号
void iic_ack(device) {
    sda(device,0);
    scl(device,1);
    scl(device,0);
    sda(device,1);
}

//发送无应答信号
void iic_noack(device)
{
    sda(device,1);
    scl(device,1);
    scl(device,0);
}

//检测应答信号
bit iic_testack(device)
{
    bit errorbit;      //真确应答,返回0
    sda(device,1);
    iic_delay(iic_delay_time);
    scl(device,1);
    iic_delay(iic_delay_time);
    errorbit=sdasense(device);
    scl(device,0);
    iic_delay(iic_delay_time);
    return(errorbit);
}

//发送一个字节
void iic_write8bit(device,unsigned char input)
{
    unsigned char temp;
    for(temp=0;temp<8;temp++)
    {
        if((input<<temp)&0x80)
            sda(device,1);
        else
            sda(device,0);
        scl(device,1);

        iic_delay(iic_delay_time);
        scl(device,0);
    }
}

//读一个字节
unsigned char iic_read8bit(device)
{
    unsigned char temp,rbyte=0;
    for(temp=0;temp<8;temp++)
    {
        scl(device,1);
        iic_delay(iic_delay_time);
        if(sdasense(device))
            rbyte=(rbyte<<1)+1;
        else
            rbyte=rbyte<<1;
        scl(device,0);
    }
    return(rbyte);
}


Tags:C51   Keil   I2C    
  • 关于本站 - 联系我们 - 网站地图 - 网站留言 - 返回顶部