線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2501
推到 Plurk!
推到 Facebook!

DS1821感測溫度,在中斷與七段顯示器顯示溫度部分不太瞭解

缺席
moon
一般會員


發表:1
回覆:1
積分:0
註冊:2009-02-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-02-15 14:22:10 IP:140.127.xxx.xxx 訂閱
最近運用組合語言,實做一個溫度感測器的專題,但碰到了一些不懂的地方,在一開始時參考了使用指南提供的DS1821驅動時序與指令,原本以為只要時序與指令正確,即可順利讀取溫度,並由8051接收DS1821讀到的溫度,配合著0-9的七段顯視器的TABLE,再輸出送到七段顯視器上顯示,(因為DS1821輸出資料8位元,假設讀取到溫度是24,那是不是輸出的8位元為0001 1000),並且考慮到視覺暫留的問題,因此加了延時,使七段顯視器正確顯示溫度給肉眼看,但是卻是顯示亂碼,後來又參考了一些資料加入了TIMER0中斷,是不是因為DS1821一秒可以讀取很多次溫度,因此必須加入中斷,使程式一秒讀一次溫度就好,再傳送給七段顯視器,但加入TIMER0中斷後,七段顯視器連亮都沒有亮了,不知道是哪邊出了問題我在猜是中斷那邊沒有寫好,不知道前輩可以給我一些建議,謝謝。以下為程式碼。 紅色部分是中斷與七段顯視器的部分。
;設定位置
YA EQU
[code c#]
YB EQU P0.1;十位數
YC EQU P0.2;百位數
DQ EQU P1.7;DS1821 DQ腳
WRITE_COMMAND EQU 0X20
READ_TEMP EQU 0x21
SLOOP EQU 0x30
T_C EQU 0x31
; 主程式開始
;*********************************
ORG 0000H
JMP START
;*********************************
;計時中斷副程式
;*********************************
ORG 000BH
MOV TH0,#0Xf0; 設定TIMER0數記數3840,模式0
MOV TL0,#0X00; 設定TIMER0數記數3840,模式0
PUSH ACC
PUSH PSW
djnz sloop ,TINT_100
CALL TEMPERATURE
TINT_100:
POP PSW
POP ACC
RETI

; 程式真正開始
;*********************************
START:
MOV TMOD,#00H ;使用TIMER0
MOV TH0,#0Xf0;
MOV TL0,#0X00
setb ea
setb et0
SETB TR0
MOV SLOOP,#100
CALL Reset_1821
MOV WRITE_COMMAND,#0x0c;寫入開始下指令的指令
CALL WRITE_COM
MOV WRITE_COMMAND,#0x42
CALL WRITE_COM
; Write "Start Convert(0xee) command to DS1821
CALL Reset_1821
MOV WRITE_COMMAND,#0xEE;寫入開始溫度轉換的指令
CALL WRITE_COM
bb:
call cc 加入這一段的用意是在中斷程式內一直讀取溫度,不會使程式往下跑
ret
cc:
call bb
ret

DELAY: mov r6,#250
DEL_5: mov r7,#200
DEL_6: Djnz r7,del_6
Djnz r6,del_5
RET
;*********************************
;溫度量測:
;*********************************
TEMPERATURE:
;Read temperature data from DS1821
CALL Reset_1821
MOV WRITE_COMMAND,#0xAA
CALL WRITE_COM
CALL READ_COM
MOV T_C,READ_TEMP
mov a,T_C
call SHOW
RET
SHOW:
CLR P0.0 ;個位數
MOV DPTR,#SEG
MOVC A,@A DPTR
MOV P2,a
call delay
SETB P0.0

[/code]

CLR P0.1 ;十位數
MOV DPTR,#SEG
MOVC A,@A DPTR
MOV P2,a
CALL delay
SETB P0.1

CLR P0.2 ;百位數
MOV DPTR,#SEG
MOVC A,@A DPTR
MOV P2,a
CALL delay
SETB P0.2
RET

SEG:
DB 00010001B ;0
DB 11011101B ;1
DB 00100101B ;2
DB 10000101B ;3
DB 11001001B ;4
DB 10000011B ;5
DB 00000011B ;6
DB 00101011B ;7
DB 00000001B ;8
DB 10000001B ;9

;*********************************
;Reset DS1821
;*********************************
Reset_1821:
SETB DQ
nop
CLR DQ
;;Keep low for 480uS
MOV R5,#150
DELAY_600:
DJNZ R5,DELAY_600
setb DQ
;;DS1821 will keep low for 60-240us
WAIT_1821LOW:
;;DS1821 will keep low for 60-240us
JB DQ, WAIT_1821LOW
WAIT_1821HIGH:
;;Wait low stat finish
JNB DQ, WAIT_1821HIGH
;;Delay 448 uS
MOV R5,#112
DELAY_448:
DJNZ R5,DELAY_448
RET
;*********************************
; Write COMMAND or DATA to DS1821
;*********************************
WRITE_COM:
MOV R4,#8
;Change DQ pin to output pin
SEND_WDATA:
JNB WRITE_COMMAND.0,OP_LOW
JMP OP_HIGH
OP_LOW:
setb dq
nop
CLR DQ
JMP KEEP_60
OP_HIGH:
SETB DQ
nop
clr dq
nop
setb dq
KEEP_60:
MOV R5,#30
DELAY_60:
DJNZ R5,DELAY_60
MOV A,WRITE_COMMAND
RR A
MOV WRITE_COMMAND,A
DJNZ R4,SEND_WDATA
RET
請在此區域輸入程式碼
編輯記錄
moon 重新編輯於 2009-02-15 14:23:51, 註解 無‧
moon 重新編輯於 2009-02-15 14:32:58, 註解 無‧
moon 重新編輯於 2009-02-16 10:25:48, 註解 無‧
moon 重新編輯於 2009-03-08 12:19:07, 註解 無‧
moon 重新編輯於 2009-03-08 12:21:40, 註解 無‧
moon 重新編輯於 2009-03-08 12:21:40, 註解 無‧
moon
一般會員


發表:1
回覆:1
積分:0
註冊:2009-02-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-02-16 10:28:28 IP:140.127.xxx.xxx 訂閱
我找到原因了~"~DS1821讀到的溫度以8位元表現,但是必須將8位元拆成兩組4位元,再分別丟到七段顯示器,就可以將溫度表示出來了。
系統時間:2024-05-03 11:07:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!