邢矯健
MCS-51單片機(jī)能夠通過(guò)編程、燒錄從而成為特定用途的芯片。單片機(jī)的編程一般是使用編譯軟件把.asm或.a51文件編譯成.hex或.bin文件,然后使用專門的編程器燒錄到單片機(jī)或者外接的可編程ROM中。本文介紹一種在沒(méi)有編程器的情況下,燒錄簡(jiǎn)單的單片機(jī)程序,進(jìn)而自制一個(gè)通過(guò)計(jì)算機(jī)直接燒錄多種芯片的實(shí)用編程器。如果你想自己制作一個(gè)編程器,或者你對(duì)手工燒錄芯片有興趣的話,那就照本文介紹的方法試試吧。
1. 硬件原理 圖1是手工燒錄器的硬件電路圖。這一電路是進(jìn)行手工燒錄的最簡(jiǎn)電路,同時(shí)將被作為成型后的編程器的一部分。電路中的89C51芯片選用40腳的零阻力插座接入,當(dāng)然也可以使用普通的DIP-40插座,只是這樣拔插芯片會(huì)麻煩一點(diǎn)。電路采用了一般編程器的電路原理,CD4040芯片是12位的二進(jìn)制計(jì)數(shù)器,這里用作89C51編程狀態(tài)的地址輸入。當(dāng)CD4040芯片的RST端輸入一高電平時(shí),計(jì)數(shù)器清零,此時(shí)對(duì)應(yīng)的89C51內(nèi)的閃存地址為“0000”,之后,每向CLK端輸入一個(gè)低電平,地址就增加“1”,一直可增加到“0FFF”,正好可以編完89C51內(nèi)4K字節(jié)閃存空間。數(shù)據(jù)輸入端采用8位DIP微動(dòng)開(kāi)關(guān)進(jìn)行手工輸入,89C51的P0.0~P0.7為數(shù)據(jù)輸入端口,當(dāng)某一引腳未接地,則輸入數(shù)據(jù)為“1”,接地則輸入為“0”。P2.6腳為芯片編程/擦除選擇,編程時(shí)應(yīng)接低電平。P3.6、P3.7也是芯片編程/擦除選擇,編程和檢驗(yàn)時(shí)均接高電平。P2.7腳為閃存器的讀寫(xiě)選擇,寫(xiě)入時(shí)(燒錄)接高電平,讀出時(shí)(檢驗(yàn))接低電平。另外,測(cè)試用表筆可以用來(lái)檢查地址、數(shù)據(jù)端口各位數(shù)據(jù),端口為“1”即高電平時(shí),LED發(fā)光,端口為“0”即低電平時(shí),LED不發(fā)光。
當(dāng)燒錄過(guò)程中不慎寫(xiě)入錯(cuò)誤數(shù)據(jù)時(shí),則應(yīng)該進(jìn)行整片擦除,從頭開(kāi)始。進(jìn)行擦除時(shí),要先把89C51置于擦除狀態(tài),即P2.6接高電平,P2.7、P3.6、P3.7都接低電平,然后按下“寫(xiě)入”按鈕10ms以上,芯片即被整片擦除,片內(nèi)所有地址單元均重新置為FF,可以重新置為編程狀態(tài),從頭開(kāi)始燒錄。
2. 手工燒錄 現(xiàn)以本刊的網(wǎng)站上給出的一段與計(jì)算機(jī)進(jìn)行串行通訊的簡(jiǎn)單程序作為例子,講一下需要在單片機(jī)端燒錄的簡(jiǎn)單程序。例子中的第二列是單片機(jī)閃存器的地址編號(hào),第三列即是對(duì)應(yīng)地址單元要燒錄的數(shù)據(jù)。
進(jìn)行燒錄前,需要特別注意你的單片機(jī)系統(tǒng)晶振是否為12MHz,如不是則應(yīng)按本刊第11期文章《如何在單片機(jī)上調(diào)試Hex文件的程序》里介紹的公式“256-晶振頻率×2SMOD÷32÷12÷波特率”,計(jì)算對(duì)應(yīng)的重裝載數(shù),修改相關(guān)的數(shù)據(jù),以使計(jì)算機(jī)端和單片機(jī)端能使用相同波特率正常通訊。另外,你應(yīng)根據(jù)RAM使用的實(shí)際地址值進(jìn)行設(shè)定。
手工燒錄需要細(xì)心和耐心,只要有一個(gè)地址單元的數(shù)據(jù)需要改正時(shí),89C51都要求將芯片內(nèi)整個(gè)存儲(chǔ)器擦除,然后從頭進(jìn)行。編程之前首先應(yīng)讀懂例子中的編程數(shù)據(jù),.a51單片機(jī)程序經(jīng)過(guò)編譯后生成的.lis文件,第一列為行號(hào),第二列為地址編號(hào),第三列為程序所對(duì)應(yīng)的代碼數(shù)據(jù),第四列則是源程序語(yǔ)句(包含語(yǔ)句后的注釋)。我們把需燒錄的內(nèi)容(即第三列的代碼數(shù)據(jù))依次寫(xiě)入第二列編號(hào)所對(duì)應(yīng)的地址單元,手工燒錄的工作即告完成。
代碼數(shù)據(jù)和地址編號(hào)均用十六進(jìn)制數(shù)表示,每位十六進(jìn)制數(shù)代表的是四位二進(jìn)制數(shù),即由0或1組成的四位數(shù)。每個(gè)十六進(jìn)制數(shù)碼表示的二進(jìn)制數(shù)如下:
000001000120010300114010050101
601107011181000 91001A1010B 1011C1100D1101E1110F1111
地址編碼有四位,轉(zhuǎn)換成二進(jìn)制數(shù)即為16位。實(shí)際上由于89C51內(nèi)的閃存器僅有4K字節(jié)(212),所以只需取后面的12位,即把地址編碼的后3位十六進(jìn)制數(shù)轉(zhuǎn)換出來(lái)即可,如第一行的地址編碼0000,在燒錄時(shí)取000,即轉(zhuǎn)換為0000 0000 0000。每一地址單元可存儲(chǔ)一字節(jié)的代碼數(shù)據(jù),即8位二進(jìn)制數(shù),對(duì)應(yīng)兩位十六進(jìn)制數(shù)。如地址單元0000應(yīng)寫(xiě)入的代碼數(shù)據(jù)為01,(注意:文件中第一行無(wú)數(shù)據(jù)),燒錄時(shí)轉(zhuǎn)換為0000 0001。后面兩位71,應(yīng)寫(xiě)入0001單元,轉(zhuǎn)換為0111 0001。接下來(lái)的0002單元無(wú)數(shù)據(jù),燒錄時(shí)可跳過(guò)。接下來(lái)的0003單元?jiǎng)t在第四行,應(yīng)寫(xiě)入的數(shù)據(jù)代碼為02,……依此類推。需注意的是,不是每一單元都有數(shù)據(jù),燒錄時(shí)跳過(guò)無(wú)數(shù)據(jù)的地址單元,即相應(yīng)單元不進(jìn)行寫(xiě)入操作。另外,每行中數(shù)據(jù)代碼最多三字節(jié),最少的一字節(jié),依次寫(xiě)入連續(xù)的地址單元中,不會(huì)與下一行的地址單元沖突重合。
理解了數(shù)據(jù)代碼后,就可以開(kāi)始燒錄了。首先要將89C51置于編程狀態(tài),即P2.6接低電平,P2.7、P3.6、P3.7接高電平,J1接口插上外接12V電源。請(qǐng)注意,手工編程需要細(xì)心和耐心,盡量一次燒錄完成,不要出差錯(cuò)。按“清零”按鈕,使CD4040輸出地址編碼從高位到低位為0000 0000 0000,可以用接LED的表筆從高位到低位逐位檢查一次。無(wú)誤后在DIP微動(dòng)開(kāi)關(guān)上表示出對(duì)應(yīng)的代碼數(shù)據(jù)0000 0001,從高位到低位,打開(kāi)接地的位為0,不開(kāi)的位為1。無(wú)誤后,按一下“寫(xiě)入”按鈕,0000地址單元即已燒錄。按“加1”按鈕,地址編碼加1,從高位到低位為0000 0000 0001??稍儆媒覮ED的表筆從高位到低位逐位檢查一次。無(wú)誤后,在DIP微動(dòng)開(kāi)關(guān)上表示出對(duì)應(yīng)的代碼數(shù)據(jù)0111 0001。無(wú)誤后,按一下“寫(xiě)入”按鈕,0001地址單元即已燒錄。按“加1”按鈕,地址編碼加1,由于0002這一單元無(wú)數(shù)據(jù)代碼可跳過(guò),即再按“加1”按鈕,直接到0003地址單元,可用接LED的表筆從高位到低位逐位檢查一次。無(wú)誤后,寫(xiě)入對(duì)應(yīng)數(shù)據(jù)代碼,方法同上。不需每次都用表筆檢查地址編碼,但有無(wú)代碼數(shù)據(jù)的單元跳過(guò)或感覺(jué)地址計(jì)數(shù)有誤時(shí),應(yīng)檢查一遍,及時(shí)對(duì)編程錯(cuò)誤采取對(duì)應(yīng)措施。否則,錯(cuò)一處就還得整片擦除,從頭開(kāi)始。
出錯(cuò)的處理方式有兩條。如果是漏寫(xiě)了一個(gè)單元,則可以先把地址清零,一路跳過(guò)已編程的單元,到漏寫(xiě)的單元,繼續(xù)后面的編程。如果寫(xiě)入了錯(cuò)誤數(shù)據(jù)或?qū)?yīng)地址單元寫(xiě)入了別的單元的數(shù)據(jù),則應(yīng)該進(jìn)行整片擦除,從頭開(kāi)始。進(jìn)行擦除時(shí),把89C51置于擦除狀態(tài),即P26接高電平,P2.7、P3.6、P3.7都接低電平,然后按下“寫(xiě)入”按鈕10ms以上,芯片即被整片擦除,片內(nèi)所有地址單元均重新置為FF,可以從頭開(kāi)始燒錄。
3. 使用電腦燒錄 利用本刊第11期《如何在單片機(jī)上調(diào)試Hex文件的程序》一文介紹的調(diào)試電路和程序來(lái)實(shí)現(xiàn)上面手工燒錄過(guò)程中的高低電平控制,就可以實(shí)現(xiàn)計(jì)算機(jī)對(duì)芯片的直接燒錄,一個(gè)自制的編程器就成型了。下面,以《如何在單片機(jī)上調(diào)試Hex文件的程序》一文中介紹的電路為調(diào)試電路,本文介紹的電路為燒錄電路,把兩部分相應(yīng)的引腳按圖2進(jìn)行連接。
調(diào)試電路工作的前提是89C51中已經(jīng)燒錄了前一部分已經(jīng)提到的串口通訊必需的源程序,并已插入到調(diào)試電路的對(duì)應(yīng)IC插座,可以接收計(jì)算機(jī)端發(fā)送的.Hex程序代碼并運(yùn)行它。
連接完成后,把燒錄控制程序shaolu.hex發(fā)送到調(diào)試電路的RAM中,并運(yùn)行。這樣,當(dāng)計(jì)算機(jī)端再發(fā)送新的 .Hex文件時(shí),燒錄控制程序即會(huì)把這一.Hex文件內(nèi)容燒錄到燒錄電路端的89C51芯片中。以后的的燒錄都將通過(guò)這一途徑進(jìn)行,更長(zhǎng)的程序簡(jiǎn)簡(jiǎn)單單通過(guò)計(jì)算機(jī)幾步即可完成。燒錄控制程序的工作流程如圖3。讀者可自行編寫(xiě),也可到本刊網(wǎng)站下載。除了燒錄功能,燒錄控制程序shaolu.hex還帶有對(duì)89C51閃存器的檢驗(yàn)和整片擦除功能。使用方法是,當(dāng)shaolu.hex在單片機(jī)端的RAM區(qū)運(yùn)行后,在計(jì)算機(jī)端的程序窗口中發(fā)送“02 A5”命令(詳細(xì)方法見(jiàn)程序的幫助),單片機(jī)即會(huì)讀出并發(fā)回?zé)浶酒拈W存器內(nèi)容,計(jì)算機(jī)端就能看到閃存器,通過(guò)適當(dāng)對(duì)比,就可以知道燒錄的數(shù)據(jù)是否正確無(wú)誤。結(jié)束時(shí),單片機(jī)端會(huì)發(fā)回結(jié)束標(biāo)記“AE”,可以判斷閃存器內(nèi)容已全部發(fā)回。發(fā)送“03 A5”命令,即可對(duì)89C51閃存器整片擦除。擦除結(jié)束,單片機(jī)端也會(huì)發(fā)回結(jié)束標(biāo)記“AE”。另外,發(fā)送“04 A5”命令,則會(huì)退出燒錄控制程序,回到原來(lái)調(diào)試控制狀態(tài)。
當(dāng)一片新的89C51燒錄完成后即可替換原先的芯片,實(shí)現(xiàn)系統(tǒng)的更新。編程器可實(shí)現(xiàn)的功能也會(huì)更多,電路適當(dāng)改進(jìn)后還能實(shí)現(xiàn)更多型號(hào)芯片的燒錄??傊允止ぞ幊痰牡谝黄酒瑸槠瘘c(diǎn),編程器的功能可以在芯片替換的過(guò)程中越來(lái)越完善。鑒于89C51芯片有一定的壽命,讀者在重新燒錄芯片前最好先調(diào)試運(yùn)行,確信無(wú)誤后再進(jìn)行燒錄操作。
4. 硬件實(shí)施 一般情況下,元件采購(gòu)比較容易一些,電路板則需專門到廠家專門定做,單片制作是很不合算的。通過(guò)實(shí)踐,我發(fā)現(xiàn)單片機(jī)電路還有一種比較簡(jiǎn)單的實(shí)施方式。
單片機(jī)的電路中有許多總線,總線排列都有一定的順序。因此,電路板的線路排列就很有規(guī)律,而且可以比較簡(jiǎn)單。下面就介紹筆者常用的一種用單面覆銅板制作單片機(jī)硬件電路板的簡(jiǎn)單方法。
以本文中的電路圖為例,首先把芯片、DIP微動(dòng)開(kāi)關(guān)對(duì)應(yīng)的IC插座放在覆銅板的有銅面上,插座的引腳用尖嘴鉗折向插座兩邊(如圖4)。放置時(shí),盡量使用IC插座,其余元件也要留出位置,要使盡可能多的需連接的引腳對(duì)齊。確定放置位置后即可開(kāi)始劃線,用刻印章用的刻刀把IC插座對(duì)應(yīng)的引腳線路刻成平行的直線條。一般DIP插座引腳間的距離為0.24cm,劃線時(shí)每厘米四等分,即每隔0.25cm劃一道線,把劃線處覆銅刻去即可滿足要求。IC插座的正中縱向把平行線條斷開(kāi),不連接線條也都斷開(kāi)。其余元件也依次刻好引腳線。其它應(yīng)連接線路則用漆包線兩頭去漆后焊接的方式連接,IC插座和其它元件也同時(shí)焊接。焊接完畢,用萬(wàn)用表檢查一遍線路連接是否無(wú)誤,相鄰線路間有無(wú)短路,有無(wú)虛焊。全部無(wú)誤后,適當(dāng)固定板上的漆包線。電路板即告完成,把元件插入對(duì)應(yīng)插座,即可使用。
如前所述,建議把調(diào)試電路和燒錄電路綜合后再制作電路板,以減少兩電路間連接的麻煩。綜合后的電路圖不再給出,相信讀者可自行繪出。綜合后的電路在進(jìn)行手工燒錄時(shí),調(diào)試電路部分的芯片最好先不要插上,以免影響手工燒錄的進(jìn)行。