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

📄 main.c

📁 51单片机上网的引导代码
💻 C
字号:
#include "REG516.H"
#include "def.h"

#define ON 0;
#define OFF 1;

sbit   LED_RED   = P3 ^ 3;	//P1 ^ 2  //LED control 1 = dark ; 0=light 
sbit   LED_GRE   = P3 ^ 4;
extern void initSERIAL(void);
extern void Uart0_print(char *p);
extern void Erase_64k(void);
extern void Program_64k(WORD RomAddr, BYTE xdata *pxdata, WORD Length0); 


BYTE data ISP_STATE; //0: start;
                     //1: shakehand success;
                     //2: received data length and check sum;
                     //3: 1st data (32k) 
                     //4: 2nd data (32k) 
WORD data Rec_length;
WORD data Data_length;
BYTE data CheckSum1, CheckSum2;
BYTE data Rec_sum=0;
BYTE xdata *pxdata=0x0000;
BYTE xdata Rec_buff[0x8000];  //can receive 31k(31*1024 byte);

void initInt(void)
{
   EA=1;
}
void initTIMER0(void)
{
    TMOD|=0X01; //TIMER0: MODE 1(16bit),timer ;
     ET0=1;
}
void Start_Timer0(WORD count)  //
{
     TL0=count&0x0ff;
	 TH0=(count>>8)&0x0ff;
	 TR0=1; //START;

}
/////////////////////////////////////////////////////
//-----------------------------------------------------
void main(void)
{

//    WORD data i;
    initInt();
    initSERIAL();
	initTIMER0();
	ISP_STATE=0;
	Rec_length=0;
	Data_length=0;
	LED_RED=ON;
//-------ENTER ISP MODE-------------
	CHPENR=0X87;
	CHPENR=0X59;  
	CHPCON=0X03; //ISP MODE
	CHPENR=0X00; //READ ONLY (CHPCON)
	Start_Timer0(0XFFF0);  //15MS;
	PCON|=0X01; //IDLE;
	LED_GRE=ON;
//----------------------------------
	while(TRUE)
	{
         switch(ISP_STATE)
         {
            case 0:
			    if(Rec_length>=4)
				{
                   if( *(pxdata)=='s'&&*(pxdata+1)=='t')
				   {
  				    Rec_length=0;
				    ISP_STATE++;
                    LED_GRE=~LED_GRE;
                    Uart0_print("stok");
					}
				}
				break;
            case 1:      //receive length;
			    if(Rec_length>=4)
				{
                    Data_length=*((WORD xdata *)pxdata);
					CheckSum1=*(pxdata+2);
					CheckSum2=*(pxdata+3);
                    Rec_sum=0;
  				    Rec_length=0;
					ISP_STATE++;
					//Erase_64k();    //erase 64k flash;
                    LED_GRE=~LED_GRE;
                    //Uart0_print("leok");
					//------------send back--------------
 					ES=0;      //disabe uart0 interrupt;
                    TI=0;
                    SBUF=*(pxdata);
                    while(!TI);
                    TI=0;
                    SBUF=*(pxdata+1);
                    while(!TI);
                    TI=0;
                    SBUF=*(pxdata+2);
                    while(!TI);
                    TI=0;
                    SBUF=*(pxdata+3);
                    while(!TI);
                    TI=0;
                    ES=1;
					//-----------------------------------
				}
				break;
            case 2:  //1st data;
			    if(Rec_length>=Data_length || Rec_length>=0x8000)
				{
					if(Rec_sum!=CheckSum1)
					{
	  				    Rec_length=0;
						ISP_STATE=0;
                    	LED_GRE=~LED_GRE;
                    	Uart0_print("eror");
					}
					else
					{
                    	LED_GRE=~LED_GRE;
						Erase_64k();    //erase 64k flash;
                       //--------------program (Rec_length) byte
					    if(Rec_length>0x8000)
						    Rec_length=0x8000;
                        Program_64k(0, 0, Rec_length);
						//--------------------------
                        if(Rec_length<Data_length)
						{
						   Data_length-=Rec_length;
	  				       Rec_length=0;
                           Rec_sum=0;
						   ISP_STATE++;
                    	   LED_GRE=~LED_GRE;
						}
						else ISP_STATE=0;
                        Rec_length=0;
                    	Uart0_print("prok");
					}

				}
				break;
            case 3:  //2nd data;
			    if(Rec_length>=Data_length || Rec_length>=0x8000)
				{
					if(Rec_sum!=CheckSum2)
					{
	  				    Rec_length=0;
						ISP_STATE=0;
                    	LED_GRE=~LED_GRE;
                    	Uart0_print("eror");
					}
					else
					{
                    	LED_GRE=~LED_GRE;       
		                //program (Rec_length) byte
					    if(Rec_length>0x8000)
						    Rec_length=0x8000;
                        Program_64k(0x8000, 0, Rec_length);
 					    //------------------------
                    	Uart0_print("prok");
						ISP_STATE=0;
                        Rec_length=0;
					}

				}
				break; 
			default:
			    break;

		  } //end of switch
      // for(i=0;i<6000;i++);
	 //  Uart0_print("GOOD\n");
	}	
}

void INT_TIMER0(void) interrupt 1
{
    TR0=0;
}

⌨️ 快捷键说明

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