我覺得是時候有必要出一些“掃盲”文章了,在2年多與網(wǎng)友們的交流中,發(fā)現(xiàn)了很多問題,這些問題大多數(shù)發(fā)生在初學者上,不管是大學生還是DIY愛好者,只要是初學者,難免會產(chǎn)生一些基礎的異或,加入技術群有覺得不好意思發(fā)問。所以只要有時間,我就會出些“掃盲”文章,轉(zhuǎn)為小白解惑。如果大家還想有其他的方面的更多了解或者疑問,歡迎在文章結(jié)尾留言!
一、什么是51單片機,現(xiàn)在很多人有用51的,用52的,還有用stc12,stc15的,這些都有什么區(qū)別?
通常我們說的51單片機,是Intel 8031指令系統(tǒng)的單片機的統(tǒng)稱,并不是某一種型號 ,盡管單片機型號繁多,但根據(jù)它們的構架及指令系統(tǒng),都可以歸為MCS51。對于用戶來說,最直觀的感受就是程序的兼容性,比如AT89C51的程序拿到AT89C52上可以通用,反之AT89C52的程序也可以用在AT89C51芯片上,當然,第二種情況有個前提,下文我會提到。也許上面的話理解起來比較復雜,那么我概括為一句:兩個51芯片功能不沖突的前提下,程序可以互相移植,這就是相同指令系統(tǒng)的單片機。
不管是學生還是diy愛好者,最開始接觸的多為AT89C51、AT89C52,或STC系列的51、52,乃至后面的AT89S系列、STC12系列、STC15系列,都屬于51芯片,他們的構架是一樣的。只是隨著需求的增加,單片機的功能越來越多,處理速度越來越快,才有了不同的型號,但它們的母親,都是偉大的intel,雖然功能有變化,但指令系統(tǒng)是不變的,這樣就方便了用戶移植程序。現(xiàn)在流行的單片機很多種類,只要說是51構架的,那么程序都是兼容的,可以不管型號。拿來就用。
二、 既然程序是兼容的,那么為什么很多時候程序直接下載后,卻不能正常工作?
程序的兼容是有前提的,我通過舉例來說明:
例1: AT89C51和AT89C52程序是否完全兼容
(1)51的程序向52移植時,完全兼容,無需任何改動即可正常 工作
(2)52向51移植時,不完全兼容,因為52有些功能是51沒有的,涉及52增強功能的,不能直接向51移植。最常見的例子就是定時器2,52芯片有定時器2,但51沒有,那么涉及到定時2的程序就不能直接給51用,如果非要用,就只能把定時器2的功能給定時器0或定時器1,這就需要改程序了
總結(jié):只要不涉及特殊功能,程序完全兼容
例2:AT89C52與STC89C52RC不同公司的芯片程序是否兼容
不同公司的51芯片程序到底兼容嗎?這個是最困惑大家的,下面以AT52和stc52做說明
(1) 如果是經(jīng)典程序,那么也是完全兼容的,這里說的經(jīng)典程序指的是我們實驗里老生常談的流水燈、點陣、定時器秒表、蜂鳴器唱歌等等,程序無需做任何改動即可下載直接使用。它們連封裝都一樣,所以說,在無特殊要求時,可以直接替換。
(2) 不能直接替換的程序與例1中提到的是一樣的,即功能差異,比如說stc52有eeprom,而AT52沒有,所以含有eeprom程序的,就不能直接移植
總結(jié),只要不涉及到功能差異的程序,也是可以互換的,但兩者在處理速度上略有差異,不過不大,但涉及到不同的芯片時,頭文件是需要注意的,一般來說,沒用的附加功能,reg52.h都適用,但如果在移植程序的時候,用到了附加功能,那就只能將頭文件改為這個芯片的頭文件。
例3:相同公司,增強型與非增強型單片機程序是否兼容?
現(xiàn)在不比以前了,最開始學單片機的朋友們,接觸最多的都是12T單片機,我讀大學的時,STC12系列的1T芯片都還沒興起。但我們總歸是要與時俱進的,現(xiàn)在在網(wǎng)上買單片機DIY套件,絕大多數(shù)都不是你正在學習的單片機型號,那么程序也會有所不同,現(xiàn)在常說的就是增強型51和非增強型51,那么到底有多大差異?下面將以STC兩種經(jīng)典的單片機型號做解說
STC89C52RC(下簡稱89C52)和STC12C5A60S2(下簡稱STC12)的程序兼容性
(1) 與例1例2中涉及到的一樣,在沒有功能性差異的前提下,程序也是兼容的,這里說一下STC12C5A60S2中的經(jīng)典功能——AD轉(zhuǎn)換。STC12內(nèi)置了8個10位AD采集通道,無需外部AD采集芯片,89C52如果想做數(shù)模轉(zhuǎn)換,就必須外接AD轉(zhuǎn)換芯片,顯然,涉及到AD部分的程序,是不能兼容的,這就是功能差異。當然,如果你放著STC12內(nèi)置AD功能不用,非要用外接AD轉(zhuǎn)換芯片,那程序自然就兼容了
(2)軟件延時不兼容
兩款芯片在處理速度上有著本質(zhì)不同,89C52為12T單片機,STC12為1T單片機,這里可以簡單理解為后者比前者處理速度更快,因為處理速度變快了,程序不能直接移植,需要轉(zhuǎn)換方可正常使用。至于到底快了多少,STC的官方手冊給出了說明,下圖即為STC官方給出的指令周期對照表(部分),列舉了一些12T單片機和1T單片機的指令處理速度差異

可以看出,1T單片機對指令提速了不少,但有人會說,我學的是C,匯編不懂,給我看這個表也沒意義。這樣說是不對的,不管你懂不懂,你至少要知道指令都是提速的,因為在keil下,C語言是先轉(zhuǎn)換為匯編語言的。匯編指令提速了,對應的C語言自然也提速了。至于說,在實際應用中,到底提速了多少呢?特別是針對C語言用戶,我只知道我寫的程序是C,不可能讓我轉(zhuǎn)譯到匯編再計算我提高了多少時間吧?接下來我將作出詳細說明。
我們先來看一段程序:
這是一個流水燈程序,單片機工作在12MHz晶振下,閃爍時間為100毫秒,這是在89C52下的程序,延時子程序是通過STC官方軟件生成的,如下圖。
我們要研究的問題在于,這個程序能不能直接用在STC12單片機上?有多大差異?
答案是可以直接下載到STC12單片機執(zhí)行的,只是閃爍時間會比100毫秒要短,因為指令速度提提升了,P2=0xaa這種端口賦值語句我們可以忽略不計,因為不管怎么提升速度,這一句對整個程序的周期影響不大。我們主要來研究下100毫秒的延時程序發(fā)生了怎樣的變化。
這個100毫秒的延時程序,下載到STC12單片機時,延時時間大約是16毫秒左右。那么為什么是16毫秒?是怎么算出來的?下面我就一一作出解釋。
我通過兩種方法來驗證,第一種就是把這些C語言轉(zhuǎn)譯為匯編,根據(jù)匯編指令計算出提高的速度,當然這種方法很蛋疼,就算懂匯編,計算起來也麻煩;第二種就是通過邏輯分析儀來檢測IO端口的輸出變化,P2=0xaa與P2=0x55存在高低電平的變化周期,觀察周期變化即可。
通過上述兩種方法,都可以得出的結(jié)論是,速度提高了6.5倍左右,可以近似的認為提高了7倍。也就是說,89C52下100毫秒的延時程序,在給STC12執(zhí)行時,速度提高了6—7倍(在匯編指令下,不同指令的提速不同,平均下來,就有了這樣一個倍數(shù)關系)。
那么有人就要問了,我現(xiàn)在有個89C52的流水燈程序,非要寫在STC12芯片上,我又不會改延時程序,只會復制粘貼,怎么辦?我估計STC也考慮到了程序移植上帶來的計算不變,所以特別設計了帶有輔助功能的下載軟件,我們只需用“軟件延時計算器”這一功能就可以完美解決。假設我們現(xiàn)在是在STC12環(huán)境下開發(fā)程序,那么先將之前的89C52流水燈程序復制過來(單片機型號對應的頭文件自行替換),如圖:
我們只要替換掉這個延時程序就可以了,當前的延時程序是89C52在12Mhz下100毫秒,只需要改為STC12在12Mhz下100毫秒就可以了。在這里強烈推薦用stc官方下載器的“軟件延時計算器”功能,只需四步,如圖:
第一步選擇晶振大小,第二步設置延時時間,第三步選擇單片機指令集種類,第四步生成C代碼或匯編代碼,最后復制這些代碼就可以了。將89C52的延時程序刪除,替換為剛剛生成的STC12延時程序,那么STC12芯片的流水燈程序就完成了!如圖:
(上圖中的延時程序就是基于STC12芯片的延時程序,與89C52下的延時程序不一樣,注意區(qū)別)
以上只是一個簡單程序的移植介紹,這種方法也適用于其他程序,比如說18B20、液晶顯示等,凡是程序中涉及到的軟件延遲,都可以通過這種方法替換。我通過這種替換延時程序的方法,移植了很多程序,諸如液晶顯示、溫度程序、DS1302程序等等。
(3)定時器延時
單片機除了軟件延時,還有定時器延時,這兩種延時都是我們最常用的,那么89C52和STC12的定時器有變化嗎?接下來我們看一下STC官方手冊中給出的說明:
可以看出,在我們常用的定時器功能、串口功能上,程序都是完全兼容的,避免了移植過程中繁瑣。同樣的,STC官方也說明,靠軟件延實現(xiàn)的延時是需要做調(diào)整的,與前文的敘述一致。當然,STC12系列畢竟和傳統(tǒng)的8051系列有著太大的不同,關于芯片替換中需要注意的問題,就需要用戶自己閱讀STC官方技術手冊了。
以上對51單片機及程序兼容性做出了解釋,上述文字僅代表工作室意見,難免出現(xiàn)錯誤、不足。望高手們更正指出!