欢迎来到51自学网!

51自学网

当前位置: 主页 > 软件教程 > 单片机教程 >

stc单片机不断电下载程序

时间:2018-08-16 06:53来源:网络整理 作者:51自学网
stc单片机支持串口isp程序下载,不必使用专用下载器,仅使用串口就能下载程序。但每次下载程序都要断电再上电,比较麻烦。 下面介绍一种不需断电就能下载程序的方法,在程序调试

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

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++)
        {;}
      }
    }

 

(责任编辑:admin)

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容