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

📄 at24c64(pass).c

📁 Keilc下的ucosII操作实时系统
💻 C
字号:
#include<reg52.h>
#include<intrins.h>
//#define WDI P3_4 

#define AT24c64_address 0xa0 //A2,A1,A0,接GND。EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1, 
//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址; 
 
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); _nop_();_nop_();_nop_();_nop_();
//#define NUM 10

//uchar idata sendbuf[NUM];
//uchar idata receivebuf[NUM];
bit bdata SystemError;
sbit SDA=P0^0;
sbit SCL=P0^1;
//uchar  dat[10];

///
void iic_start();//启动IIC总线
void iic_stop();//停止IIC总线
void slave_ACK();//从机发送应答
void slave_NOACK(void);//从机发送非应答
void check_ACK(void);//主机应答位检查
void IICSendByte(uchar ch);//发送1BYTE
uchar IICReciveByte(void);//接收1BYTE
void AT24c64_write_byte(uint address,uchar dat);// 24c64存储1BYTE
uchar AT24c64_read_byte(uint address);//读指定的地址的1BYTE数据 
void AT24c64_read_bytes(uint address,uchar *pdat,uchar length);//读指定地址后的连续的数据 
void AT24c64_write_bytes(uint address,uchar *pdat,uchar length);//写一页数据到24c64中 
void delay_tt_ms(uchar tt);//延时TTMS
///////////////////////////////
void iic_start(void)//启动IIC总线
  {
    EA=0;
    SDA=1;
    SCL=1;
    delayNOP();//延时5us
    SDA=0;
    delayNOP();
    SCL=0;
  }
/////////////////////////////////
void iic_stop(void)//停止IIC总线
  {
    SDA=0;
    SCL=1;
    delayNOP();
    SDA=1;
    delayNOP();
    SCL=0;
  }
////////////////////////////////
void slave_ACK(void)//从机发送应答
  {
    SDA=0;
    SCL=1;
    delayNOP();
    SCL=0;
    SDA=1;
  }
/////////////////////////////////
void slave_NOACK(void)//从机发送非应答
  {
    SDA=1;
    SCL=1;
    delayNOP();
    SDA=0;
    SCL=0;
  }
/////////////////////////////////
void check_ACK(void)//主机应答位检查
  {
    SDA=1;
    SCL=1;
    F0=0;//非应答标志F0
    if(SDA==1)
       F0=1;//表明非应答
    SCL=0;
  }
//////////////////////////////////
void IICSendByte(uchar ch)//发送1BYTE
  {
    uchar idata n=8;//1字节共8位
    while(n--)
      {
         if((ch&0x80)==0x80)//发送高位
          {
            SDA=1;//传输1
            SCL=1;
            delayNOP();
            SCL=0;
          }
         else
          {
            SDA=0;//传输0
            SCL=1;
            delayNOP();
            SCL=0;
          }
         ch<<=1;//数据左移
      }
  }
//////////////////////////////////
uchar IICReceiveByte(void)//接收1BYTE
  {
    uchar idata n=8;
    uchar tdata;
    while(n--)
      {
         SDA=1;
         SCL=1;
         tdata<<=1;//左移一位
         if(SDA==1)
          tdata=tdata|0x01;//收到1,数据最后一位为1
         else
          tdata=tdata&0xfe;
         SCL=0;
      }
    return(tdata);
  }
////////////////////////////////////
void AT24c64_write_byte(uint address,uchar dat)// 24c64存储1BYTE
  { 
    uchar value; 
    iic_start(); 
    value=AT24c64_address&0xfe; //发送器件地址 
    IICSendByte(value); 
    check_ACK();//检测应答
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    value=address/0x100;//发送地址高字节 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    value=address%0x100;//发送地址低字节 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    value=dat; 
    IICSendByte(value);//发送数据 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    iic_stop(); 
  } 
///////////////////////////////////
uchar AT24c64_read_byte(uint address)//读指定的地址的1BYTE数据 
  { 
    uchar value; 
    iic_start(); 
    value=AT24c64_address&0xfe; //发送器件地址 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return 0;
      }
    value=address/0x100;//发送地址高字节 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return 0;
      }
    value=address%0x100;//发送地址低字节 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return 0;
      }
    iic_stop(); 
    iic_start(); 
    value=AT24c64_address|0x01; //发送器件地址 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return 0;
      }
    value=IICReceiveByte();
    slave_NOACK(); //主不应答信号;主机发送非应答,迫使数据传输结束 
    iic_stop(); 
    return(value); 
} 
//////////////////////////////////
void AT24c64_write_bytes(uint address,uchar *pdat,uchar length)//写一页数据到24c64中 
  { 
    uchar value,i; 
    iic_start();  
    value=AT24c64_address&0xfe; //发送器件地址 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    value=address/0x100;//发送地址高字节 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    value=address%0x100;//发送地址低字节 
    IICSendByte(value);
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      } 
    for(i=0;i<length;i++ )
      { 
        value=*pdat; 
        IICSendByte(value);//发送数据 
        check_ACK();
        if(F0==1)
          {
             SystemError=1;
             return;
          }
        pdat++; 
       } 
    iic_stop(); 
  } 
//////////////////////////////////////
void AT24c64_read_bytes(uint address,uchar *pdat,uchar length)//读指定地址后的连续的数据 
  { 
    uchar value,i; 
    iic_start(); 
    value=AT24c64_address&0xfe; //发送器件地址 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    value=address/0x100;//发送地址高字节 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    value=address%0x100;//发送地址低字节 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    iic_stop(); 
    iic_start(); 
    value=AT24c64_address|0x01; //发送器件地址 
    IICSendByte(value); 
    check_ACK();
    if(F0==1)
      {
         SystemError=1;
         return;
      }
    i=length-1; 
    while(i--) 
      { 
        *pdat=IICReceiveByte(); 
        slave_ACK();//主应答信号 
        pdat++; 
      } 
    *pdat=IICReceiveByte(); 
    slave_NOACK();//主不应答信号 
    iic_stop(); 
}
//////////////////////////////////
/*void delay_tt_ms(uchar tt)//延时TTMS
  {
    uchar i;
    while(tt--)
    for(i=0;i<125;i++);
  }
//////////////////////////////////
void main(void)
  {
    uchar d=0xff,i;
    /*AT24c64_write_byte(0x0020,0x08);//测试写入1BYTE
    delay_tt_ms(5);//写入有个时间的最短3MS,
    d=AT24c64_read_byte(0x0020);//读测试
    P1=d;
    uchar  pdat[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
    AT24c64_write_bytes(0x0010,pdat,10);//测试页写入
    delay_tt_ms(5);
    AT24c64_read_bytes(0x0010,dat,10);//读指定地址后的连续的数据
    while(1)
      {
         for(i=0;i<=10;i++)
          {
             P2=dat[i];
             delay_tt_ms(200);
             delay_tt_ms(200);
             delay_tt_ms(200);
             delay_tt_ms(200);
          }
      }
  }	   */

⌨️ 快捷键说明

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