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

📄 24c02.c

📁 向24C02写入256字节数据并将刚写入的数据读出
💻 C
字号:
/*******************************************************************************
*  标题:  北京蓝海微芯LJD-SY-5200单片机开发系统演示程序                        *
*  文件:  24C02.C                                                              *
*  日期:  2006-7-21                                                            *
*  版本:  1.0                                                                  *
*  作者:  蓝海微芯                                                             *
*  网站: http://www.ljd-2008.com                                              *
********************************************************************************
*  描述:                                                                       *
*           向24C02写入256字节数据并将刚写入的数据读出,通过仿真器可           *
*         以观察达写入和读出的数据。使用本程序前请仔细阅读24C02相关资料。      *              
*                                                                              *
*                                                                              *
********************************************************************************
* 【版权】 Copyright(C)微芯科技 http://www.bluemcu.com    All Rights Reserved  *          
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
*******************************************************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

sbit SDA  = P1^0;                     /* iic数据传送位 */
sbit SCL  = P1^1;                     /* iic时钟控制位 */
sbit P1_4 = P1^4;
sbit P1_3 = P1^3;
sbit P1_5 = P1^5;
/* 函数声明 */
void iic_wait(void);                  /* iic延时       */
void iic_start(void);                 /* 开启iic总线   */
void iic_stop(void);                  /* 关闭iic总线   */
void iic_ack(void);                   /* 发送ACK信号   */
void iic_no_ack(void);                /* 发送NOACK信号 */
bit iic_wait_ack(void);               /* 等待ACK信号   */
void iic_send_byte(uchar demand);     /* MCU向iic设备发送一个字节 */
uchar iic_receive_byte(void);         /* MCU从iic设备接收一个字节 */
/* 声明结束 */
void delay(void)
{
  uchar i;
  uchar j;

  for(i=0;i<100;i++)
  for(j=0;j<100;j++);
}
/* iic延时       */
void iic_wait(void)
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _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 write_iic_data(uchar write_data[], uchar address, uchar num)
{
  uchar n;

  iic_start();
  iic_send_byte(0xa0);
  iic_wait_ack();
  iic_send_byte(address);
  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 read_iic_data(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);
  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();
}
/**********************主程序**********************/
main()
{
  uchar idata test_write[64];
  uchar idata test_read [64];
  uint i;
  uchar j;
  P1_4=1;
  P1_4=0;
  P1_5=1;
  P1_3=1;

  while(1)
  {
    for (i=0; i<64; i++)
    {
      test_read[i] = 0;
    }
    for (i=0; i<64; i++)
    {
      test_write[i] =i+0;
    }
    for(j=0;j<8;j++)                                  
    {
      write_iic_data(&test_write[j*8],j*8,8);           /*向24C02的0-63地址存储单元写数据*/
      delay();
      read_iic_data(&test_read[j*8], j*8,8);            /*从24C02的0-63地址存储单元读数据*/
    }
    for (i=0; i<64; i++)
    {
      test_read[i] = 0;
    }
    for (i=0; i<64; i++)
    {
      test_write[i] =i+64;
    }
    for(j=0;j<8;j++)
    {
      write_iic_data(&test_write[j*8],j*8+64,8);       /*向24C02的64-127地址存储单元写数据*/
      delay();
      read_iic_data(&test_read[j*8], j*8+64,8);        /*从24C02的64-127地址存储单元读数据*/
    }
    for (i=0; i<64; i++)
    {
      test_read[i] = 0;
    }
    for (i=0; i<64; i++)
    {
      test_write[i] =i+128;
    }
    for(j=0;j<8;j++)
    {
      write_iic_data(&test_write[j*8],j*8+128,8);      /*向24C02的128-191地址存储单元写数据*/
      delay();
      read_iic_data(&test_read[j*8], j*8+128,8);       /*从24C02的128-191地址存储单元读数据*/
    }
    for (i=0; i<64; i++)
    {
      test_read[i] = 0;
    }
    for (i=0; i<64; i++)
    {
      test_write[i] =i+192;
    }
    for(j=0;j<8;j++)
    {
      write_iic_data(&test_write[j*8],j*8+192,8);     /*向24C02的192-255地址存储单元写数据*/
      delay();
      read_iic_data(&test_read[j*8], j*8+192,8);      /*从24C02的192-255地址存储单元读数据*/
    }
    _nop_(); 
   while(1);   
  }
}

⌨️ 快捷键说明

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