現(xiàn)在的這個程序在at89s51上完全正常 在12c5a60s2上只顯示0.0 怎么修改才能讓它在12c5a60s2上使用
DQ BIT P3.0; 18b20
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 2AH
TEMPLC DATA 2BH
TEMP_ZH DATA 2CH
FLAG EQU 6EH ;溫度標志位
MAIN:
LCALL RE_TEMP ; 讀溫度
LCALL CONVER ; 處理溫度
LCALL DISPBCD ; BCD 碼溫度值
LCALL DISPLAY_INT ; 顯示溫度
LJMP MAIN
;***************************************************************
;溫度讀取
;************************************************************ ***
RE_TEMP:
SETB DQ
ACALL INIT_18B20
JB FLAG, ST
RET
ST:
MOV A, #0CCH
ACALL WRITE_18B20
MOV A, #44H
ACALL WRITE_18B20
ACALL INIT_18B20
MOV A, #0CCH
ACALL WRITE_18B20
MOV A, #0BEH
ACALL WRITE_18B20
ACALL READ_18B20
RET
;***************************************************************
;寫DS18B20
;***************************************************************
WRITE_18B20:
MOV R2, #8
CLR C
WR1:
CLR DQ
MOV R3, #6
DJNZ R3, $
RRC A
MOV DQ, C
MOV R3, #23
DJNZ R3, $
SETB DQ
NOP
DJNZ R2, WR1
SETB DQ
RET
;***************************************************************
;初始化DS18B20
;***************************************************************
INIT_18B20:
SETB DQ
NOP
CLR DQ
MOV R1, #3
DLY: MOV R0, #107
DJNZ R0, $
DJNZ R1, DLY
SETB DQ
NOP
NOP
NOP
MOV R0, #25H
T2: JNB DQ, T3
DJNZ R0, T2
JMP T4
T3: SETB FLAG
JMP T5
T4: CLR FLAG
JMP T7
T5: MOV R0, #117
T6: DJNZ R0, T6
T7: SETB DQ
RET
;***************************************************************
;讀DS18B20
;***************************************************************
;從DS18B20中讀出溫度低位、高位和報警值TH、TL
;存入26H、27H、28H、29H
;============================================================
READ_18B20:
MOV R4,#4 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#26H ; 存入26H、27H、28H、29H
RE00: MOV R2,#8
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ ;讀前總線保持為低
NOP
NOP
NOP
SETB DQ ;開始讀總線釋放
MOV R3,#09 ;延時18微妙
DJNZ R3,$
MOV C,DQ ;從DS18B20總線讀得一個BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
RRC A ;把讀得的位值環(huán)移給A
DJNZ R2,RE01 ;讀下一個BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
;***************************************************************
;溫度轉換
;***************************************************************
CONVER:
; 處理溫度 BCD 碼子程序
;****************************************************
CONVTEMP: MOV A,TEMPH ;判溫度是否零下
ANL A,#80H
JZ TEMPC1 ;溫度零上轉
CLR C
MOV A,TEMPL ;二進制數(shù)求補(雙字節(jié))
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH ;-
CPL A
ADDC A,#00H
MOV TEMPH,A ;TEMPHC HI =符號位
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;
TEMPC11: MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC LOW=小數(shù)部分 BCD
MOV A,TEMPL ;整數(shù)部分
ANL A,#0F0H
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH
SWAP A
ORL A,TEMPL
MOV TEMP_ZH,A ;組合后的值存入TEMP_ZH
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC ;TEMPHC LOW = 十位數(shù) BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A ;TEMPLC HI = 個位數(shù) BCD
ORL A,TEMPLC
MOV TEMPLC,A
MOV A,R7
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R7,A
MOV A,TEMPHC ;TEMPHC HI = 百位數(shù) BCD
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPC12: RET
;===========================================================
;顯示區(qū) BCD 碼溫度值刷新子程序
;===========================================================
DISPBCD: MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A ;小數(shù)位
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 71H,A ;個位
MOV A,TEMPHC
ANL A,#0FH
MOV 72H,A ;十位
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,A ;百位
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DISPBCD0
SJMP DISPBCD2
;========================================
DISPBCD0: MOV A,TEMPHC
ANL A,#0FH
JNZ DISPBCD2 ;十位數(shù)是0
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符號位不顯示
MOV 72H,A ;十位數(shù)顯示符號
DISPBCD2: RET
;***************************************************************
;顯示溫度整數(shù)部分
;***************************************************************
DISPLAY_INT:
;百位
MOV A,73H;
MOV DPTR, #TAB
MOVC A,@A+DPTR
MOV P0,A;
CLR P1.4
CALL XSYS
SETB P1.4;
;十位
DIST: MOV A,72H;
MOV DPTR, #TAB
MOVC A,@A+DPTR
MOV P0,A;
CLR P1.5
CALL XSYS
SETB P1.5;
;個位
DISY: MOV A,71H;
MOV DPTR, #TAB
MOVC A,@A+DPTR
MOV P0,A;
CLR P1.6
CLR P0.7
CALL XSYS
SETB P0.7;
SETB P1.6;
;小數(shù)
MOV A,70H;
MOV DPTR, #TAB
MOVC A,@A+DPTR
MOV P0,A;
CLR P1.7
CALL XSYS
SETB P1.7;
RET
;===================================================================
;顯示延時
XSYS:
DELAY200US: ;@11.0592MHz
NOP
NOP
NOP
PUSH 30H
PUSH 31H
MOV 30H,#2
MOV 31H,#179
NES:
DJNZ 31H,NES
DJNZ 30H,NES
POP 31H
POP 30H
RET
;***************************************************************
;單字節(jié)十六進制轉 BCD
;******************************************************
HEX2BCD1: MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;***************************************************************
; 數(shù)據(jù)查表
;***************************************************************
TAB: DB 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h,0FFH,0BFH; ;共陽
; 0 1 2 3 4 5 6 7 8 9 空 -
; 小數(shù)部分碼表
;-----------------------------------------------------------
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;====================================================
END
|