📄 main.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 + -