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
文章评论(0条评论)
登录后参与讨论