stc單片機不斷電下載程序

原文鏈接:http://www.51hei.com/mcu/1433.html

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。

將實現以上功能的代碼加入到你的程序中,當需要下載程序時,按下復位按鈕,此時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程序下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章