我花了很长时间调出了这个程序
但是在温度显示的时候1秒左右会闪动一次
不晓得是什么原因
放上来让大家查查看
图片下次再发上来
TEMPER_L EQU 29H ;放读取的低8位
TEMPER_H EQU 28H ;放读取的高8位
A_BIT EQU 33H ;百位存储单
B_BIT EQU 32H ;十位存储单元
C_BIT EQU 31H ;个位存储单元
D_BIT EQU 22H ;个位小数
E_BIT EQU 23H ;十位小数
F_BIT EQU 24H ;百位小数
G_BIT EQU 25H ;千位小数
T_DF EQU 27H
T_INTEGER EQU 30H
DQ BIT P3.7
;-------------------主程序---------------------
ORG 0030H
LOOP:
MOV SP,#60H
CLR EA
LCALL CHU_1820
LCALL DUWENDU
LCALL GET_TEMPER
LCALL T_FORMAT
;------------------------DS18B20初始化-----------------------
CHU_1820:
L0:SETB DQ
NOP
CLR DQ
MOV R2,#250
L1:
DJNZ R2,L1
SETB DQ
MOV R2,#25
L15:DJNZ R2,L15
CLR C
ORL C,DQ
JC L0
;CLR P2.0
MOV R6,#23
L16:ORL C,DQ
JC L3
DJNZ R6,L16
SJMP L0
L3:MOV R2,#120
DJNZ R2,$
RET
;------------------------设定暂存器----------------------------
DUWENDU:
CLR EA
LCALL CHU_1820
JB DQ,TS1
RET
TS1:MOV A,#0CCH ;跳过ROM匹配
LCALL XIE_1820
MOV A,#4EH
LCALL XIE_1820
RET
;-----------------------读转换后的温度值------------------------
GET_TEMPER:
SETB DQ
LCALL CHU_1820
JB DQ,TSS2
RET ;若不存在则返回
TSS2: MOV A,#0CCH ;跳过ROM
LCALL XIE_1820
MOV A,#44H ;发出温度转换命令
LCALL XIE_1820
LCALL DISPLAY ;延时
LCALL CHU_1820
MOV A,#0CCH ;跳过ROM
LCALL XIE_1820
MOV A,#0BEH ;发出读温度换命令
LCALL XIE_1820
LCALL RED_1820 ;读两个字节的温度
RET
//----------------------写命令到1820--------------------------
XIE_1820:
CLR EA
MOV R2,#8
L9:SETB DQ
MOV R3,#7
RRC A
CLR DQ
DJNZ R3,$
MOV DQ,C
MOV R3,#20
DJNZ R3,$
DJNZ R2,L9
SETB DQ
RET
//----------------------读出两字节温度数据-----------------------
RED_1820:
MOV R2,#2
MOV R1,#TEMPER_L ;低位存入(TEMPER_L),高位存入(TEMPER_H)
L7:MOV R3,#8
L6:CLR C
CLR DQ
NOP
NOP
NOP
SETB DQ ;开始读数据,总线释放
MOV R4,#4
DJNZ R4,$ ;总线保持8us
MOV C,DQ
RRC A
MOV R5,#30
L5:DJNZ R5,L5 ;等待60us释放总线
DJNZ R3,L6
MOV @R1,A
DEC R1 ;指向高8位存储单元
DJNZ R2,L7
SETB DQ
RET
;-----整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
T_FORMAT: MOV A, #0FH
ANL A, TEMPER_L
MOV T_DF, A ;获得小数部分(4位)
MOV A, TEMPER_L
SWAP A
MOV TEMPER_L, A
MOV A, TEMPER_H
SWAP A
MOV R0, #TEMPER_L
XCHD A, @R0
MOV T_INTEGER, A ;获得整数部分(1字节)
AJMP DISPLAY
RET
; -------------------DISPLAY---------------------
DISPLAY:
MOV A, T_INTEGER
MOV B,#10
DIV AB
MOV C_BIT,B ;个位存在C_BIT
MOV B,#10
DIV AB
MOV A_BIT,A ;百位存在A_BIT
MOV B_BIT,B ;十位存在B_BIT
MOV A, T_DF
MOV R0, #D_BIT
MOV R2, #4
D0: MOV B, #10
MUL AB
MOV B, #16
DIV AB
MOV @R0, A ;从个位小数D_BIT,到十位E_BIT,百位F_BIT,千位G_BIT
INC R0
MOV A, B
DJNZ R2, D0
MOV R0,#4
DPL1: MOV R1,#250 ;显示1000次
DPLOP: MOV DPTR, #TAB1
MOV A,C_BIT ;取个位数
MOVC A,@A+DPTR
MOV P0,A
CLR P1.1
ACALL D1MS
SETB P1.1
MOV DPTR, #TAB
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR
MOV P0,A
CLR P1.0
ACALL D1MS
SETB P1.0
/*MOV DPTR, #TAB
MOV A,A_BIT ;取百位显示
JZ D1 ;判断百位是否是0,是则不显示
D1: AJMP D2
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
ACALL D1MS
SETB P2.1
MOV DPTR, #TAB
D2:*/ MOV A,D_BIT ;取个位小数
MOVC A,@A+DPTR
MOV P0,A
CLR P1.2
ACALL D1MS
SETB P1.2
MOV DPTR, #TAB
MOV A,E_BIT ;取十位小数
MOVC A,@A+DPTR
MOV P0,A
CLR P1.3
ACALL D1MS
SETB P1.3
MOV DPTR, #TAB
MOV A,F_BIT ;取百位小数
MOVC A,@A+DPTR
MOV P0,A
CLR P1.4
ACALL D1MS
SETB P1.4
MOV DPTR, #TAB
MOV A,G_BIT ;取千位小数
MOVC A,@A+DPTR
MOV P0,A
CLR P1.5
ACALL D1MS
SETB P1.5
DJNZ R1,DPLOP ;100次没完循环
DJNZ R0,DPL1 ;4个100次没完循环
RET
;***********************************
D1MS: MOV R7,#80 ;1MS延时(按12MHZ算)
DJNZ R7,$
RET
//**不带小数点的共阳7段代码**//
;TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;;共阳
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ; 共阴
;-------------带小数点的代码-----------
;TAB1:DB 40H,79H,24H,30H,19H,12H,2H,78H,00H,10H ;共阳
TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;共阴
END
文章评论(0条评论)
登录后参与讨论