DS1821感測溫度,在中斷與七段顯示器顯示溫度部分不太瞭解 |
缺席
|
moon
一般會員 發表:1 回覆:1 積分:0 註冊:2009-02-13 發送簡訊給我 |
最近運用組合語言,實做一個溫度感測器的專題,但碰到了一些不懂的地方,在一開始時參考了使用指南提供的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
一般會員 發表:1 回覆:1 積分:0 註冊:2009-02-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |