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