⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24c02.c

📁 51单片机模拟实现I2C 协议
💻 C
字号:
#include<reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <absacc.h>
sbit RS=P1^0;   //设置连接线
sbit RW=P1^1;
sbit E=P1^2;
sbit D7=P2^7;
sbit scl=P3^2;  //24c02 SCL时钟线
sbit sda=P3^3;  //24c02 SDA数据线

#define uchar unsigned char
#define uint unsigned int   
unsigned char sec; //定义计数值,每过1 秒,sec 加1
unsigned int tcnt; //

uchar x24c02_read(uchar address);  //从24c02的地址address中读取一个字节数据
void x24c02_write(uchar address,uchar info);//向24c02的address地址中写入一字节数据inf  
void x24c02_init();   //24c02初始化子程序
void delay1(uchar x);
void flash();
void x24c01_init();
void start();
void stop();
void writex(uchar j);
uchar readx();
void clock();
/*******************************
以下为LCD1602的驱动程序
************************************/
busy()  //系统忙检测函数
{ 
  do {P2=0xff;  
      RS=0; 
      RW=1;                 
      E=0;
     _nop_();
      E=1;
     }while (D7);
}

write_com(char commend)//写命令函数
{
  P2=commend;
  RS=0;
  RW=0;
  E=0;
  busy();
  E=1;
}

i_lcd()//初始化函数
{
  write_com(0x01);//清屏
  write_com(0x38);//置功能
  write_com(0x0c);//显示开
  write_com(0x06);//输入模式
  write_com(0x80);//显示位置
}


write_char(char lcddata)//写数据函数
{
  P2=lcddata;
  RS=1;
  RW=0;
  E=0;
  busy();
  E=1;
}
/*******************************
写一串数据
************************************/

write_string(char * s)
{
while (*s!=0x00)
write_char(*s++);
}
/*******************************
以上为LCD1602的驱动程序
************************************/
void delay1(uchar j)
{
   uint i;
   for(i=0;i<j;i++);
   ;
}
/*******************************
以下为24C02的驱动程序
************************************/
void flash()////延时
{;;
}  
///////初始化
void x24c02_init()             
{
   scl=1; flash(); sda=1; flash();
}
/*******************************
以下为24C02的开始信号SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
************************************/

void start()
{
   sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
}
/*******************************
以下为24C02的结束信号//SCL为高电平时?,SDA由低电平向高电平跳变,结束传送数据。。
************************************/
void stop()
{
   sda=0; flash(); scl=1; flash(); sda=1; flash();
}
 /*******************************
以下为24C02的写一个字节
************************************/
void writex(uchar j)
{
   uchar i,temp;
   temp=j;
   for (i=0;i<8;i++)
   {
      temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();
   }
   
   scl=0; flash(); sda=1; flash();
}
 /*******************************************
   也可以这样写数据
    for (i=0;i<8;i++)
   {scl=0;flash();
   if(temp<<i&0x80) sda=1;else sda=0;scl=1; flash();
   ****************************************************************************
以下为24C02的读一个字节
************************************/
uchar readx()
{
   uchar i,j,k=0;
   scl=0; flash(); sda=1;///数据线为输入状态
   for (i=0;i<8;i++){
      flash(); scl=1; flash();
      if (sda==1) j=1;
      else j=0;
      k=(k<<1)|j; scl=0;      ///////读数据 8位先传高位
   }
   flash(); return(k);
}
/*************************************
每次响应,保持SDA高电平///这里写法个人认为可以不同,SDA也可以是低电瓶///其次考虑建立时间
********************/
void clock()               ///时钟
{
   uchar i=0;
   scl=1; flash();
   while ((sda==1)&&(i<255))i++;
   scl=0; flash();
}
uchar x24c02_read(uchar address)
{
   uchar i;
   start(); writex(0xa0);///写操作
   clock(); 
   writex(address);
   clock();
   start();
   writex(0xa1); clock();//读操作
   i=readx(); stop();
   delay1(10);
   return(i);
}
/*****************************
在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010)
接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -