原创 今天整理的以前用IIC代码

2010-1-3 12:52 2131 5 5 分类: 通信

IIC.C文件如下:


/******************************************************************
*         同翔电子
*       51&AVR单片机学习板
*       EMAIL:ming_2100@163.com
*       QQ: 306136554
*       http://shop33987716.taobao.com
*******************************************************************/


#include "AT89X52.H"
#include "main.h"
#include "IIC.h"


/*******************************************************
*函数名称:Start
*函数功能:IIC总线开始
*入口参数:无
*作    者:同翔电子
*******************************************************/
void Start()
{
 SDA=1;
 SCL=1;
 SDA=0;
 SCL=0;
}
/*******************************************************
*函数名称:Stop
*函数功能:IIC总线停止
*入口参数:无
*作    者:同翔电子
*******************************************************/
void Stop()
{
 SCL=0;
 SDA=0;
 SCL=1;
 SDA=1;
}
/*******************************************************
*函数名称:NoAck
*函数功能:IIC总线发送ACK
*入口参数:无
*作    者:同翔电子
*******************************************************/
void NoAck()
{
 SDA=1;
 SCL=1;
 SCL=0;
}
/*******************************************************
*函数名称:TestAck
*函数功能:IIC总线检测ACK
*入口参数:无
*作    者:同翔电子
*******************************************************/
bit TestAck()
{
 bit ErrorBit;
 SDA=1;
 SCL=1;
 ErrorBit=SDA;
 SCL=0;
 return(ErrorBit);
}
/*******************************************************
*函数名称:Write8Bit
*函数功能:IIC总线开始
*入口参数:无
*作    者:同翔电子
*******************************************************/
void Write8Bit(unsigned char input)
{
 unsigned char temp;
 for(temp=8;temp!=0;temp--)
 {
  SDA=(bit)(input&0x80);
  SCL=1;
  SCL=0;
  input=input<<1;
 }
}
/*******************************************************
*函数名称:IIC_Write
*函数功能:指定地址写入一个字节的数据
*入口参数:无
*作    者:同翔电子
*******************************************************/
void IIC_Write(uchar d,uchar addressL,uchar addressH)
{
 Start();
 Write8Bit(WriteDeviceAddress);
 TestAck();
 Write8Bit(addressL);
 TestAck();
#ifdef AT24C256
 Write8Bit(addressH);
 TestAck();
#else
 addressH = addressH;
#endif
 Write8Bit(d);
 TestAck();
 Stop();
 DelayMs(10);
}
/*******************************************************
*函数名称:Read8Bit
*函数功能:IIC总线读出一个字节的数据
*入口参数:无
*作    者:同翔电子
*******************************************************/
uchar Read8Bit()
{
 unsigned char temp,rbyte=0;
 for(temp=8;temp!=0;temp--)
 {
  SCL=1;
  rbyte=rbyte<<1;
  rbyte=rbyte|((unsigned char)(SDA));
  SCL=0;
 }
 return(rbyte);
}
/*******************************************************
*函数名称:IIC_Read
*函数功能:IIC总线指定地址读出一个字节的数据
*入口参数:无
*作    者:同翔电子
*******************************************************/
uchar IIC_Read(uchar addressL,uchar addressH)
{
 uchar ch;
 Start();
 Write8Bit(WriteDeviceAddress);
 TestAck();
 Write8Bit(addressL);
 TestAck();
#ifdef AT24C256
 Write8Bit(addressH);
 TestAck();
#else
 addressH = addressH;
#endif
 Start();
 Write8Bit(ReadDviceAddress);
 TestAck();
 ch=Read8Bit();
 NoAck();
 Stop();
 return(ch);
}


 


IIC.h文件如下:


#ifndef __IIC_H__
#define __IIC_H__


sbit SCL="P0"^1;
sbit SDA="P0"^2;


#define WriteDeviceAddress 0x98 //定义器件在IIC总线中的地址


#define ReadDviceAddress 0xa1
//#define AT24C256


uchar IIC_Read(uchar address,uchar addressH);
uchar Read8Bit();
void IIC_Write(uchar ch,uchar address,uchar addressH);
void Write8Bit(unsigned char input);
bit TestAck();
void NoAck();
void Stop();
void Start();



#endif

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条