現(xiàn)在您對(duì)Stamp和液晶顯示屏有了初步的了解,我們?cè)偌右粋€(gè)元件就可以制作一支數(shù)字溫度計(jì)。 制作數(shù)字溫度計(jì)需要用到芯片DS1620。 該芯片包含:
- 一個(gè)溫度傳感器
- 一個(gè)用于溫度感應(yīng)設(shè)備的模擬數(shù)字轉(zhuǎn)換器
- 一個(gè)用于從模數(shù)轉(zhuǎn)換器讀取數(shù)據(jù)的移位寄存器
- 一個(gè)用于保存設(shè)置的小型電可擦除只讀存儲(chǔ)器
DS1620有兩種工作模式: 一種作為獨(dú)立的恒溫芯片;另一種則是與計(jì)算機(jī)相連作溫度計(jì)使用。 電可擦除只讀存儲(chǔ)器用來(lái)保存當(dāng)前的工作模式和恒溫模式設(shè)定值。
DS1620與Stamp的連接十分簡(jiǎn)單。 該芯片有8根引腳。從Stamp引出的5伏以上電源接入DS1620的8號(hào)引腳; 電源地線接DS1620的4號(hào)引腳。3根Stamp輸入輸出引腳驅(qū)動(dòng)DS1620的以下三根引腳:
- 1 號(hào)引腳為數(shù)據(jù)線。 通過(guò)該引腳讀寫數(shù)據(jù)。
- 2 號(hào)引腳為時(shí)鐘引腳。 為移位寄存器移入移出數(shù)據(jù)提供時(shí)鐘。
- 3 號(hào)引腳為復(fù)位、片選信號(hào)。 該引腳置高電平,選通芯片。
例程代碼中,假設(shè):
- 數(shù)據(jù)線連接Stamp的2號(hào)輸入輸出引腳。
- 時(shí)鐘引腳連接Stamp的1號(hào)輸入輸出引腳。
- 復(fù)位、片選信號(hào)由Stamp的0號(hào)輸入輸出引腳提供。
完整連線如下圖所示:
|
你可以將DS1620芯片安裝在Stamp的母板的實(shí)驗(yàn)建模區(qū),也可以裝在單獨(dú)的面包板上。安裝完畢,將液晶顯示屏與Stamp的3號(hào)輸入輸出引腳相連,載入并運(yùn)行下面的程序:
symbol RST = 0 ' 定義復(fù)位、選通1620芯片引腳編號(hào)
symbol CLK = 1 ' 定義連接1620芯片移位寄存器的時(shí)鐘引腳編號(hào)
symbol DQ = 2 ' 定義連接1620芯片數(shù)據(jù)線的引腳編號(hào)
symbol DQ_PIN = pin2 ' 定義2號(hào)引腳為數(shù)據(jù)線
symbol LCD = 3 ' 定義液晶顯示屏數(shù)據(jù)線引腳編號(hào)
begin:
low RST ' 不用時(shí),不選通1620芯片
high CLK ' 1620芯片時(shí)鐘引腳默認(rèn)為高電平
pause 1000 ' 等待溫度計(jì)與顯示屏的引導(dǎo)啟動(dòng)
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毫秒,等待電可擦除只讀存儲(chǔ)器
start_convert:
b0 = $EE ' $EE 是1620的命令字節(jié)
' 啟動(dòng)模數(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é)
' 溫度信號(hào)采樣
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請(qǐng)求下一位
bit8 = DQ_PIN ' 讀取位
high CLK ' 時(shí)鐘信號(hào)引腳切換為高電平
next
return
' 以攝氏度單位顯示溫度
display:
if bit8 = 0 then pos ' 如果bit8=1
' 溫度為負(fù)值
b0 = b0 and/ b0 ' 通過(guò)對(duì)自身的與非操作
' 對(duì)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è)程序,你會(huì)發(fā)現(xiàn)這一溫度計(jì)是以0.5度的精度,以攝氏度為單位顯示溫度。
DS1620芯片測(cè)量溫度的精度為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ù),我們可以通過(guò)把其他各位取反加1的方法,得到其絕對(duì)值。
以下是上述數(shù)字溫度計(jì)程序執(zhí)行的操作:
- 使用symbol關(guān)鍵字設(shè)置若干常量,使程序更易于閱讀(也更容易把芯片與其他不同的輸入輸出引腳相連)。
- 設(shè)定DS1620芯片的時(shí)鐘和復(fù)位引腳信號(hào)為預(yù)期值。
- 通過(guò)向DS1620的電可擦除只讀存儲(chǔ)器寫入命令字節(jié),使其工作在“溫度計(jì)模式”。你只需要進(jìn)行一次這樣的操作,嚴(yán)格地說(shuō)你在運(yùn)行過(guò)一次程序之后,就可以把這段代碼刪掉了(出于節(jié)省程序存儲(chǔ)空間考慮),因?yàn)檫@種工作模式已經(jīng)保存在電可擦除只讀存儲(chǔ)器中。
- 程序發(fā)送指令$EE(“$”表示十六進(jìn)制數(shù),$EE轉(zhuǎn)換成十進(jìn)制為238),啟動(dòng)溫度計(jì)的模數(shù)轉(zhuǎn)換。
之后,程序進(jìn)入循環(huán)。 每秒向DS1620芯片發(fā)出指令獲取目前溫度信號(hào),讀取 DS1620返回的9位的數(shù)據(jù),將其保存在變量w0中。Stamp通過(guò)切換時(shí)鐘信號(hào)一次發(fā)送或接收一位數(shù)據(jù)信號(hào),與DS1620通信。變量w0(16位)與b0/b1(8位)與 bit0/bit1/.../bit15(1位)占有相同的存儲(chǔ)空間,當(dāng)我們從bit8開(kāi)始插入從DS1620 獲取的位數(shù)據(jù),并將w0變量除以2時(shí),實(shí)際上我們就是在將數(shù)據(jù)右移,以便把從 DS1620獲取的9位溫度信號(hào)保存在變量w0中。 溫度保存在w0中之后,display子例程判斷讀數(shù)的正負(fù),然后以攝氏度為單位,在液晶顯示屏上正確顯示讀數(shù)。 攝氏度到華氏度的單位換算如下:
- dF=dC*9/5+32
這樣,我們就完成了一個(gè)非常昂貴的溫度計(jì)的制作。 它有些什么用途呢? 這有一個(gè)好主意。 例如你在一家制藥公司工作,需要在全國(guó)范圍內(nèi)運(yùn)輸藥品,藥品運(yùn)輸全程溫度要保持恒定,否則藥品會(huì)失效。 你可以用 Stamp 制作一臺(tái)溫度數(shù)據(jù)記錄儀。 Jameco公司(部件號(hào)143811)和Parallax公司(部件號(hào)27960)都出售稱為“RAM 封裝模塊”的元件。 它包含具備串行接口的低功耗8千字節(jié)(也可以選擇32千字節(jié))RAM芯片。 可以給你的Stamp配上該元件(或相似產(chǎn)品),編寫代碼,每分鐘將讀取的溫度數(shù)值保存在隨機(jī)存取存儲(chǔ)器中。 然后,你可以將 Stamp隨藥品一起打包,在運(yùn)輸過(guò)程結(jié)束時(shí)取回Stamp。 RAM模塊會(huì)包含整個(gè)運(yùn)輸過(guò)程的溫度歷史記錄,通過(guò)記錄你可以知道藥品是否解凍過(guò)。
評(píng)論
查看更多