当前位置:文档之家› 51单片机IO模拟IIC通讯(C_H文件)

51单片机IO模拟IIC通讯(C_H文件)

/*
文件名:C51_IIC.C
作 者:QX
时 期:2015.8
*/

#include "STC12C5A60S2.H"
#include "C51_IIC.h"

sbit SDA=P1^0;
sbit SCL=P1^1;

//IIC开始
void Start()
{
SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;
}


//IIC停止
void Stop()
{
SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;
}

//读取应答
void RACK()
{
SDA=1;NOP4();SCL=1;NOP4();SCL=0;
}

//发送非应答
void NO_ACK()
{
SDA=1;SCL=1;NOP4();SCL=0;SDA=0;
}

//写一字节
void Write_A_Byte(uchar b)
{
uchar i;
for(i=0;i<8;i++)
{
b<<=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;
}
RACK();
}

//向指定地址写数据
void I2C_Write_One_Byte(uchar addr,uchar dat)
{
Start();
Write_A_Byte(Device_Address_W);Write_A_Byte(addr);Write_A_Byte(dat);
Stop();
NOP4();NOP4();NOP4();NOP4();
}

//读一字节
uchar Read_A_Byte()
{
uchar i,b;
for(i=0;i<8;i++)
{
SCL=1;b<<=1;b|=SDA;SCL=0;
}
return b;
}

//从当前地址读数据
uchar Read_Current()
{
uchar d;
Start();
Write_A_Byte(Device_Address_R);d=Read_A_Byte();NO_ACK();
Stop();
return d;
}

//从任意地址读取数据
uchar I2C_Read_One_Byte(uchar addr)
{
Start();
Write_A_Byte(Device_Address_W);Write_A_Byte(addr);
return Read_Current();
}








/*
文件名:C51_IIC.H
作 者:QX
时 期:2015.8
*/

#ifndef __C51_IIC_H__
#define __C51_IIC_H__

#include

#define uchar unsigned char
#define uint unsigned int

#define NOP4() {_nop_();_nop_();_nop_();_nop_();}

#define Device_Address (0xD0) //DS1307设备地址
#define Device_Address_W (Device_Address & 0xFE) //写-LSB=0
#define Device_Address_R (Device_Address | 0x01) //读-LSB=1

uchar I2C_Read_One_Byte(uchar addr);
void I2C_Write_One_Byte(uchar addr,uchar dat);

#endif


相关主题
文本预览
相关文档 最新文档