richards 发表于 2011-5-5 00:14:26

STC89单片机自动下载(免断电)的方法

STC89单片机自动下载(免断电)的方法
STC在传统51的基础,对其功能进行了增强,不光增加了更多的硬件资源,最大的特色在于它的串口ISP功能,可以使用户不用专用下载线缆就可以直接进行程序下载,这也正是其如此流行的主要原因。

    下面将详细介绍STC单片机的串口ISP原理与操作方法,另外在笔者对STC单片机深入研究的基础,对其ISP功能进行了改造,实现了免断电自动下载。

    在介绍STC串口ISP前,先了解一下传统S51的ISP功能。

    传统的89S51是支持ISP(In System Programming)功能的,可以使用户不用将芯片拆下就可以通过计算机并口对其重新编程,但是需要专用的下载电缆。

    以下是下载电路,有兴趣的读者可以依此仿制:

      

配合以相应的下载软件就可以实现在系统下载:

            


以下是ISP下载电路的效果图:

   

            

    以并口ISP为基础,又衍生出了串口ISP,其实是用串口的握手信号来模拟ISP下载的时序,以下是串口ISP的下载电路,笔者没有经过验证,读者可自行试制:

         

相应的下载软件如下:

         

    STC的串口ISP与S51的串口ISP是有本质区别的,S51的串口ISP只是通过串口的握手线来模拟ISP时序,并没有用到串口的通信线,但STC的串口ISP则是通过一个ISP监控程序与计算机串口进行数据通信来实现的。

    它的下载电路就是经典的232电路:

         

    在STC单片机中有两个程序区,用户程序区与ISP程序区。单片机上电后(冷启动,并非外部手动复位或看门狗复位),先会运行ISP程序,检测是否有合法的下载命令流,占时几十毫秒到几百毫秒,如果没有合法的下载命令流,则立即运行用户程序。如果有合法的下载命令流,则ISP监控程序开始与ISP下载软件通信,软件也会进入编程模式,向监控程序发送程序码,监控程序接收程序码,并将其写入用户程序区中。在编程完毕,对程序校验成功后,用户程序立即生效,开始运行用户程序。

ISP下载软件如下:

   

总之,下载的流程是这样的(前提是单片机下载电路正确):

打开STC-ISP软件-->选择相应的芯片型号-->打开要下载的.hex或.bin文件(如果文件长度超过所选芯片的程序存储器容量,则会报错)-->选择下载要用的串口 COMn与下载波特率(从1200bps到115200bps,波特率越高下载速度越快,但由于用户电路的不同,不一定所有的用户电路都可以使用115200的最高下载波特率。)-->选择单片机的时钟数(STC对传统51单片机进行改造,12时钟与6时钟可选,6时钟比12时钟运行速度快一倍。)-->振荡器增益(STC可以工作于较高时钟频率,从而造成功耗上升,使用1/2gain可以通过降低振荡器增益,实现降低功耗。)-->点击下载按钮,开始下载。-->硬重启单片机,引导ISP监控程序。

    (上面未提及的选项可保持默认。)

    以下详细介绍了STC单片机的下载方法,但其中有一个问题可能您已经发现了,就是每次下载时都要将单片机硬重启(因为ISP下载软件不能让单片机自动从用户程序转入ISP监控程序),在就给实际的应用开发带来了不便,无法想像,如果要更改100次程序,就要断电100次,单对开关器件来说就是很大的损耗。

    以下是对这一问题的解决方法,此方法不需要添加任何硬件,采用软件实现,应用只需简单嵌入到用户程序中即可。嵌入的代码非常小巧,它主要功能为:使用户程序能够接收STC-ISP下载软件的命令流,在接收到合法的命令流后,说明STC-ISP正在等待单片机进入ISP监控程序,如果此时单片机从用户程序转入ISP监控程序,则下载过程开始。而嵌入的代码就是通过单片机提供的IAP功能,让程序转入ISP程序区,从而实现自动下载,本质上来说,只是改变了启动ISP监控程序的方式,由手动方式变成了程序自动启动方式。

    首先来分析一下STC-ISP下载软件的下载命令流,采用Ser232mon,笔者在应用开发中经常用到该软件,用来监视串口各种动作、运行状态与数据截获。

    按下下载按钮后看看它所发的下载指令到底是什么,这也是嵌入代码的重要基础。


    从截获的数据来看,STC-ISP发送下载命令流的波特率为1200bps(使用如此低的波特率应该是为了稳定)。在将串口波特率设置为1200bps后,开始不停地发送十六进制的7F。

    既然知道了STC-ISP的下载命令流,那么就可以让嵌入的代码在接收到连续的7F时,使单片机转入ISP监控程序,监控程序启动后开始向STC-ISP发送回应数据,在握手成功后,开始下载程序。

    嵌入的代码要去单片机有串口进行监视,为了不占用单片机的定时器1,代码中使用了STC单片机扩展的定时器2作为波特率发生器。因此在嵌入代码后传统51的各硬件资源(除串口)仍然可用。如果应用开发要用到串口,则不能嵌入自动下载代码,毕竟只有一个串口,引时就只能手动启动ISP监控程序了(即硬重启)。

    下面举例说明如何向用户程序中嵌入自动下载代码(ADOS:Auto Download Of STC)

    ados.h文件:

#define _ADOS(x) ADOS(x)

#define FLAG 0x7f

#define TIME 100

#define CHUZHI ((unsigned int)(65536-mhz*26))

#define CHULI RI?((RI=0,SBUF==FLAG)?((counter++>TIME)?ISP_CONTR=0x60:0):0):0


/*

描述:STC89单片机串口自动下载程序,调用后下载可不用断电重启

作者:于振南

时间:2008-1-30 01:30

*/

void ADOS(float mhz)

{

unsigned char h,l;

h=CHUZHI/256;

l=CHUZHI%256;

SCON=0x50;

RCAP2H=TH2=h;

RCAP2L=TL2=l; //1200 BPS

REN=ES=EA=1;

RI=0;

T2CON=0x34;

}


void sio_int() interrupt 4 using 3

{

static int counter=0;

ES=0;

CHULI;

ES=1;

}

    _main.c文件

#include <stc51rd.h>

#include <ados.h>   //将ados.h包含进来


void delay(unsigned int time)

{

while(time--);

}


void main()

{

_ADOS(22.1184);   

/*在程序开始时调用ados.h中所定义的宏 _ADOS(x);

    x为用户系统中单片机的晶体振荡器的频率,单位

   为MHz

*/

while(1)

{

P2=~P2;

delay(20000);

}

while(1);

}

    第一次下载时,仍需要使用手动方式,将嵌入了ADOS的代码下载到单片机中,以后就不用再手动断电了。

wkman 发表于 2011-5-5 00:16:33

啰嗦阿。

实际上这个代码在论坛发了很多次了也讨论多次了。

jsjjccc 发表于 2011-5-5 08:27:00

没看明白,但我知道只要ISP_CONTR=0x60;就可以复位到ISP了

dmmcu 发表于 2011-5-5 08:41:10

//---------------------------------------------------------------------------
void UARTInterrupt(void) interrupt 4//设置一下下载波特率就行了。
{
uchar data i;
if(RI)RI=0;
i=SBUF;
if(i==0x7f)IAP_CONTR=0x60;
}
//---------------------------------------------------------------------------
或者直接用一个按键;
sbit rest=P1.0;
if(rest==0)IAP_CONTR=0x60;
页: [1]
查看完整版本: STC89单片机自动下载(免断电)的方法