下面介绍不掉电载程序的实现过程。先要了解一点基础知识。
单片机的复位,下载流等等。。。
首先说一下复位。STC89C52有的复位有两种,一种是上电复位,也就是冷启动,复位后检测串口那里有没有下载流,有的话跑去下载程序那里。还有一种是平时的按键复位,高电平有效那种的,不检测是否有下载流。
下载流是什么?就是串口发送给单片机要烧写程序的信息。STC89C52的下载流是0x7F,连续12个好像(官方公布是大于16 )。如果我们上位机点下载,它就通过一直发送0x7F给单片机。如果这是有上电复位,就烧写程序进去单片机。
我们的程序里面就是要用到这些,再介绍一下基本思路。我们需要单片机正常运行过程中检测是否有下载流(0x7F),如果有下载流就跳进上电复位。只要实现了这个功能,就是实现了不掉电下载程序了~~~检测下载流不难,我这里使用的是串口中断,中断里面检测是否有下载流信息,有的话就跳进上电复位那里。主要是跳到上电复位,怎么跳?上电复位在哪??
跳转方面,有学过微机的同学就能好理解。只要修改 PC 指针就行了,让它指向上电复位那段程序。还有一个问题是,上电复位那段程序在哪里?这个要找芯片数据手册了。官方公布的是0xEC00, 但是我们不是直接跳转过去的, 而是通过使能IAP, 也就是设置IAP控制寄存器。官方公布的IAP控制寄存器地址是0xE7, 设置成0x60就使能了IAP.来到这里相信同学们都理解了,可以着手写一下程序了。
把必要的东西弄上。文件包含,宏定义,寄存器声明等等。
#include
#define IAP_ENABLE0x60 //IAP允许
sfr IAP_CNTR = 0xE7; //IAP控制寄存器
void mian(void)
{
UART_Init(); //串口初始化
while(1) //死循环,等待串口中断
{
}
}
void UART_Init()
{
TMOD|=0x20; //定时器1提供串口波特率
TH1=0xf3; //波特率2400, 晶振为12M
TL1=0xf3; //波特率2400, 晶振为12M
EA=1; //打开总中断
TR1=1; //定时器1开始计数
ES=1; //允许串口中断
SCON=0x50; //方式0, 允许串口接收
}
void UART_IRQHandler(void)interrupt 4
{
unsigned char rev; //临时变量, 保存SBUF
if(RI) //检查是否接收到数据
{
RI = 0; //软件清除接受标志位
rev = SBUF; //读取接受缓冲区
if(0x7F == rev) //判断是否为下载流信息
{
IAP_CNTR=IAP_ENABLE; //允许IAP, 也就是直接进入下载程序
}
}
}
(编译通过,下载程序,测试能否在线下载。成功!!!!!!!!!!!!那是感动啊~~~~)
有了上面程序的话,以后下载程序就直接打开上位机,也就是STC_ISP那个软件,选择好对应的.hex文件,点击下载,就开始下载程序了。以后再也不用先关电源,再上电了下载,那是方便啊(事实证明,我已经对频繁对电源开关,感觉非常繁琐了)。多年来的梦想啊(虽然接触51,貌似不到1年。。。),让我曾经一度非常妒忌AT的单片机,因为它支持在线下载程序。。。