stc单片机不断电下载程序

stc单片机支持串口isp程序下载,不必使用专用下载器,仅使用串口就能下载程序。但每次下载程序都要断电再上电,比较麻烦。

下面介绍一种不需断电就能下载程序的方法,在程序调试时比较方便。

基本原理:

stc单片机有专用的复位寄存器,通过对该寄存器写入不同的数值可以实现单片机热启动复位。

寄存器功能如下图所示:

由上图可以看出只要满足某个条件,向ISP_CONTR写入0x60,就可以实现从ISP监控区软启动启动
某个条件设置为:当串口接收到0xaa数据时,单片机执行ISP_CONTR=0x60; 指令,从ISP监控区软启动启动。
演示程序如下:

    //*************************STC12C5410AD软启动演示**************************
    // 
    //收到0xaa,从ISP监控区软启动,利用该特性,可以实现stc单片机不断电下载
    //收到0x55,从用户程序区启动
    //2010年3月13日21:58:49
    //*************************************************************************
    #include <STC12C5410AD.H>
    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。

答:用片内振荡器不需要外接谐振器。如果你的单片机只做AD采集转换,便不需要太高的频率,内部4Mhz振荡器即可。但如果还要做其他对时序要求较严的工作比如说总线通信,那就要考虑使用外部振荡器,因为内部振荡器的误差太大(即使校准了还有1%的误差),而用多大的晶振要看工作要求,频率越高单片机功耗越大。只做AD的话,4M足够。

将实现以上功能的代码加入到你的程序中,当需要下载程序时,按下复位按钮,此时POF位=0,单片机再次从isp引导区软复位,从而实现程序下载。

该方法只需在用户程序中嵌入一段判断POF标志位的代码就能实现程序不断电下载,无需占用任何单片机内部资源。

 

演示程序:

//*******************stc单片机不断电下载程序******************
#include <REG52.H>

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程序下载

> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >

通过本次温度测量系统的设计,我对温度测量控制有了进一步的熟悉和更深入的学习。在整个设计的过程中,本设计的重点和难点是:怎样将PT100热电阻的非电量信号转换为单片机单片机能识别的电量信号,其中的信号如何放大及放大倍数的确定等等。

生成海报
点赞 0

thePro

我还没有学会写个人说明!

相关推荐

通过串口烧录N76E003 单片机(ISP)

一、N76E003烧录模式介绍 Flash存储器支持硬件编程和应用编程(IAP)。如果产品在研发阶段或产品需要更新软固件时,硬件编程就显得不太方便,采用在系统编程(ISP&#

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

51小车(一)

1.准备: 借鉴: 详细介绍如何从零开始制作51单片机控制的智能小车(一)———让小车动起来_慕羽★的博客-CSDN博客_新手怎么制作单片机智能小车 2.已有模块 (1)  已有电机驱动 (2)

三相电机相电感,相电阻和极对数的测量

相电阻测量: 方法一:可使用万用表电阻档直接测量其中两端 方法二:可使用LCR数字电桥仪器测量 万用表操作: 将万用表旋转到电阻档的适当量程内 将万用表上的两表笔接触在电机的其中任意