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

📄 24c01a.c

📁 C51单片机扩展的数据存储器24X01的读写驱动程序
💻 C
字号:

#include <reg51.h>
#include <intrins.h>
//#include <stdio.h>
//#include <absacc.h>

#define uchar unsigned char
#define uint unsigned int
#define WriteDeviceAddress 0xa0
#define ReadDviceAddress 0xa1




uchar get_code(uchar i);
void display(uchar i,uchar j,uchar k,uchar l);
void DelayMs(uint number);
void Start(void);
void Stop(void);
void Ack(void);
void NoAck(void);
bit TestAck(void);
void Write8Bit(uchar input);
uchar Read8Bit(void);
void Write24c02(uchar Romadd,uchar number,uchar *Wdata);
void Read24c02(uchar RomAddress, uchar num,uchar *RamAddress);



sbit SCL=P1^6;
sbit SDA=P1^7;
bit bdata NACK=0;//器件坏或错误标志;
uchar idata MTD[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //数据发送缓冲区
uchar idata MRD[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //数据接收缓冲区

/***************************************************************************/

main()
{
 uchar i;
 Write24c02(0x00,8,MTD);
 Read24c02(0x00,8,MRD);
 for(i=0;i<8;i++)
 {
  display(MRD[i],MRD[i],MRD[i],MRD[i]);
 }
 while(1);
}

/*************************************功能:发起始信号*******************************/
/*****************当SCL为高电平时,SDA发生由高到低跳变为开始信号*********************/
void Start()
{SCL=0;
 SDA=1;
  _nop_();_nop_();_nop_();_nop_();
 SCL=1;
 _nop_();_nop_();_nop_();_nop_();
 SDA=0;
 _nop_();_nop_();_nop_();_nop_();
 SCL=0;
 return;
 }
 /***************************************************************************/





/*********************************功能:发停止信**********************************/
/****************当SCL为高电平时,SDA发生由低到高跳变为结束信号*******************/
void Stop()
{ SCL=0;
  SDA=0;
  _nop_();_nop_();_nop_();_nop_();
  SCL=1;
  _nop_();_nop_();_nop_();_nop_();
  SDA=1;//放开总线
  _nop_();_nop_();_nop_();_nop_();
  return;
}
/***************************************************************************/




/*********************************功能:发响应信号***************************/
void Ack()
{SCL=0;
 SDA=0;
  _nop_();_nop_();_nop_();_nop_();
 SCL=1;
 _nop_();_nop_();//_nop_();_nop_();
 SCL=0;
  _nop_();_nop_();_nop_();_nop_();
 return;
 }
 /***************************************************************************/





/*********************************功能:发非响应信号*************************/
void NoAck()
 {
 SCL=0;
 SDA=1;
 _nop_();_nop_();_nop_();_nop_();
 SCL=1;
  _nop_();_nop_();_nop_();_nop_();
  SCL=0;
  return;
}
/***************************************************************************/




/*****************************测试响应信号(不完善需改动)**********************************/
bit TestAck()
{
   bit ErrorBit;
   SCL=0;
   SDA=1;
   _nop_();_nop_();_nop_();_nop_();
   SCL=1;
   _nop_();_nop_();_nop_();_nop_();
   ErrorBit=SDA;
   SCL=0;
   SDA=1;
   return(ErrorBit);
  }
/***************************************************************************/









/*****************************写一字节**********************************/
 void Write8Bit(unsigned char input)
 {
  unsigned char temp;
  for(temp=8;temp!=0;temp--)
   {
    SCL=0;
    SDA=(bit)(input&0x80);
    _nop_();_nop_();_nop_();_nop_();
    SCL=1;
    _nop_();_nop_();_nop_();_nop_();
    SCL=0;
    input=input<<1;
 }
}
/***************************************************************************/


/********************************读一字节**********************************/
unsigned char Read8Bit()
 {
  unsigned char temp,rbyte=0;
  SDA=1;
  for(temp=8;temp!=0;temp--)
  {
   SCL=0;
   _nop_();_nop_();_nop_();_nop_();
   SCL=1;
   _nop_();_nop_();_nop_();_nop_();
   rbyte=rbyte<<1;
   rbyte=rbyte|((unsigned char)(SDA));
   SCL=0;
   SDA=1;
  }
 return(rbyte);
}
/***************************************************************************/


/*********************************多字节写操作******************************************/
/*Wdata为待写数据所在的首地址,RomAddress为将存储的存储卡地址,number为将写入的数据个数*/

void Write24c02(uchar RomAdd,uchar number,uchar *Wdata)
 {
 uchar i;
 Start();
 Write8Bit(WriteDeviceAddress); //发送从地址
 i=TestAck();
 if(i==1)
 {
  NACK=1;
  return;
 }
 Write8Bit(RomAdd);     //发送子地址
 i=TestAck();
 if(i==1)
    {
      NACK=1;
      return;
    }
for(;number!=0;number--)
   {
       Write8Bit(*Wdata);
       i=TestAck();
       if(i==1)
         {
           NACK=1;
           return;
         }
        Wdata++;

   }

 Stop();
 DelayMs(10);

}
/**********************************************************************************/



/*********************************多字节读操作***************************************/
/*************RamAddress为待将读出的数据所放的单片机的首地址,RomAddress*************/
/***************为待读数据在存储卡的首地址,number为将读出的数据个数*****************/
void Read24c02(uchar RomAddress,uchar num,uchar *RamAddress)

{
 uchar i;
 Start();
 Write8Bit(WriteDeviceAddress);
 i=TestAck();
  if(i==1)
 {
  NACK=1;
  return;
 }
 Write8Bit(RomAddress); //子地址
 i=TestAck();
  if(i==1)
 {
  NACK=1;
  return;
 }
 Start();
 Write8Bit(ReadDviceAddress);
 i=TestAck();
  if(i==1)
 {
  NACK=1;
  return;
 }
 while(num!=1)
  {
 *RamAddress=Read8Bit();
 Ack();
 RamAddress++;
 num--;
 }
 *RamAddress=Read8Bit();
 NoAck();
 Stop();
}
/***************************************************************************/



//-----------------------------------------------------------------
//函数名称:DelayMS()
//功能:实现廷时(number)mS
//-----------------------------------------------------------------
void DelayMs(uint number)
{
 unsigned char temp;
 for(;number!=0;number--)
  {
      for(temp=125;temp!=0;temp--)
      {  }
  }
}



 //--------------------------------------------------------------
 //函数名称:get_code
 //功能:获得对应的共阳极码
 //--------------------------------------------------------
uchar get_code(uchar k)
{
unsigned char p;
	  switch (k){
		case  0:	p=0x3F;	break;	/*0*/
        case  1:    p=0x06;	break;	/*1*/
        case  2:    p=0x5B;	break;	/*2*/
        case  3:    p=0x4F;	break;	/*3*/
        case  4:    p=0x66;	break;	/*4*/
        case  5:    p=0x6D;	break;	/*5*/
        case  6:    p=0x7D;	break;	/*6*/
        case  7:    p=0x07;	break;	/*7*/
        case  8:    p=0x7F;	break;	/*8*/
        case  9:    p=0x67;	break;	/*9*/
        case 10:    p=0x77;	break;	/*A*/
        case 11:    p=0x7C;	break;	/*B*/
        case 12:    p=0x39;	break;	/*C*/
        case 13:    p=0x5E;	break;	/*D*/
        case 14:    p=0x79;	break;	/*E*/
        case 15:    p=0x71;	break;	/*F*/
        case 16:    p=0x00;	break;	/*灭灯*/
		default:		 	  	break;}
	  return (p);
}


//-----------------------------------------------------------
//函数名称:display
//功能:动态数码显示
//-----------------------------------------------------------
void display(uchar i,uchar j,uchar k,uchar l)
{  uchar ii;
  for(ii=0;ii<250;ii++)
  {
  P0=get_code(i);
  P2=0x8F;
  DelayMs(2);
  P0=get_code(j);
  P2=0x4F;
  DelayMs(2);
  P0=get_code(k);
  P2=0x2F;
  DelayMs(2);
  P0=get_code(l);
  P2=0x1F;
  DelayMs(2);
  }
  P2=0x0F;
  }











⌨️ 快捷键说明

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