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

📄 24c02读写程序.c

📁 本人收集和自己写的部分51系列例程,供各位参考
💻 C
字号:
#include <at89x51.h>


#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//////////////////////////////////////////////////////////////////
//////////24c读写的时候用到的函数/////////////////////////////////
//////////////////申明函数////////////////////////////////////////
sbit at24c02_scl=P3^7;
sbit at24c02_sda=P3^6;
void delay(uchar delay_temp);//长延时
void delaym(uchar delaym_temp);//短延时
void sta(void);//启动IIC总线
void stop(void);//停止IIC总线数据传送
void mnack(void);//发送非应答位
uchar cack(void);//应答位检查
void wrbyt(uchar date_24c02);//向SDA线上发送一个数据字节
uchar rdbyt(void);//从SDA线上读取一个数据字节
void   wriet24(uchar  w_add,uchar  w24_data);
uchar  read24(uchar  r_add);
//////////////////////////////////////////////////////////////////////
/////////读写的时候用到的变量申明/////////////////////////////////////
uchar   w_add,r_add;
uchar  data24,w24_data;
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

uchar   number1,number2,number3,number4;
uchar   count;



unsigned char leddata[]={ ////////////////显示数据
 
                0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90,  //"9"
                 };


void  mdelay(unsigned  int delay)  //延时子程序
{
 unsigned int  i;
 for(;delay>0;delay--)
  {
   for(i=0;i<124;i++)
    {;}
   }
 }


void  disp()//////////////////////////显示函数
{
 number1=count/1000;      ////////有问题///
 number2=(count-number1*1000)/100;
 number3=(count-number1*1000-number2*100)/10;
 number4=(count-number1*1000-number2*100-number3*10);
 P2_4=0;
 P0=leddata[number1]; 
 mdelay(5);
 P2_4=1;

 P2_5=0;
 P0=leddata[number2];
 mdelay(5);
 P2_5=1;

 P2_6=0;
 P0=leddata[number3];
 mdelay(5);
 P2_6=1;

 P2_7=0;
 P0=leddata[number4];
 mdelay(5);
 P2_7=1;


}


void  main()
{
 w_add=10;
 r_add=10;
 w24_data=255;

 wriet24( w_add, w24_data);////向24的W_ADD地址写一个W24_DATA的数据///

 count=read24(r_add);//////////将从R_ADD地址读到的数据返回给COUNT///

  while(1)
   {
    disp();
   }
}
  





void delay(uchar delay_temp)//延时子程序
{
 uchar i,j;
 for(i=0;i<delay_temp;i++)
 {
  for(j=0;j<255;j++);
 }
}
void delaym(uchar delaym_temp)//延时子程序
{
 uchar i;
 for(i=0;i<delaym_temp;i++);
}
void sta(void)//启动IIC总线
{
 at24c02_sda=1;
 at24c02_scl=1;
 delaym(1);
 at24c02_sda=0;
 delaym(1);
 at24c02_scl=0;
}
void stop(void)//停止IIC总线数据传送
{
 at24c02_sda=0;
 at24c02_scl=1;
 delaym(1);
 at24c02_sda=1;
 delaym(1);
 at24c02_scl=0;
}
uchar cack(void)//应答位检查
{
 uchar i;
 i=0x00;
 at24c02_sda=1;
 at24c02_scl=1;
 if(at24c02_sda==1)i=0xff;
 at24c02_scl=0;
 return i;
}
void mnack(void)//发送非应答位
{
 at24c02_sda=1;
 at24c02_scl=1;
 delaym(1);
 at24c02_scl=0;
 at24c02_sda=0;
}
void wrbyt(uchar date_w24)//向SDA线上发送一个数据字节
{
 uchar i,j;
 j=0x80;
 for(i=0;i<8;i++)
 {
  if((date_w24&j)==0)
  {
   at24c02_sda=0;
   at24c02_scl=1;
   delaym(1);
   at24c02_scl=0;
  }
  else
  {
   at24c02_sda=1;
   at24c02_scl=1;
   delaym(1);
   at24c02_scl=0;
   at24c02_sda=0;
  }
  j=j>>1;
 }
}

uchar rdbyt(void)//从SDA线上读取一个数据字节
{
 uchar i,j;
 j=0x00;
 for(i=0;i<8;i++)
 {
  at24c02_sda=1;
  at24c02_scl=1;
  if(at24c02_sda==0)
  {
   j=j&0xfe;
  }
  else
  {
   j=j|0x01;
  }
  if(i!=7)j=j<<1;
  at24c02_scl=0;
 }
 return j;
}

void   wriet24(uchar  w_add,uchar  w24_data)//////////向24的W_ADD地址写
               /////W24_DATA的数据////
{
 //////////////////////////////////////////////写24c
  sta();
  wrbyt(0xa0);//写24C02
  while(cack());  
  wrbyt(w_add);//地址
  while(cack());
  wrbyt(w24_data);//写数据
  while(cack());
  stop();
  delay(50);//停止到启动信号之间需要延时
} 

uchar read24(uchar  r_add)//////////向24的R_ADD地址读
          /////数据READ24_DATA////
{
//////////////////////////////////////////////////读24c
  sta();//启动IIC总线
  wrbyt(0xa0);//向SDA线上发送一个数据字节
  while(cack()); //应答位检查
  wrbyt(r_add);//地址
  while(cack());
  sta();
  wrbyt(0xa1);//读24C02
  while(cack());
  data24=rdbyt();//在仿真环境中执行到下一步观察temp_1的值,//从SDA线上读取一个数据字节

  mnack(); //发送非应答位
  stop();
  delay(20);
  return data24;
}

⌨️ 快捷键说明

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