福利:資深單片機工程師的開(kāi)發(fā)經(jīng)驗總結
1、與發(fā)光二極管串聯(lián)的電阻(排阻)的計算和選取,一般發(fā)光二極管的正常發(fā)光的電流是3~10mA,在發(fā)光二極管上產(chǎn)生的壓降是1.7
本文引用地址:http://dyxdggzs.com/article/201710/368836.htmV(軌管) R=(5-1.7)/3~10 (k)
2、單片機TTL電平 高電平:+5V;低電平:0V。
RS232串口電平 高電平:—12V ;低電平:+12V。 可以通過(guò)MAX232電平轉換芯片,轉換之間的電平。
3、單片機上電IO口的寄存器為高電平,其余寄存器為低電平。
4、三極管的開(kāi)關(guān)作用:在B、E間接正向電壓,E、C是導通的。
5、蜂鳴器:
1) 有源蜂鳴器直接接上額定電壓就可以連續發(fā)聲。
2)無(wú)源蜂鳴器和電磁揚聲器一樣,需要接在音頻輸出電路中才能發(fā)聲。
3)有源蜂鳴器帶振蕩源,無(wú)源的不帶。
4)有源蜂鳴器的理想信號是直流電。
5)無(wú)源蜂鳴器的理想信號為方波信號。
方波發(fā)聲函數:void beep()
{ fmq=0;
delay 500us();
fmq=1;
delay 500us();
}
6、計算單片機指令周期:
指令周期(us) = 12 / 晶振頻率(Mhz)
選用12M的晶振,一個(gè)指令周期為1us
7、89C51的芯片最高支持24M的晶振
以上是筆者對單片機開(kāi)發(fā)的初探,結合自己的實(shí)際做的幾點(diǎn)歸納,但筆者和大家都會(huì )感覺(jué)到不是很過(guò)癮,筆者經(jīng)過(guò)整理前人的經(jīng)驗總結,看到了很多值得很大家一起分享的一些開(kāi)發(fā)經(jīng)驗??!
目前介紹單片機應用的文章很多,但介紹單片機開(kāi)發(fā)工具制作的文章卻較少。由于單片機是一門(mén)實(shí)踐性很強的課程,如果采用傳統的開(kāi)發(fā)模式,則要購買(mǎi)價(jià)格昂貴的仿真器、編程器等開(kāi)發(fā)工具來(lái)作實(shí)驗。其實(shí)由于芯片功能的日益完善,我們可以利用芯片的在系統編程(ISP)功能制作出實(shí)用而低價(jià)的開(kāi)發(fā)工具。本文旨在幫助DIY愛(ài)好者開(kāi)發(fā)制作出適合自己的開(kāi)發(fā)工具。
1 當前常用開(kāi)發(fā)模式
目前,基本上有兩種開(kāi)發(fā)模式可供選擇:用仿真器、用編程器。
?、?用仿真器。優(yōu)點(diǎn):方便,可以設置斷點(diǎn),可以觀(guān)察存儲器及寄存器的內容。缺點(diǎn):價(jià)格昂貴,不同類(lèi)型的單片機要購買(mǎi)不同的仿真器;仿真器終究不是單片機,有時(shí)代碼在仿真器上能通過(guò),但在單片機中不能正常工作,反而增加了調試的難度。
?、?用編程器。優(yōu)點(diǎn):價(jià)格相對便宜,通常一款編程器可編程多種器件。缺點(diǎn):操作相當不便,每次要將芯片在目標板與編程器之間轉移,并且還要在編譯操作界面與編程器操作界面之間切換,大部分時(shí)間在做簡(jiǎn)單的重復工作。
2 新的開(kāi)發(fā)模式介紹及芯片選擇
本文介紹的開(kāi)發(fā)工具采用一種新的開(kāi)發(fā)模式(類(lèi)似于編程器開(kāi)發(fā)模式)。由于利用了芯片的在系統編程功能,因此不需要移動(dòng)芯片。在軟件設計時(shí)設計成:一旦代碼文件被重新編過(guò),即自動(dòng)下載到芯片,并自動(dòng)復位運行,是真正的“所編即所得”。
目前很多單片機都支持在系統編程。8051系列單片機支持在系統編程的也很多,但大多數是支持通過(guò)PC機的串口對單片機進(jìn)行編程。這樣有四個(gè)不方便的地方:一是項目本身與PC機串行通信不方便;二是要增加1片MAX232電平轉換芯片;三是有的芯片要按特定的步驟進(jìn)入下載模式,編程過(guò)程需要手工干預;四是有的芯片需要固件(定制的程序)的支持,如果不小心損壞了固件,則芯片的在系統編程功能也沒(méi)有了。
經(jīng)過(guò)比較,Atmel公司生產(chǎn)的AT89S8252是一種比較理想的芯片,適合制作開(kāi)發(fā)工具。此芯片有如下特點(diǎn):
◆ 與8051兼容;
◆ 內含8KB可擦寫(xiě)1000次的程序存儲器,2KB可擦寫(xiě)超過(guò)100 000次的數據存儲器及256字節8位寬內部RAM;
◆ 可通過(guò)SPI接口在系統串行編程,與8051兼容
◆ 串行編程時(shí)有自動(dòng)擦寫(xiě)周期,在調試大程序時(shí)可以分段下載,節約時(shí)間;
◆ 低電壓下載,無(wú)需12V編程電壓。
3 AT89S8252串行編程
?。?) AT89S8252串行編程模式
當芯片的RST引腳置高電平時(shí),所有程序和數據存儲器可以通過(guò)SPI總線(xiàn)接口[SCK,MOSI(input),MISO(output)]編程。RST變高以后,在編程或擦除操作之前必須首先發(fā)送一條編程允許命令。在串行編程模式下,芯片會(huì )在字節編程之前自動(dòng)插入一個(gè)擦除周期。因此,除非芯片的代碼保護位被編程,編程之前不需要執行全片擦除命令。SPI接口之SCK時(shí)鐘頻率須低于晶振頻率的1/40。
?。?) AT89S8252串行編程步驟
?、?在XTAL1與XTAL2之間連接一個(gè)3~24MHz的晶振;在VCC與GND之前加上電源電壓,將RST置高,等待10ms。
?、?發(fā)送串行編程允許命令。
?、?發(fā)送寫(xiě)/讀/擦除等命令及數據,串行數據高位在前,低位在后,數據在時(shí)鐘的上升沿鎖定。
?、?如果上一步是寫(xiě)命令,至少等待2.5ms。
?、?需要時(shí)重復③、④兩步。
?、?將RST置低,芯片開(kāi)始運行。
?。?) AT89S8252串行編程命令
AT89S8252串行編程命令如表1所列。
表1
?。?) AT89S8252串行編程時(shí)序圖
AT89S8252串行編程時(shí)序如圖1所示。
圖1
4 硬件設計
?、?通過(guò)計算機并口與單片機SPI口連接;
?、?為了保護計算機并口,需要增加1片74HC244作為隔離。
實(shí)用的原理圖如圖2所示。(已經(jīng)過(guò)實(shí)踐檢驗,可放心使用。)
圖2
5 用VB編程進(jìn)行并口控制
打印端口的基地址一般為0x278、0x378或0x3BC,可以從控制面板中查到。為了方便讀者,表2列出了常用打印端口引腳及寄存器位元的說(shuō)明。
表2
在Windows環(huán)境下最簡(jiǎn)單易學(xué)的語(yǔ)言恐怕非VB莫屬,所以我們的開(kāi)發(fā)工具也選用VB作為編程語(yǔ)言。但由于Windows的保護,VB無(wú)法直接讀寫(xiě)打印端口,因此我們需要另外的程序模塊來(lái)實(shí)現打印端口的直接讀寫(xiě)。在Internet網(wǎng)上可以找到許多此類(lèi)模塊,并且相當多的模塊可以免費使用。經(jīng)過(guò)試用,筆者推薦使用Winio v2.0。該模塊支持Win9X/NT/2000/XP(http://www.internals.com Yariv Kaplan ),并且帶有詳細的幫助、例子程序及源碼。使用時(shí),將Winio.sys、Winio.dll、Winio.vxd及Winio.bas四個(gè)文件拷貝到工作目錄下,在VB中直接添加Winio.bas模塊即可。本例中用到的函數有四個(gè),分別說(shuō)明如下。
?、?IniTIalize():允許端口控制函數。在使用端口輸入輸出函數之前調用一次,成功返回“1”,失敗返回“0”。
?、?Shutdown():關(guān)閉端口控制函數。在退出程序時(shí)執行一次,成功返回“1”,失敗返回“0”。
?、?GetPortVal(ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean:讀取端口函數,PortAddr 為端口地址, Portval為端口值,bSize為要讀取的字節數。讀取成功時(shí)返回“1”,失敗時(shí)返回“0”。
?、?SetPortVal(ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean:寫(xiě)端口函數。PortAddr 為端口地址, Portval為要寫(xiě)的值,bSize為要寫(xiě)入的字節數。寫(xiě)入成功返回“1”,失敗返回“0”。
四個(gè)函數在Winio.bas模塊中的聲明如下:
Declare FuncTIon IniTIalizeWinIo Lib “WinIo.dll” () As Boolean
Declare FuncTIon ShutdownWinIo Lib “WinIo.dll” () As Boolean
Declare Function GetPortVal Lib “WinIo.dll” (ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean
Declare Function SetPortVal Lib “WinIo.dll” (ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean
6 Intel HEX 格式文件
由于一般編譯軟件產(chǎn)生的用于寫(xiě)入芯片的文件都是Intel HEX格式的文件。Intel HEX文件屬于文本文件,可以用記事本查看。一個(gè)Intel HEX文件的一行稱(chēng)為一個(gè)記錄,每個(gè)記錄都是由十六進(jìn)制字符組成的,兩個(gè)字符表示一個(gè)字節的值。Intel HEX文件通常由若干條記錄組成,每個(gè)記錄都具有如下的形式:
?。篖LAAAATTDD.。.DDCC
“:”——記錄的起始標志;
LL——記錄長(cháng)度,表示該記錄中的數據字節數;
AAAA——數據裝入的首地址(16位);
TT——記錄類(lèi)型,00表示數據記錄,01表示文件結束;(注意:有的編譯軟件會(huì )產(chǎn)生大于01的記錄類(lèi)型,本應用中對大于01記錄類(lèi)型的記錄忽略掉即可。)
DD——數據值(字節);
CC——校驗和。(將其本身與記錄中除起始標志外的所有字節相加應為0,不為0則有錯。)
VB編程詳細說(shuō)明見(jiàn)本刊網(wǎng)絡(luò )補充版(http://www.dpj.com.cn)。(由于各子程序的流程都較簡(jiǎn)單,所以直接給出源碼,而未畫(huà)出流程圖。程序采用由底至頂的設計方法。)
結語(yǔ)
雖然上述程序能實(shí)現各種基本的功能,但并不完善,并未考慮各種異常情況,讀者可根據實(shí)際情況進(jìn)行完善。編程功力較差的朋友可直接到筆者的網(wǎng)站(http: //www.mcudiy.com)下載相對較完善的應用程序 。如果充分理解了上述程序,那么DIY一個(gè)AVR或PIC單片機的開(kāi)發(fā)工具也非難事。在筆者的網(wǎng)站也有制作完成的“MCS51/AVR/PIC三合一下載器資料”供愛(ài)好者下載。
由于A(yíng)T89S8252的價(jià)格還是較貴,所以現在市場(chǎng)上較難買(mǎi),不過(guò)Atmel公司推出的替代AT89C51/52的AT89S51/52也有在系統編程功能,且價(jià)格便宜。其在系統編程的實(shí)現方法與AT89S8252類(lèi)似,對本例部分程序稍作修改即可支持該器件。筆者制作的“MCS51/AVR/PIC三合一下載器”增加了對AT89S51/52的支持。
再來(lái)幾點(diǎn):
先從最簡(jiǎn)單的AT89C5X(51,52,55等等)說(shuō)起吧,做這個(gè)的時(shí)間最長(cháng),知道的可能多些,書(shū)本上的東西這里我不多說(shuō),主要談些實(shí)際應用中的經(jīng)驗與教訓。書(shū)可以參看北航出的一本專(zhuān)門(mén)講AT89系列的,還不錯,建議大家購買(mǎi)。
AT89C51我認為是一個(gè)非常標準的51單片機了,4個(gè)P口,1個(gè)串口,RAM只有標準的128Byte,Flash也只有4K,功能還算齊全,我就以它為基礎,所以開(kāi)發(fā)過(guò)程中遇到的問(wèn)題吧。
第一個(gè)問(wèn)題:復位源的問(wèn)題
大家最常用的復位方式就是電阻加電容吧,AT89C51是高電平復位,這種方式不穩定,在產(chǎn)品調試時(shí)可以使用,因為在調試時(shí)我們一般使用了仿真器,而許多仿真器都會(huì )自己輸出復位信號,而屏蔽掉目標板產(chǎn)生的復位信號,所以調試時(shí)復位信號是沒(méi)有問(wèn)題的,我們公司使用的是長(cháng)沙菊陽(yáng)的仿真器,用的是比較先進(jìn)的技術(shù),還算可以,仿真AT89系列的芯片一點(diǎn)問(wèn)題沒(méi)有,還很穩定的說(shuō)。這里有一個(gè)非常重要的問(wèn)題要說(shuō)下,大家有時(shí)候會(huì )遇到這樣的一個(gè)問(wèn)題:自己的程序在仿真時(shí)運行一點(diǎn)問(wèn)題也沒(méi)有,但燒錄后卻不行了。結合我的經(jīng)驗有兩種原因。一是時(shí)序可能變了,這個(gè)大家都知道,我不多說(shuō),還有一個(gè)原因就是復位信號的問(wèn)題。具體情況如下:
?。?)復位電路有問(wèn)題,不能正常產(chǎn)生復位信號。因為調試時(shí)仿真器可能給你提供了復位信號,而脫離仿真器后就沒(méi)有了;
?。?)看門(mén)狗的問(wèn)題。有些51芯片帶有看門(mén)狗復位功能,如At89c55WD,當程序開(kāi)啟了看門(mén)狗后,有時(shí)候程序的初始化內容太多了,往往會(huì )產(chǎn)生了復位信號,特別是用C語(yǔ)言編程功能時(shí),有時(shí)候雖然你明明在程序開(kāi)始時(shí)某個(gè)地方關(guān)閉了看門(mén)狗,但程序依然會(huì )復位,這是因為C語(yǔ)言執行效率比匯編低,看似幾行代碼,有時(shí)候要很長(cháng)時(shí)間的,所以在使用開(kāi)門(mén)狗時(shí)一定要注意這個(gè)問(wèn)題。而這個(gè)問(wèn)題在使用仿真器時(shí)容易被忽視,因為即使你的程序里看門(mén)狗復位了,但是仿真器(菊陽(yáng)仿真器可以開(kāi)啟/屏蔽這個(gè)功能)往往會(huì )屏蔽了這個(gè)復位信號,所以程序仍然會(huì )正常運行的。當你把程序燒好后再運行時(shí),你卻為發(fā)現剛調試好的程序卻無(wú)法正常運行了,那是因為你的程序一直在不停復位了,注意用示波器觀(guān)察RST腳可能看不到復位信號的,因為看門(mén)狗復位并不影響RST腳的電平。再一種情況就是芯片內部不帶看門(mén)狗,但是電路中有CPU監控芯片的,它往往是可以提供復位信號的,而且是多種原因的復位信號,如果你發(fā)現上述情況,就可以用示波器查看RST腳看是否有電平變化。
所以建議大家做51產(chǎn)品開(kāi)發(fā)時(shí)盡量使用CPU監控芯片,向X5045就是非常好用的,因為它還帶有Eprom功能,這在很多場(chǎng)合使用的到的,也可以用MAX708等專(zhuān)用復位芯片了,既穩定又方便。
評論