相信喜歡單片機的朋友都用過STC的單片機,用過STC單片機的朋友都有這種感受:實惠、易用、功能強大!就是每次下載都要冷啟動特別惡心,相信很多朋友的開發板上的電源鍵都按爛了。。。。。
其實STC單片機可以不用免掉電下載,想要知道怎樣才能免掉電下載,我們先要了解STC單片機是怎樣實現串口下載的,其實STC單片機出廠時就預置了一段ISP監控程序,我們稱作ISP引導碼,這段ISP監控程序就好比電腦硬盤的系統引導區。我們對STC單片機上電啟動時,單片機首先執行ISP引導碼檢測串口是否下載程序的命令,如果上位機在對單片機下載程序時,單片機檢測到下載數據流就啟動ISP下載功能對單片機進行程序下載,這就是我們平時實驗時點擊下載后按開發板電源鍵的過程。
STC單片機在進行冷啟動時會從ISP引導碼開始執行程序,而進行熱啟動或按復位鍵軟啟動時是從用戶程序段開始執行的。然而熟悉STC單片機的朋友知道STC單片機增加了ISP/IAP控制寄存器ISP_CONTR,用來管理ISP/IAP功能和是否軟啟動,其各位功能大家可參照STC公司相關資料。當我們將ISP_CONTR置為0x60時單片機自動復位從ISP引導碼開始執行。由此我們在需要下載程序時將ISP_CONTR置為0x60就可以完成下載了。。。偶耶!
下面來介紹怎樣實現
方法一:通過按復位鍵來實現,STC單片機上電復位時PCON的POF=1,在按復位鍵復位時POF=0。所以我們在程序中可以用POF來 控制ISP_CONTR。
方法二:利用串口,STC下載軟件中有個自定義下載,也就是下載前通過串口發送一段自定義代碼,單片機收到該代碼后來控制單片機
ISP_CONTR進行軟復位下載。
相關程序代碼如下:
/************************************** I LOVE MCU ************************************ * 程序名稱:STC單片機免掉電下載 * 程序作者: 郭偉(QQ:495817787 ,Email:) * 程序版本: V1.0 * 編制日期: 2012-01-19 * 編譯器:Keil C uVision4 * 調試芯片:STC89C52 11.0592M晶振 * 占用資源: 1》自定義下載:串口,定時器T1,中斷 2》復位鍵下載:不占用資源 * 特別說明: 1》使用本程序時需要用宏來選擇條件編譯程序段 2》使用復位鍵下載時,只需要在main函數開頭調用ResetKey_Download(); 3> 使用自定義下載時調用Auto_Download()對串口進行初始化,波特率9600 ********************************* I LOVE MCU ******************************************/ #ifndef _DOWNLOAD_H_ #define _DOWNLOAD_H_ #include <STC89.H> #include "delay.h" /***選擇下載方式***/ #define Auto_download //#define ResetKey_download//使用條件編譯選擇下載方式 /*****************/ #ifdef ResetKey_download void ResetKey_Download() { if ((PCON & 0x10) == 0) { //POF位=0,單片機軟件復位 PCON = PCON | 0x10; //將POF位置1,防止重復進入isp監控區 ISP_CONTR = 0x60; //軟復位,從ISP監控區啟動,如果沒有isp下載流,則重新轉向用戶區引導 } else { PCON = PCON & 0xef; //將POF位清零 } } #endif #ifdef Auto_download unsigned char Sbuff_isp[8];//申明緩沖區 void Auto_Download() { //定時器1工作在模式2,8Bit自動重裝載模式 TMOD = (TMOD & 0X0F) | 0X20; /*設置波特率*/ TH1=0xfd; TL1=0xfd; RI=0; TI=0; SCON = 0x50; ES = 1; EA = 1; TR1 =1; } //自動ISP功能函數 void ISP_Check() { unsigned char i=0,k=0; unsigned char code isp_comm[8]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};//串口發送數據要與該數組數據相同 for(i=0;i<8;i++) { if(Sbuff_isp[i]!=isp_comm[i]) { k=1;} } if(k==0) { EA = 0; delay_ms(1000);//等待1秒 ISP_CONTR = 0x60; //軟復位進入ISP下載模式 } } //串口接收中斷 void Serial_int(void) interrupt 4 using 1 { static uchar i=0; if (RI) { Sbuff_isp[i] = SBUF;//將串口數據依次存入緩沖區 i++; RI = 0; } if(i==8) { ISP_Check(); i=0; } } #endif #endif 歡迎喜歡單片機的朋友來多多交流。。。