stc單片機(jī)支持串口isp程序下載,不必使用專用下載器,僅使用串口就能下載程序。但每次下載程序都要斷電再上電,比較麻煩。
下面介紹一種不需斷電就能下載程序的方法,在程序調(diào)試時比較方便。
基本原理:
stc單片機(jī)有專用的復(fù)位寄存器,通過對該寄存器寫入不同的數(shù)值可以實(shí)現(xiàn)單片機(jī)熱啟動復(fù)位。
寄存器功能如下圖所示:
由上圖可以看出只要滿足某個條件,向ISP_CONTR寫入0x60,就可以實(shí)現(xiàn)從ISP監(jiān)控區(qū)軟啟動啟動
某個條件設(shè)置為:當(dāng)串口接收到0xaa數(shù)據(jù)時,單片機(jī)執(zhí)行ISP_CONTR=0x60; 指令,從ISP監(jiān)控區(qū)軟啟動啟動。
演示程序如下:
//*************************STC12C5410AD軟啟動演示**************************
//
//收到0xaa,從ISP監(jiān)控區(qū)軟啟動,利用該特性,可以實(shí)現(xiàn)stc單片機(jī)不斷電下載
//收到0x55,從用戶程序區(qū)啟動
//2010年3月13日21:58:49
//*************************************************************************
#include
uint c;
//*************** 函數(shù)定義 ******************
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)
{
}
}
//***************************發(fā)送數(shù)據(jù)**************************
void senddata(uchar dc)
{
SBUF=dc;
while(!TI); //當(dāng)TI=0時,發(fā)送未結(jié)束,循環(huán)等待
TI=0; //當(dāng)TI=1時,發(fā)送結(jié)束,用軟件將TI清零
}
void uart(void) interrupt 4
{
uchar cdd;
if(RI)
{
RI=0;
cdd=SBUF;
if(cdd==0xaa)
{
ISP_CONTR=0x60; //軟復(fù)位,從ISP監(jiān)控區(qū)啟動
}
else if(cdd==0x55)
{
ISP_CONTR=0x20; //軟復(fù)位,從用戶程序區(qū)啟動
}
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++)
{;}
}
}
在調(diào)試程序中加入串口初始化代碼,串口中斷代碼即可實(shí)現(xiàn)不斷電下載程序
///******************
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; //軟復(fù)位,從ISP監(jiān)控區(qū)啟動
}
else if(cdd==0x55)
{
ISP_CONTR=0x20; //軟復(fù)位,從用戶程序區(qū)啟動
}
else
{
senddata(cdd);
}
}
else
{
TI=0;
}
}
在上演示程序中,利用單片機(jī)串口收到某個有效數(shù)據(jù)后,執(zhí)行從isp引導(dǎo)區(qū)軟啟動的命令(ISP_CONTR=0x60;),實(shí)現(xiàn)程序不斷電下載。但該方法為實(shí)現(xiàn)程序不斷電下載,占用了一些單片機(jī)資源——串口、中斷等,實(shí)際應(yīng)用中有一些不便。下面介紹另一種程序不斷電下載方法:
考慮到單片機(jī)開發(fā)板在設(shè)計(jì)時一般都留有一個手動復(fù)位按鈕,能否利用該按鈕實(shí)現(xiàn)程序不斷電下載呢?答案是肯定的!!!!!
單片機(jī)上電復(fù)位時,POF=1;單片機(jī)手動復(fù)位時,POF=0
單片機(jī)上電運(yùn)行時對POF位進(jìn)行判斷,如果POF位=0,將POF位置1,讓單片機(jī)從isp引導(dǎo)區(qū)軟復(fù)位。
如果POF位=1,將POF位清0。
將實(shí)現(xiàn)以上功能的代碼加入到你的程序中,當(dāng)需要下載程序時,按下復(fù)位按鈕,此時POF位=0,單片機(jī)再次從isp引導(dǎo)區(qū)軟復(fù)位,從而實(shí)現(xiàn)程序下載。
該方法只需在用戶程序中嵌入一段判斷POF標(biāo)志位的代碼就能實(shí)現(xiàn)程序不斷電下載,無需占用任何單片機(jī)內(nèi)部資源。
演示程序:
//*******************stc單片機(jī)不斷電下載程序******************
#include
sfr ISP_CONTR=0xe7; 軟復(fù)位寄存器聲明
void main(void)
{
//////////////將這段代碼嵌入到程序中////////////////
if((PCON&0x10)==0) //如果POF位=0
{
PCON=PCON|0x10; //將POF位置1
ISP_CONTR=0x60; //軟復(fù)位,從ISP監(jiān)控區(qū)啟動
}
else
{
PCON=PCON&0xef; //將POF位清零
}
//////////////////////////////////////////////
while(1)
{
`
` 用戶程序
`
}
}
操作說明:
1 將演示程序中的紅色代碼復(fù)制到您的程序中,首次使用時應(yīng)利用斷電下載的方式將含有紅色代碼的程序下載到單片機(jī)中
2 將hex文件載入STC單片機(jī)isp軟件,點(diǎn)擊下載按鈕
3 按下單片機(jī)開發(fā)板上復(fù)位鍵,單片機(jī)進(jìn)行is程序下載
『本文轉(zhuǎn)載自網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系刪除』