Un programa de ensamblaje de termómetro digital de alta precisión basado en el microcontrolador AT89C51, el sensor de temperatura DS18B20 y la pantalla de cristal líquido LCD1602.
Sensor de temperatura DS18B20, código de pantalla de cristal líquido LCD1602
; placa de desarrollo de microcontrolador multifunción XRF 51
Programa de medición de temperatura DS18B20 (pantalla LCD, puede medir) 0 -99 grados)
;*************************************** ***** *************************************
;* ***** ********************************************** ****** ******
TEMPER_L EQU 36H; vuelva a leer el área de almacenamiento temporal de bits altos y bajos de DS18B20
TEMPER_H EQU 35H; >
TEMPER_NUM EQU 60H; almacenamiento del valor de temperatura
TEMPER_GE EQU 61H
TEMPER_SHI EQU 62H
TEMPER_SAVE EQU 63H
FLAG1 BIT 00H
FLAG2 BIT 01H
RS BIT p2.0; interfaz de control LCD
RW BIT p2.1
E BIT p2. 2
DQ BIT p3.5; puerto de bus único
ORG 0000H
AJMP MAIN
ORG 0030H
PRINCIPAL: MOV SP, #70H
LCALL GET_TEMPER
LCALL TEMPER_COV
LCALL LCDDISP
lcall d100ms
lcall d100ms
LJMP MAIN
NOP
;************************ ******** *************************
;Leer el valor de temperatura convertido
;************ ************************************* ********
GET_TEMPER:
SETB DQ; entrada de tiempo
BCD: LCALL INIT_1820
JB FLAG1, S22
LJMP BCD; si DS18B20 no existe Luego regresa
S22: LCALL DELAY1
MOV A, #0CCH Omitir coincidencia de ROM----- -0CC comando
LCALL WRITE_1820
MOV A, #44H; Emitir comando de conversión de temperatura
LCALL WRIT
E_1820
LCALL D100MS
CBA: LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC: LCALL DELAY1
MOV A, #0CCH; omitir coincidencia de ROM
LCALL WRITE_1820
MOV A, #0BEH; Emitir comando de temperatura de lectura
< p; >LCALL WRITE_1820LCALL READ_18200 ;READ_1820
RET
;********************* **********************************************
;El programa para leer DS18B20, lee un byte de datos de DS18B20
;************************ ****** **********************************
READ_1820:
MOV R2, #8
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3, #7
DJNZ R3, $
MOV C, DQ
MOV R3, #23
DJNZ R3, $
RRC A
DJNZ R2, RE1
RET
;********** ***** ****************************************
;Escribiendo el programa DS18B20
;*************************************** ***** *************
WRITE_1820:
MOV R2, #8
CLR C p>
WR1:
CLR DQ
MOV R3, #6
DJNZ R3, $
RRC A p>
MOV DQ, C
MOV R3, #23
DJNZ R3, $
SETB DQ
NOP
DJNZ R2, WR1
SETB DQ
RET
;*************** ******* **********************************
; para leer DS18B20, leer desde DS18B20 Dos bytes de datos de temperatura
;****************************** ****** *******************
READ_18200:
MOV R4, #2; Leer lo alto y lo bajo; bits de temperatura de DS18B20
MOV R1, #36H El bit bajo se almacena en 36H (TEMPER_L), el bit alto se almacena en 35H (TEMPER_H) ;
p>
RE00:
MOV R2, #8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3, #7
DJNZ R3, $
MOV C, DQ
MOV R3, #23
DJNZ R3, $
RRC A
DJNZ R2, RE01
MOV @R1, A
DEC R1
DJNZ R4, RE00
RET
;********************* *** **********************************
; Usar los datos de temperatura leídos desde DS18B20 para realizar Convertir
*************************************** ***************
TEMPER_COV:
MOV A, #0F0H
ANL A, TEMPER_L; el bit de baja temperatura Valor de temperatura con cuatro dígitos después del punto decimal
SWAP A
MOV TEMPER_NUM, A obtiene los cuatro dígitos inferiores
MOV A, TEMPER_L;
JNB ACC.3, TEMPER_COV1; valor de temperatura redondeado
INC TEMPER_NUM
TEMPER_COV1:
MOV A, TEMPER_H
ANL A, #07H
SWAP A
ORL A, TEMPER_NUM; obtiene los cuatro bits superiores y luego OR con los cuatro bits inferiores para obtener el valor p>
MOV TEMPER_NUM, A; guarda los datos de temperatura de transformación después de
LCALL BIN_BCD
RET
;;******** ************** *************************************
; Convierte datos de temperatura hexadecimales en código BCD comprimido
;*************************** **************** *************
BIN_BCD:
MOV A, TEMPER_NUM
MOV B, #10
DIV AB
MOV TEMPER_SHI,A
MOV TEMPER_GE,B
RET
;****** ************************************* **********
;Programa de inicialización DS18B20
;************************ ************** ****************
INIT_1820:
SETB DQ p>
NOP
CLR DQ
MOV R0, #250
TSR1:
DJNZ R0, T
SR1; retardo 520us
SETB DQ
MOV R0, #25H
TSR2:
DJNZ R0, TSR2
JNB DQ, TSR3; si D0 es bajo, el reinicio es exitoso y existe DS18B20
LJMP TSR4; SETB FLAG1; establece el bit de bandera, lo que indica que DS1820 existe
LJMP TSR5
TSR4:
CLR FLAG1, lo que indica que DS1820 no existe; existe
LJMP TSR7
TSR5:
MOV R0, #06BH
TSR6:
DJNZ; R0, TSR6; extendido cuando
TSR7:
SETB DQ; tirar del bus alto
RET
;****** ****** ******************************************* p>
;Programa de visualización digital
************************************ ************ ******
*************************** *********** *************
;Programa de pantalla LCD
;******* *********** *******************************
LCDDISP :
mov p1, #01h; borrar pantalla
llamar a enrw
mov p1, #38h; establecido en 8 bits, fuente 5*7 dos líneas
llamar a enrw p>
mov p1, #0Ch
llamar a enrw
mov p1, #06h
llamar a enrw
mov p1, #80h
llamar a enrw
mov dptr, #yjtab
llamar a rwram
mov p1, #0C0h
llamar a enrw
mov dptr, #yjtab1
llamar a rwram
W_TEM:
mov p1, #0CCh
llamada enrw
MOV DPTR, #ASCII
MOV A, TEMPER_SHI
MOVC A, @A DPTR
MOV P1, A
setb rs
clr rw
clr e
llamada D500us
setb e
MOV DPTR, #ASCII
MOV A, TEMPER_GE
MOVC A, @
A DPTR
MOV P1, A
setb rs
clr rw
clr e
llamada D500us
setb e
RET
enrw: clr rs
clr rw
clr e
llamar D500us
setb e
ret
rwram: mov r1, #00h
a1: mov a, r1 p>
movc a, @a dptr
call rwram2
inc r1
cjne a, #00h, a1
ret
rwram2: mov p1, a
setb rs
clr rw
clr e
llamar a D500us
setb e
ret
;******************R****** ****** *************************
;Subrutina de retardo
;*** * ********************************************
D500us:
MOV R6, #250; retardo 500us
DJNZ R6, $
RET
DELAY1: MOV R7 , #20H
DJNZ R7, $
RET
D100MS: MOV R6, #200
D2: MOV R5, #250
DJNZ R5, $
DJNZ R6, D2
RET
yjtab: db 'XRF MCS-51', 00h p >
yjtab1: db 'temperatura: **`C', 00h
ASCII: DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H, 38H, 39H
fin