歡迎您光臨本站 登入註冊首頁

概述

本人初學C,曾為這個問題大傷腦筋^_^,就是一個單片機系統有兩個以上的相同地址的I2C設備,無法用兩個同一對SDA/SCL引腳,#include"stc89c51.h"#inclu……

本人初學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);
}


[admin via 研發互助社區 ] 連接多個相同地址I2C設備的C51程序已經有2931次圍觀

http://cocdig.com/docs/show-post-42236.html