Diseño de voltímetro digital basado en microcontrolador (no complete el plagio)
Les mostraré el voltímetro digital que hice antes, ensamblado
COM EQU 50H; registro de comando
DAT EQU 51H; p>RS EQU P2.1; señal de selección de registro LCD
RW EQU P2.2; señal de selección de lectura/escritura de LCD
E EQU P2.3 señal de habilitación de LCD; p>
ORG 0000H
LJMP MAIN; Dirección de entrada del programa principal
ORG 000BH
Entrada de interrupción LJMP T0
ORG 0030H; Programa principal, inicialización
PRINCIPAL:
MOV SP, #60H
LCALL INT
MOV 30H, #30H; Dígitos enteros de voltaje
MOV 31H, #02EH; Dígitos de punto decimal
MOV 32H, #30H; Dígitos decimales
MOV 33H, #30H;
MOV 34H, #30H; Dígitos de centenas decimales
MOV 35H, #56H; Carácter "V"
MOV R7, # 30H
LCALL STR0; Mostrar cadena 0
LCALL DELAY
LCALL STR1; Mostrar cadena 1
LCALL DELAY
LCALL N2; Voltaje=0.000V
;************Programa de inicialización del temporizador******************
MOV TMOD, #00H; Establece el temporizador T0 en modo 0
MOV TH0, #00H Constante de sincronización de carga para 100us
MOV TL0, #00H
SETB; TR0; Iniciar T0
MOV 24H, #08H; Cargar tiempos de interrupción T0
MOV IE, #82H Activar interrupción
LP :
MOV R7, #30H; Muestra la primera dirección del búfer
LCALL DISPLY
Visualización de bucle SJMP
LED1: CLR P3.0
RET
DISPLY: ; subrutina de pantalla LCD
MOV COM, #0CAH
LCALL PR1
MOV DAT, 30H
LCALL PR2
MOV DAT, 31H
LCALL PR2
MOV DAT, 32H
LCALL PR2
MOV DAT, 33H
LCALL PR2
MOV DAT, 34H
LCALL PR2
MOV DAT, 35H
LCALL PR2
RET
STR0:
MOV COM, #01H
LCALL PR1
MOV COM, #06H
LCALL PR1
MOV COM, #090H; Establecer dirección DDRAM
LCALL PR1; Llamar y escribir subrutina de código de instrucción
MO
V DPTR, #TAB4
MOV R2, #16
MOV R3, #00H
WRIN0:
MOV A, R3
MOVC A, @A DPTR
MOV DAT, A
LCALL PR2
INC R3
DJNZ R2 , WRIN0
MOV COM, #0D0H
LCALL PR1
MOV DPTR, #TAB5
MOV R2, #16
MOV R3, #00H
WRIN1:
MOV A, R3
MOVC A, @A DPTR
MOV DAT, A
LCALL PR2
INC R3
DJNZ R2, WRIN1
MOV R3, #10H
ZUOYI:
MOV COM, #18H
LCALL PRX
DJNZ R3, ZUOYI
LCALL DELAY00
LCALL DELAY00
LCALL DELAY00
LCALL DELAY00
RET
RET
STR1:
MOV COM, #01H; comando LCD borrar 0
LCALL PR1; escribir subrutina de código de comando
MOV COM, #06H comando de modo de entrada, el cursor se mueve hacia la derecha
LCALL PR1; subrutina de código de instrucción de transferencia
MOV COM, #40H
LCALL PR1
MOV R5, #20H
p>MOV DPTR, #ZI
MOV R4, #0
BUCLE1: MOV A, R4
MOVC A, @A DPTR p>
MOV DAT, A
LCALL PR2
INC R4
DJNZ R5, LOOP1
MOV COM, #80H
LCALL PR1
MOV DPTR, #TAB2
MOV A, #00H
MOVC A, @A DPTR
MOV DAT, A
LCALL PR2
MOV A, #01H
MOV DPTR, #TAB2
MOVC A, @A DPTR
MOV DAT, A
LCALL PR2
MOV A, #02H
MOV DPTR, #TAB2
MOVC A, @A DPTR
MOV DAT, A
LCALL PR2
MOV A, #03H
MOV DPTR, #TAB2
MOVC A, @A DPTR
MOV DAT, A
LCALL PR2
MOV R1, #00H
MOV R0, #0dH
MOV DPTR, #TAB3
BUCLE2: MOV A, R1
MOVC A, @A DPTR
MOV DAT,A
p>
LCALL PR2
INC R1
DJNZ R0, LOOP2
RET
N2: MOV COM, #0C0H
LCALL PR1
MOV DPTR, #TAB1
MOV R2, #10
MOV R3, #00H
WRIN:
MOV A, R3
MOVC A, @A DPTR
MOV DAT, A
LCALL PR2
INC R3
DJNZ R2, WRIN
RET
TAB1: DB "VOLTAGE = "
TAB2: DB 00H
DB 01H
DB 02H
DB 03H
DB 04H
DB 05H
TAB3: DB "10701 tcw "
ZI: DB 009H, 00AH, 00CH, 01FH, 00CH, 00AH, 00CH, 009H
DB 004H, 004H, 01FH, 004H, 00AH, 00AH, 011H, 000H
DB 004H, 004H, 01FH, 01FH, 01FH, 004H, 007H, 000H
DB 004H, 00EH, 010H, 00EH, 000H, 00EH, 003H, 000H
TAB4: DB " ¡bienvenido! "
TAB5: DB "DISEÑO POR tcw"
TAB6: DB "123456"
************************************************ *********************
; La subrutina de servicio de interrupción del temporizador T0 lee el resultado de la conversión A/D del canal 0 de ADC0809 y Convert. para mostrar el valor*
;*************************************** *******************************
BT0:
PUSH ACC
PUSH PSW
MOV PSW, #08H
CLR TR0
MOV TH0, #00H recargar valor inicial
MOV TL0, #00H
DIC 24H
MOV A, 24H
JNZ RTN1
MOV 24H, #08H
LCALL ADC
RTN1: SETB TR0
POP PSW
POP ACC
RETI
ADC:
MOV DPTR, #0F6FFH
MOV A, #0; seleccione el canal 0
MOVX @DPTR, A; iniciar conversión AD<; /p>
MOV A, #40H
DJNZ ACC, $
MOVX A, @DPTR
MOV 22H, A
MOV 21H, #0CCH
CJNE A, 21H, BJ0
BJ0: LED JNC
SJMP LL0
>
LL0: SETB P3.0
SJMP LL
LED: LCALL LED1
LL: MOV A, 22H
MOV B, #05H; el resultado de la conversión A/D se convierte en valor de visualización
MUL AB; (AD*5)/256
MOV 30H, B 5 La sección es la parte entera
MOV B, #0AH
MUL AB; el byte bajo de AD*5 es el resultado de /256, que es la parte decimal
MOV 32H, B; Convertir decimal binario a número decimal
MOV B, #0AH
MUL AB
MOV 33H, B
MOV B, #0AH
MUL AB
MOV 34H, B
MOV A, 30H
MOV DPTR, #TAB
MOVC A, @A DPTR
MOV 30H, A
MOV A, 32H
MOVC A, @A DPTR
MOV 32H, A
MOV A, 33H
MOVC A, @A DPTR
MOV 33H, A
MOV A, 34H
MOVC A, @A DPTR
MOV 34H, A
RET
TAB: DB " 0123456789"
****************************************** ******* p>
;****Subrutina de inicialización en modo de control indirecto LCD******
;********** ******** *************************
INT:
RETARDO DE LLAMADA LC
MOV COM, #38H; Establecer modo de trabajo
LCALL PR1
MOV COM, #01H
LCALL PR1
MOV COM, #06H
LCALL PR1
MOV COM, #0CH
LCALL PR1
RET
DELAY: ; Subrutina de Retardo
MOV R6, #0FH
MOV R7, #00H
DELAY1:
NOP
DJNZ R7, DELAY1
DJNZ R6, DELAY1
RET
DELAY00: ; Subrutina de retardo
MOV R6 , #0FFH
MOV R7, #0FFH
DELAY0:
NOP
DJNZ R7, DELAY1
DJNZ R6, DELAY1
RET
;****************************** ****** ***********
;**********Subrutina del controlador en modo de control indirecto LCD******** *
****************************************** ******
;2 Escribir subrutina de código de instrucción
>
PRX:
PUSH ACC
CLR RS
SETB RW
PR110:
MOV P0, #0FFH
SETB E
LCALL DELAY00
NOP
MOV A, P0
CLR E
JB ACC.7, PR11
CLR RW
MOV P0, COM
SETB E
CLR E
POP ACC
RET
PR1:
PUSH ACC
CLR RS
SETB RW
PR11:
MOV P0, #0FFH
SETB E
RETARDO DE LLAMADA LC
NOP
MOV A, P0
CLR E
JB ACC.7, PR11
CLR RW
MOV P0, COM
SETB E
CLR E
POP ACC
RET
3 pantalla de escritura; Subrutina de datos
PR2:
PUSH ACC
CLR RS
SETB RW
PR21:
p>MOV P0, #0FFH
SETB E
LCALL DELAY
MOV A, P0
CLR E
p>
JB ACC.7, PR21
SETB RS
CLR RW
MOV P0, DAT
SETB E
CLR E
POP ACC
RET
END