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

📄 10244.c

📁 25f1024 c51程序 通过keil编译并已应用
💻 C
字号:

#include <absacc.h>
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
 
#define SPI_CS    XBYTE[0x9000]
#define uint      unsigned int
#define uchar     unsigned char
#define ulong     unsigned long
#define SomeNOP();_nop_();_nop_( );_nop_();_nop_();//_nop_();_nop_();

sbit   SCLK   =  P1^3;                         //
sbit   DIN    =  P1^2;
sbit   DOUT   =  P1^1;
sbit   I2CSCL =  P1^6;                           
sbit   I2CSDA =  P1^7;

bit   sen_data_f,rev_end_f;
bit   busy_bit;
uchar state_word=0x55; 
uchar nn,command;
uchar xdata flash_r_data[1500]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,};
uchar xdata flash_w_data[1000]={0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01};
uchar xdata rev_data[1000];
uchar xdata sen_data[1000];                           
ulong sen_len,sendatalong,revdatalong;
ulong  long_num;
ulong address_num;
/***********************************************************************

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

void feedog(void)
 {
   I2CSDA=0;
   I2CSDA=1;
 }

 void Delay_N_mS( unsigned int n_milisecond) // n mS delay 
{
unsigned char i;
while(n_milisecond--)
{
i=248;
while(i--);
}
}
/**************************************************************************

**************************************************************************/
void init_serialcomm(void)       
 {
   TMOD=0x21;                                            //24MHz晶振
   TL1=0xF3;                                             //串行速率:
   TH1=0xF3;
   SCON=0x50;
   PCON=0x80;  
   TR1=1;
   EA=1;                    // IE = 0x90;
   ES=1;
   SCLK=0;
  }
        

/***************写使能*******************************/

void write_en1()
 {
  
   EA=0;
   SCLK=0;
   SPI_CS=0XFB;
   
  command=0x06;
  for(nn=0;nn<8;nn++)
   {
    DIN=(bit)(command&0x80);           //0x06写使能命令字
    SCLK=1; 
    SomeNOP();
    SCLK=0;
	command=command<<1;
   }
    SCLK=0;
    SPI_CS=0XFF;
    EA=1;
 }                                              


 /*********读状态寄存 判是否忙器*****************/

bit  inquire_busy()  //准备好返回1 忙返回:0
{   
   EA=0; 
   SCLK=0;
   SPI_CS=0XFB;
 
  command=0x05;
 for(nn=0;nn<8;nn++)
  {
   DIN=(bit)(command&0x80);
   SCLK=1;
   SomeNOP();
   SCLK=0;
   command=command<<1;  
  } 
   
   state_word=0;
 for(nn=0;nn<8;nn++)
  {
   state_word=state_word<<1;
   SCLK=0;
   SomeNOP();
   SCLK=1;
   if(DOUT) state_word++;
  } 
   
   SCLK=0;
   SPI_CS=0XFF;                   //disable SPI
   
   EA=1;
   if(state_word&0x01) return 0;
   else
     return 1;
    
} 

/*************写状态寄存器,关闭写保护*******************************/

void close_protect(void)
{
   

   write_en1();
   SomeNOP();
   EA=0;
   SCLK=0;
   SPI_CS=0XFB;
   
   command=0x01;
  for(nn=0;nn<8;nn++)
   {
    DIN=(bit)(command&0x80);           //0x01写寄存器命令字去掉写保护
    SCLK=1;
    SomeNOP();
    SCLK=0;
	command=command<<1;
   }

	command=0x00;
  for(nn=0;nn<8;nn++)
   {
     DIN=(bit)(command&0x80);           //0x01写寄存器命令字去掉写保护
     SCLK=1;
     SomeNOP();
     SCLK=0;
	 command=command<<1;
   }
    SCLK=0;
    SPI_CS=0XFF;
 /*
    SPI_CS=0XF7;
  
    command=0x01;
  for(nn=0;nn<16;nn++)
   {
    SCLK=0;
    DIN=(bit)(command&0x80);           //0x01写寄存器命令字去掉写保护
    command=command<<1;
    //SomeNOP();
    SCLK=1;
   }
    SCLK=0;
    SPI_CS=0XFF; */

    EA=1;
}      


/**********擦出芯片**********************************/

void erase()
{ 
   write_en1();
   SomeNOP();

   EA=0;
   SCLK=0;
   SPI_CS=0XFB;
   
  command=0x62;
  for(nn=0;nn<8;nn++)
   {
    DIN=(bit)(command&0x80);           //0x06写使能命令字
    SCLK=1;  
    SomeNOP();
    SCLK=0;
    command=command<<1;
   }
    SCLK=0;
    SPI_CS=0XFF;
    EA=1;

	feedog();
    Delay_N_mS(1500);
    feedog();
    Delay_N_mS(1500);
    feedog();
	Delay_N_mS(500);
    feedog();
}          

/*********读*****************************/

void read_1024(ulong address,uint count)
{

  uint cci;
  uint shift_address;
 

   EA=0;
   SPI_CS=0XFF; 
   SomeNOP();
   SCLK=0;
   SPI_CS=0XFB;
   
   shift_address=address/65536;   //middle_address;
   shift_address=shift_address|0x0300;
   for(nn=0;nn<16;nn++)
  {
   DIN=(bit)(shift_address&0x8000);
   SCLK=1;  
   SomeNOP(); 
   SCLK=0;
   shift_address=shift_address<<1;  
   
  } 

   shift_address=address;
   for(nn=0;nn<16;nn++)
  {
    DIN=(bit)(shift_address&0x8000);
   SCLK=1;
   SomeNOP();
   SCLK=0;
   shift_address=shift_address<<1; 
  } 

for(cci=0;cci<count;cci++)
{

   flash_r_data[cci]=0;
 for(nn=0;nn<8;nn++)
  {
   flash_r_data[cci]=flash_r_data[cci]<<1;
   SCLK=0;
   SomeNOP();
   SCLK=1;
   if(DOUT) flash_r_data[cci]++;     
  } 
   SomeNOP();

}
   SCLK=0;
   SPI_CS=0XFF;                                     //disable SPI 
   EA=1;


}          

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

void write_1024(uint count)
{

  uint cci;
  uint shift_address;
  ulong middle_address;
  uchar xdata send_middle;

   write_en1();
   SomeNOP();

   EA=0;
   SCLK=0;
   SPI_CS=0XFB;
   middle_address=address_num;
   for(nn=0;nn<16;nn++)
   {
    middle_address=middle_address>>1;
   }


   shift_address=address_num/65536;   //middle_address;
   shift_address=shift_address|0x0200;
   for(nn=0;nn<16;nn++)
   {
    DIN=(bit)(shift_address&0x8000);
    SCLK=1; 
    SomeNOP();
    SCLK=0;  
    shift_address=shift_address<<1;
   } 
   
   shift_address=address_num;
   for(nn=0;nn<16;nn++)
    {
	 DIN=(bit)(shift_address&0x8000);
     SCLK=1;   
     SomeNOP();
     SCLK=0; 
 	 shift_address=shift_address<<1;
    } 
     SomeNOP( );
    
 for(cci=0;cci<count;cci++)
  {
   send_middle=flash_w_data[cci];
   for(nn=0;nn<8;nn++)
    {
	 DIN=(bit)(send_middle&0x80); 
     SCLK=1;
     SomeNOP();
     SCLK=0;
	 send_middle=send_middle<<1;
	 SomeNOP();//elay_N_mS( 1);
    } 
	feedog();
	SomeNOP();
	
  } 
  SCLK=0;  
  SPI_CS=0XFF;  //disable SPI 
 
  
  EA=1;
  Delay_N_mS( 1);

} 

void modbuscom() interrupt 4 using 1
 {
  uint t;
 
        t=1000000.0*2*3/(9600.0*7);                   //7:循环语句执行时间
	 

   if(TI)                                             //发送中断
     {
       TI = 0;
       if(sen_len < sendatalong)
        {                                  //未发送完
          //tdi = sen_data[sen_len];
          SBUF = sen_data[sen_len];
          sen_len++;
        }
       else
        {
          sen_data_f = 0;                   //发送完成标志
   
        }
     }
   if(RI==1)
    {
	  RI=0;
     
	    rev_data[revdatalong]=SBUF;
	 //commseg[I+1]=recdata[I];
	    revdatalong++;
      
	 
   
    while(revdatalong>0&&RI==0&&t>0) 
      {
	   t--;    //13us
	  }
    if(t==0)
     {
      rev_end_f=1;    
	 }

    }
   
   
      
  }

void send_data( uint num)
{
  uint kk;
  for(kk=0;kk<num;kk++)
   {
    sen_data[kk]=flash_r_data[kk];
	//stj++;
   }
   
   SBUF = sen_data[0];
   sendatalong =num;
   sen_len = 1;
   rev_data[0]=0x00;
   revdatalong=0;

}



void main(void)

{
 uint write_num,kkk;
 
 address_num=0;   //0x1ff00;
 SPI_CS=0XFF;
 init_serialcomm();
 close_protect();
 feedog();
 Delay_N_mS(300);
 feedog();
 
for(write_num=0;write_num<300;write_num++)
  {
    flash_w_data[write_num]=write_num;

   }
  
 feedog();
 SBUF=0X33;
 sendatalong =5;
 sen_len = 1;
 
while(1)
{

feedog();
if(rev_data[0]==0x88)
 {
 
  address_num=0x0001ff00; //address_num+64; 
  kkk=64;

  write_1024(kkk);
  busy_bit=inquire_busy();
  read_1024(0x0001fe00,1000); 
  flash_r_data[1]=state_word;
  flash_r_data[2]=rev_data[1];
  flash_r_data[3]=rev_data[2];
  send_data(1000);
  
  rev_data[0]=0X00;
  revdatalong=0;
 }

if(rev_data[0]==0x66)
 { 
  
  erase();
  //read_1024(0x0001fe00,999); 
  send_data(1000);

  rev_data[0]=0X00;
  revdatalong=0;
 }
}
}            

⌨️ 快捷键说明

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