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

📄 24c16.txt

📁 利用24c16实现断电存储功能。先在地址中写入一个数
💻 TXT
字号:
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

#define HIGH 1
#define LOW 0

sbit SCL =P1^6;
sbit SDA =P1^7;
sbit led =P1^4;
void delay(uint x)
{
  uint i;
  for(i=0;i<x;i++)
  {
       _nop_();
       _nop_();  
       _nop_();
       _nop_();
  }
}

delay1ms(uint t)
{
   uint i,j;
   for( i=0;i<t;i++)
   for( j=0;j<120;j++)
   ;
}


void I_start(void)   //起始条件
{
  SDA=HIGH;
  SCL=HIGH;
  delay(1);
  SDA=LOW;
  delay(1);
}


void I_stop(void)    //停止条件
{
  SDA=LOW;
  SCL=HIGH;
  delay(1);
  SDA=HIGH;
  delay(1);
}


void Ack(void)      //应答位
{
   SDA=LOW;
   delay(1);
   SCL=HIGH;
   delay(1);
   SCL=LOW;
}

void NoAck(void)   //反向应答位
{
   SDA=HIGH;
   delay(1);
   SCL=HIGH;
   delay(1);
   SCL=LOW;
}

void I_send(uchar Data)            //发送数据子程序,Data为要求发送的数据
{
  uchar BitCounter=8;              //位数控制
  uchar temp;                      //中间变量控制
  do
  {
    temp=Data;
	SCL=LOW;
	delay(1);
	if((temp&0x80)==0x80)       //如果最高位是1
	    SDA=HIGH;
	else
	    SDA=LOW;
	SCL=HIGH;
	temp=Data<<1;
	Data=temp;
    BitCounter--;
  }while(BitCounter);
  SCL=LOW;
}



uchar Read(void)         //读一个字节的数据,并返回该字节值
{
  uchar temp=0,temp1=0;
  uchar BitCounter=8;
  SDA=HIGH;
  do
  {
     SCL=LOW;
	 delay(1);
	 SCL=HIGH;
	 delay(1);
	 if(SDA)               //如果SDA=1
	    temp=temp|0x01;    //temp的最低位置1
	 else
	    temp=temp&0xfe;    //否则temp的最低位清0
	 if(BitCounter-1)
	 {   temp1=temp<<1;
	     temp=temp1;
	 }
	 BitCounter--;
   }while(BitCounter);
   return(temp);
}

void WrToROM(uchar Data[],uchar Address,uchar Num)
{
    uchar i=0;
	uchar * PData;
	PData=Data;
	I_start();
    I_send(0xa0);
	Ack();
	I_send(Address);
	Ack();
	for(i=0;i<Num;i++)
	{
	  I_send(*(PData+i));
	  Ack();
	}
	I_stop();
}

void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
    uchar i=0;
	uchar * PData;
	PData=Data;
    for(i=0;i<Num;i++)
	{
	   	I_start();
        I_send(0xa0);
        Ack();
      	I_send(Address+i);
        Ack();
      	I_start();
        I_send(0xa1);
        Ack();
		*(PData+i)=Read();
		SCL=LOW;
		NoAck();
		I_stop();
	 }
}

void main()
{
       uchar code ROMDat[4]={0xe2,0xe2,0x10,0xef};
       uchar code ROMDat1[4];          
       WrToROM(ROMDat,0x0000,4);
       RdFromROM(ROMDat1,0x8000,4);
	   for(;;)
	   {
         {if(ROMDat1[0]==0xe2){led=0;delay1ms(1000);}
          else {led=1;delay1ms(1000);}
         }
		 {if(ROMDat1[1]==0xe2){led=1;delay1ms(1000);}
		  else{led=0;delay1ms(1000);}
		 }
         {if(ROMDat1[2]==0x10){led=0;delay1ms(1000);}
          else {led=1;delay1ms(1000);}
         }
         {if(ROMDat1[3]==0xef){led=1;delay1ms(1000);}
		  else{led=0;delay1ms(1000);}
		 }
       }
}

⌨️ 快捷键说明

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