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