基于51单片机的IIC总线控制程序
发布时间:2011-10-18 13:26:49
发布时间: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