cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1533|回复: 0

转载一位朋友的AT24C1024的C51驱动程序

[复制链接]
发表于 2009-8-3 00:38:52 | 显示全部楼层 |阅读模式
原贴地址: http://www.51c51.com/bbs/dispbbs.asp?boardID=15&ID=31388&page=19

void  delayI2C()
{
   _nop_();   
   _nop_();
   _nop_();
   _nop_();
   _nop_();
}
void delayms(uint dlycnt)
{
  uint i;
  for(;dlycnt>0;dlycnt--)
     {
       for(i=0;i<124;i++)
       {}
     }
  
}
void  Start()       //SCL为高时,SDA由高到低的变化就是一个起始状态
{
  scl=0;
  _nop_();
  sda=1;
  _nop_();
  scl=1;
  delayI2C();
  sda=0;
  delayI2C();
  scl=0;
  _nop_();
}
void  Stop()       //SCL为高时,SDA由低到高的变化就是一个起始状态
{
  sda=0;
  _nop_();
  scl=1;
  _nop_();
  sda=1;
  delayI2C();
  scl=0;
  _nop_();
}
void  SendByte(uchar SData)     //发送数据SCL为低时数据SDA改变,SCL为高时发送
{
  uchar j;
  for(j=0;j<8;j++)
  {
     scl=0;
     SData<<=1;
     sda=CY;
     scl=1;
     delayI2C();
  }
  scl=0;
}
uchar ReceiveByte()        //接收数据
{
   uchar i;
   uchar RData;
   RData=0;
   for(i=0;i<8;i++)
   {  
      sda=1;
      _nop_();
      scl=1;
      _nop_();
      _nop_();
      RData=RData<<1;
      RData=RData|sda;
      _nop_();
      _nop_();
      scl=0;
    }
   return(RData);
}
bit  ReceiveAck()                    //主机接收应答信号
{
  bit Ack;
  sda=1;                  
  _nop_();
  _nop_();
  scl=1;           
  _nop_();
  _nop_();
  Ack=sda;
  _nop_();
  _nop_();
  scl=0;
  _nop_();
  return(Ack);
}
void SendAckI2C()
{
  sda=0;
  _nop_();
  _nop_();
  scl=1;
  delayI2C();         
  scl=0;
  _nop_();
  _nop_();
}
void SendNoAck()
{
  sda=1;
  _nop_();
  _nop_();
  scl=1;
  delayI2C();   
  scl=0;
  _nop_();
  _nop_();
}
void SendToSubAddress(unsigned long addr,uchar *pSData,uchar N)
{
  uchar i;
  uchar SlaveAddress;
  SlaveAddress=(addr>>15)%256;
  SlaveAddress = SlaveAddress & 0x0e | 0xa0;
  Start();
  SendByte(SlaveAddress);    //选择器件地址
  ReceiveAck();
  SendByte((addr>>8)%256);    //发送数据地址高字节
  ReceiveAck();
  SendByte(addr%256);    //发送数据地址低字节
  ReceiveAck();
  for(i=0;i<N;i++)
  {
    SendByte(pSData);
    ReceiveAck();
  }
  Stop();
}
void ReceiveFromSubAddress(unsigned long addr,uchar *pRData,uchar N)
{
  uchar i;
  uchar SlaveAddress;
  SlaveAddress=(addr>>15)%256;
  SlaveAddress = SlaveAddress & 0x0e | 0xa0;
  Start();
  SendByte(SlaveAddress);    //发送器件地址
  ReceiveAck();
  SendByte((addr>>8)%256);    //发送数据地址高字节
  ReceiveAck();
  SendByte(addr%256); //发送数据地址低字节
  ReceiveAck();
  Start();                              //I2C 开始
  SendByte(SlaveAddress+1);    //读设备
  ReceiveAck();
  for(i=0;i<N-1;i++)
  {
     pRData=ReceiveByte();
     SendAckI2C();
  }
  pRData=ReceiveByte();
  SendNoAck();
  Stop();
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-4 02:28 , Processed in 0.471987 second(s), 8 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表