單晶片:入門

我想用一種門外漢的角度,來寫篇單晶片的入門文章。非相關科系的人要學單晶片最大的問題是,不知從何著手。網路上找到的資訊通常都蠻零散的,只能靠自己一點一點慢慢拼湊;而市面上的書籍內容通常較為專一,很難獲得較全面的訊息。這篇文章算不上是教學吧?不過我儘量把我在學的時候遇到的問題作個整理,想學的人看一看也許能夠有個方向。

.關於單晶片
CPU(Central Processing Unit, 中央處理器)相信大家都知道這是什麼。比較小,比較遜的CPU就叫作MPU(Micro Processing Unit, 微型處理器)。今天的主角叫作MCU(Micro Control Unit, 微型控制器), 又稱作單晶片微電腦(Single Chip Microcomputer),在台灣習慣稱作「單晶片」,在大陸則管他叫「單片機」。MCU跟MPU一樣可以看作是一種微型處理器,但不同的是MCU通常會將CPU、RAM、ROM、I/O介面等全都包含在同一顆晶片上。也就是說一顆MCU晶片就可以看作是一部超迷你型的電腦。
MCU通常是拿來作一些小型的控制,像是家電、自動控制、玩具等等,需要作一些電腦控制,但又不可能把一台電腦放進去的那種場合,就非常的好用。在業界很多人是靠這個吃飯,但喜歡的話可以拿來作點小玩具玩,比如沒事可以來作個CD-Pro2,或是小機器人之類的,也蠻不錯的。


.認識8051
學單晶片一定會聽過「8051」。8051是Intel在1980年發表的一顆單晶片處理器,和早期個人電腦的CPU 8086/8088是差不多年代(1978/1979)的東西。8086/8088現在我們可能很少用到了,他後來變成了大家比較熟悉的80286、386、486、Pentium等等等;但8051從2x年前一直到今天他都還是8051,而且一直被廣泛使用著。Intel的8051家族還有一些兄弟姊妹,包含8031/8051/8751和8032/8052/8752等等,他們只差別在於ROM的型式、容量,或是功能的擴充,其它基本的功能和內部指令都是相同的。這些與8051指令集相容的MCU,通稱作MCS-51。
8051因為發展的早,使用的廣,幾乎可說是單晶片入門的代名詞。學校的單晶片課程大都以8051作為教學內容,市面上的參考書籍、網路上的參考資料,全都是以8051最多。尤其在台灣,其它單晶片的資料相較之下簡直是少的可憐。另外和程式開發有關的,像整合編輯器(IDE)、編譯器(Compiler)、軟體模擬器(Simulator)等等的,也都是以8051的數量最多。所以8051在學習和使用上有著極大的優勢。

.MCS-51的變種
許多Intel以外,像是Atmel/DALLAS/Philips/STC/Winbond等等等的一堆廠商,也生產了許多MCS-51的相容晶片。他們和8051的指令集相同,但是功能可能更強大。所以學會8051不止是可以用8051而已,也等於同時也能夠使用這些8051的相容/變種晶片。像現在市面上能買到的”標準”8051,幾乎都是Ateml生產的AT89C51/AT89S51系列。又例如8051的標準運作時脈只有12MHz,嫌不夠快怎辦?Winbond有出一堆40MHz的MCS-51,甚至還可找到其它縮短指令週期,或是更高頻率的版本。而標準的8051是40pin,若覺得40pin的IC體積太大,又用不到那麼多IO port,也可以找到更小的版本,像Atmel 2051系列,包含89C1051/89C2051/89C4051和89S1051/89S2051/89S4051,刪除了兩個IO port,只剩下20pin,小小一顆可愛多了。
那怎樣找這些變種51的資訊呢?方法是,先想辦法知道那些廠商有生廠51相容晶片(像是上面已經提到好幾家了),然後去他們網站,把規格表抓下來一個一個看,就會知道有那些東西可以用,慢慢的就會認識越來越多型號了。

.其它的單晶片
51系的好處前面有提到,相關資料超多、開發環境較成熟、相容晶片多,真的是好學好用。但是,這世界上並不是只有MCS-51而已,去看看其它的單晶片我想也不是什麼壞事。問題又來了,要去那裏看?怎麼知道有那些可以看?
好吧,單晶片百百種,但簡單講,除了51系之外,一般比較常見有人在討論/比較容易找到資料的小型單晶片,其實只有Atmel的AVR系列,和Microchip的PIC系列,就這兩種而已。至於其它的嘛,光是為了找資料大概都會搞死人,我想以非專業用途來講可以不太需要管他們了。所以不想侷限只用51系的話,AVR/PIC都是不錯的選擇。雖然他們的相關資源跟51比起來可能差了一大截,但也還算的上是豐富的了。
學51以外的單晶片雖然可能會比較困難,但AVR/PIC有些特點是51沒有的:
– 接腳數的選擇:51系就我現在知道的,最少接腳數是20pin,如果想用在空間很小的場合可能較不適用。AVR就我所知最小作到8pin,PIC則是6pin。
– AVR/PIC的架構和51比較起來可能會比較先進,畢竟51也算是很有歷史的一顆單晶片了。51系使用的是複雜指令集(CISC),AVR/PIC則是使用精簡指令集(RISC)。
– AVR/PIC大都有ISP(線上下載)功能,可以不經由專用燒錄器燒錄,在開發電路板上不需要拔MCU,直接經由傳輸線傳輸燒錄即可。
– AVR/PIC大都內建RC振盪線路(雖然內建的速度可能不快),可以省掉石英振盪器的外接線路用起來更方便。
舉些例子,像是最近熱門的Wii改機晶片,用的其實就是Microchip的PIC12F629,小小一顆,只有8支腳又內建振盪線路,完全不需外接其它電路,所以把程式燒錄進去後直接丟進Wii就可以用了,連燒錄器都可以很容易的自製。另外像Atmel的ATtiny2313,腳位和80251完全相容,可以直接取代80251使用,但速度快了大概十倍,且有ISP,也內建RC振盪,唯一的差別就是他是AVR系列,指令和51完全不相容,程式需要重新寫過。

.單晶片的選擇
一開始得先選定其中一種單晶片來學,才有個方向,所以需要知道每家單晶片的特點。
– MCS-51系列
資源多,找資料容易。變種多,學一種可以用一百種。開發環境成熟,可以找到很多的相關工具。

– Atmel AVR系列
AVR跟其它單晶片比起來,特異功能特別多。像是內建A/D轉換、PWM輸出之類的,都是其它家比較缺乏的。
AVR八位元系列又分為mega系列和tiny系列。顧名思義,mega系列就是長的比較大的,tiny系列就是小小一顆的。大的功能特多,小的體積小但功能也不簡單。此外還有90系列,現在多屬USB、PWM之類的專門用途。

– Microchip PIC系列
PIC系列最厲害的就是晶片的種類多的數不完,可以依不用需求來作選擇。
PIC又分為PIC10/12/14/16/18
依接腳數來看:
PIC10: 6pin / PIC12: 8pin /PIC16: 18~40pin / PIC18: 28pin以上
因為是使用RISC精簡指令集,指令數少,易記易學
例如:
12位元核心,如PIC12C5XX,指令數33個
14位元核心,如PIC16CXX, 指令數35個
16位元核心,如PIC18CXX, 指令數77個
但也因為PIC系列種類太多,各系列間指令不同無法互用是比較麻煩的地方。

可以依自己學單習晶片的目的來選擇比較適合的單晶片系列。要容易學的話可選51,需要用到PWM之類的話可考慮AVR,想作小東西的話PIC就蠻適合。另外51/AVR/PIC以外可能會用上的MCU也不是沒有,像作機器人的話可能會用到BASIC Stamp這類的MCU,這種的碰上的時候就會知道了。

.程式語言的選擇
單晶片的基本程式語言是組合語言。雖然以學習上來講不會很困難,但比較大的問題是每換一種單晶片,就得去重新瞭解他的指令集,程式要移植也不容易。用C語言來寫是一種不錯的選擇,複雜的程式比較容易寫,移植容易。現在的編譯器都作蠻不錯的了,用C寫的程式容量和執行速度都可和直接用組合語言寫的相當接近。所以除非是單晶片儲存容量超小、或是速度方向需要極斤斤計較的情況,不然一般來講用C寫會比較好些。

.C語言的開發環境
不過用C寫有一個問題,就是開發工具的選擇。原廠提供的開發工具通常都只有組合語言的版本,要用C寫的話得尋找其它第三方的整合編輯器(IDE )或編譯器(Compiler)。除了開發工具的額外花費以外,IDE有用的順不順手的問題,Compiler有編譯效率的問題;除此之外,C語言雖然有一定的標準,但是各家的編譯器對C語言的解釋都會有些不同;像是光就PC上來講,在Borland c可以跑的程式就不見得能在gcc上執行。所以選擇合用的C開發工具恐怕也是得多花些精神的。

.除錯工具
單晶片程式開發最陽春的辦法就是:寫完程式,用燒錄器將程式燒錄進MCU,把MCU插上電路板上測試。有錯誤的話,修改程式之後拔下MCU,放上燒錄器重新燒錄,插回電路板再作測試。這樣的反覆插拔MCU的過程很煩人,而且也容易造成損壞,得找些方便點的方法才行。
– 使用線上模擬器(In Circuit Emulator, 簡稱ICE):ICE是一種硬體的模擬器,可替代MCU插入電路板的插槽進行模擬,另一端則接上電腦下載程式,省去重覆插拔的麻煩,使用上很方便。但缺點是價格不便宜,且每換一種MCU都得搭配對應的ICE才行。另外也有結合燒錄功能的線上模擬器,可作測試也可燒錄MCU,這種的則稱作燒模器。
– 使用ISP燒錄:現在許多MCU有ISP燒錄功能,只要在電路板上多留一組接頭連接到電腦,就可以直接下載寫好的程式到MCU進行測試。和ICE不同的是,這些ISP的線路大都相當簡單,可自行製作,費用也不高。但這功能就必需要MCU本身有支援才行。
– 使用軟體模擬器(Software Simulator):軟體模擬器最基本的就是MCU模擬器。將編譯好的程式交給MCU模擬器執行,可以追蹤各暫存器的數值、IO腳位的電位高低變化等等。MCU模擬器經常會整合於程式開發的IDE介面上,像Atmel原廠提供於AVR開發的AVR Studio,或普遍使用於MCS-51開發的Keil,都內建有MCU模擬器供測試使用。Keil內的模擬器甚至還提供了像波形產生器等軟體工具,對軟體模擬開發有不少幫助。這種模擬器可以提供初步的MCU程式執行測試,但缺點則是是不容易看出整個電路的實際運作情況。
– 使用軟體電路模擬器:另外還有一種更進一步模擬整個電路的運作的軟體模擬器,像是以MCS-51為基礎的電路模擬器就可找到不少,例如「SIMLAB-8051」,用起來就像一般8051的實習套件一般,可以模擬LED、七段LED、單色/彩色點矩陣LED、鍵盤、喇叭、指撥開關等等。在AVR/PIC方面雖然比較找不到這方面的專用軟體,不過先前文章中曾提到過Proteus VSM這套電路模擬軟體,不單是可以模擬一般類比/數位電路的運作,他對MCS-51/AVR/PIC等眾多MCU晶片也支援了程式的執行,甚至在上面放上小型LCD顯示器執行Linux都不是問題。對設計來講是蠻方便的方法,可以先以軟體方式模擬,最終再燒錄進行實際電路測試。

.參考書籍的選擇
一開始要學單晶片,可能連「該買什麼書來看」都很頭痛。但能夠瞭解並確定了要用的單晶片類型、選用的程式語言、開發環境之後,再來要選本書來看不會那麼困難了。例如若選擇以MCS51+Keil+C來開發,那就去找本類似「8051單晶片設計:使用Keil C」這樣書名的書來看。不然萬一你去買了本「8051實作入門」,結果裏面講的全是組合語言,保證看完還是一樣茫茫然。不過組合語言的東西說實在看看是不賴啦,對認識單晶片的運作蠻有幫助的。
買本適合的書,用力的K,裏面的程式照著寫,電路照著作,再來….應該就不會有什麼大問題了。:p

在 “單晶片:入門” 有 37 則留言

  1. 大丙做任何一件事情都會是一個漫長的歷程.
    我記得這件事情之前是說要玩電車吧…結果殼買了,甩尾胎買了…但是搞了半天還是沒有看到那輛BMW的英姿…

    酸~~~

  2. to mon,
    要知道大計畫裏面會有小計畫,小計畫裏面還會有更大計畫,這叫平凡中見偉大

    所以…咳咳,其實MCU是電車計畫裏面的電燈小計畫裏面的一個偉大計畫,依計畫分類是屬於電燈計畫的第三階段工程。這個很漫長是一定要的啦~

    (不過BMW不是前幾篇就有貼照片了嗎?)

    to horo,
    有馬子就沒時間搞偉大計畫啦!

    to J,
    你如果說看的懂的話,本人一定是已經被外星人抓走了。

    to Earvin,
    新竹啊….
    據說某人過年還不知能不能休假是吧?

  3. 嘩….我以前上課就是用PIC的說(據說以前都是8051)

    說真的這還滿好玩的,哈哈~

    我們用的語言叫做Forth,老實說,真的是很冷門。

    但是寫起來比組合語言親切一點點。

    ——
    這篇我要是早看十年,上課應該就會認真一點XD

  4. 醫工啦….要是念電機電子我就發達了XD

    我們也有微電腦處理這種課,很有趣吧~

    樣樣學、樣樣不精

  5. 其實中文書的選擇也不多啦
    看你想用那種程式寫
    如果要寫C的話還要留意開發工具的問題
    IAR/GCC/ICC等等的C compiler,他們的程式寫法還都不太一樣,這個買書的時候也得注意才行
    考慮這些之後,其實能挑的大概也只剩一、兩本而已,已經沒有推不推薦的問題了…XD

  6. 大大,
    小弟有去弄本C Programming Book for Microcontrollers跟avr butterfly的版子,但也才剛入門,如果有開讀書會,記得通知一下,謝謝啦…

  7. 你決定好要用那種C了嗎?

    IAR:國外好像很多人用,而且其它家的C都常在提說「和IAR相容」。不過缺點是很貴…。

    ICC:大陸同胞好像大多是用這個,要找範例程式的時候就蠻方便的,也蠻多人在討論。

    GCC:不用花錢,其實也還蠻好用的。

    其它有的沒的: 比較少人用的就算了…書和資源都不好找。

    書一定要用跟自己選的C開發環境一樣的,不然寫不出來哦

  8. 不論是 8051, PIC, AVR, ARM, x86, P4, PPC, SPARC, H8, SUPER…都一樣,只要把計算機概論第一章唸通,念懂了,真的了解了.就都會了,剩的只是動手實踐腦袋裡的觀念罷了,什麼組語,指令都一樣啦,萬法不離宗啦,希望有志者一起加油囉…
    左手 HOLTEK, 右手 ARM9, 橫批 “O.S.湊熱鬧”

  9. 哈嚕您好:

    很冒昧寫信給您
    看到您寫了有關單晶片的知識
    覺得您知識淵博
    想請教您一些問題^^

    小弟從小就對機器人很有興趣
    可是一直都沒有機會可以朝相關的領域發展
    大學研究所念的是半導體方面的科系
    現在工作也是類似的方向

    所以一直到現在
    我都沒有接觸過程式
    也不會寫韌體
    只有一些最基礎的電子概念

    直到最近 看到一些有關機器人的網站跟論壇
    又看了一些單晶片的文章
    才知道原來單晶片可以做這麼多的事情

    現在的我想要自己製做一個機器人
    順便利用這個機會 了解程式還有硬體之間的關係

    想要請教大大的是
    您是在學的時候就有接觸過電子方面跟單晶片的知識了嗎?
    開始接觸機器人都是怎麼入門的呢??
    我有點想去買機器人的套件來玩
    不知道這樣對程式以及硬體的學習會不會有幫助呢??
    我搞不太懂 一般的單晶片 如8051之類的 好像要用C語言來寫
    跟那些公司發展的單晶片 要用他們自己的語言寫
    有甚麼不一樣呢?
    您有提到Basic Stamp,我是要先學C語言,或是先學這個語言呢??這種語言是不是只有發展機器人的單晶片會使用??跟C語言有甚麼樣的關聯性嗎??
    請問您有沒有比較推薦的機器人套件
    可以讓初學者了解單晶片怎麼樣運作 順便學習比較有用的程式語言(大家常用的)??

    我在Lynxmotion網站  看到一台很酷的機器人
    是一台六足仿生機器人  叫Phoenix
    他的運動模式很酷
    您會推薦這個套件嗎??
    不過他買起來好像要好幾萬  而且我也不知道原廠有沒有提供整個套件的說明
    您有沒有玩過甚麼類似的機器人套件呢??
    您組的機器人都是用自己的單晶片  套件也是自己製作的嗎??

    拉里拉雜的寫了這麼多
    是因為我到現在三十歲了
    才發現一個   可以實踐夢想的地方
    所以有很多一直都有的問題就都寫出來了
    希望您不要介意
    也希望您可以給我一些建議  
    希望我可以展開我的機器人夢~~^^

    打擾您了   感謝~~^^

  10. 可是你沒有留信箱…. XD

    機器人我沒有玩耶
    不過要簡單的話可以玩樂高那套NXT啦
    比較不用煩惱零件的問題

    程式不用先學C啦,看你要用那種程式就去學就行了~ ^^

  11. Hello, 51系的不一定有ISP哦(原始是沒有的)
    電路版上留一組接頭的意思是..
    如果你是用麵包板,那就在麵包板上把ISP對應的腳位拉出來作成接頭

    至於燒錄器(也就是你貼的那個電路板),剛開始作的話建議是買現成的,會容易許多~

  12. Hello板大你好
    我現在是一名資工大四的學生
    因為專題需要以UART對8051做傳輸
    所以想要買一本關於這方面的書
    開發環境是IAR 用的語言是C
    (之前寫過組合語言但是實在很不親切ˊ ˋ)
    我想請問一下
    市面上賣的 “單晶片8051 使用IAR C” 書
    有比較推薦哪一本嗎?
    或是說其實這方面的書都大同小異
    挑本自己順眼的看就好?
    另外哪些資訊是建議晚輩可以先自行閱讀的
    有的話煩請告知
    感謝你

  13. hi OldYa,
    要寫UART的話應該大部份的書都會提到
    挑一本你喜歡的就行了~

    至於資訊…這樣講我也說不上來耶
    也許先去下載原廠MCU的spec下來看看?

  14. to 李ㄚ白 大大
    您是那所醫工的呀,竟有教forth

    因不常上本站,請您回我email
    tks

  15. 我最近想跳進自動控制
    但電路知識=0

    請問可以加你MSN嗎?希望能向你請較一些入門的相關問題
    我的MSN:netsmail@pchome.com.tw

    萬分感激 ^__^

  16. 感謝大大的文章.

    小弟最近開始在玩 Arduino 還有 Teensy, 它就是用AVR的單晶片. 好處是GCC和IDE做得很好, library很多很好入手.
    很適合像我這種連焊槍都用不好的初學者.

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *