为什么我的温度一直显示为17.4度
我用的s52单片机+DS18B20传感器+ZLG7289A显示芯片~~~结果8段数码管一直稳定显示为17.4度
主程序如下:
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
SEND_BUF EQU 3AH ;发送缓冲
DELAYJ EQU 3BH ;循环计数器
TEMPHEAD EQU 33H
TEMPDIN BIT P3.7
CS BIT P2.0
DIO BIT P2.2
CLK BIT P2.1
F BIT P2.7
;
;*********************************
;中断向量区
;*********************************
;
ORG 0000H
LJMP START
;
;*********************************
; 系统初始化
;*********************************
ORG 0100H
START:
MOV SP, #60H
CLSMEN: MOV R0, #40H
MOV R1, #80H
CLSMEN1: MOV @R0, #00H
INC R0
DJNZ R1, CLSMEN1
MAIN:
LCALL INITDS18B20 ;DS18B20复位
LCALL LONG_DELAY
LCALL LONG_DELAY
CPL F
LCALL LONG_DELAY
LCALL LONG_DELAY
LCALL READTEMP1 ;读暂存器
LCALL CONVTEMP ;计算温度处理
LCALL DISPBCD
LCALL READTEMP
LCALL DISPLAY ;调用显示程序
NOP
NOP
NOP
AJMP MAIN
;
INITDS18B20:
SETB TEMPDIN
NOP
NOP
CLR TEMPDIN
MOV R6,#0A0H
DJNZ R6,$
MOV R6,#0A0H
DJNZ R6,$
SETB TEMPDIN
MOV R6,#32H
DJNZ R6,$
MOV R6,#3CH
LOOP18B20: MOV C,TEMPDIN
JC INITDS18B20OUT
DJNZ R6,LOOP18B20
MOV R6,#064H
DJNZ R6,$
SJMP INITDS18B20
RET
INITDS18B20OUT:SETB TEMPDIN
RET
;******************************
;读DS18B20的程序
;*****************************
READDS18B20: MOV R7,#08H
SETB TEMPDIN
NOP
NOP
READDS18B20LOOP:
CLR TEMPDIN
NOP
NOP
NOP
SETB TEMPDIN
MOV R6,#07H
DJNZ R6,$
MOV C,TEMPDIN
MOV R6,#3CH
DJNZ R6,$
RRC A
DJNZ R7,READDS18B20LOOP
MOV R6,#3CH
DJNZ R6,$
RET
;
;***********************************
;写DS18B20的程序
;***********************************
WRITEDS18B20: MOV R7,#08H
SETB TEMPDIN
NOP
NOP
WRITEDS18B20LOP:
CLR TEMPDIN
MOV R6,#07
DJNZ R6,$
RRC A
MOV TEMPDIN,C
MOV R6,#34H
DJNZ R6,$
SETB TEMPDIN
DJNZ R7,WRITEDS18B20LOP
SETB TEMPDIN
RET
;
;*************************************
;READ TEMP
;*************************************
;
READTEMP: MOV R6,#14H
DL5:MOV R7,#19H
DL6:DJNZ R7,DL6
DJNZ R6,DL5
LCALL INITDS18B20
MOV A,#0CCH
LCALL WRITEDS18B20
MOV R6,#34H
DJNZ R6,$
MOV A,#44H
LCALL WRITEDS18B20
MOV R6,#34H
DJNZ R6,$
RET
;
READTEMP1: MOV R6,#14H
DL7:MOV R7,#19H
DL8:DJNZ R7,DL8
DJNZ R6,DL7
LCALL INITDS18B20
MOV A,#0CCH
LCALL WRITEDS18B20
MOV R6,#34H
DJNZ R6,$
MOV A,#0BEH
LCALL WRITEDS18B20
MOV R6,#34H
DJNZ R6,$
MOV R5,#09H
MOV R0,#TEMPHEAD
MOV B,#00H
READTEMP2:LCALL READDS18B20
MOV @R0,A
INC R0
READTEMP21: LCALL CRC8CAL
DJNZ R5,READTEMP2
MOV A,B
JNZ READTEMPOUT
MOV A,TEMPHEAD+0
MOV TEMPL,A
MOV A,TEMPHEAD+1
MOV TEMPH,A
READTEMPOUT:RET
;
;********************************
;处理温度BCD码子程序
;********************************
;
CONVTEMP:MOV A,TEMPH
ANL A,#80H
JZ TEMPC1
CLR C
MOV A,TEMPL
CPL A
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
MOV TEMPHC,#0AH
SJMP TEMPC11
;
TEMPC1:MOV TEMPHC,#0FH
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
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
;
;******************************
;小数部分码表
;******************************
;
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;
;************************************
;显示区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,A ;符号位不显示
MOV 72H,A ;十位数显示符号
DISPBCD2:RET
;
;**********************************
; 7289-LED数码管实验显示
;**********************************
;
DISPLAY:NOP
NOP
NOP
SETB CS
SETB DIO
MOV SEND_BUF,#10100100B ;ZLG7289A复位命令
LCALL SEND
SETB CS
MOV R6,#24H
DL9:MOV R7,#39H
DL10:DJNZ R7,DL10
DJNZ R6,DL9
DONE: LCALL DISP ;显示子程序
DISP:
MOV R0,#70H ;写入7289
MOV R1,#80H ;LED写入1-8
REA1:MOV SEND_BUF,R1
LCALL SEND
MOV SEND_BUF,@R0
LCALL SEND
SETB CS
INC R1
INC R0
CJNE R1,#84H,REA1
SETB CS
SETB DIO
MOV SEND_BUF,#11001001B
LCALL SEND
MOV A,71H
ORL A,#80H
MOV SEND_BUF,A
LCALL SEND
SETB CS
RET
SEND: MOV R7,#08H
CLR CS
CLR CLK
LCALL LONG_DELAY ;延时50微秒
SEND_LP:NOP
MOV A,SEND_BUF
RLC A
MOV SEND_BUF,A
MOV DIO,C
NOP
NOP
SETB CLK
LCALL SHORT_DELAY ;延时10微秒
CLR CLK
LCALL SHORT_DELAY
DJNZ R7,SEND_LP
CLR DIO
RET
LONG_DELAY:
MOV R6,#25 ;延时50微秒
DJNZ R6,$
RET
SHORT_DELAY:
MOV R6,#4 ;延时10微秒
DJNZ R6,$
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
;
;******************************
; CRC-8
;******************************
CRC8CAL: PUSH ACC
MOV R7,#08H
CRC8LOOP1:XRL A,B
RRC A
MOV A,B
JNC CRC8LOOP2
XRL A,#18H
CRC8LOOP2:RRC A
MOV B,A
POP ACC
RR A
PUSH ACC
DJNZ R7,CRC8LOOP1
POP ACC
RET
;
END
望有高手告诉我程序哪出问题了~~~~小弟万分感谢
[/size]
发表时间:2007年5月23日21:15:30