轉自:stc單片機不斷電下載程序(利用串口)(佔用串口和一個定時器)(不實用)
第一步:編寫串口操作程序。這種自動下載方法需要用到串口中斷。所謂自動下載,就是說當前單片機已經在運行程序了,但這個程序必須具備串口中斷功能,通過串口接收特定字符標誌,使得單片機知道應該從運行用戶程序狀態退出,復位後進入監控狀態(即ISP狀態),爲下載新的用戶程序做好準備。所以,如果你總想不通過冷啓動的辦法來自動下載程序,就要求當前單片機運行的程序以及你將要下載的程序都具備串口中斷及識別特定字符標誌的功能,這就需要編寫串口操作程序。首先利用定時器產生波特率信號,設置串口。建立頭文件timer1.h:
#ifndef _timer1_h_
#define _timer1_h_
//定時器1初始化,串口波特率初始化
//自動ISP功能模塊
void timer1_init(void)
{
//定時器T1工作在模式2,8位自動重裝載模式
TMOD = (TMOD & 0X0F) | 0X20;
SCON = 0x50;
PCON |= 0x80;//波特率加倍
TH1 = 0xff;
TL1 = 0xff;
TR1 =1;
ES = 1;
EA = 1;
}
void delay(unsigned int time)
{
while(--time);
}
//自動ISP功能函數
void ISP_Check(unsigned char tmp)
{
static isp_counter=0;
//ISP標誌字符
unsigned char code isp_comm[16]= {0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef,0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
if(tmp != isp_comm[isp_counter++])
{
isp_counter = 0;
return;
}
else if (isp_counter > 15)
{
EA = 0;
delay(100000);
ISP_CONTR = 0x60; //軟復位進入ISP下載模式
}
}
//串行接收中斷
void Serial_int(void) interrupt 4 using 1
{
unsigned char tmp;
if (RI)
{
tmp = SBUF;
ISP_Check(tmp);
RI = 0;
}
}
#endif
把上面的打包成timer1.h文件包含進工程文檔,並在主程序中調用timer1.h內的初始化函數,
如下所示:
#include "STC89C51RC.H"
#include "timer1.h"
sbit beep=P1^7;//P1^7接揚聲器驅動電路
void delay_ms(const unsigned int DELAY)
{
unsigned int x,y;
for(x=0;x<=DELAY;x++)
{
for(y=0;y<=120;y++);
}
}
main()
{
delay_ms(500);
timer1_init(); //timer1初始化,啓用串口設置
while(1)
{
beep=1;
delay_ms(400);
beep=0;
delay_ms(400);
}
}
第二步:編譯工程得到HEX文件,運行STC-ISP.exe。如下圖:
(原文件名:0.jpg)
注意紅線框內的自定義下載的參數設置,即串口和標誌字符的設置,一定要與上面第一步在timer1.h文件中設置的一致。在Step1中,選定單片機型號;在Step2中,選定要下載的HEX文件;在Step3中,設置串口;在Step4中,通常使用默認設置。假設單片機正在運行程序(此程序的串口設置、標誌字符和自定義下載的參數一致),點擊自定義下載選項頁的發送按鈕,即可完成新的用戶程序下載並運行之。
需要特別注意的是:(1)自定義下載選項頁中的波特率設置很重要,不能有錯;(2)主程序開始最好插入延時語句,避免串口通訊出現問題。(3)這種Auto ISP方式佔用了串口和一個定時器,有一定侷限性