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

📄 at24c64.h

📁 keil C语言编写的数据存储器AT24C64与51单片机连接的驱动程序
💻 H
字号:


#include "DS1302.H"
#include "math.h"

#define  uchar    unsigned char
#define  uint     unsigned int

sbit SDA  = P1^3;                     /* iic数据传送位 */
sbit SCL  = P1^2;                     /* iic时钟控制位 */

uint NUM;
uint HEAD=1;
uint HEAD_NUM=0;
uint dataflag=1;

uchar  data_AT24C1[] = {"无数据"};
uchar  data_AT24C2[] = {"删除此数据成功"};
uchar  data_AT24C3[] = {"请稍候"};
uchar  data_AT24C4[] = {"正在处理中"};
uchar  data_AT24C5[] = {"删除所有数据成功"};

/*24C64子程序 */
void   iic_start(void);
void   iic_stop(void);
void   iic_ack(void);
void   iic_no_ack(void);
void   iic_send_Byte( uchar);
uchar  iic_receive_Byte(void);
void   AT24C64_R(uchar read_data[], uchar address, uchar num);
void   AT24C64_W(uchar write_data[], uchar address, uchar num);
/************************************************************************/
/* iic延时       */
void iic_wait(void)
{
  _nop_();
  _nop_();
}
/************************************************************************/
/* 开启iic总线   */
void iic_start(void)
{
  SDA = 1;
  SCL = 1;
  iic_wait();
  SDA = 0;
  iic_wait();
  SCL = 0;
}
/************************************************************************/
/* 关闭iic总线   */
void iic_stop(void)
{
  SDA=0;
  SCL=0;
  iic_wait();
  SCL=1;
  iic_wait();
  SDA=1;
}
/************************************************************************/
/* 发送ACK信号   */
void iic_ack(void)
{
  SDA=0;
  iic_wait();
  SCL=1;
  iic_wait();
  SCL=0;
}
/************************************************************************/
/* 发送NOACK信号 */
void iic_no_ack(void)
{
  SDA=1;
  iic_wait();
  SCL=1;
  iic_wait();
  SCL=0;
}
/********************************************************************
函 数 名:iic_wait_ack   
功    能:等待ACK信号
说    明:
入口参数:
返 回 值:1-ACK         0-ERROR
设    计:蓝海微芯           
***********************************************************************/
bit iic_wait_ack(void)
{
  uchar errtime=255;
  //uint errtime = 1000;

  SDA=1;
  iic_wait();
  SCL=1;
  iic_wait();

  while(SDA)
  {
    errtime--;
    if(!errtime)
    return 0;
  }
  SCL=0;
  return 1;
}
/********************************************************************
函 数 名:iic_send_byte   
功    能:MCU向iic设备发送一个字节 
说    明:
入口参数:sbyte                  待发送的字节数据
返 回 值:
设    计:蓝海微芯           
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
  uchar i = 8;

  while(i--)
  {
    SCL = 0;
    _nop_();
    SDA = (bit)(sbyte&0x80);
    sbyte <<= 1;
    iic_wait();
    SCL = 1;
    iic_wait();
  }
 SCL=0;
}
/********************************************************************
函 数 名:iic_receive_byte  
功    能:MCU从iic设备接收一个字节
说    明:
入口参数:
返 回 值:ddata   接收数据
设    计:蓝海微芯           
***********************************************************************/
uchar iic_receive_byte(void)
{
  uchar i=8;
  uchar ddata=0;

  SDA=1;
  while(i--)
  {
    ddata <<= 1;
    SCL=0;
    iic_wait();
    SCL=1;
    iic_wait();
    ddata |= SDA;
  }
  SCL=0;
  return ddata;
}
/********************************************************************
函 数 名:write_iic_data 
功    能:向iic设备写入N个字节
说    明:
入口参数:write_data              存放写入字节的数组
          address                 指定从address处开始写入
          num                     写入的字节数  
返 回 值:无
设    计:蓝海微芯           
***********************************************************************/
void AT24C64_W(uchar write_data[], uchar address, uchar num)
{
  uchar n;
  iic_start();
  iic_send_byte(0xa0);
  iic_wait_ack();
  iic_send_byte(address>>8);
  iic_wait_ack(); 
  iic_send_byte(address & 0xff);
  iic_wait_ack();
  for(n=0; n<num; n++)
  {
    iic_send_byte(write_data[n]);
    iic_wait_ack();
  }
  iic_stop();
}
/********************************************************************
函 数 名:read_iic_data 
功    能:从iic设备读取N个字节
说    明:
入口参数:read_data               存放读取字节的数组 
          address                 指定从address处开始读取 
          num                     读取的字节数
返 回 值:无
设    计:蓝海微芯           
***********************************************************************/
void AT24C64_R(uchar read_data[], uchar address, uchar num)
{
  uchar n;
  uchar *pread_data;
  pread_data = read_data;
  iic_start();
  iic_send_byte(0xa0);
  iic_wait_ack();
  iic_send_byte(address>>8);
  iic_wait_ack();
  iic_send_byte(address & 0xff);
  iic_wait_ack();
  iic_start();
  iic_send_byte(0xa1);
  iic_wait_ack();

  for (n=0; n<num; n++)
  {
    *pread_data = iic_receive_byte();
    pread_data++;

    if (n != (num - 1))     //最后一个数据不应答
    {
      iic_ack();
    }
  }
  iic_no_ack();
  iic_stop();
}
/**********************************************************************************/
void testdata(uchar data1[],uchar data2[],uchar num,uint flag_num)
{
 uint test=1;
 uint i;
 again:
 while(test==1)
 {
  for(i=0;i<num;i++)
  {
   if(data1[i]!=data2[i])
   {
    AT24C64_R(&data1[0],flag_num,num);
    AT24C64_R(&data2[0],flag_num,num);
    test=1;
    goto again;
   }
   else
    test=0;
  }
 }
}
/**********************************************************************************/
void translate(uchar datas[])
{ 
 uchar datas2[9];

 datas2[0] = datas[0] + '0';  //Date值
 datas2[1] = datas[1] + '0';
 datas2[2] = '-';
 datas2[3] = datas[2] + '0';
 datas2[4] = datas[3] + '0';
 datas2[5] = '-';
 datas2[6] = datas[4] + '0';
 datas2[7] = datas[5] + '0';
 datas2[8] = '\0';
 setPosition(0,3);
 writeString(datas2);

 datas2[0] = datas[6] + '0';  //Time值
 datas2[1] = datas[7] + '0';
 datas2[2] = ':';
 datas2[3] = datas[8] + '0';
 datas2[4] = datas[9] + '0';
 datas2[5] = ':';
 datas2[6] = datas[10] + '0';
 datas2[7] = datas[11] + '0';
 datas2[8] = '\0';
 setPosition(1,3);
 writeString(datas2);

 datas2[0] = datas[12] + '0';  //温度
 datas2[1] = datas[13] + '0';
 datas2[2] = '\0';
 setPosition(2,3);
 writeString(datas2);

 datas2[0] = datas[14] + '0';  //湿度
 datas2[1] = datas[15] + '0';
 datas2[2] = '\0';
 setPosition(2,7);
 writeString(datas2);

 datas2[0] = datas[16] + '0';  //SPAD值
 datas2[1] = datas[17] + '0';
 datas2[2] = '\0';
 setPosition(3,3);
 writeString(datas2);
}
/**********************************************************************************/
void LCD_DISPLAY(void)
{
  setPosition(0,0);
  writeString("Date: ");
  setPosition(1,0);
  writeString("Time: ");
  setPosition(2,0);
  writeString("温度:");
  setPosition(2,4);
  writeString("湿度:");
  setPosition(3,0);
  writeString("SPAD:");
}
/**********************************************************************************/
void key_work(void)
{
 uint s;
 uchar read_data1[50],read_data2[50];
 uint ad0=0,ad1=0;
 float idata SPAD;
 uint i;
 uchar datas1[20];
 uchar num[1];

 if(P1_5==0)   //工作模式
 {
  delayMs(5);
  while(!P1_5);
  setPosition(3,0);
  writeString("仪器测量SPAD模式");
  while(1)
  {
   if(P1_4==0)   //呼出数据
   {
    delayMs(5);
    while(!P1_4);
    if(NUM!=0)
	{
	 init();
     if(HEAD_NUM==NUM)
      HEAD_NUM = 0;
     HEAD = 9*HEAD_NUM+1+(HEAD_NUM/3)*5;
     HEAD_NUM = HEAD_NUM+1;
     LCD_DISPLAY();
     AT24C64_R(&read_data1[0],HEAD,9);
     AT24C64_R(&read_data2[0],HEAD,9);
 	 testdata(read_data1,read_data2,9,HEAD);
     for(i=0;i<10;i++)
     {
      datas1[2*i] = read_data1[i]/10;
      datas1[2*i+1] = read_data1[i]%10;
     } 
     translate(datas1);
     setPosition(3,5);
     writeString("数据");
     setPosition(3,7);
    
     datas1[0] = HEAD_NUM/10 + '0';
     datas1[1] = HEAD_NUM%10 + '0';
     datas1[2] = '\0';

     writeString(datas1);
    }
    else 
    {
     init();
     setPosition(1,2);
     writeString(data_AT24C1);
    }
   }

   /*if(P1_5==0)
   {
   init();
   ad0 = ad1 = 0;
   for(i=0;i<10;i++)	//接收光光照强度
   {
    s=ADC_Convert(0);
    if(s>ad0)
     ad0 = s;
   }
   ad0 = ad0 - 22;  
   for(i=0;i<10;i++)
   {
    s=ADC_Convert(1);
    if(s>ad1)
     ad1 = s;
   } 
   ad1 = ad1 - 30;
   read_data1[0]=ad0/1000 + '0';
   read_data1[1]=(ad0%1000)/100 + '0';
   read_data1[2]=(ad0%100)/10 + '0';
   read_data1[3]=ad0%10 + '0';
   read_data1[4]='\0';
   setPosition(0,0);
   writeString(read_data1);
   read_data1[0]=ad1/1000 + '0';
   read_data1[1]=(ad1%1000)/100 + '0';
   read_data1[2]=(ad1%100)/10 + '0';
   read_data1[3]=ad1%10 + '0';
   read_data1[4]='\0';
   setPosition(1,0);
   writeString(read_data1);
   SPAD = fabs(1000*(log10((ad1*2182.00)/(ad0*3447.00))));//K值未确定,公式还得修改
   read_data1[0]=(int)SPAD/10 + '0';
   read_data1[1]=(int)SPAD%10 + '0'; 
   read_data1[2]='\0';
   setPosition(3,0);
   writeString(read_data1);}*/

   if(P1_5==0) //求SPAD
   {
    delayMs(5);
    while(!P1_5);
    init();
    ad0 = ad1 = 0;
    for(i=0;i<10;i++)	//接收光光照强度
    {
     s=ADC_Convert(0);
     if(s>ad0)
      ad0 = s;
    }
    ad0 = ad0 - 22;  
    for(i=0;i<10;i++)
    {
     s=ADC_Convert(1);
     if(s>ad1)
      ad1 = s;
    } 
    ad1 = ad1 - 30;
    NUM = NUM+1;
    num[0] = NUM;
    AT24C64_W(&num[0],0,1);          //储存数据组数

    SPAD = fabs(500*(log10((ad1*2182.00)/(ad0*3447.00))));//K值未确定,公式还得修改  

    LCD_DISPLAY();

    DS1302_GetTime(&CTE);  //显示时间
    DateToStr(&CTE);
    TimeToStr(&CTE);
    setPosition(0,3);
    writeString(CTE.DateString);
    setPosition(1,3);
    writeString(CTE.TimeString);
    setPosition(1,7);
    writeString("  ");
    TEM_HUM_DISP();            //显示温度 湿度
    setPosition(3,0);
    writeString("SPAD:  ");
    read_idata[6] = sht11[0];  //收集当前温度数据
    read_idata[7] = sht11[1];  //收集当前湿度数据
    read_idata[8] = (int)SPAD; //收集当前SPAD数据
    
    AT24C64_W(&read_idata[0],9*(NUM-1)+1+((NUM-1)/3)*5,9);//存储当前数据

    datas1[0] = (int)SPAD/10 + '0';
    datas1[1] = (int)SPAD%10 + '0';
    datas1[2] = '\0';
    setPosition(3,3);
    writeString(datas1);

    if(NUM==1)
    {
     setPosition(3,5);
     writeString("00");
    }
    else
    {
     dataflag = 9*(NUM-2)+1+((NUM-2)/3)*5;
     AT24C64_R(&read_data1[0],dataflag,9);
     AT24C64_R(&read_data2[0],dataflag,9);
 	 testdata(read_data1,read_data2,9,dataflag);
     datas1[0] = read_data1[8]/10 + '0';
     datas1[1] = read_data1[8]%10 + '0';
     datas1[2] = '\0';
     setPosition(3,5);
     writeString(datas1);
    }
   }
   if(P1_6==0)  //删除当前测量的一个数据
   {
    delayMs(5);
    while(!P1_6);
    if(NUM!=0)
    {
     NUM = NUM-1;
     num[0] = NUM;
     AT24C64_W(&num[0],0,1);          //储存数据组数
     init();
     if(HEAD_NUM!=0)
       HEAD_NUM = HEAD_NUM - 1;
     setPosition(1,1);
     writeString(data_AT24C3);
     setPosition(2,1);
     writeString(data_AT24C4);
     delayMs(5000);
     init();
     setPosition(1,0);
     writeString(data_AT24C2);
    }
    else
    {
     init();
     setPosition(1,2);
     writeString(data_AT24C1);
    } 
   }
   if(P1_7==0)//删除所有数据
   {
    delayMs(5);
    while(!P1_7);
    NUM=0;
    HEAD_NUM=0;
    num[0] = NUM;
    AT24C64_W(&num[0],0,1);          //储存数据组数
    init();
    setPosition(1,1);
    writeString(data_AT24C3);
    setPosition(2,1);
    writeString(data_AT24C4);
    delayMs(5000);
    init();
    setPosition(1,0);
    writeString(data_AT24C5);
    delayMs(10000);
    init();
    break;
   }
  }
 }
}

⌨️ 快捷键说明

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