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

📄 2401.c

📁 适用于51单片机的AT24C01-24C16的驱动
💻 C
字号:
#include <stc89c51.h>
#include <intrins.h>
#include "source.h"

/*            5ms延时           */
void ms (void)
{  uchar i=20,j;
   do
   {  j=250;
      while(--j);
   }
   while(--i);     
}
/*            启动I2C           */
void ic_start (void)
{  io=1;
   clk=1;
   nop;
   io=0;
   nop;
   clk=0;
   nop;
}
/*             停止I2C              */
void ic_over (void)
{  io=0;
   clk=0;
   nop;
   clk=1;
   nop;
   io=1;
   nop;
}
/*              应答检测             */
void check_ack (void)
{  io=1;
   clk=1;
   nop;
   clk=0;
   nop;
}
/*                应答                */
void ack (void)
{  io=0;
   clk=1;
   nop;
   clk=0;
   nop;
}
/*                非应答              */
void no_ack (void)
{  io=1;
   clk=1;
   nop;
   clk=0;
   io=0;
   nop;
}
/*                写一个字节            */
void write_byte (uchar d)
{  uchar i=8;
   do
   {  if(d&0x80)
      {  io=1;
         clk=1;
         nop;
         clk=0;
         io=0;
         nop;
       }
       else
       {  io=0;
          clk=1;
          nop;
          clk=0;
          nop;
       }
       d<<=1;
    }
	while(--i);
}
/*                读一个字节                */
uchar read_byte (void)
{  uchar i=8,d;
   io=1;
   do
   {  clk=1;
      nop;
	  d<<=1;
      if(io)
      {  d|=0x01;
         clk=0;
         nop;
      }
      else
      {  d&=0xfe;
         clk=0;
         nop;
      }
   }
   while(--i);
   return d;
}
/*                向I2C写数据            */
void ic_write (uint add,uchar d)
{  uchar i,j;
   j=(uchar)add;
   i=(uchar)(add/256);
   i<<=1;
   i+=0xa0;
   ic_start();
   write_byte(i); 
   check_ack();
   write_byte(j);
   check_ack();
   write_byte(d);
   check_ack();
   ic_over();
}
/*                  从I2C读数据               */
void ic_read (uint add,uchar len)
{  uchar i=0,j,k;
   j=(uchar)add;
   k=(uchar)(add/256);
   k<<=1;
   k+=0xa0;
   ic_start();
   write_byte(k);
   check_ack();
   write_byte(j);
   check_ack();
   ic_start();
   k|=0x01;
   write_byte(k);
   check_ack();
   do
   {  ic_data[i]=read_byte();
      ack();
      i+=1;
   }
   while(--len);
   ic_data[i]=read_byte();
   no_ack();
   ic_over();
}
   
      
   

⌨️ 快捷键说明

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