发布论文 | 上传资料 | 发布供求 | 发布求职 | 发布项目 | 加入收藏 | RSS
您当前的位置:首页 > 文章中心 > 单 片 机 > 51单片机

I2C设备的C51程序

时间:2008-07-25 13:48:28  来源:  作者: 点击:31

一个单片机系统有两个以上的相同地址的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);
}

来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
音乐程序的设计原理之单片机
音乐程序的设计原理之
FPGA的可编程全数字锁相环路实现
FPGA的可编程全数字锁
什么是模拟电路?
什么是模拟电路?
挪威发明蛇形消防机器人
挪威发明蛇形消防机器
相关文章
    无相关信息
栏目更新
栏目热门