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