stc单片机不断电下载程序

stc单片机支持串口isp程序下载,不必使用专用下载器,仅使用串口就能下载程序。但每次下载程序都要断电再上电,比较麻烦。
下面介绍一种不需断电就能下载程序的方法,在程序调试时比较方便。
基本原理:
stc单片机有专用的复位寄存器,通过对该寄存器写入不同的数值可以实现单片机热启动复位。
     寄存器功能如下图所示:

stc单片机不断电下载程序_第1张图片

由上图可以看出只要满足某个条件,向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程序下载

你可能感兴趣的:(单片机)