现在的这个程序在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 ;把读得的位值环移给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 ;二进制数求补(双字节)
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=小数部分 BCD
MOV A,TEMPL ;整数部分
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 = 十位数 BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A ;TEMPLC HI = 个位数 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 = 百位数 BCD
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPC12: RET
;===========================================================
;显示区 BCD 码温度值刷新子程序
;===========================================================
DISPBCD: MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A ;小数位
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 ;十位数是0
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符号位不显示
MOV 72H,A ;十位数显示符号
DISPBCD2: RET
;***************************************************************
;显示温度整数部分
;***************************************************************
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;
;小数
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
;***************************************************************
;单字节十六进制转 BCD
;******************************************************
HEX2BCD1: MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;***************************************************************
; 数据查表
;***************************************************************
TAB: DB 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h,0FFH,0BFH; ;共阳
; 0 1 2 3 4 5 6 7 8 9 空 -
; 小数部分码表
;-----------------------------------------------------------
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;====================================================
END
|