完整代码:
09111421224905.rar
/**************************************************************************
ISP_DEMO监控程序演示
魏东(tonywei@tom.com) 2009.6.25
IAP11F62X,频率:22.1184MHz(1T超高速 单片机 )
===========================================================================
IAP11F62X内部含62k存储器(FLASH页面大小为512字节)
可以作为程序存储或数据存储使用,本程序中FLASH安排如下:
0000-EFFF 用户程序(60k)
F000-F3FF 监控程序(1k)
F400-F7FF 数据存储(1k)
**************************************************************************/
#include "STC11Fxx.H"
#include "IAP_11_10.h"
#include <intrins.h>
#define CON_OSC 22118400 /* 振荡频率(1T超高速) */
#define CON_BPSB 256 - ( CON_OSC / 1 / 32 / 115200 ) /* 115.2kBPS时间常数(T1x12=1) */
unsigned char code *reset_info = "ISP_DEMO_Boot1_2009-6-25"; /* 软件版本 */
/* 变量定义 */
unsigned char idata com_buf[58]; /* 串口公用缓冲区 */
unsigned int nAddress = 0; /* 编程器编程地址 */
bit con_ok=0; /* 已经在操作标志 */
unsigned char xdata xbuf[1024]; /* EEPROM数据区缓冲 */
/* 函数定义 */
unsigned char com_getch(void); /* 串口接收1字符 */
void com_putch(char); /* 串口发送1字符 */
void com_putinfo(void); /* 串口发送复位信息 */
/***********************************************************************************/
/* 串口接收1字符 */
unsigned char com_getch(void)
{ unsigned char c;
RI=0;
while(RI==0) if((WDT_CONTR&0x20)&&con_ok) WDT_CONTR=0x3f; /* 如果看门狗是开启的且已经在操作,则最长时间喂狗 */
c=SBUF;
return c;
}
/* 串口发送1字符 */
void com_putch(char c)
{
TI=0;
SBUF=c;
while(TI==0);
}
/* 串口发送复位信息 */
void com_putinfo(void)
{ unsigned char cr,ci;
cr=0;
for(ci=0;ci<24;ci++)
{ com_putch(reset_info[ci]);
cr+=reset_info[ci];
}
cr = 0 - cr;
com_putch(cr); /* 发送效验和 */
}
/***********************************************************************************/
/* 写程序 */
void f_prg(unsigned char cj)
{ unsigned char ci;
nAddress = ((unsigned int*)com_buf)[1];
for(ci=0;ci<cj;ci++)
{ if(nAddress<=FPRG_END) byte_program(nAddress,com_buf[4+ci]); /* 写程序 */
nAddress ++;
}
if(iap_error) com_putch(5); /* 返回错误标志 */
else com_putch(6); /* 返回正确标志 */
}
/***********************************************************************************/
void main (void)
{ unsigned char cr,ci,cj;
unsigned int ui;
unsigned char code * pcadr;
bit eewid=0;
EA=0; /* 禁止中断 */
ES=0; /* 禁止串口中断 */
TR1=0; /* 停止定时器1 */
AUXR=0x40; /* T0x12,T1x12,UART_M0x6,EADCI,ESPI,ELVDI,-,- */
PCON=0x00; /* 波特率不加倍 */
TMOD=0x21; /* 置T/C1工作方式2定时器,T/C0工作方式1定时器 */
SCON=0x50; /* 置串口工作方式1(T1用作串口波特率发生) */
TH1=CON_BPSB; /* 波特率时间常数 */
TL1=CON_BPSB;
TR1=1; /* 启动定时器1 */
pcadr=FDAT_ADR;
for(ui=0;ui<1024;ui++) xbuf[ui]=pcadr[ui]; /* 读入数据扇区 */
com_putinfo(); /* 发送复位信息 */
RI=0;
ci=0;
while(1)
{ iap_error=0;
if(ci==0x21)
{ for(ci=0;ci<3;ci++) com_buf[ci]=com_getch();
if((com_buf[0]==0x5a)&&(com_buf[1]==0)&&(com_buf[2]==0xa6))
{ con_ok=1; /* 已经在操作 */
com_putinfo(); /* 发送复位信息 */
}
}
else if(ci==0x07) /* 数据包:07H,0EH,包长度,’W’,00H,地址高字节,地址低字节,程序数据,效验和 */
{ for(ci=0;ci<2;ci++) com_buf[ci]=com_getch();
if((com_buf[0]==0x0e)&&com_buf[1])
{ cj = com_buf[1];
cr = cj;
for(ci=0;ci<=cj;ci++)