基于51单片机的IIC总线控制程序

发布时间:2011-10-18 13:26:49

//////////////////////////////////////////////////////////////////////////////////

//函数功能:void iic_start() 启动信号

// void iic_stop(void) 停止信号

// void iic_check_answer() 应答信号

// void iic_write_byte(uchar dat) 写字节函数

// void iic_write_n_byte(uchar *buffer,uchar n) n个字节函数

// void iic_write_at_addr(uchar addr,uchar dat) 指定地址写字节函数

// uchar iic_read_byte(void) 读字节函数

//

// uchar iic_read_at_addr(uchar addr) 读指定地址字节

///////////////////////////////////////////////////////////////////////////////////

#ifndef __iic_H__

#define __iic_H__

sbit scl=P1^0;

sbit sda=P1^1;

//延时4us@12mhz

void delay_iic()

{

;;;

}

//启动iic总线的函数,当scl为高电平时使sda产生一个负跳变

void iic_start(void)

{

sda=1;

delay_iic();

scl=1;

delay_iic();

sda=0;

delay_iic();

}

//终止iic总线,当scl为高电平时使sda产生一个正跳变

void iic_stop(void)

{

sda=0;

delay_iic();

scl=1;

delay_iic();

sda=1;

delay_iic();

}

//发送完一个字节后检验设备的应答信号

void iic_check_answer()

{

uchar i;

scl=1;

delay_iic();

while((sda==1) && (i<250))

i++;

scl=0;

delay_iic();

}

//iic总线写一个字节

void iic_write_byte(uchar dat)

{

uchar i,temp;

temp=dat;

for(i=0;i<8;i++)

{

temp=temp<<1;

scl=0;

delay_iic();

sda=CY;

delay_iic();

scl=1;

delay_iic();

}

scl=0;

delay_iic();

sda=1;

delay_iic();

}

//I2C总线写n个字节

void iic_write_n_byte(uchar *buffer,uchar n)

{

uchar i;

iic_start();

for(i=0;i

{

iic_write_byte(buffer[i]);

}

iic_stop();

}

//向芯片的指定地址,写入字节

void iic_write_at_addr(uchar addr,uchar dat)

{

iic_start(); //设定地址,AT24C02固定地址为1010,再加上设定的地址,

iic_write_byte(0xa0); //最后一位表示读或写,0表示写,所以为1010 0000,即0xa0

iic_check_answer(); //等待芯片应答

iic_write_byte(addr); //设置要写入数据的地址

iic_check_answer(); //等待芯片应答

iic_write_byte(dat); //写入要保存的数据

iic_check_answer(); //等待芯片应答

iic_stop();

}

//I2C总线读一个字节

uchar iic_read_byte(void)

{

uchar i,k;

scl=0;

delay_iic();

sda=1;

delay_iic();

for(i=0; i<8; i++)

{

scl=1;

delay_iic();

k =(k<<1)|sda;

scl=0;

delay_iic();

}

return k;

}

/*//I2C总线读n个字节

bit iic_read_n_byte(uchar SlaveAdr,uchar n,uchar *buffer)

{

uchar i;

iic_start();

Write_byte(SlaveAdr); //向总线发送接收器地址

if(!check_answer()) //等待接收器应答信号

return 0;

for(i=0;i

{

buffer[i]=READ_byte();

if(i!=n)

SEND_0(); //发送应答

else

SEND_1(); //发送非应答

}

iic_stop();

return 1;

} */

//读取芯片指定地址的数据

uchar iic_read_at_addr(uchar addr)

{

uchar dat;

iic_start();

iic_write_byte(0xa0);//向芯片发送一个写操作信号

iic_check_answer();

iic_write_byte(addr);//设置要读取的地址

iic_check_answer();

iic_start();

iic_write_byte(0xa1);//向芯片发送一个读操作信号

iic_check_answer();

dat=iic_read_byte();

iic_stop();

return dat;

}

#endif

基于51单片机的IIC总线控制程序

相关推荐