历史上的今天
今天是:2025年03月16日(星期日)
2021年03月16日 | 51单片机不断电下载程序
2021-03-16 来源:eefocus
stc单片机支持串口isp程序下载,不必使用专用下载器,仅使用串口就能下载程序。但每次下载程序都要断电再上电,比较麻烦。
下面介绍一种不需断电就能下载程序的方法,在程序调试时比较方便。
基本原理:
stc单片机有专用的复位寄存器,通过对该寄存器写入不同的数值可以实现单片机热启动复位。
寄存器功能如下图所示:

由上图可以看出只要满足某个条件,向ISP_CONTR写入0x60,就可以实现从ISP监控区软启动启动
某个条件设置为:当串口接收到0xaa数据时,单片机执行ISP_CONTR=0x60; 指令,从ISP监控区软启动启动。
演示程序如下:
//*************************STC12C5410AD软启动演示**************************
//
//收到0xaa,从ISP监控区软启动,利用该特性,可以实现stc单片机不断电下载
//收到0x55,从用户程序区启动
//2010年3月13日21:58:49
//************************************************************
*************
#include uint c; //*************** 函数定义 ****************** void delay1ms(unsigned int j); void senddata(uchar dc); //*************** 主程序 ******************** void main(void) { ///****************** TMOD|=0x20; SCON=0x50; TH1=0xfd; //12T时钟9600bps TL1=0xfd; TR1=1; ES=1; EA=1; AUXR=AUXR|0x40; //定时器1使用1T时钟9600*12=115200bps ///****************** delay1ms(30000); for(c=0;c<256;c++) { senddata(c); delay1ms(200); } while(1) { } } //***************************发送数据************************** void senddata(uchar dc) { SBUF=dc; while(!TI); //当TI=0时,发送未结束,循环等待 TI=0; //当TI=1时,发送结束,用软件将TI清零 } void uart(void) interrupt 4 { uchar cdd; if(RI) { RI=0; cdd=SBUF; if(cdd==0xaa) { ISP_CONTR=0x60; //软复位,从ISP监控区启动 } else if(cdd==0x55) { ISP_CONTR=0x20; //软复位,从用户程序区启动 } else { senddata(cdd); } } else { TI=0; } } //*************************延时 n*1ms******************** void delay1ms(unsigned int j) { unsigned int i; for(;j>0;j--) { for(i=0;i<124;i++) {;} } } 在调试程序中加入串口初始化代码,串口中断代码即可实现不断电下载程序 ///****************** TMOD|=0x20; SCON=0x50; TH1=0xfd; //12T时钟9600bps TL1=0xfd; TR1=1; ES=1; EA=1; AUXR=AUXR|0x40; //定时器1使用1T时钟9600*12=115200bps ///****************** void uart(void) interrupt 4 { uchar cdd; if(RI) { RI=0; cdd=SBUF; if(cdd==0xaa) { ISP_CONTR=0x60; //软复位,从ISP监控区启动 } else if(cdd==0x55) { ISP_CONTR=0x20; //软复位,从用户程序区启动 } else { senddata(cdd); } } else { TI=0; } } 在上演示程序中,利用单片机串口收到某个有效数据后,执行从isp引导区软启动的命令(ISP_CONTR=0x60;),实现程序不断电下载。但该方法为实现程序不断电下载,占用了一些单片机资源——串口、中断等,实际应用中有一些不便。下面介绍另一种程序不断电下载方法: 考虑到单片机开发板在设计时一般都留有一个手动复位按钮,能否利用该按钮实现程序不断电下载呢?答案是肯定的!!!!! 单片机上电复位时,POF=1;单片机手动复位时,POF=0 单片机上电运行时对POF位进行判断,如果POF位=0,将POF位置1,让单片机从isp引导区软复位。 如果POF位=1,将POF位清0。 将实现以上功能的代码加入到你的程序中,当需要下载程序时,按下复位按钮,此时POF位=0,单片机再次从isp引导区软复位,从而实现程序下载。 该方法只需在用户程序中嵌入一段判断POF标志位的代码就能实现程序不断电下载,无需占用任何单片机内部资源。 演示程序: //*******************stc单片机不断电下载程序****************** #include sfr ISP_CONTR=0xe7; 软复位寄存器声明 void main(void) { //////////////将这段代码嵌入到程序中//////////////// if((PCON&0x10)==0) //如果POF位=0 { PCON=PCON|0x10;//将POF位置1 ISP_CONTR=0x60;//软复位,从ISP监控区启动 } else { PCON=PCON&0xef;//将POF位清零 } ////////////////////////////////////////////// while(1) { ` ` 用户程序 ` } } 操作说明: 1将演示程序中的红色代码复制到您的程序中,首次使用时应利用断电下载的方式将含有红色代码的程序下载到单片机中 2将hex文件载入stc单片机isp软件,点击下载按钮 3按下单片机开发板上复位键,单片机进行is程序下载
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 楼上有哪位知道 有关MSS1002_20资料,请上帖,谢谢,感激不尽! … 查看全部问答> |
|
x-ctu的资料详细的谁有 我手上有个XBEE模块,DIGI的 然后如何配置成网络 是否只能1主多从 就是1COORDINATOR和多个ROUTER 有没有多个ROUTER不用COORDINATOR的 这样任意加入一个ROUTER就可以使用 任意一个ROUTER发的包其他的ROUTER都可以接收 ...… 查看全部问答> |
|
在一个文档里看见,LSB,MSB,和 lower significance bit. 这个lower significance bit不太明白,有清楚的大虾吗?在线等。… 查看全部问答> |
|
一个关于avrstudio和GCCAVR的奇怪问题,请大家帮帮我! 大家好: 我现在用的Atmel16单片机,开发软件是基于avrstudio和GCCAVR,我在调试以下程序时,提示:“Conflicting the type of wr(void)”的错误! void mian(void) { unsi ...… 查看全部问答> |




