現在您對Stamp和液晶顯示屏有了初步的了解,我們再加一個元件就可以制作一支數字溫度計。 制作數字溫度計需要用到芯片DS1620。 該芯片包含:
DS1620有兩種工作模式: 一種作為獨立的恒溫芯片;另一種則是與計算機相連作溫度計使用。 電可擦除只讀存儲器用來保存當前的工作模式和恒溫模式設定值。
DS1620與Stamp的連接十分簡單。 該芯片有8根引腳。從Stamp引出的5伏以上電源接入DS1620的8號引腳; 電源地線接DS1620的4號引腳。3根Stamp輸入輸出引腳驅動DS1620的以下三根引腳:
例程代碼中,假設:
- 數據線連接Stamp的2號輸入輸出引腳。
- 時鐘引腳連接Stamp的1號輸入輸出引腳。
- 復位、片選信號由Stamp的0號輸入輸出引腳提供。
完整連線如下圖所示:
|
你可以將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模塊會包含整個運輸過程的溫度歷史記錄,通過記錄你可以知道藥品是否解凍過。
評論
查看更多