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下載下傳軟體為例:
選擇keil安裝目錄xxxxxxxxxxx\keil , 點選确定,就會出現:
(2)打開keil,建立工程後,出現MCU選擇:
選擇STC MCU Database後,選擇STC12C5A60S2,後建立并加載.c檔案,設定生成hex檔案:
技巧:為了防止意外操作導緻stc的mcu頭檔案被修改,設定其為“隻讀”模式,這時候工程檔案就會有如下的“鑰匙”标記
(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)修改下載下傳設定:
(6)自動下載下傳實驗準備:修改main函數中的:
P1=0x01;/*第一次,leds*/
修改為:
P1=0x0f;
(7)編譯程式後,等待3s,發現led燈變化了,說明STC-ISP軟體已經自動下載下傳了程式,而沒有經過手動的重新上電。并且,以上的程式,隻需要手動下載下傳一次,以後無論你下載下傳多少次都不用手動去啟動開關下載下傳了(但是main函數中的UartInit不能删除)。