天天看點

stc單片機“全自動下載下傳”(程式版)

STC單片機“完全自動下載下傳”,無需再手動重新上電啟動!(程式版)

修改:

2014/03/21  整理上傳

2014/10/30  修改錯誤:在序列槽函數中有UartInit(),但是在主函數中調用了InitUart(),書寫錯誤導緻無法編譯通過

對于stc單片機下載下傳程式時,每次都需要冷啟動,即需要給開發闆斷電然後重新上電,才能供完成下載下傳,這裡介紹用過的兩種“全自動下載下傳”方式:

(1)使用STC自動下載下傳器,此子產品在我們點選STC-ISP的“下載下傳”時,會自動完成斷電,上電,下載下傳功能。需要購買。

(2)軟體複位法,即IAP下載下傳方式。(本文中的重點,注意有的晶片無此功能,需要較新出來的晶片,這裡以STC12C5A60S2為例)

步驟如下:

1.添加stc公司的mcu到keil軟體

(

這一步不是必須的,但進行了這一步之後,keil軟體就會有stc公司的mcu的頭檔案,可以直接調用了,但如果沒有這一步在主函數中頭檔案就要注意,對于IAP_CONTR的特殊功能寄存器就不能直接調用,這時候就必須使用者自己定義:

sft IAP_CONTR=0xc7;

)

這裡以目前最新 STC-ISP下載下傳軟體為例:

stc單片機“全自動下載下傳”(程式版)

選擇keil安裝目錄xxxxxxxxxxx\keil , 點選确定,就會出現:

stc單片機“全自動下載下傳”(程式版)

(2)打開keil,建立工程後,出現MCU選擇:

stc單片機“全自動下載下傳”(程式版)

選擇STC MCU Database後,選擇STC12C5A60S2,後建立并加載.c檔案,設定生成hex檔案:

技巧:為了防止意外操作導緻stc的mcu頭檔案被修改,設定其為“隻讀”模式,這時候工程檔案就會有如下的“鑰匙”标記

stc單片機“全自動下載下傳”(程式版)

(3)程式代碼如下:

主函數0000.c:

#include "./STC/stc12c5a60s2.h"
#include "uart.h"

void main(void)
{
	UartInit();

	P1=0x01;/*第一次,leds*/

	while(1);
}
           

uart.h檔案:

#ifndef __UART_H__
#define __UART_H__

#define selfDownLodCmd 0x01

extern void UartInit(void) ;

#endif 
           

uart.c檔案:

#include "./stc/stc12c5a60s2.h"  
#include "uart.h"  
  
void UartInit(void)  
{  
	IP   |= 0x10 ;/*建議設定序列槽中斷為高優先級*/
    SCON |= 0x50 ;  
    TMOD |= 0X20 ;  
    TH1  =  0xfd ;  //11.0592MHZ , 9600kps  
    TL1  =  0xfd ;  
    TR1= 1 ;  
    ES = 1 ;  
    EA = 1 ;  
}  
  
void UART_IRQ(void) interrupt 4  using 3
{  
    unsigned char k ;  
  
    if(RI)  
    {  
        RI=0;  
        k=SBUF;  
        if(k==selfDownLodCmd)  
        {  
            IAP_CONTR |=0x60 ;  
        }  
        else  
        { /*其他操作,等待補充*/  
              
        }  
    }  
    else  
    {  
        TI =0;  
        /*其他操作,等待補充*/ 

    }  
}  
           

(4)這裡第一次先手動啟動下載下傳一次,然後發現led0被點亮。保持上電狀态。

(5)修改下載下傳設定:

stc單片機“全自動下載下傳”(程式版)

(6)自動下載下傳實驗準備:修改main函數中的:

P1=0x01;/*第一次,leds*/
           

修改為:

P1=0x0f;
           

(7)編譯程式後,等待3s,發現led燈變化了,說明STC-ISP軟體已經自動下載下傳了程式,而沒有經過手動的重新上電。并且,以上的程式,隻需要手動下載下傳一次,以後無論你下載下傳多少次都不用手動去啟動開關下載下傳了(但是main函數中的UartInit不能删除)。

繼續閱讀