微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机模拟I2C总线,读取AT24C02——田卫卫修正郭天祥版

单片机模拟I2C总线,读取AT24C02——田卫卫修正郭天祥版

时间:10-02 整理:3721RD 点击:

/*********************************************************

文件名称: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一下

你改哪了?   我也写了这个程序不能用

赞一个。。。

谢谢分享    。

感谢小编!感谢小编!感谢小编!感谢小编!

郭老师的程序哪里有问题,还麻烦指教一下。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top