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

来源:本站
导读:目前正在解读《连接多个相同地址I2C设备的C51程序》的相关信息,《连接多个相同地址I2C设备的C51程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《连接多个相同地址I2C设备的C51程序》的详细说明。
简介:本人初学C,曾为这个问题大伤脑筋^_^,就是一个单片机系统有两个以上的相同地址的I2C设备,无法用两个同一对SDA/SCL引脚,

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

}

提醒:《连接多个相同地址I2C设备的C51程序》最后刷新时间 2024-03-14 01:10:15,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《连接多个相同地址I2C设备的C51程序》该内容的真实性请自行鉴别。