51單片機

1、處理能力的概念。
51單片機屬於8位機,8位是個什麼意思呢?就是CPU處理的數據是8位的。位數的高低體現了CPU處理能力的強弱。4位的處理器已經基本淘汰了,8位的處理器佔據了低端單片機的大部分市場,32位處理器是現在興起的嵌入式系統的主流配置,我們常用的電腦大多都是32位,64位的處理器也有,但是市場份額比較少,價格也較高。所以我們學習的51單片機屬於比較低級的單片機,會逐漸被新興的嵌入式處理器所淘汰,但是51單片機成本低,學習資源最豐富,上手容易,對於初學者來說是很理想的用於學習的單片機。
2、存儲器問題。
51單片機有兩類存儲器,一類是程序存儲器ROM,它斷電以後數據不丟失,但是必須用編程器擦除和寫入程序;另一類是數據存儲器RAM,它斷電以後數據會丟失,但是可以用程序改寫內容。以AT89C51爲例,因爲它有16條地址線(P0和P2),所以它可以訪問64K存儲器空間(2的16次方是65535),它的ROM和RAM都是分內外的,外部存儲器都需要擴展,擴展方法參見教材。但是ROM和RAM的內外執行方式不同,ROM的內外切換要用EA腳(31腳)的電平選擇,而RAM的切換可以直接用不同指令MOV和MOVX分開同時訪問。例如AT89C51有4K內部ROM,64K外部ROM,如果EA=1,則從內部ROM開始執行,當超出4K之後,跳轉到片外4K以上的空間運行;如果EA=0,則完全在外部ROM中運行,內部ROM不再起作用。什麼意思呢?就是要麼運行內部4KROM要麼運行外部4KROM,內外ROM的前4K不能同時運行,必須用EA切換。所以一般在沒有外部ROM的情況下,EA必須接電源正極,否則程序不能運行。我曾經因爲EA懸空造成程序無法運行,苦苦思索一週才找到原因,期間因爲盲目測試導致3塊AT89C51損壞,教訓十分慘痛,望後來者吸取教訓。RAM就不同了,AT89C51有128B內部RAM,可以擴展64K外部RAM,這兩個部分的RAM可以同時被訪問,注意選擇不同指令即可,訪問內部用MOV,訪問外部用MOVX,外部RAM擴展方法參見教材。ROM的種類除了常見的PROM(可編程ROM),還有MASK ROM、FLASH ROM 和EEPROM等種類。MASK ROM是掩模存儲器,掩模的意思就是工廠把程序直接做在芯片上了,適於不需要反覆修改的大批量產品生產,成本非常低,但是用戶不能更改程序,8051裏就是這種ROM。我最初接觸單片機的時候,去電子市場買8051,結果商家真的賣給我了一塊,回家一看,裏面全都是程序,根本無法修改,現在回想起來,自己簡直是個傻瓜,哪有買掩模ROM的單片機做學習和開發的?!商家也不告訴我已經燒好的程序可以幹什麼,害的我只能拿它當8031使了!這個教訓真是好笑,希望大家一定要搞明白ROM的種類區分。PROM有OTP(一次性編程)和允許反覆擦寫(用紫外線照射擦除)兩種,87C51系列就是OTP的ROM;就現在的形勢看,ROM有普及FLASH之勢,那些用紫外線擦除的垃圾看來是要被淘汰了。FLASH ROM可以電擦寫,但必須整塊擦除,寫入速度快,擦寫次數在1000到10萬次之間(視不同類型芯片而定),事實上89C51系列的ROM就是FLASH ROM,U盤內的ROM也是,一種NAND FLASH現在廣泛用於嵌入式系統中,它的存儲容量大,成本低,可以實現固態硬盤的功能;EEPROM是電可擦寫存儲器,它是按
位擦寫的,可以擦寫10萬次以上,但擦寫速度較FLASH ROM要慢,AT24C02就是EEPROM,我們用的很多智能IC卡也是。RAM的種類有靜態SRAM,動態DRAM和SDRAM之分。SRAM只要寫入一次,有電數據就可以保持,單片機裏就是SRAM,但是它的缺點就是太貴,所以單片機裏的RAM都很小。DRAM一次寫入數據之後只能保持一瞬間,必須不斷重寫,叫做刷新,這個過程還需要相應的邏輯電路支持,很麻煩但是很便宜。SDRAM叫做具有靜態特性的動態RAM,它把邏輯刷新電路和DRAM做到了一起,它的工作方式本質是動態的,但是從外部看相當於一個SRAM,這樣就不但具有靜態特性而且價格便宜,我們電腦裏的內存條都是SDRAM。我自己的理解是這樣的,就像爬山比賽,能力強的人呢,爬上去就不會滑下來。但是能力不行的人站不住,只好滑下來再爬上去,反覆這樣,頻率高了給人的感覺就好像他在山上一樣。呵呵,反正能力強的東西總是更貴一些的。
3、IO口問題。
P0口是集電極開路,所以我的實驗板上給它加了上拉電阻。上拉電阻的作用就是在基本沒有電流輸出的情況下將管腳電位拉到5V,這樣對於外部來說是邏輯1,如果沒有這個電阻,管腳電位就是0。爲什麼?假如三極管關閉的情況下C-E間電阻爲100M,如果上拉電阻爲10K,則分壓的結果是幾乎接近5V,這就是上拉的原理。IO口的驅動能力有限,AT89C51也就不到20MA(8051連這些都沒有),可以直接驅動LED(電流流入方式),但是驅動別的大電流外部設備必須加驅動電路,否則會燒燬IO口,務必注意。迄今爲止,我一共燒燬了7塊AT89C51,損失了一把銀子之後我終於找到了原因:一個是電源問題,電源電壓超過5V或者極性顛倒都會導致芯片燒燬;另一個問題就是我在單片機供電的情況下測量P0.0腳(39腳)電位時表筆不小心連通了電源正極(40腳),而此時剛好P0.0內部MOS管開通(也就是輸出0),結果直接燒燬了輸出MOS管。因爲P0口是數據線,結果導致編程時數據無法寫入。這個教訓最慘痛了,務必牢記。單片機的一種絕對保密技術就是利用了這種方法,編程之後燒燬一隻閒置的數據或地址管腳的輸出管,造成數據無法讀出,達到絕對保密的目的。還有一點需要注意,如果要讀入管腳的狀態,必須先向該管腳寫1,然後再讀該管腳方能得到正確輸入。使用P3的第二功能之前,也要先向P3口寫1,目的都是讓IO口輸出管關閉。IO口詳細構造請閱讀51教材相關部分。
4、有關尋址方式。
相關教材中的尋址部分純粹是找彆扭,我都可以用51開發產品了,可是我現在重讀這部分教材依然一頭霧水,無法理解。不理解很好,說明你大腦正常,不用去管教材所說的尋址方式到底是什麼意思,你學會如何使用就行了。其實就是對數字操作(所謂立即尋址)、對寄存器操作(所謂寄存器尋址)、對地址操作(所謂直接尋址)、對指針操作(有專用指針也有寄存器作爲指針)和對位操作5種情況。尋址方式就是告訴你一個操作什麼東西的問題,沒有什麼高深的。如果還是不明白就不要看這部分內容了,直接學習指令進行編程,當你編程很熟練之後,你會發現,其實它那些怪里怪氣的尋址方式命名是很可笑的。
5、對中斷概念的理解。
我最開始看了一個使用中斷的程序之後,想了好幾個晚上也沒有理解什麼叫中斷。這個程序的註釋竟然說中斷服務程序是這個程序的核心部分,我當時就茫然
了——那主函數是什麼?垃圾嗎?在我的認識裏,主函數才應該是一個程序的核心。忘了過了多少日子,我終於明白了中斷的含義。假如你設置一隻鬧鐘6點叫你,如果你6點準時爬起來看鬧鐘是不是叫你的話,那就不叫鬧鐘了,你成了鬧鐘的鬧鐘了。初學者很容易不明白爲什麼主函數裏並沒有跳轉到中斷服務函數的指令,怎麼中斷服務程序就自己自動執行了呢?沒錯,中斷不需要什麼指令來啓動,它會自己啓動,就像定時炸彈到點就會自動爆炸一樣。什麼時候啓動由定時器、計數器或者外部中斷決定,這是一個前臺運行過程(誰表演誰就是前臺嘛),你在後臺看不到,後臺是個設置中斷的過程,決定什麼情況下中斷會叫你。比如你在車站等你女朋友,你無法準確知道她什麼時候來,所以後臺函數是個循環——你來回踱步,焦急的等待。當你女朋友出現的時候,她要求你停止踱步,和她去商店買衣服——這是中斷服務函數。如果你女朋友還沒來,你就自己跑到商店裏了,那就不叫中斷了。如果她來了你還在踱步——很不幸,系統不是跑飛就是崩潰了,呵呵。有關中斷的具體操作與設置方法,請仔細閱讀51教材相關部分。中斷是單片機一個的難點,也是一個有特色之處,沒有中斷的話單片機就失去了全部的靈活性與實時性,變成一塊用於順序控制的數字電路了。
6、編程語言問題。
你可以用匯編編程,也可以用C51語言編程。它們各有各的強項和弱點,選擇哪種語言要根據你的基礎和具體任務確定。有個老兄這樣說:彙編挺好啊,不過你用着用着就想用C51了;C51嘛,也挺好啊,不過你用着用着就想用匯編了。呵呵,真的是這樣。我個人的理解是:彙編好寫不好看,C語言好看不好寫。去看別人一段沒有註釋的彙編語言是一件很困難的事情,看不懂並不說明你編程水平差。這種情況下先不要看別人的例程,根據你自己的思路編寫即可,到了關鍵部分或是遇到障礙再看看例程,效果很好。別人寫的C語言比較好理解,因爲C語言本質上就是各種各樣的函數調來調去的過程,看懂了函數,程序基本就明白了。下面說說彙編和C各自的特點:彙編是個事必躬親的戰術語言,要幹什麼就直接幹什麼,什麼事情都要直接操作硬件,所以累啊——系統倒不累,你累啊,呵呵,累死你換來的好處就是代碼比較小,而且工作準確,操作決不會馬馬虎虎。C語言就不同了,是個戰略語言,只抓大局,一堆基層工作全給INCLUDE了,夠狠,要幹什麼不好好幹,非要拐彎抹角——比如重新運行不讓用跳轉(封殺GOTO語句),非要設計一個巧妙的循環,彙編就沒這麼不老實。這次你不累了,但是如果智商不夠就慘了,一句都寫不下去,不像彙編——就算我笨,能編多少時多少,編一點是一點。當甩手掌櫃自然不錯,但是缺點也很明顯:一來代碼要大不少,系統資源一下就被搞緊張了;二來涉及到對硬件的具體操作就它就沒招了,還得求人家彙編,呵呵。所以彙編和C你都要掌握,大局由C定,幾處需要準確處理硬件的工作交給彙編,屬於瞎子背瘸子的組合,呵呵。兩手抓,兩手都要硬,互相***,結合使用,這就是學習單片機語言的基本原則。說了一頓,和具體編程一點關係都沒有,但是原則你要把握。彙編語言我就不說了,教材都會詳細說明指令的意義和使用方法,下面我說一下C51。C語言的具體結構和編寫方法你明白了嗎?沒明白趕緊看書。C51與通用C語言的區別我理解主要有兩點:一是中斷函數的聲明與使用,二是如何在單片機裏進行位操作,我的理解就這一點點,當然這與我水平比較菜有很大關係。那麼C語言如何能夠認識那些單片機的寄存器呢?難道每寫一個程序都先要鋪天蓋地的定義一番?!這個我們不怕也不用管,KEIL裏有自帶的包含文件來解決這個問題。你在KEIL裏寫C51程序的話,
上來先寫一個#INCLUDE<AT89C51.H>,這一堆問題就解決了,下面你可以直接寫P0=0X00,或者SCON=0X00之類,反正C語言可以認識,還能正確編譯,怎麼樣?戰略語言確實不得了,髒活全讓<AT89C51.H>這個文件做了。當然想舒服就得付出資源的代價,C代碼肯定比彙編大,不信你編寫一個同樣的彙編程序試試看。想學習C51的話,可以找一本教材,但是如果你基本明白C了,買教材就有點浪費了,因爲大多數C51教材都花上很大篇幅講C的規則,什麼數據類型,什麼控制語句,簡直是浪費白紙,所以你借一本教材看看C51和通用C不同的地方就可以了,買一本實在不值得。借不到也可以到網絡上搜索一下,有更通俗的教材,這裏推薦明浩寫的那個基於KEIL軟件的C51教材,雖然只有幾課內容,很簡單,但是非常容易理解,也很實用,同時還說明了KEIL的使用方法。
常見問題就談這麼多,都是一些概括性的介紹,具體問題你要自己去解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章