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

📄 at89s52.h

📁 一个使用USB下载51单片机程序的源程序
💻 H
字号:
////////////////////////AT89S5X//////////////////////////////////////////////////////
void at89s5XWriteByte(BYTE b)
{
    BYTE i;
    ACC=b;
	for(i=8; i>0; i--){
		B_MISO = ACC_7;
		B_SCK = 1; 
        _nop_();
		B_SCK = 0;  
		ACC <<= 1;
	}

}

BYTE at89s5XReadByte(void)
{
	BYTE i;
    ACC=0;
	for(i=8; i>0; i--){
        ACC <<= 1;
        B_SCK = 1;
        ACC_0 = B_MOSI;
		B_SCK = 0;
	}

 return(ACC);
}
////////////////////////AT89S5X/////////////////////////////////////////////////////
///////////////////////////////////ATMEGA8L/////////////////////////////////////////
void atmegaXWriteByte(BYTE b)
{
    BYTE i;
    ACC=b;
    for(i=8; i>0; i--){
      B_MISO = ACC_7;
      B_SCK  = 0;
      B_SCK  = 1;
	  ACC  <<= 1;
    }
}

BYTE atmegaXReadByte(void)
{
	BYTE i;
    ACC=0;
    for(i=8; i>0; i--){
      B_SCK = 0;
      ACC <<= 1;
      B_SCK = 1;
      ACC_0 = B_MOSI;
    }
    return(ACC);
}
///////////////////////////////////ATMEGA8L/////////////////////////////////////////

void Reset_Target()
{
	B_RST = !buf[1];
    B_SCK = 1;
    B_MOSI= 1;
    B_MISO= 1;
    programed=0;
    Delay_ms (20);
	tx_buf[0]=0;  
    tx_buf[1]=0xEE;  
    tx_buf[2]=0xEE;
}

BYTE Enable_Program()
{
 BYTE cReturn,cError;
 switch (device){
   case 0: 
   case 1:           //at89s51,at89s52
     for (cError=0;cError<4;cError++)
       {  
        B_RST = 1;
        B_SCK = 0;
        Delay_ms(20);
        at89s5XWriteByte(0xAC);
	    at89s5XWriteByte(0x53);
	    at89s5XWriteByte(0x00);
        cReturn=at89s5XReadByte ();
        if (cReturn==0x69){
          tx_buf[0]=1;tx_buf[1]=0xEE; tx_buf[2]=0xEE; 
          programed=1;
          return 1;
        } 
        Delay_ms (10);
     }
     break;
   case 2:          //atmega8L
     for (cError=0;cError<4;cError++)
       { 
        B_SCK = 0;
        B_MOSI= 0;
        B_MISO= 0;
        B_RST = 0;
        Delay_ms (50);             
        B_RST = 1;
        Delay_ms (10);
        B_RST = 0;
        Delay_ms(10);
        atmegaXWriteByte(0xAC);
	    atmegaXWriteByte(0x53);
        cReturn=atmegaXReadByte ();
	    atmegaXWriteByte(0x00);
        //atmegaXWriteByte (0xFF);
        
        if (cReturn==0x53){
          tx_buf[0]=1;tx_buf[1]=0xEE; tx_buf[2]=0xEE; 
          programed=1;
          return 1;
        }

       }
     break;
    }        
   tx_buf[0]=1;tx_buf[1]=cReturn; tx_buf[2]=cReturn; 
   programed=0;
   return 0;
}

BYTE Flash_ReadByte(WORD Addr)
{
    BYTE head;
    switch (device){
      case 0:                        //at89s51,at89s52
      case 1:
       	at89s5XWriteByte(0x20);
  	    at89s5XWriteByte(Addr/256);
	    at89s5XWriteByte(Addr%256);
	    return at89s5XReadByte();
        break;
      case 2:                       //atmega8L
        if (Addr&1)
          head=0x28;
        else
          head=0x20;

        atmegaXWriteByte (head);
        atmegaXWriteByte (Addr/256>>1);
        atmegaXWriteByte (Addr%256>>1);
        return atmegaXReadByte ();
        break;
      }

}

BYTE Chip_Erase(void)
{
    BYTE i;
    switch (device){
      case 0:
      case 1:
  	    at89s5XWriteByte(buf[2]);
	    at89s5XWriteByte(buf[3]);
	    at89s5XWriteByte(buf[4]);
	    at89s5XWriteByte(buf[5]);
	    Delay_ms(500);
    
        tx_buf[0]=2;
        for (i=0;i<10;i++)
          if (Flash_ReadByte (i)!=0xFF)break;
        if (i!=10)                            //擦除失败
          {tx_buf[1]=0x00; tx_buf[2]=0x00;  return 0;}
        else                                  //擦除成功
          {tx_buf[1]=0xEE;  tx_buf[2]=0xEE; return 1;}
        break;
      case 2:
        atmegaXWriteByte(buf[2]);
	    atmegaXWriteByte(buf[3]);
	    atmegaXWriteByte(buf[4]);
	    atmegaXWriteByte(buf[5]);
	    Delay_ms(10);
    
        tx_buf[0]=2;
        for (i=0;i<10;i++)
          if (Flash_ReadByte (i)!=0xFF)break;
        if (i!=10)                            //擦除失败
          {tx_buf[1]=0x00; tx_buf[2]=0x00;  return 0;}
        else                                  //擦除成功
          {tx_buf[1]=0xEE;  tx_buf[2]=0xEE; return 1;}
        break;
   }
}

void Flash_WriteByte(WORD Addr, BYTE Data)
{
    switch (device){
      case 0:                        //at89s51,at89s52
      case 1:
       	at89s5XWriteByte(0x40);
	    at89s5XWriteByte(Addr/256);
	    at89s5XWriteByte(Addr%256);
	    at89s5XWriteByte(Data);
        break;
      case 2:                       //atmega8L
        atmegaXWriteByte(0xC0);
        break;
      }
}

void Write_LockBit(BYTE mode)
{
	atmegaXWriteByte(0xAC);
	atmegaXWriteByte(0xE0|mode);
	atmegaXWriteByte(0x00);
	atmegaXWriteByte(0x00);
	Delay_ms(1);
}

void Flash_WritePage(BYTE mode,BYTE page)
{
	BYTE i,head,k,addrinpage;
    switch (device){
      case 0:
      case 1:
        if(!mode){
          at89s5XWriteByte (0x50);
	      at89s5XWriteByte (page);
        }
        for(i=0; i<32; i++)
	      {at89s5XWriteByte(buf[i+4]);for(k=190; k>0; k--);}
        break;
      case 2:
        addrinpage=buf[3];
        for (i=0;i<32;i++){
          if (addrinpage&1)
            head=0x48;
          else
            head=0x40;
          atmegaXWriteByte (head);
          atmegaXWriteByte (0xFF);
          atmegaXWriteByte (addrinpage>>1);
          atmegaXWriteByte (buf[i+4]);
          addrinpage++;
        }
        if (!mode){
          atmegaXWriteByte (0x4C);
          atmegaXWriteByte (page>>3);
          atmegaXWriteByte (page<<5);
          atmegaXWriteByte (0x00);
          Delay_ms (2);
        }  
        break;
   }
}

⌨️ 快捷键说明

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