STC89C52RC單片機(jī)可以直接用串口進(jìn)行ISP編程,對(duì)于使用者來說,這就變得很簡(jiǎn)單了.這里要說的是,對(duì)STC89C52RC進(jìn)行串口ISP編程的兩種方法.
第一種 冷啟動(dòng), 即徹底關(guān)斷用戶目標(biāo)板的電源,再上電.這一方法為廠家推薦之方法.宏晶公司在STC89C52RC數(shù)據(jù)手冊(cè)上給出了下面的編程流程.

具體做法如下:
1.首先確保有STC89C52RC的目標(biāo)板至少有最小系統(tǒng).
2.到宏晶公司的網(wǎng)站下載一個(gè)軟件,下載地址為: http://www.mcu-memory.com/datasheet/stc/stc-isp-v2.9-setup/stc-isp-v2.9-setup-beta5.exe
先在MCU Type下拉列表中選擇正確的單片機(jī)型號(hào),這里就選STC89C52RC啦,然后點(diǎn)擊“Open File”打開待下載的文件,接著選擇正確的COM口以及本機(jī)可用的最高波特率,COM口根據(jù)你接的串口來確定,最高波特率通常不必改動(dòng),接下來就是選擇是否啟用單片機(jī)的倍速特性,根據(jù)自己的需要來定,選擇芯片內(nèi)置振蕩器的增益大小,可以根據(jù)提示,按提示要求去做,可得到較低的EMI特性。 一切選項(xiàng)最好之后,可以開始下載.
關(guān)斷電源,然后點(diǎn)擊“Download/下載”按鈕,點(diǎn)完后,再接通電源,這里要注意,關(guān)斷電源到接通電源時(shí)間應(yīng)稍微長(zhǎng)一些,保證板子充分放電.只要注意操作順序應(yīng)該沒有什么問題,如果點(diǎn)擊“Download/下載”未及時(shí)插上電源,會(huì)出現(xiàn)如下圖所示畫面,不必?fù)?dān)心,直接將電源插上即可。
第二種 不切斷電源的方法
與冷啟動(dòng)相比,前面的操作都一樣,只是從冷啟動(dòng)需要關(guān)斷電源的操作步驟開始不一樣.當(dāng)冷啟動(dòng)需要關(guān)斷電源時(shí),在本方法下,不需要關(guān)斷電源.此時(shí),請(qǐng)按照下面步驟進(jìn)行:
需要用到串口,因此要占用單片機(jī)串行口和定時(shí)器T1或者T2作為波特率發(fā)生器,因此,定時(shí)器T1或者T2你就不能用了(在調(diào)試階段)。下面,我們要在程序里加上一段串口初始化的程序: serial_init () { SCON = 0x50; /* mode 1: 8-bit UART, enable receiver */ C_T2=0; /*Timer2 runing in Timer mode*/ RCLK=1; TCLK=1; RCAP2H=0xff; RCAP2L=0xee; TR2=1; /*enable Timer2 run */ ES = 1; REN=1; EA=1; SM2=1; /*SM2=1時(shí)收到的第9位為1才置位RI標(biāo)志*/ } 這段程序加在主程序初始化那里,特別要提示的是,在初始化之前要有一段延時(shí),時(shí)間約為0.1s即可,也就是主程序應(yīng)該是這樣的: void main() { ….. 變量的定義,其他初始化語(yǔ)句 mDelay(100); //延時(shí)100ms serial_init(); …… 其他語(yǔ)句 為什么一定要在初始化串口之前加一段延時(shí)呢?這在后面交待。 然后要加一段串口收數(shù)的程序,直接復(fù)制下面這一段就可以,了解清楚原理后自己寫也行: uchar bitset(uchar num,uchar cbit) /*設(shè)置某一位*/ { uchar bit_value[]={1,2,4,8,16,32,64,128}; return num|bit_value[cbit]; } //////////////////////////////////////////////////////// void Ser() interrupt 4 { static uchar Count=0; GetCharBuf[Count]=SBUF; if(GetCharBuf[Count]==(Count+0x10)) //要求stc下載軟件發(fā)送的數(shù)是10 11 12 13 14 15 16 17 { sMark="bitset"(sMark,Count); //如果收到的數(shù)符合要求,則將sMark這個(gè)相應(yīng)位置1 } Count++; if(Count>=8) { Count="0"; mGet=1; //置位標(biāo)志 } RI=0; } 看懂了沒有呢?這里定義了8個(gè)字節(jié)的命令字,如果從主機(jī)傳來連續(xù)的8個(gè)數(shù)正好與所定義的8個(gè)數(shù)相符合,那么就說明主機(jī)有要求重新下載的指令了。定義哪8個(gè)數(shù),如何判定,這都可以發(fā)揮你自己的聰明才智來寫,這里就簡(jiǎn)單地要求主機(jī)發(fā)送0x10 0x11 0x12 0x13 0x14 0x15 0x16和0x17這8個(gè)數(shù),看程序中的這一行: if(GetCharBuf[Count]==(Count+0x10)) 由于每次收到數(shù)Count會(huì)加1,從開始的0計(jì)到7為止,因此,接收到的數(shù)如果是Count加上0x10,就認(rèn)為是相符的。 相符之后就要做個(gè)記號(hào),這里用了一個(gè)字節(jié)sMark,開機(jī)時(shí),該字節(jié)為0,相符一次,則將相應(yīng)位置1,如果收到的8個(gè)數(shù)均相符,那么sMark=0xff,如果收到的數(shù)中有一個(gè)不符,那么sMark不等于0xff。利用sMark即可判斷是否接收到了正確的8個(gè)數(shù)。 一旦收到8個(gè)數(shù)之后,即置位標(biāo)志位mGet,然后在main函數(shù)里面做個(gè)判斷,如果mGet=1且sMark=0xff,說明要求重新下載,下面即延時(shí)1s,然后將數(shù)0x60寫入特殊功能寄存器:ISP_CONTR即可,main函數(shù)中的這一部份程序如下: if(mGet) { if(sMark==0xff) //收到數(shù)符合要求 { sMark="0"; //復(fù)位 mDelay(2000); ISP_CONTR=0x60;//復(fù)位到isp下載區(qū) } else { sMark="0"; } } 你可以把這一段放在main函數(shù)的for(;;)循環(huán)當(dāng)中。 ISP_CONTR是STC89C52RC的一個(gè)特殊功能寄存器,其地址為0xE7,可以在程序的開頭用sfr關(guān)鍵字來定義: sfr ISP_CONTR=0xe7; 接下來看一看PC機(jī)程序端應(yīng)該怎么做。 點(diǎn)擊界面右側(cè)的“自定義下載”,先選定特率,按上面的程序,如果選用stc89C52rc的倍速特性的話,波特率就是38400,否則就是19200,其他按圖4設(shè)置即可。接著到自定義下載文本框中輸入自定義下載指令為10 11 12 13 14 15 16 17 輸入好了以后,點(diǎn)擊發(fā)送,即可在不斷電的情況下進(jìn)行程序的下載了。 那么為什么一開始初始化的時(shí)候一定要延時(shí)呢?這是我們?cè)趯?shí)際使用中發(fā)現(xiàn),在下載完成后,軟件似乎會(huì)多發(fā)送一些數(shù)據(jù),由于我們的程序中沒有設(shè)置超時(shí)等處理,所以就會(huì)干擾數(shù)據(jù)的正確接收,為此采取了一個(gè)簡(jiǎn)的方法就是延時(shí)一段時(shí)間再開啟串口。當(dāng)然你也可以采用其他的方法來解決這個(gè)問題,不過我們認(rèn)為這種方法簡(jiǎn)單有效。 為了更有效地進(jìn)行程序的開發(fā),建議你將“選項(xiàng)”下方的“每次下載前自動(dòng)刷新已打開在緩沖區(qū)的文件,以方便調(diào)試”前面打上勾。
|