连接多个相同地址I2C设备的C51程序
2012-10-24
大炮
标签: I2C C51

本人初学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
}

//
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 <
             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);
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号