24C64的51子程序

发布者:梦想启航最新更新时间:2016-10-30 来源: eefocus关键字:24C64  51子程序 手机看文章 扫描二维码
随时随地手机看文章
//24c64子程序

//------------------------------------------------------------------------------
//CPU产生I2C起始信号,SCL高电平期间,SDA由1到0
//------------------------------------------------------------------------------
void start()
{
  unsigned char i;
  SDA=1;            //SDA置1
  i=2;while(--i);
  SCL=1;            //SCL置为高电平
  i=2;while(--i);
  SDA=0;            //SDA清0
  i=2;while(--i);
  SCL=0;            //SCL恢复低电平
}
//-----------------------------------------------------------------------------
//CPU产生I2C结束信号,SCL高电平期间,SDA由0到1
//-----------------------------------------------------------------------------
void stop()
{
  unsigned char i;
  SDA=0;            //SDA清0
  i=2;while(--i);
  SCL=1;            //SCL置为高电平
  i=2;while(--i);
  SDA=1;            //SDA置1
  i=2;while(--i);
  SCL=0;            //SCL恢复低电平
}
//--------------------------------------------------------------------------------------------------------
//CPU产生应答信号(CPU接收数据后)接收方产生应答或非应答信号,

//24c64自动产生,cpu需要调用程序
//--------------------------------------------------------------------------------------------------------
void ACK()
{
  unsigned char i;
  SDA=0;            //SDA清0
  i=2;while(--i);
  SCL=1;
  i=2;while(--i);
  SCL=0;
  i=2;while(--i);
  SDA=1;
}
//-----------------------------------------------------------
//CPU产生非应答信号 (CPU接收数据后)
//-----------------------------------------------------------
void NACK()
{
  unsigned char i;
  SDA=1;            //SDA置1
  i=2;while(--i);
  SCL=1;
  i=2;while(--i);
  SCL=0;
  i=2;while(--i);
}
//---------------------------------------------------------------------------------------------------------------
//CPU向24C64发送一个字节(写数据或地址),并检查24C64发回的确认信号,

//返回标志位flag,0应答,1非应答。
//---------------------------------------------------------------------------------------------------------------
bit Sendbyte(unsigned char data0)
{
  unsigned char i,j;
  bit flag;
  for(j=0;j<8;j++)    //发送一个字节 (1次发送1位)
  {
    SCL=0;
    i=2;while(--i);
    if(data0&0x80)   //取data0最高位
       SDA=1;
    else
       SDA=0;
    i=2;while(--i);
    SCL=1;
    i=2;while(--i);
    data0=data0<<1;  //data0左移1位
  }
//以下为检查24C64应答信号
  SCL=0;
  i=2;while(--i);
  SDA=1;           //数据线拉高
  i=2;while(--i);
  SCL=1;
  i=2;while(--i);
  flag=SDA;       //读应答信号
  SCL=0;
  i=2;while(--i);
  return flag;  //24C64正确接收,返回0(ACK);不正确接收,返回1(NOACK)。
}
//---------------------------------------------------
//CPU接收24C64发送来的一个字节
//---------------------------------------------------
unsigned char Receivebyte()
{
  unsigned i,j,data0;
  SCL=0;
  i=2;while(--i);
  SDA=1;
  for(j=0;j<8;j++)   //1次接收1位
  {
    data0=data0<<1;
    SCL=1;
    i=2;while(--i);
    if(SDA) data0=data0+1;  //接收数据存在最低位
    i=2;while(--i);
    SCL=0;
    i=2;while(--i);
  }
  return data0;      //返回接收的数据
}
//---------------------------------------------------------------------------------------------
//CPU向24C64内部EEPROM写入一个字节  (写1个字节数据过程)
//--------------------------------------------------------------------------------------------
void byteWR24c64(unsigned int address,unsigned char data0)
{               //  24c64内部单元地址,             数据
  unsigned char flag;
  start();    //CPU发起始信号
  flag=Sendbyte(0xa0);    //CPU发器件地址
    while(flag) {Sendbyte(0xa0);}   //检查确认信号,不正确则重发
  flag=Sendbyte(address/256);     //CPU发ROM高八位地址
    while(flag) {Sendbyte(address/256);}
  flag=Sendbyte(address%256);     //CPU发ROM低八位地址
    while(flag) {Sendbyte(address%256);}
  flag=Sendbyte(data0);        //CPU发送数据
    while(flag) {Sendbyte(data0);}
  stop();     //CPU发结束信号
  delaynms(10);
}
//--------------------------------------------------------------------------------------------
//CPU向24C64内部EEPROM写入一页字节,一次最多32个字节。

//  (写1页数据过程)
//--------------------------------------------------------------------------------------------
void pageWR24c64(unsigned int address,unsigned char *p1,unsigned char count)
{           //  24c64内部起始单元地址,  数据缓冲区地址        写入字节个数
  unsigned char flag;
  start();     //CPU发起始信号
  flag=Sendbyte(0xa0);    //CPU发器件地址
    while(flag) {Sendbyte(0xa0);} //检查确认信号,不正确则重发
  flag=Sendbyte(address/256);   //CPU发ROM起始单元高八位地址
    while(flag) {Sendbyte(address/256);}
  flag=Sendbyte(address%256);   //CPU发ROM起始单元低八位地址
    while(flag) {Sendbyte(address%256);}
  while(count--)
  {
   flag=Sendbyte(*p1); // 发送1个数据
    while(flag) {Sendbyte(*p1);}  //检查确认信号,不正确则重发
   p1++;   //修改指针
  }
  stop();  //CPU发结束信号
  delaynms(10);
}
//--------------------------------------------------------------------------
//CPU从24C64内部EEPROM读取n个字节。 连续读
//--------------------------------------------------------------------------
void nbyteRD24c64(unsigned int address,unsigned char *p2,unsigned char count)
{            //  24c64内部起始单元地址,  数据缓冲区地址       读取字节个数
  unsigned char flag;
  //以下是伪写
  start();   //CPU发起始信号
  flag=Sendbyte(0xa0);  //CPU发器件地址
    while(flag) {Sendbyte(0xa0);}
  flag=Sendbyte(address/256);  //CPU发ROM起始单元高八位地址
    while(flag) {Sendbyte(address/256);}
  flag=Sendbyte(address%256);  //CPU发ROM起始单元低八位地址
    while(flag) {Sendbyte(address%256);}
  //以下是读n个字节
  start();   //CPU发起始信号
  flag=Sendbyte(0xa1);   //CPU发器件地址
    while(flag) {Sendbyte(0xa1);}
  while(--count)   //读取 count-1 个数据
  {
    *p2=Receivebyte();  // 读取1个数据
    ACK();   //cpu发应答信号
    p2++;    //修改指针
  }
  *p2=Receivebyte();  // 读取第 count 个数据
  NACK();   // cpu发送非应答信号
  stop();   //CPU发结束信号
}

关键字:24C64  51子程序 引用地址:24C64的51子程序

上一篇:18b20的51子程序
下一篇:12864(带字库)显示图形和汉字-51程序

推荐阅读最新更新时间:2024-03-16 15:18

MCS-51单片机实用子程序库--浮点数除法
标号: FDIV 功能:浮点数除法 入口条件:被除数在 中,除数在 中。 出口信息:OV=0时,商仍在 中,OV=1时,溢出。 影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节 FDIV: INC R0 MOV A,@R0 INC R0 ORL A,@R0 DEC R0 DEC R0 JNZ DIV1 MOV @R0,#41H;被除数为零,不必运算 CLR OV RET DIV1: INC R1 MOV A,@R1 INC R1 ORL A,@R1 DEC R1 DEC R1 JNZ DIV2 SETB OV ;除数为零,溢出 RET DIV2: LCALL MVR0 ;将 传送到第一工作区中 MOV A,
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved