新闻  |   论坛  |   博客  |   在线研讨会
今天整理的以前用IIC代码
0750long | 2010-03-07 17:43:40    阅读:4262   发布文章

今天整理的以前用IIC代码

 

 

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客