单片机模拟I2C总线,读取AT24C02——田卫卫修正郭天祥版
/*********************************************************
文件名称:I2C.C 主控芯片:STC89C52RC 晶振11.0592MHz
功能描述:单片机模拟I2C总线,操作E2PROM AT24C02芯片
函数名称:
void Write(uchar address,uchar date); //向24c02的地址address中,写入一字节数据date
uchar Read(uchar address); //从24c02的地址address中,读取一个字节数据
输入参数:参考函数名称
返 回 值:地址address中,读取的一个字节数据
备 注:
作者日期:田卫卫 / 2013年2月11日
版 本:V1.3
*********************************************************/
#include<reg52.h>
#include"I2C.h"
void main()
{
uchar num;
while (1)
{
num = Read(3);
P1 = num;
if (num<15)
{
num++;
}
else
{
num=0;
}
delayms(1000);
Write(3,num);
delayms(20);
}
}
/*********************************************************
文件名称:I2C.h 主控芯片:STC89C52RC 晶振11.0592MHz
功能描述:单片机模拟I2C总线,操作E2PROM AT24C02芯片
函数名称:
void Write(uchar address,uchar date); //向24c02的地址address中,写入一字节数据date
uchar Read(uchar address); //从24c02的地址address中,读取一个字节数据
输入参数:参考函数名称
返 回 值:地址address中,读取的一个字节数据
备 注:
作者日期:田卫卫 / 2013年2月11日
版 本:V1.3
*********************************************************/
#include<intrins.h>
#define uint unsigned int /*宏定义*/
#define uchar unsigned char /*宏定义*/
#define WRDADDS 0xa0 /*宏定义I2C器件地址,寻址写*/
#define RDDADDS 0xa1 /*宏定义I2C器件地址,寻址读*/
sbit SDA = P2^0; /*数据线*/
sbit SCL = P2^1; /*时钟线*/
void Write(uchar address,uchar date); /*向24c02的地址address中,写入一字节数据date*/
uchar Read(uchar address); /*从24c02的地址address中,读取一个字节数据(返回值)*/
void wr_byte(uchar date); /*I2C总线写一个字节(有参数)*/
uchar rd_byte(); /*I2C总线读一个字节(返回值)*/
void start(); /*启动I2C总线*/
void stop(); /*停止I2C总线*/
bit respons(); /*I2C总线应答信号检查*/
void delay(); /*延时微秒*/
void delayms(uint xms); /*延时毫秒*/
/*向24c02的地址address中,写入一字节数据date*/
void Write(uchar address,uchar date)
{
start(); //启动信号
wr_byte(WRDADDS); //I2C器件地址,寻址写
respons(); //应答信号
wr_byte(address); //选择单元地址
respons(); //应答信号
wr_byte(date); //写数据
respons(); //应答信号
stop(); //停止信号
}
/*从24c02的地址address中读取一个字节数据*/
uchar Read(uchar address)
{
uchar temp;
start(); //开始信号
wr_byte(WRDADDS); //I2C器件地址,寻址写
respons(); //应答信号
wr_byte(address); //选择单元地址 信号
respons(); //应答信号
start(); //重发启动信号
wr_byte(RDDADDS); //I2C器件地址,寻址读
respons(); //应答信号
temp = rd_byte(); //读数据(函数返回值)点亮流水灯
stop(); //停止信号
return temp;
}
/*启动I2C总线*/
void start()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
delay();
}
/*停止I2C总线*/
void stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
/*I2C总线应答信号检查*/
bit respons()
{
bit temp=0;
SDA=1;
delay();
SCL=1;
delay();
temp = SDA;
SCL=0;
delay();
return temp;
}
/*I2C总线写一个字节*/
void wr_byte(uchar date)
{
uchar i;
for(i=0;i<8;i++)
{
date=date<<1;
SDA=CY;
delay();
SCL=1;
delay();
SCL=0;
delay();
}
}
/*I2C总线读一个字节*/
uchar rd_byte()
{
uchar i,temp;
for(i=0;i<8;i++)
{
SCL=1;
delay();
temp=(temp<<1)|SDA;
delay();
SCL=0;
delay();
}
return temp;
}
/*NOP延时函数*/
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*延时函数*/
void delayms(uint xms)
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<110;j++);
}
谢谢分享
谢谢!
感谢,先mark一下
你改哪了? 我也写了这个程序不能用
赞一个。。。
谢谢分享 。
感谢小编!感谢小编!感谢小编!感谢小编!
郭老师的程序哪里有问题,还麻烦指教一下。