邢矯健
MCS-51單片機能夠通過編程、燒錄從而成為特定用途的芯片。單片機的編程一般是使用編譯軟件把.asm或.a51文件編譯成.hex或.bin文件,然后使用專門的編程器燒錄到單片機或者外接的可編程ROM中。本文介紹一種在沒有編程器的情況下,燒錄簡單的單片機程序,進而自制一個通過計算機直接燒錄多種芯片的實用編程器。如果你想自己制作一個編程器,或者你對手工燒錄芯片有興趣的話,那就照本文介紹的方法試試吧。
1. 硬件原理 圖1是手工燒錄器的硬件電路圖。這一電路是進行手工燒錄的最簡電路,同時將被作為成型后的編程器的一部分。電路中的89C51芯片選用40腳的零阻力插座接入,當然也可以使用普通的DIP-40插座,只是這樣拔插芯片會麻煩一點。電路采用了一般編程器的電路原理,CD4040芯片是12位的二進制計數(shù)器,這里用作89C51編程狀態(tài)的地址輸入。當CD4040芯片的RST端輸入一高電平時,計數(shù)器清零,此時對應(yīng)的89C51內(nèi)的閃存地址為“0000”,之后,每向CLK端輸入一個低電平,地址就增加“1”,一直可增加到“0FFF”,正好可以編完89C51內(nèi)4K字節(jié)閃存空間。數(shù)據(jù)輸入端采用8位DIP微動開關(guān)進行手工輸入,89C51的P0.0~P0.7為數(shù)據(jù)輸入端口,當某一引腳未接地,則輸入數(shù)據(jù)為“1”,接地則輸入為“0”。P2.6腳為芯片編程/擦除選擇,編程時應(yīng)接低電平。P3.6、P3.7也是芯片編程/擦除選擇,編程和檢驗時均接高電平。P2.7腳為閃存器的讀寫選擇,寫入時(燒錄)接高電平,讀出時(檢驗)接低電平。另外,測試用表筆可以用來檢查地址、數(shù)據(jù)端口各位數(shù)據(jù),端口為“1”即高電平時,LED發(fā)光,端口為“0”即低電平時,LED不發(fā)光。
當燒錄過程中不慎寫入錯誤數(shù)據(jù)時,則應(yīng)該進行整片擦除,從頭開始。進行擦除時,要先把89C51置于擦除狀態(tài),即P2.6接高電平,P2.7、P3.6、P3.7都接低電平,然后按下“寫入”按鈕10ms以上,芯片即被整片擦除,片內(nèi)所有地址單元均重新置為FF,可以重新置為編程狀態(tài),從頭開始燒錄。
2. 手工燒錄 現(xiàn)以本刊的網(wǎng)站上給出的一段與計算機進行串行通訊的簡單程序作為例子,講一下需要在單片機端燒錄的簡單程序。例子中的第二列是單片機閃存器的地址編號,第三列即是對應(yīng)地址單元要燒錄的數(shù)據(jù)。
進行燒錄前,需要特別注意你的單片機系統(tǒng)晶振是否為12MHz,如不是則應(yīng)按本刊第11期文章《如何在單片機上調(diào)試Hex文件的程序》里介紹的公式“256-晶振頻率×2SMOD÷32÷12÷波特率”,計算對應(yīng)的重裝載數(shù),修改相關(guān)的數(shù)據(jù),以使計算機端和單片機端能使用相同波特率正常通訊。另外,你應(yīng)根據(jù)RAM使用的實際地址值進行設(shè)定。
手工燒錄需要細心和耐心,只要有一個地址單元的數(shù)據(jù)需要改正時,89C51都要求將芯片內(nèi)整個存儲器擦除,然后從頭進行。編程之前首先應(yīng)讀懂例子中的編程數(shù)據(jù),.a51單片機程序經(jīng)過編譯后生成的.lis文件,第一列為行號,第二列為地址編號,第三列為程序所對應(yīng)的代碼數(shù)據(jù),第四列則是源程序語句(包含語句后的注釋)。我們把需燒錄的內(nèi)容(即第三列的代碼數(shù)據(jù))依次寫入第二列編號所對應(yīng)的地址單元,手工燒錄的工作即告完成。

代碼數(shù)據(jù)和地址編號均用十六進制數(shù)表示,每位十六進制數(shù)代表的是四位二進制數(shù),即由0或1組成的四位數(shù)。每個十六進制數(shù)碼表示的二進制數(shù)如下:
000001000120010300114010050101
601107011181000 91001A1010B 1011C1100D1101E1110F1111
地址編碼有四位,轉(zhuǎn)換成二進制數(shù)即為16位。實際上由于89C51內(nèi)的閃存器僅有4K字節(jié)(212),所以只需取后面的12位,即把地址編碼的后3位十六進制數(shù)轉(zhuǎn)換出來即可,如第一行的地址編碼0000,在燒錄時取000,即轉(zhuǎn)換為0000 0000 0000。每一地址單元可存儲一字節(jié)的代碼數(shù)據(jù),即8位二進制數(shù),對應(yīng)兩位十六進制數(shù)。如地址單元0000應(yīng)寫入的代碼數(shù)據(jù)為01,(注意:文件中第一行無數(shù)據(jù)),燒錄時轉(zhuǎn)換為0000 0001。后面兩位71,應(yīng)寫入0001單元,轉(zhuǎn)換為0111 0001。接下來的0002單元無數(shù)據(jù),燒錄時可跳過。接下來的0003單元則在第四行,應(yīng)寫入的數(shù)據(jù)代碼為02,……依此類推。需注意的是,不是每一單元都有數(shù)據(jù),燒錄時跳過無數(shù)據(jù)的地址單元,即相應(yīng)單元不進行寫入操作。另外,每行中數(shù)據(jù)代碼最多三字節(jié),最少的一字節(jié),依次寫入連續(xù)的地址單元中,不會與下一行的地址單元沖突重合。
理解了數(shù)據(jù)代碼后,就可以開始燒錄了。首先要將89C51置于編程狀態(tài),即P2.6接低電平,P2.7、P3.6、P3.7接高電平,J1接口插上外接12V電源。請注意,手工編程需要細心和耐心,盡量一次燒錄完成,不要出差錯。按“清零”按鈕,使CD4040輸出地址編碼從高位到低位為0000 0000 0000,可以用接LED的表筆從高位到低位逐位檢查一次。無誤后在DIP微動開關(guān)上表示出對應(yīng)的代碼數(shù)據(jù)0000 0001,從高位到低位,打開接地的位為0,不開的位為1。無誤后,按一下“寫入”按鈕,0000地址單元即已燒錄。按“加1”按鈕,地址編碼加1,從高位到低位為0000 0000 0001。可再用接LED的表筆從高位到低位逐位檢查一次。無誤后,在DIP微動開關(guān)上表示出對應(yīng)的代碼數(shù)據(jù)0111 0001。無誤后,按一下“寫入”按鈕,0001地址單元即已燒錄。按“加1”按鈕,地址編碼加1,由于0002這一單元無數(shù)據(jù)代碼可跳過,即再按“加1”按鈕,直接到0003地址單元,可用接LED的表筆從高位到低位逐位檢查一次。無誤后,寫入對應(yīng)數(shù)據(jù)代碼,方法同上。不需每次都用表筆檢查地址編碼,但有無代碼數(shù)據(jù)的單元跳過或感覺地址計數(shù)有誤時,應(yīng)檢查一遍,及時對編程錯誤采取對應(yīng)措施。否則,錯一處就還得整片擦除,從頭開始。

出錯的處理方式有兩條。如果是漏寫了一個單元,則可以先把地址清零,一路跳過已編程的單元,到漏寫的單元,繼續(xù)后面的編程。如果寫入了錯誤數(shù)據(jù)或?qū)?yīng)地址單元寫入了別的單元的數(shù)據(jù),則應(yīng)該進行整片擦除,從頭開始。進行擦除時,把89C51置于擦除狀態(tài),即P26接高電平,P2.7、P3.6、P3.7都接低電平,然后按下“寫入”按鈕10ms以上,芯片即被整片擦除,片內(nèi)所有地址單元均重新置為FF,可以從頭開始燒錄。
3. 使用電腦燒錄 利用本刊第11期《如何在單片機上調(diào)試Hex文件的程序》一文介紹的調(diào)試電路和程序來實現(xiàn)上面手工燒錄過程中的高低電平控制,就可以實現(xiàn)計算機對芯片的直接燒錄,一個自制的編程器就成型了。下面,以《如何在單片機上調(diào)試Hex文件的程序》一文中介紹的電路為調(diào)試電路,本文介紹的電路為燒錄電路,把兩部分相應(yīng)的引腳按圖2進行連接。
調(diào)試電路工作的前提是89C51中已經(jīng)燒錄了前一部分已經(jīng)提到的串口通訊必需的源程序,并已插入到調(diào)試電路的對應(yīng)IC插座,可以接收計算機端發(fā)送的.Hex程序代碼并運行它。
連接完成后,把燒錄控制程序shaolu.hex發(fā)送到調(diào)試電路的RAM中,并運行。這樣,當計算機端再發(fā)送新的 .Hex文件時,燒錄控制程序即會把這一.Hex文件內(nèi)容燒錄到燒錄電路端的89C51芯片中。以后的的燒錄都將通過這一途徑進行,更長的程序簡簡單單通過計算機幾步即可完成。燒錄控制程序的工作流程如圖3。讀者可自行編寫,也可到本刊網(wǎng)站下載。除了燒錄功能,燒錄控制程序shaolu.hex還帶有對89C51閃存器的檢驗和整片擦除功能。使用方法是,當shaolu.hex在單片機端的RAM區(qū)運行后,在計算機端的程序窗口中發(fā)送“02 A5”命令(詳細方法見程序的幫助),單片機即會讀出并發(fā)回?zé)浶酒拈W存器內(nèi)容,計算機端就能看到閃存器,通過適當對比,就可以知道燒錄的數(shù)據(jù)是否正確無誤。結(jié)束時,單片機端會發(fā)回結(jié)束標記“AE”,可以判斷閃存器內(nèi)容已全部發(fā)回。發(fā)送“03 A5”命令,即可對89C51閃存器整片擦除。擦除結(jié)束,單片機端也會發(fā)回結(jié)束標記“AE”。另外,發(fā)送“04 A5”命令,則會退出燒錄控制程序,回到原來調(diào)試控制狀態(tài)。

當一片新的89C51燒錄完成后即可替換原先的芯片,實現(xiàn)系統(tǒng)的更新。編程器可實現(xiàn)的功能也會更多,電路適當改進后還能實現(xiàn)更多型號芯片的燒錄。總之,以手工編程的第一片芯片為起點,編程器的功能可以在芯片替換的過程中越來越完善。鑒于89C51芯片有一定的壽命,讀者在重新燒錄芯片前最好先調(diào)試運行,確信無誤后再進行燒錄操作。
4. 硬件實施 一般情況下,元件采購比較容易一些,電路板則需專門到廠家專門定做,單片制作是很不合算的。通過實踐,我發(fā)現(xiàn)單片機電路還有一種比較簡單的實施方式。
單片機的電路中有許多總線,總線排列都有一定的順序。因此,電路板的線路排列就很有規(guī)律,而且可以比較簡單。下面就介紹筆者常用的一種用單面覆銅板制作單片機硬件電路板的簡單方法。
以本文中的電路圖為例,首先把芯片、DIP微動開關(guān)對應(yīng)的IC插座放在覆銅板的有銅面上,插座的引腳用尖嘴鉗折向插座兩邊(如圖4)。放置時,盡量使用IC插座,其余元件也要留出位置,要使盡可能多的需連接的引腳對齊。確定放置位置后即可開始劃線,用刻印章用的刻刀把IC插座對應(yīng)的引腳線路刻成平行的直線條。一般DIP插座引腳間的距離為0.24cm,劃線時每厘米四等分,即每隔0.25cm劃一道線,把劃線處覆銅刻去即可滿足要求。IC插座的正中縱向把平行線條斷開,不連接線條也都斷開。其余元件也依次刻好引腳線。其它應(yīng)連接線路則用漆包線兩頭去漆后焊接的方式連接,IC插座和其它元件也同時焊接。焊接完畢,用萬用表檢查一遍線路連接是否無誤,相鄰線路間有無短路,有無虛焊。全部無誤后,適當固定板上的漆包線。電路板即告完成,把元件插入對應(yīng)插座,即可使用。
如前所述,建議把調(diào)試電路和燒錄電路綜合后再制作電路板,以減少兩電路間連接的麻煩。綜合后的電路圖不再給出,相信讀者可自行繪出。綜合后的電路在進行手工燒錄時,調(diào)試電路部分的芯片最好先不要插上,以免影響手工燒錄的進行。