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

📄 main.c

📁 P89V51RC2FA 单片机的IAP程序
💻 C
字号:
#include "intrins.h"
#include "V51IAP.h"
//==I485接收缓冲区队列
unsigned char idata UartBuf[12]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//
unsigned char data  unum=0x00;         //
bit UartFlag;
bit _TI_;                              //发送位
sbit i485_con=P2^7;
bit flag;


void UartInit();
void delay(unsigned int i);
void ErrorDo(char *s);
void UartSendChar(char c);
void UartSendString(char *s);


/*
功能:
	通过串行口发送单个字节

*/
void UartSendChar(char c)
{
   i485_con=0;

	while ( !_TI_ );
	_TI_ = 0;
	SBUF = c;

    i485_con=1;
}


/*
功能:
	通过串行口发送字符串
参数:
	*s:被发送的字符串

*/
void UartSendString(char *s)
{
	char c;
	for (;;)
	{
		c = *s;
		if ( c == '\0' ) break;
		s++;
		UartSendChar(c);
	}
}

//==============================
/*延时子程序*/
 void delay(unsigned int ii)
{
 do{
 }while(ii--);
}

void ErrorDo(char *s)
{
	UartSendString(s);
	UartSendString("\r\n");
}

//======================== 串口初始化====================
void UartInit()
{
   unsigned char i;
	EA = 0;
	RXD = 1;
	TXD = 1;
	_TI_ = 1;

		for ( i=0; i<12; i++ )
		{
			UartBuf[i] = '\0';
		}

	i=0x00;
	UartFlag = 0;
	SCON = 0x50;	//串口方式1
	PCON |= 0x80;	//波特率加倍
	TMOD &= 0x0F;
	TMOD |= 0x20;
	TH1 = 0xfa;
	TL1 = TH1;
	TR1 = 1;
	i485_con=1;
	ES = 1;			//允许串行口中断
	EA = 1;			//允许中断
}

//串行口中断服务程序
void UartINTSVC() interrupt 4
{	int i=0;
	unsigned char c;
    unsigned char syt;
	if ( RI )	//接收中断
	{
		c = SBUF;
		RI = 0;
		if ( unum <=1)
		{
		   if(c==0xaa)
		   unum++;
		   else
		   unum=0;

		}
		else if (( 1<unum)&&(unum<=11))
		{
		    UartBuf[unum]=c;
			unum++;

		}
		else if ( unum==12 )
		{
		 
		  for(i==2;i<=11;i++)
		   syt=syt+UartBuf[i];
		   syt=syt+c;
		   if(syt==0)
		   {
		   unum= 0;
		   UartFlag = 1;
		   }
		   else
		   {
		   unum=0;
		   }
	          }
		}
	if ( TI )	//发送中断
	{
		TI = 0;
		_TI_ = 1;
	}
}
main()
{


	unsigned char n;
	unsigned int ci;
	unsigned char t;
	unsigned int x;
	unsigned int y;
	unsigned int xx;
	unsigned int zong;
	//系统初始化
    n=0x00;
	ci=0x900;
	x=0x00;
	zong=0x00;

	delay(100);
        UartInit();
	flag=0;
	do{
	delay(1000);
	if( UartFlag == 1 )
	{
	  UartFlag=0;
	  for(t=2;t<=9;t++)
	  zong=zong+UartBuf[t];
	  if(zong==0)
	  if(UartBuf[10]<0x80)
	  {
	  zong=UartBuf[10];
	  zong=zong<<8;
	  zong=zong+UartBuf[11];
	  ci=0x00;
	  flag=1;
	  break;
	  }
	  else
	  UartSendString("count error");
	  else 
	  UartSendString("count error"); 
	}
	}while(ci--);                  //等待时间接收串口数据
	
	if(flag==0)
   JumpToUser();                  //跳转到用户程序	 

	if(flag==1)					   //说明IAP读写启动
	{
	flag=0;
	UartSendString("IAP begin"); //发送开始信号
	delay(200);
    UartSendString("\r\n");
	delay(200);			            	                       
	UartSendString("Erase");    //擦除用户Flash的32k
	delay(200);
    UartSendString("\r\n");
	delay(200);
    for ( x=0; x<256; x++ )
    IAP_SectorErase(x); 
	delay(100);
	UartSendString("Ready\r\n");     //准备接收数据
    x=0x00;  	
	for (;;)
	{
	  PCON |= 0x01;                  //等待中断的到来	                               
	if ( UartFlag == 1 )
		{	
next:      UartFlag = 0;
   		    
			 xx=x;
			 for(ci=0x02;ci<=11;ci++)
			 {
			 y=UartBuf[ci];
			 flag=IAP_Program(x++,y);
			 if (flag )
			  {
				ErrorDo("error");
				x=xx;
				goto next;
					}
			 }
			 if(x>=zong)
			 goto endok;
		  	 UartSendString("next"); //发送开始信号
             UartSendString("\r\n");	
			 if(x>=zong)
			 goto endok;		   

		}	 
		}
endok:  UartSendString("Download OK\r\n");
		delay(100);
       	JumpToUser();	             
	 }




}

⌨️ 快捷键说明

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