微控制器
微控制器是將微型計算機的主要部分集成在一個芯片上的單芯片微型計算機。微控制器誕生于20世紀70年代中期,經(jīng)過20多年的發(fā)展,其成本越來越低,而性能越來越強大,這使其應(yīng)用已經(jīng)無處不在,遍及各個領(lǐng)域。例如電機控制、條碼閱讀器/掃描器、消費類電子、游戲設(shè)備、電話、HVAC、樓宇安全與門禁控制、工業(yè)控制與自動化和白色家電(洗衣機、微波爐)等。
微控制器(Microcontroller Unit,即MCU)可從不同方面進行分類:根據(jù)數(shù)據(jù)總線寬度可分為8位、16位和32位機;根據(jù)存儲器結(jié)構(gòu)可分為Harvard結(jié)構(gòu)和Von Neumann結(jié)構(gòu);根據(jù)內(nèi)嵌程序存儲器的類別可分為OTP、掩膜、EPROM/EEPROM和閃存Flash;根據(jù)指令結(jié)構(gòu)又可分為CISC(Complex Instruction Set Computer)和RISC(Reduced Instruction Set Computer)微控制器。
微控制器工作原理
今天,在大量形形色色的產(chǎn)品中,都可以看到微控制器的影子。如果你的微波爐有發(fā)光二極管或是液晶顯示屏和操作按鍵,那么它就裝有微控制器?,F(xiàn)在所有的汽車都至少裝有一個微控制器,多的可達六到七個: 發(fā)動機、防抱死剎車系統(tǒng)和定速巡航控制都離不開微控制器的控制。任何配有遙控裝置的設(shè)備幾乎都裝有微控制器: 電視機、錄像機和高端的立體聲系統(tǒng)都屬于這一類。 精密的單反相機、數(shù)碼相機、手機、便攜攝像機、電話應(yīng)答機、激光打印機、帶來電顯示和號碼存儲等功能的電話、尋呼機、功能全面的電冰箱、洗碗機、洗衣機以及帶有顯示屏和操作鍵盤的干衣機……你應(yīng)該有所了解了。總的來說,任何需要與用戶進行交互的產(chǎn)品或設(shè)備都內(nèi)置有微控制器。
在本文中,我們將探討微控制器,幫助你了解它們的本質(zhì)和工作原理。之后我們將進一步介紹如何能夠親自動手使用微控制器。提前透露一下,我們將制作一個帶有微控制器的數(shù)字時鐘!此外,我們還將制作一支數(shù)字溫度計。 在整個過程中,你將學到大量關(guān)于微控制器如何應(yīng)用于商業(yè)產(chǎn)品的知識。
背景知識
如果你對數(shù)字邏輯、門電路和線路連接不熟悉,那么請先閱讀以下內(nèi)容:
位和字節(jié)
布爾邏輯的應(yīng)用
電子門工作原理
什么是微處理器?
一個微處理器就是一個計算機。所有的計算機——無論我們所說的個人臺式計算機或是一臺大型計算機或是一個微控制器——都有很多共同點:
所有的計算機都有一個用來執(zhí)行程序的CPU(中央處理單元)。如果你正坐在一臺臺式計算機前閱讀這篇文章,這臺計算機的CPU現(xiàn)在正在執(zhí)行一個程序,這個程序就是用于顯示這個網(wǎng)頁的Web瀏覽器。
CPU從某個設(shè)備中加載程序。在你的臺式計算機上,瀏覽器程序是從硬盤中載入的。
計算機具有一些用來存儲“變量”的RAM(隨機存取存儲器)。
此外,計算機還有一些輸入和輸出的設(shè)備,這樣它才能和用戶交換信息。在你的臺式計算機上,鍵盤和鼠標是輸入設(shè)備,顯示器和打印機是輸出設(shè)備。 硬盤則是一個輸入輸出設(shè)備——它既可以輸入又可以輸出。
你正在使用的臺式機是一種“通用計算機”,它可以運行數(shù)以千計的各類程序。而微控制器則是用作特殊用途的“專用計算機”。它專注于做一件事。 微控制器還有許多共同的特點。如果一個計算機具備了以下大部分的特征,那么你就可以稱之為“微控制器”:
微控制器都“嵌入”在其他裝置(通常是一個消費類產(chǎn)品)內(nèi)部來控制該產(chǎn)品的功能和操作。 因此,微控制器又被稱為“嵌入式控制器”。
微控制器運行一個特定的程序來完成一項專門的工作。該程序存儲在ROM(只讀存儲器)中,一般不會被修改。
微控制器通常是低能耗的裝置。 臺式計算機的電源插頭幾乎始終插在墻壁插座中,其功率約為50瓦。電池供電的微控制器的功率大概為0.05瓦。
微控制器有一個專用輸入設(shè)備,通常(但并不總是)還有一個用作輸出的發(fā)光二極管或液晶顯示屏。 微控制器也從它所控制的裝置獲取輸入信號,并通過向設(shè)備中的不同部分發(fā)送信號來控制該設(shè)備。
例如,電視機中的微控制器從遙控器得到輸入信號,然后在屏幕上顯示出來。微控制器會控制頻道選擇器、揚聲器和一些如色彩、亮度等顯像管的電子調(diào)節(jié)。 汽車中的發(fā)動機控制器從氧氣和爆震等傳感器中得到輸入信號,對燃料混合以及火花塞定時等進行控制。微波爐控制器從操作鍵盤獲得輸入信號,在液晶顯示屏上顯示輸出,并控制負責微波發(fā)生器開關(guān)的繼電器。
微控制器通常具有小巧、低成本的特點。 對各個元件的選擇都秉持使體積最小化、使成本最低化的原則。
微控制器通常都很耐用,但也并不總是這樣。
例如,控制轎車發(fā)動機的微控制器必須能夠在一般計算機無法承受的溫度極限下工作。美國阿拉斯加的汽車的微控制器就需要工作在零下34攝氏度的寒冷天氣里,而同樣的控制器在美國內(nèi)華達州則需要工作在零上49攝氏度的炎熱環(huán)境中。再加上發(fā)動機運行發(fā)出的熱量,發(fā)動機箱的溫度可高達零上65-80攝氏度。
而錄像機內(nèi)部使用的嵌入式微控制器則沒有這么苛刻的要求。
實際上,用作微控制器的處理器多種多樣。 例如,數(shù)字手機工作原理一文中的移動電話就包含一個Z-80處理器。Z-80處理器是一個8位微處理器,它誕生于二十世紀七十年代,最初用于當時的家用計算機中。GPS接收機工作原理中的Garmin全球定位系統(tǒng),包含一個低功耗版的Intel 80386處理器,據(jù)說是這樣。Intel 80386處理器最初是專為臺式計算機設(shè)計的。
在許多產(chǎn)品中,例如微波爐,對于微控制器性能的要求很低,價格是主要的考慮因素。 在這樣的情況下,制造商開始設(shè)計專用的微控制器芯片——一種專為成本低、體積小且功耗低設(shè)計的嵌入式中央處理器。Motorola 6811和Intel 8051都是這種芯片的成功典范。另外還有Microchip公司生產(chǎn)的名為“PIC 微控制器”的系列控制器,也非常受歡迎。從今天的標準來看,這些中央處理器簡易得令人難以置信;但是大批量購買的價格非常低廉,而且往往只需一片就可以滿足產(chǎn)品設(shè)計者的需要。
一個典型的低端微控制器芯片中約有1000字節(jié)的只讀存儲器和20字節(jié)的隨機存取存儲器,有8個輸入輸出引腳。大批量生產(chǎn)這種芯片,單位成本不過幾美分。 當然,你也不能指望在這種芯片上運行像Microsoft Word這樣的程序——因為 Microsoft Word需要約30兆字節(jié)的隨機存取存儲空間和每秒可執(zhí)行幾百萬條指令的處理器。不過控制一臺微波爐可不需要Microsoft Word這么復(fù)雜的程序。你要使用微控制器完成的是一個具體的任務(wù),而且低成本、低功耗運行才是最重要的。
微控制器的使用
在電子門工作原理一文中,你了解到了7400系列TTL(晶體管邏輯電路)元件,在哪里購買以及如何裝配它們。 你會發(fā)現(xiàn)要實現(xiàn)一個簡單的裝置通常需要很多門電路。 例如,在數(shù)字時鐘部分,我們所設(shè)計的時鐘可能需要15到20片芯片。微控制器的主要優(yōu)勢之一就在于,軟件(你編寫并在控制器上執(zhí)行的那個小程序)可以取代許多門電路。 因此,本文中我們將用微控制器制作一臺數(shù)字時鐘。 這將是一臺非常昂貴的數(shù)字時鐘(近200美元?。?,但是在這一過程中,你將積累下今后幾年使用微控制器需要的各種知識。 即使并不實際動手制作這樣一個數(shù)字時鐘,閱讀相關(guān)內(nèi)容就能讓你獲益良多。
這里用到的一款微控制器是專為方便日常生活設(shè)計的。 它是Parallax公司開發(fā)的名為“BASIC Stamp”的微控制器。 BASIC Stamp是一個兼容BASIC程序設(shè)計語言的PIC微控制器。使用BASIC程序設(shè)計語言使得微控制器的軟件編寫變得十分容易。 微控制器配套提供了一個9伏電池供電的母板,通過和計算機的一個端口相連對其進行編程。沒有一個制造商會在實際的產(chǎn)品中使用BASIC Stamp——因為 Stamp價格高且速度慢(相對而言)。 但是,為進行實驗建模或一次性演示產(chǎn)品使用Stamp非常普遍,因為它的設(shè)置和使用是令人難以置信的輕松。
該微控制器之所以被稱為“Stamps”是因為它只有一張郵票大小。
Parallax公司生產(chǎn)了兩種版本的BASIC Stamp:BS-1與BS-2。下面是兩種版本的對比:
比較項目BS-1BS-2
隨機存取存儲器14字節(jié)26字節(jié)
電可擦除只讀存儲器256字節(jié)2000字節(jié)
最大程序長度約75條指令約600條指令
執(zhí)行速度每秒2,000行每秒4,000行
輸入輸出引腳816
本文中用到的是一個名為“BASIC Stamp修正版D”的微控制器(如下圖所示)。
BASIC Stamp修正版D是一個BS-1芯片,安裝在一塊9伏電池供電的母板上。配套組件包括:電壓調(diào)節(jié)器、程序連接電纜、輸入輸出引腳插針以及一小塊建模區(qū)域。你也可以單獨購買一塊BS-1芯片,在面包板上和其他元件相連。修正版D只不過更加方便一些。
從上表可以看出,你不可能用BASIC Stamp做出非常奇特的東西來。BS-1的75行(256字節(jié)的電可擦除只讀存儲器可以存放約75行BASIC語言程序)程序的限制有相當?shù)木窒扌?。然而,你可以做些精巧的東西,Stamp非常小巧并用電池供電,這就意味著它幾乎可以適用于任何地方。
BASIC Stamp程序設(shè)計
您需要使用BASIC程序設(shè)計語言對BASIC Stamp進行編程。如果對BASIC語言已經(jīng)有一些了解,您會發(fā)現(xiàn)Stamp中的BASIC語言非常易懂,只是略顯零散。如果您不懂BASIC語言,但是您會使用如C、Pascal或是Java等程序設(shè)計語言,那么掌握BASIC對您來說是易如反掌。如果您沒有任何編程經(jīng)驗,建議您先閱讀一下學習編程。下面是Stamp BASIC編程所用到指令的簡要列表。
標準BASIC語言指令:
for.。.next : 標準循環(huán)語句
gosub : 跳轉(zhuǎn)到子程序
goto : 跳轉(zhuǎn)到程序標記處(例如 -“l(fā)abel:”)
if.。.then : 標準的“if/then”(如果/那么)判斷
let : 賦值(可選)
return : 從子程序返回
end : 結(jié)束程序,進入休眠狀態(tài)
與輸入輸出引腳相關(guān)的指令:
button : 讀取輸入引腳上的鍵值,防反跳并自動重復(fù)
high : 將輸入輸出引腳設(shè)置為高電平
input : 將輸入輸出引腳的方向設(shè)置為輸入
low : 將一個輸入輸出引腳設(shè)置為低電平
output : 將輸入輸出引腳的方向設(shè)置為輸出
pot : 讀取輸入輸出引腳上的電位計值
pulsin : 讀取輸入引腳上脈沖的寬度
pulsout : 通過一個輸出引腳發(fā)出指定寬度的脈沖
pwm : 在輸出引腳上執(zhí)行脈沖寬度調(diào)制
reverse : 反轉(zhuǎn)引腳輸入輸出方向
serin : 讀取輸入引腳的串行數(shù)據(jù)
serout : 在輸出引腳寫入串行數(shù)據(jù)
sound : 向輸出引腳發(fā)送特定頻率的聲音
toggle : 切換輸出引腳上的位
BASIC Stamp的特有指令:
branch : 讀取轉(zhuǎn)移表
debug : 向臺式計算機上的控制臺發(fā)送調(diào)試字符串
eeprom : 將程序下載到EEPROM
lookdown : 返回列表中某個值的指針
lookup : 使用索引進行數(shù)組查找
nap : 休眠一段時間
pause : 延遲指定的時間
random : 選取一個隨機數(shù)
read : 從EEPROM中讀取值
sleep : 斷電指定的時間長度
write : 向EEPROM寫入數(shù)據(jù)
運算:
+ : 加
- : 減
* : 乘(低字)
** : 乘(高字)
/ : 除
// : 取余數(shù)
max : 返回兩個值中的最大值
min : 返回兩個量的最小值
and : 與
| : 或
^ : 異或
and/ : 與非
|/ : 或非
^/ : 異或非
if 語句邏輯:
=
《》
《
《=
》
》=
AND
OR
變量
BS-1中的所有變量都具有預(yù)定義的名稱(您可以用自己的名稱代替這些名稱)。 請記住,只有14個字節(jié)的RAM(隨機存取存儲器)可用,所以變量名稱應(yīng)簡潔。 以下是標準的名稱:
w0, w1, w2.。.w6 : 16位字變量
b0, b1, b2.。.b13 : 8位字節(jié)變量
bit0, bit1, bit2.。.bit15 : 1位位變量
由于只有14個字節(jié)的內(nèi)存可用,所以w0和b0/b1在RAM中是相同的位置,w1和b2/b3是相同的位置,以此類推。 此外,bit0到bit15位于w0中(因而b0/b1也是如此)。
輸入輸出引腳
您可以看到,BS-1中有14條指令與I/O引腳相關(guān)。之所以要強調(diào)這一點是因為輸入輸出引腳是BASIC Stamp與外界交流的唯一途徑。BS-1有8根輸入輸出引腳(編號0到7),BS-2有16根輸入輸出引腳(編號0到15)。
這些輸入輸出引腳都是雙向的,就是說既可以從引腳上讀輸入值也可以通過引腳輸出。要向引腳發(fā)送值,最簡便的方法是使用HIGH或LOW指令。 使用語句high 3可以在引腳3上發(fā)出一個1(+5伏),使用LOW則發(fā)出一個0(接地)。這里的3號引腳是任意選取的——您可以對0到7號任意引腳輸出電平信號。
關(guān)于輸入輸出引腳有許多有趣的指令。 例如,如果您按照POT指令要求在電位計(可變電阻器)兩端并聯(lián)一個電容器,POT指令就可以讀出電位計的設(shè)置。 PWM指令可以發(fā)出脈沖寬度的調(diào)制信號。借助類似這樣的指令,為Stamp添加控制和驅(qū)動功能要輕松得多。有關(guān)語言的詳細信息,請參見documentation。此外,諸如斯科特·愛德華所著Programming and Customizing the BASIC Stamp Computer(對BASIC Stamp計算機進行編程和自定義)這樣包含大量示例項目的書,也是極有裨益的。
BASIC Stamp的實際操作
如果您想實際操作一下BASIC Stamp,上手是十分容易的。您所需要的就是一臺臺式計算機,和一個BASIC Stamp入門工具包。入門工具包包括Stamp微控制器、編程電纜以及一個運行于臺式計算機的應(yīng)用程序,該應(yīng)用程序?qū)ASIC程序下載到Stamp中。
入門工具包可以從Parallax公司這樣的制造商那里獲得,也可以從Jameco公司這樣的供應(yīng)商那里獲得。如果讀過有關(guān)門電路和數(shù)字時鐘的文章,您會對Jameco公司耳熟能詳。從Parallax公司您可以訂購“BASIC Stamp D入門工具包”(部件號 27202),從Jameco公司您可以訂購部件號為140089的入門工具包。您將收到 Stamp(如下圖)、編程電纜、軟件和操作說明書。兩家公司的定價均為79美元。有時,Parallax公司會推出特別版本的入門工具包,稱為“必備基礎(chǔ)、一網(wǎng)打盡”,這個特別版本除上述內(nèi)容外,還包括斯科特·愛德華編寫的Programming and Customizing the BASIC Stamp Computer(對BASIC Stamp計算機進行編程和自定義)一書。
Stamp的連接十分容易。您只需將其連接到計算機的并行端口, 然后運行DOS 應(yīng)用程序來編輯您的BASIC程序,并將該程序下載到Stamp中就可以了。以下是一個典型的編輯器(選自斯科特·愛德華的書中)的截圖:
要在此編輯器中運行程序,請按ALT+R組合鍵。編輯器應(yīng)用程序?qū)z查BASIC程序,然后通過電纜將程序發(fā)送到Stamp上的EEPROM(電可擦除只讀存儲器)。 隨后,Stamp會執(zhí)行該程序。在這個例子中,程序在I/O引腳3上生成方波。如果引腳3上連接有邏輯探針或LED(發(fā)光二極管),您將看到,LED每秒鐘亮滅兩次,這是由于它根據(jù)PAUSE指令,每隔250毫秒改變一次狀態(tài)。了解LED的詳細信息,請參閱有關(guān)門電路的文章。一節(jié)9伏的干電池可以讓這個程序運行幾個星期??s短LED處于打開狀態(tài)的時間(例如亮50毫秒,滅450毫秒),或者用NAP r指令代替PAUSE指令,都可以節(jié)約電能。
制作數(shù)字時鐘
花79美元讓一只LED亮起來似乎有些奢侈。你肯定更想用BASIC Stamp制作出更實用的東西?;ㄉ?00多美元,你就可以制作一臺精致的數(shù)字時鐘!這好像也過于奢侈,但以后做其他各種裝置時,你會發(fā)現(xiàn)這些元件都可以重復(fù)利用。
我們將使用BASIC Stamp的輸入輸出引腳來顯示數(shù)字。在數(shù)字時鐘部分,我們了解了如何連接7447芯片的7段顯示發(fā)光二極管。7447芯片可以和BASIC Stamp協(xié)同工作。將BASIC Stamp的四根輸入輸出引腳直接與7447相連,就可以很容易的顯示0到9的數(shù)字。BS-1版本的Stamp有8根輸入輸出引腳,這樣可以直接驅(qū)動兩片7447芯片。
就一個時鐘而言,需要至少顯示4個數(shù)字。為了用8個輸入輸出引腳驅(qū)動4片7447,我們需要更有創(chuàng)造性一些。下圖給出了一種解決辦法:
上圖中,8根輸入輸出引腳從左邊引入。該方法用4個輸入輸出引腳驅(qū)動全部的4片7447。剩余的4個引腳,用來按順序激活4片7447(芯片上的“E”表示“Enable 使能”——7447芯片上的5號引腳)。要讓這個系統(tǒng)工作,Stamp的程序首先通過4根數(shù)據(jù)線發(fā)出第一個數(shù)字,并且把第一片7447的E引腳與第一根控制線置位,從而把7447激活。然后發(fā)出第二個數(shù)字,激活第二片7447,就這樣按順序不停的反復(fù)激活四片7447。 實際上,稍微改動一下連線,一片7447就可以實現(xiàn)這些功能。使用74154多路轉(zhuǎn)換芯片以及一些驅(qū)動,就可以用這種方法驅(qū)動多達16個數(shù)字。
這就是實際中控制發(fā)光二極管顯示屏的標準方法。如果你有一個老式的發(fā)光二極管顯示的計算器,邊晃動邊觀察顯示屏。你會發(fā)現(xiàn)同一時刻只有一個數(shù)字被點亮。這種技術(shù)被稱為多路復(fù)用顯示。
這種技術(shù)在時鐘和計算器上有很好的應(yīng)用,但是存在兩個重要問題:
發(fā)光二極管耗電量大。
7 段顯示發(fā)光二極管只能顯示數(shù)字。
另一方法是使用液晶顯示屏。 液晶顯示屏應(yīng)用廣泛,而且與Stamp連接方便。 例如,下圖所示的兩行字母數(shù)字式的液晶顯示屏在Jameco公司(部件號150990)和Parallax公司(部件號27910)都可以買到。 此處展示的是一個典型的液晶顯示屏,將液晶顯示屏插在面包板上,便于和其他芯片連接:
這類液晶顯示屏的優(yōu)點:
一根引腳就可以驅(qū)動顯示。 顯示屏包含允許Stamp以串行方式與自己通信的邏輯電路,因此只需一根引腳。 此外,BASIC Stamp中的SEROUT命令可以十分容易的實現(xiàn)串口通信,控制顯示屏十分簡單。
液晶顯示屏可以顯示字母數(shù)字文本,包括: 字母和數(shù)字,甚至可以是自定義字符。
液晶顯示屏耗電量極低——只需3毫安的電流。
唯一美中不足就是,這樣的一個液晶顯示屏要花費59美元。顯然,沒有人會在烤箱上裝這樣的顯示屏。 而設(shè)計烤箱時,一般會先用這樣的顯示屏作樣品試驗,而后用自己設(shè)計的芯片和軟件驅(qū)動便宜的顯示屏,用于最終的產(chǎn)品。
驅(qū)動這樣的顯示屏,你只需提供5伏以上的電源和地線(Stamp的9伏電池滿足這兩個條件),然后把Stamp的一個輸入輸出引腳與顯示輸入線連接。 要將Stamp的輸入輸出引腳連接到像液晶顯示屏這樣的設(shè)備,我能找到的最輕松的方法,是使用Jameco公司生產(chǎn)的連線工具(部件號34577)和30-gauge規(guī)格的連接線(部件號22541)。這樣不需要焊接,并且連接結(jié)實、可靠。
下面的程序中,BASIC Stamp完成了一個時鐘的功能,通過液晶顯示屏輸出時間(假定液晶顯示屏接在Stamp輸入輸出0號引腳上):
pause 1000 ‘等待液晶顯示屏啟動serout 0, n2400, (254,1) ’清除顯示serout 0, n2400, (“time:”) 顯示屏上 顯示“time:” ‘在加載程序之前進行預(yù)設(shè)b0 = 0 ’秒數(shù)b1 = 27 ‘分鐘數(shù)b2 = 6 ’小時數(shù) again: b0 = b0 + 1 ‘秒數(shù)加1if b0 《 60 then minutes b0 = 0 ’如果秒數(shù)等于60 b1 = b1 + 1 ‘則分鐘數(shù)加1minutes: if b1 《 60 then hours b1 = 0 ’如果分鐘數(shù)等于 60 b2 = b2 + 1 ‘則小時數(shù)加1hours: if b2 《 13 then show b2 = 1 ’如果小時數(shù)等于13,則重置為1 show: serout 0, n2400, (254, 135) ‘在顯示屏上定位光標, ’然后顯示時間serout 0, n2400, (#b2, “:”, #b1, “:”, #b0, “ ”) pause 950 ‘暫停950毫秒goto again ’重復(fù)
這個程序中,通過SEROUT命令向液晶顯示屏發(fā)送數(shù)據(jù)。 序列 (254, 1) 用于清空液晶顯示屏,其中254是轉(zhuǎn)義字符,1是清空屏幕的指令。 序列(254, 135)用于定位光標。其他兩個SEROUT指令只是將文本字符串發(fā)送到顯示屏。
這種方法將得到一個比較精確的時鐘。通過調(diào)整PAUSE語句,可以將每天的誤差控制在數(shù)秒之內(nèi)。顯然,真正的時鐘需要一到兩個按鈕來校正時間—— 在這個程序中,你需要在向 Stamp 載入程序前,預(yù)先設(shè)置時間。
此方法簡單、有效,但并不十分準確。如果你需要提高計時精度,在Stamp上連接實時時鐘芯片是一種好的選擇。這樣,每過一秒左右就會從芯片讀取時間并顯示出來。實時時鐘芯片中使用石英晶體獲得極佳的精確度。 時鐘芯片通常還包含日期信息,并可以自動進行閏年修正。
要讓實時時鐘和Stamp實現(xiàn)對接,一個簡單的辦法是使用稱為Pocket Watch B的元件。
Pocket Watch B模塊
Pocket Watch B在Jameco公司(部件號145630)和Parallax公司(部件號 27962)都可以買到。該元件只有一枚硬幣大小,包括時鐘芯片、石英晶體和與輸入輸出引腳通信用的串行接口。它的價格在30美元左右,也不適用于烤箱,但卻非常適合在搭建樣品模型時使用。
制作數(shù)字溫度計
現(xiàn)在您對Stamp和液晶顯示屏有了初步的了解,我們再加一個元件就可以制作一支數(shù)字溫度計。 制作數(shù)字溫度計需要用到芯片DS1620。 該芯片包含:
一個溫度傳感器
一個用于溫度感應(yīng)設(shè)備的模擬數(shù)字轉(zhuǎn)換器
一個用于從模數(shù)轉(zhuǎn)換器讀取數(shù)據(jù)的移位寄存器
一個用于保存設(shè)置的小型電可擦除只讀存儲器
DS1620有兩種工作模式: 一種作為獨立的恒溫芯片;另一種則是與計算機相連作溫度計使用。 電可擦除只讀存儲器用來保存當前的工作模式和恒溫模式設(shè)定值。
DS1620與Stamp的連接十分簡單。 該芯片有8根引腳。從Stamp引出的5伏以上電源接入DS1620的8號引腳; 電源地線接DS1620的4號引腳。3根Stamp輸入輸出引腳驅(qū)動DS1620的以下三根引腳:
1 號引腳為數(shù)據(jù)線。 通過該引腳讀寫數(shù)據(jù)。
2 號引腳為時鐘引腳。 為移位寄存器移入移出數(shù)據(jù)提供時鐘。
3 號引腳為復(fù)位、片選信號。 該引腳置高電平,選通芯片。
例程代碼中,假設(shè):
數(shù)據(jù)線連接Stamp的2號輸入輸出引腳。
時鐘引腳連接Stamp的1號輸入輸出引腳。
復(fù)位、片選信號由Stamp的0號輸入輸出引腳提供。
完整連線如下圖所示:
DS1620可以從Jameco公司(部件號146456)或Parallax公司(部件號27917)的“應(yīng)用工具包”中獲得,這一工具包包括芯片、電容器、一些有用的文檔和示例代碼。 或者,你也可以從Jameco公司單獨購買該芯片(部件號114382)。如果你是第一次使用此芯片,還是建議你購買“應(yīng)用工具包”,里面的文檔會非常有用。
你可以將DS1620芯片安裝在Stamp的母板的實驗建模區(qū),也可以裝在單獨的面包板上。安裝完畢,將液晶顯示屏與Stamp的3號輸入輸出引腳相連,載入并運行下面的程序:
symbol RST = 0 ‘ 定義復(fù)位、選通1620芯片引腳編號symbol CLK = 1 ’ 定義連接1620芯片移位寄存器的時鐘引腳編號symbol DQ = 2 ‘ 定義連接1620芯片數(shù)據(jù)線的引腳編號symbol DQ_PIN = pin2 ’ 定義2號引腳為數(shù)據(jù)線symbol LCD = 3 ‘ 定義液晶顯示屏數(shù)據(jù)線引腳編號 begin: low RST ’ 不用時,不選通1620芯片high CLK ‘ 1620芯片時鐘引腳默認為高電平pause 1000 ’ 等待溫度計與顯示屏的引導(dǎo)啟動 setup: high RST ‘ 選通1620芯片b0 = $0C ’ $0c 是1620的命令字節(jié) ‘ 意思是“寫入設(shè)定”gosub shift_out ’ 發(fā)送至1620芯片b0 = %10 ‘ %10 是1620的命令字節(jié) ’ 設(shè)定溫度計工作模式gosub shift_out ‘ 發(fā)送至1620芯片low RST ’ 不選通1620芯片pause 50 ‘ 延時50毫秒,等待電可擦除只讀存儲器 start_convert: b0 = $EE ’ $EE 是1620的命令字節(jié) ‘ 啟動模數(shù)轉(zhuǎn)換high RST ’ 選通1620芯片gosub shift_out ‘ 發(fā)送至1620芯片low RST ’ 不選通1620芯片 ‘ 以下為主循環(huán)程序’ -- 每秒讀取并顯示溫度main_loop: high RST ‘ 選通1620芯片 b0 = $AA ’ $AA 為1620命令字節(jié) ‘ 溫度信號采樣 gosub shift_out ’ 發(fā)送至1620芯片 gosub shift_in ‘ 從1620讀取 ’ 溫度數(shù)值 low RST ‘ 不選通DS1620。 gosub display ’ 用攝氏度單位顯示溫度 pause 1000 ‘ 等待一秒goto main_loop ’ shift_out 子程序?qū)0字節(jié)中的內(nèi)容‘ 發(fā)送至 1620 芯片shift_out: output DQ ’ 設(shè)置數(shù)據(jù)線為 ‘ 輸出模式for b2 = 1 to 8 low CLK ’ 準備1620發(fā)送數(shù)據(jù)所需的時鐘 DQ_PIN = bit0 ‘ 發(fā)送數(shù)據(jù)位 high CLK ’ 數(shù)據(jù)位送至1620 b0 = b0/2 ‘ 將所有位 ’ 朝bit0右移next return ‘ shift_in 子例程從 1620 中’ 得到 9 位的溫度讀數(shù)shift_in: input DQ ‘ 設(shè)置數(shù)據(jù)線設(shè)置為 ’ 輸入模式w0 = 0 ‘ 變量w0清零for b5 = 1 to 9 w0 = w0/2 ’ 輸入數(shù)據(jù)右移。 low CLK ‘ 向1620請求下一位 bit8 = DQ_PIN ’ 讀取位 high CLK ‘ 時鐘信號引腳切換為高電平next return ’ 以攝氏度單位顯示溫度display: if bit8 = 0 then pos ‘ 如果bit8=1 ’ 溫度為負值 b0 = b0 and/ b0 ‘ 通過對自身的與非操作 ’ 對b0取反 b0 = b0 + 1 pos: serout LCD, n2400, (254, 1) ‘ 清除液晶顯示屏serout LCD, n2400, (“Temp = ”) ’ 在顯示屏上 ‘ 顯示“Temp=”bit9 = bit0 ’ 保存0.5度b0 = b0 / 2 ‘ 換算成度數(shù)if bit8 = 1 then neg ’ 判斷溫度是否為負值 serout LCD, n2400, (#b0) ‘ 顯示正溫度 goto half neg: serout LCD, n2400, (“-”, #b0)’ 顯示負溫度half: if bit9 = 0 then even serout LCD, n2400, (“.5 C”) ‘ 顯示 .5度 goto done even: serout LCD, n2400, (“.0 C”) ’ 顯示 .0度done: return
運行這個程序,你會發(fā)現(xiàn)這一溫度計是以0.5度的精度,以攝氏度為單位顯示溫度。
DS1620芯片測量溫度的精度為0.5攝氏度。這個芯片用9位2-補碼二進制數(shù)表示華氏-110至250度(攝氏-55至125度)范圍內(nèi)的溫度。把接收到的數(shù)值除以2就是實際溫度的數(shù)值。2-補碼是一種表示負值的便捷方法。下面列出了4位2-補碼四位二進制數(shù)據(jù)所代表的數(shù)值:
0111 : 7 0110 : 6 0101 : 5 0100 : 4 0011 : 3 0010 : 2 0001 : 1 0000 : 0 1111 : -1 1110 : -2 1101 : -3 1100 : -4 1011 : -5 1010 : -6 1001 : -7 1000 : -8
通常用四位二進制數(shù)表示0到15的數(shù)值,而四位2-補碼二進制數(shù)表示-8到7。最左邊一位決定了數(shù)值的正負。如果數(shù)值為負,我們可以通過把其他各位取反加1的方法,得到其絕對值。
以下是上述數(shù)字溫度計程序執(zhí)行的操作:
使用symbol關(guān)鍵字設(shè)置若干常量,使程序更易于閱讀(也更容易把芯片與其他不同的輸入輸出引腳相連)。
設(shè)定DS1620芯片的時鐘和復(fù)位引腳信號為預(yù)期值。
通過向DS1620的電可擦除只讀存儲器寫入命令字節(jié),使其工作在“溫度計模式”。你只需要進行一次這樣的操作,嚴格地說你在運行過一次程序之后,就可以把這段代碼刪掉了(出于節(jié)省程序存儲空間考慮),因為這種工作模式已經(jīng)保存在電可擦除只讀存儲器中。
程序發(fā)送指令$EE(“$”表示十六進制數(shù),$EE轉(zhuǎn)換成十進制為238),啟動溫度計的模數(shù)轉(zhuǎn)換。
之后,程序進入循環(huán)。 每秒向DS1620芯片發(fā)出指令獲取目前溫度信號,讀取 DS1620返回的9位的數(shù)據(jù),將其保存在變量w0中。Stamp通過切換時鐘信號一次發(fā)送或接收一位數(shù)據(jù)信號,與DS1620通信。變量w0(16位)與b0/b1(8位)與 bit0/bit1/。。./bit15(1位)占有相同的存儲空間,當我們從bit8開始插入從DS1620 獲取的位數(shù)據(jù),并將w0變量除以2時,實際上我們就是在將數(shù)據(jù)右移,以便把從 DS1620獲取的9位溫度信號保存在變量w0中。 溫度保存在w0中之后,display子例程判斷讀數(shù)的正負,然后以攝氏度為單位,在液晶顯示屏上正確顯示讀數(shù)。 攝氏度到華氏度的單位換算如下:
dF=dC*9/5+32
這樣,我們就完成了一個非常昂貴的溫度計的制作。 它有些什么用途呢? 這有一個好主意。 例如你在一家制藥公司工作,需要在全國范圍內(nèi)運輸藥品,藥品運輸全程溫度要保持恒定,否則藥品會失效。 你可以用 Stamp 制作一臺溫度數(shù)據(jù)記錄儀。 Jameco公司(部件號143811)和Parallax公司(部件號27960)都出售稱為“RAM 封裝模塊”的元件。 它包含具備串行接口的低功耗8千字節(jié)(也可以選擇32千字節(jié))RAM芯片。 可以給你的Stamp配上該元件(或相似產(chǎn)品),編寫代碼,每分鐘將讀取的溫度數(shù)值保存在隨機存取存儲器中。 然后,你可以將 Stamp隨藥品一起打包,在運輸過程結(jié)束時取回Stamp。 RAM模塊會包含整個運輸過程的溫度歷史記錄,通過記錄你可以知道藥品是否解凍過。
掌握微控制器的工作原理之后,你可以借助Stamp制作出大量類似這樣的小巧實用的設(shè)備。
評論
查看更多