前言
正在寫作這篇文章的筆者是一名大四的軟件工程學(xué)生,因為實習(xí)工作的需要,奉命研究單片機開發(fā),所以我所扯的內(nèi)容可能更適合跟我的情況比較相同的人。
如果你懂一些計算機原理和C語言開發(fā),讀下面的文章就不會很費勁。但如果不懂也沒關(guān)系,那就交叉學(xué)習(xí)吧。
什么是單片機
從CPU說起。
CPU(Central Processing Unit, 中央處理器)
CPU由運算器、緩存器及總線構(gòu)成。其中,運算器是指ALU(Arithmetic logic unit,算術(shù)邏輯單元),是CPU的核心;緩存器(Cache)可分為一級緩存、二級緩存和三級緩存,容量逐步遞增,讀寫速度速度遞減,成本遞減;總線(Bus)分為數(shù)據(jù)、控制和狀態(tài)三種。典型代表:8086。
-
物理結(jié)構(gòu)
從物理結(jié)構(gòu)上看,CPU可分為邏輯部件、寄存器部件和控制部件。邏輯部件主要用于定點或浮點算術(shù)運算操作、移位操作和邏輯操作;寄存器部件可分為通用、專用和控制。每一種寄存器都有它自己的用處;控制部件主要用于指令譯碼和發(fā)出控制信號。 -
性能參數(shù)
作為數(shù)據(jù)處理的中心,最主要的參數(shù)可以說是主頻和外頻了。先說外頻,外頻是基準(zhǔn)頻率,它決定了主板的運行速度,人們所說的超頻,超的就是外頻。
主頻=外頻倍頻*
主頻,又叫時鐘頻率。由上述公式可以看出主頻由外頻決定。主頻表示CPU內(nèi)數(shù)字脈沖信號震蕩的速度,它可以說明CPU的運算和處理數(shù)據(jù)的速度。簡而言之,主頻越高,CPU越快。CPU每做一個動作,處理數(shù)據(jù)或發(fā)布命令,都要隨著主頻的節(jié)奏來。所以這是個很有節(jié)奏感的東西。
計算機(Computer)
依照馮諾依曼體系,計算機的五大組成部件為運算器、控制器、存儲器、輸入設(shè)備和輸出設(shè)備。其中運算器和控制器合起來就是CPU;存儲器又可以拆分為內(nèi)存和外存;輸入和輸出設(shè)備就是鍵盤、鼠標(biāo)、顯示器等。
-
處理器
運算器和控制器可以合稱為處理器,CPU主要就是這兩個部件。前者負(fù)責(zé)數(shù)據(jù)處理,后者發(fā)布命令。 -
存儲器
存儲器主要是指內(nèi)存(RAM,Random Access Memory,隨機存取存儲器),靠電容的充放電存儲電容信號進而可在邏輯上表示數(shù)字信號。由于電容充放電速度很快,所以內(nèi)存的讀寫速度僅次于CPU中的緩存。但又因為是電容,所以無法在不通電的情況下存儲這些信息。這樣就催生了ROM,為了保存數(shù)據(jù)但只能寫入一次的只讀存儲器。再后來為了能擦了重寫就出現(xiàn)了EPROM和EEPROM等可擦寫ROM。硬盤、U盤等都是前者的衍生物,他們都統(tǒng)稱為外存(external storage),其主要作用就是在斷電的時候能夠保存數(shù)據(jù)。因為涉及到物理動作(掰硬盤里面的小磁針、在光盤上燙洞),所以相對于內(nèi)存的速度要慢上要幾個檔次。 -
I/O
I/O就是與之交互的基礎(chǔ)了,通過輸入設(shè)備來告訴它,通過輸出設(shè)備來告訴你。就是機器交互的耳朵和嘴了。
單片機(MCU, Microcontroller Unit)
是一種集成電路(IC, Integrated Circuit),其實應(yīng)該叫微控制器,單片機這個名字主要是指之前的SCM(Single Chip Micyoco, 嗯… Micyoco是個神奇的單詞)。而現(xiàn)在MCU是由SCM發(fā)展而來的,在高級點就可以說是SoC(System on Chip)。但后面的我所提到的單片機就是說MCU啦(因為我主要玩了下51單片機,這個是什么鬼我后面會說)。
說正事兒,單片機可以說是“濃縮的計算機”而不是“濃縮的CPU”,首先維基百科對他的解釋是:
a small computer on a integrated circuit。
其次是因為它內(nèi)部不僅僅有運算器、控制器和寄存器這種CPU三件套,他還常封裝有RAM、ROM這種存儲器部件,還有I/O口供人們編程及操作。所以總結(jié)來說,他有處理器、存儲器和I/O,也算是符合馮諾依曼體系的“濃縮計算機”。
-
應(yīng)用領(lǐng)域
說到這種“濃縮計算機”的應(yīng)用,可以說是廣到?jīng)]朋友。智能儀表、實時工控、通訊設(shè)備、導(dǎo)航系統(tǒng)、家用電器等等。隨著物聯(lián)網(wǎng)(IoT)時代的到來,單片機可謂再一次大展神威,我們手中的控制端可能是手機這種高級玩意兒,但是用來控制設(shè)備電路的接收端就是單片機要做的事情了。讓家用電器接入網(wǎng)絡(luò),就是在其內(nèi)部放一塊帶Wifi模塊的單片機即可。 -
封裝類型
剛才說到它算一個計算機,他的那些部件都是怎么放在一起的?這就涉及到封裝問題了。以下列出主要的單片機封裝形式。
封裝 | 全稱 | 中文名稱 |
---|---|---|
DIP | Dual In-Line Package | 雙列直插式封裝 |
PLCC | Plastic Leaded Chip Carrier | 帶引線的塑料芯片封裝 |
QFP | Quad Flat Package | 塑料方形扁平式封裝 |
PGA | Pin Grid Array Package | 插針網(wǎng)絡(luò)陣列封裝 |
BGA | Ball Grid Array Package | 球柵陣列封裝 |
這里不做詳細(xì)描述,具體資料可點擊封裝名稱進入查閱。
51單片機
你若是初學(xué)單片機,并且直接上網(wǎng)去查“單片機入門”之類的關(guān)鍵詞,你絕對會看到“51單片機什么什么的”。誰知道51單片機是啥玩意,一開始我還以為51是個牌子,然后就開始吐槽滿世界的廣告啊,能不能安安靜靜的學(xué)個單片機啊。
什么是51單片機
百度百科的摘要是這樣說的:
51單片機是對所有兼容Intel 8031指令系統(tǒng)的單片機的統(tǒng)稱。該系列單片機的始祖是Intel的8004單片機,后來隨著Flash rom技術(shù)的發(fā)展,8004單片機取得了長足的進展,成為應(yīng)用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應(yīng)用于工業(yè)測控系統(tǒng)之中。很多公司都有51系列的兼容機型推出,今后很長的一段時間內(nèi)將占有大量市場。51單片機是基礎(chǔ)入門的一個單片機,還是應(yīng)用最廣泛的一種。需要注意的是51系列的單片機一般不具備自編程能力。
維基百科是這樣說的:
The page "51-MCU" does not exist. You can ask for it to be created, but consider checking the search results below to see whether the topic is already covered.
嗯,看來這個詞是國內(nèi)出來的。根據(jù)百度百科上的內(nèi)容我們可以了解到如下信息
Key | Value |
---|---|
指令集 | 8031 |
始祖 | Intel 8004 單片機 |
處理器 | 8位 |
I/O線 | 32條 |
這跟“51”有個蛋的關(guān)系啊?!
后來了解到,這款單片機的起點是Intel的MCS51系列單片機,此系列包括:8031,8051,8751,8032,8052,8752等,后來Intel普度眾生,將技術(shù)傳了下去。人們將后來的那些單片機都統(tǒng)稱為51單片機。那為毛我入個門就給我個51單片機啊?!
因為此款單片機應(yīng)用非常廣,而且支持在線編程(ISP, In-System Programmability),用它可以搭建比較為復(fù)雜的系統(tǒng),相較于其他8位單片機(AVR、PIC)而言,他出現(xiàn)較早,可以獲取大量學(xué)習(xí)資料。所以…
引腳
單片機的操作向來靠引腳,51系列也不除外。常見的是40腳DIP封裝,以此為例說說以下幾類引腳。
- 電源
引腳 | 說明 |
---|---|
Vcc | 電源,用于引入正電平 |
GND | 地線,引入負(fù)電平 |
關(guān)于電平的資料請參考:邏輯電平
- 時鐘
引腳 | 說明 |
---|---|
XTAL2 | 片內(nèi)震蕩電路輸出端 |
XTAL1 | 片內(nèi)震蕩電路輸入端 |
- 編程控制
引腳 | 說明 |
---|---|
RST | 用于復(fù)位 |
PSEN | 當(dāng)有擴展ROM時用,在讀外部ROM時,低電平有效 |
ALE/PROG | 當(dāng)有擴展RAM時用 |
EA/Vpp | 當(dāng)有擴展ROM時用,高電平讀取內(nèi)部ROM,低電平讀取外部ROM |
- I/O
引腳 | 說明 |
---|---|
P0 | 雙向,8位,三態(tài) |
P1 | 準(zhǔn)雙向,8位 |
P2 | 準(zhǔn)雙向,8位 |
P3 | 準(zhǔn)雙向,8位,擁有第二功能 |
P3第二功能定義:
標(biāo)號 | 第二功能 | 說明 |
---|---|---|
P3.0 | RXD | 串行輸入口 |
P3.1 | TXD | 串行輸出口 |
P3.2 | INT0 | 外部中斷0 |
P3.3 | INT1 | 外部中斷1 |
P3.4 | T0 | 定時器/計數(shù)器0外部輸入端 |
P3.5 | T1 | 定時器/計數(shù)器1外部輸入端 |
P3.6 | WR | 外部數(shù)據(jù)存儲器寫脈沖 |
P3.7 | RD | 外部數(shù)據(jù)存儲器讀脈沖 |
擴展的關(guān)鍵字
單片機編程支持匯編和C,其他的我沒用過也不太清楚。如果入門的話最好的選擇就是C啦,首先你很有可能學(xué)過C,就算沒學(xué)過也很好上手,去買本譚浩強的《C程序設(shè)計》吧。
除了標(biāo)準(zhǔn)的ANSI C關(guān)鍵字外,單片機編程還擴展了如下幾個類型的關(guān)鍵字:
- 位標(biāo)量說明
關(guān)鍵字 | 說明 |
---|---|
bit | 聲明一個位標(biāo)量或位類型函數(shù) |
sbit | 聲明一個可位尋址變量,必須定義為外部變量 |
- 特殊功能寄存器聲明
關(guān)鍵字 | 說明 |
---|---|
sfr | 聲明一個特殊功能寄存器,必須定義為外部變量 |
sfr16 | 聲明一個16位的特殊功能寄存器,必須定義為外部變量 |
- 存儲器類型說明
關(guān)鍵字 | 說明 |
---|---|
data | 直接尋址的內(nèi)部數(shù)據(jù)存儲器 |
bdata | 可位尋址的內(nèi)部數(shù)據(jù)存儲器 |
idata | 間接尋址的內(nèi)部數(shù)據(jù)存儲器 |
pdata | 分頁尋址的外部數(shù)據(jù)存儲器 |
xdata | 外部數(shù)據(jù)存儲器 |
code | 程序存儲器 |
- 其他
關(guān)鍵字 | 說明 |
---|---|
interrupt | 定義一個中斷函數(shù) |
reentrant | 定義一個再入函數(shù) |
using | 定義芯片的工作寄存器 |
STC89C52
我的第一個實體單片機開發(fā),就是這款了,STC89C52,可以說是增強型8051單片機。來,先看一下它的配置:
- 處理器
Key | Value |
---|---|
核心 | MCS-51 |
最高運作頻率 | 35MHz |
- 物理參數(shù)
關(guān)鍵字 | 說明 |
---|---|
I/O | 39 |
工作溫度 | 商業(yè)級:0°C75°C;工業(yè)級:-40°C85°C |
封裝 | DIP |
- 存儲器
關(guān)鍵字 | 說明 |
---|---|
RAM | 512B |
ROM | 8KB |
EEPROM | 4KB |
- 功能
關(guān)鍵字 | 說明 |
---|---|
定時器 | 3個 |
串口 | 1個,全雙工 |
外部中斷 | 4個 |
看門狗 | 支持 |
內(nèi)置復(fù)位 | 支持 |
ISP/IAP | 支持 |
- 可選模式
關(guān)鍵字 | 說明 |
---|---|
掉電模式 | 支持 |
空閑模式 | 支持 |
我的這款的具體型號為:STC89C52_35I_PDIP40_1550HHT352.C90C
關(guān)于標(biāo)識命名規(guī)則請參閱:STC全系列芯片命名規(guī)則說明
軟件準(zhǔn)備
既然要編程,我們就需要開發(fā)環(huán)境,你可以選擇Keil,也可以選擇加載Keil插件的Eclipse。
代碼寫好后,通過編譯器編譯成單片機可以識別的機器碼。機器碼通常會保存為.hex文件,這個文件可以用那些十六進制文件查看器查看。這個文件的數(shù)據(jù)要寫入到單片機的程序存儲器中,通常為一個ROM。通常買的開發(fā)板都會集成串口及其芯片,還有配套的下載軟件。你只需要安裝好它的串口芯片的驅(qū)動程序,然后用下載器直接下載就好。如果是自己焊的板子就會麻煩一些了。這里不做說明,因為筆者還沒干過。
還有一種就是通過Proteus模擬,在沒有實體板的情況下可以考慮這種方式。Proteus可以模擬單片機的邏輯線路和演示效果。向里面的邏輯單片機下載程序的話,更是十分方便,在Proteus內(nèi)可以很方便的操作完成。若是要模擬單片機與PC通信,那你就需要一個模擬串口連接的程序了---VSPD(Virtual Serial Port Driver)。
- 列個清單
程序 | 說明 |
---|---|
Keil | 單片機開發(fā)的IDE,支持編譯c、asm、c++。 |
單片機串口驅(qū)動 | 用于讓計算機識別單片機 |
Proteus | 模擬集成電路,可以演示效果 |
VSPD | 模擬串口連接 |
程序下載程序 | 用于將編譯好hex文件下載到單片機 |
一個軟工狗的總結(jié)
作為一個軟工狗,我對我們專業(yè)的理解是更專注于一個軟件的工程項目的始終而不是技術(shù)實現(xiàn),偏向于“工”。而單片機開發(fā)是更加貼近計算機底層的一種開發(fā),更偏向于“理”,而且也不會采用面向?qū)ο蟮乃枷搿K裕绕鹬八龅木W(wǎng)頁開發(fā)也好,客戶端開發(fā)也罷,都顯得更加不友好。
-
內(nèi)存可能不夠用
在開發(fā)過程中會開始考慮內(nèi)存夠不夠用這種問題,這個是現(xiàn)代IT學(xué)子幾乎不會考慮的問題,不說電腦,手機的內(nèi)存都大的一腿,但是來到單片機的地盤,你就得考慮了,考慮好不要動不動就上個double(我目前用的最長的變量類型也就是unsigned int),而且為了拓展范圍長度還要考慮是不是要把變量聲明稱無符號類型,更嚴(yán)重的情況可能還要掰指頭數(shù)清楚你的變量有沒有聲明的太多。 -
一切從優(yōu)
也是因為硬件資源的限制,所以在做一些實現(xiàn)的時候你不能只考慮如何實現(xiàn),還要考慮單片機吃不吃得起你的代碼。所以在這個領(lǐng)域,面向?qū)ο筮@種思想是基本棄用的(面向?qū)ο蟮乃枷胂騺硎菍Τ绦騿T友好,對機器不太友好的)。考慮好你程序的時間及空間復(fù)雜度,因為單片機不僅內(nèi)存小,主頻一般也特別低。 -
二進制是爸爸
好好的鞏固一下之前所學(xué)的C語言吧,還有二進制操作才是爸爸級別的操作。說到這一點其實還是因為硬件資源的限制。各種且或非、異或、移位會讓代碼變得高效,雖然我們之前并不習(xí)慣這樣做。其實很多牛逼的程序員都會很擅長使用二進制操作,因為這樣很對機器的口味(1024吧,湊個整)。 -
很好玩!
不像客戶端或web開發(fā),我們只是在調(diào)用,很少有思維上的突破。我覺得單片機開發(fā)會更靈活,你可以去網(wǎng)上花十塊錢不到買各種小部件添加上去調(diào)用著玩。自己設(shè)計小型自動電路是我覺得再有趣不過的事情了。 -
怎么個開始
要是沒學(xué)過C語言,先去把C學(xué)了。若是學(xué)好了,那就了解基礎(chǔ)知識后直接實戰(zhàn)。關(guān)于實戰(zhàn),我的建議是,先在Proteus上模擬,等稍微熟練再往實體開發(fā)板里寫。一個是因為Proteus模擬,能簡單實踐一下畫板子,可以學(xué)習(xí)簡單的線路,但又不像真正畫板子那樣麻煩。另一個是因為單片機的程序存儲器的擦寫次數(shù)是有限的,雖然這個次數(shù)也不用特別在意,但是能少一次就少一次嘛。到了實體開發(fā)板階段,就不是為了驗證你的程序邏輯了,而是解決實際問題,因為Proteus并不會完美模擬出實際情況,這也是由模擬到實踐的真正過度。最后,可以自己買各種工具(洞洞板、錫絲、松香、烙鐵、吸錫器、烙鐵架)來焊個板子,在自己焊的板子上編程。這樣就完成了從焊到編再到實現(xiàn)的一條龍DIY。
我很推薦軟工狗們嘗試單片機開發(fā),因為這可以讓你對計算機原理和底層有更深的認(rèn)識,還可以體會到設(shè)計并實現(xiàn)各種DIY小器件的樂趣。望各位就著汗水盡情釋放創(chuàng)造力吧!
玩的開心~