Buscando un programa de semáforo simple escrito en lenguaje ensamblador para un microcontrolador. Por favor ayudenme, expertos. Gracias.
;------------------------------------
;Función de implementación del programa
;Alterne el tráfico recto y gire en la intersección norte-suroeste, el tubo digital muestra la cuenta regresiva para el tráfico recto y el estado del tráfico de la carretera, incluida la acera, se muestra mediante las luces roja, verde y amarilla.
Cuando la carretera en una determinada dirección está congestionada, el tiempo del tráfico en dirección este-oeste, norte-sur se puede controlar y ajustar manualmente.
En caso de emergencia, los semáforos de cada intersección mostrarán luces rojas y el tubo digital mantendrá los datos sin cambios.
;Registro de trabajo y asignación de unidades de almacenamiento
;1. Registro de trabajo
;R2 se establece en el número de interrupciones del temporizador, R6 y R7 se utilizan para retraso Registros en el programa
2. Unidad de almacenamiento en chip
; 30H y 31H se utilizan como dos conjuntos de unidades de almacenamiento de datos de pantalla de tubo digital 32H y 33H; las unidades de almacenamiento del estado inicial del semáforo se utilizan como unidades de almacenamiento de datos de visualización del semáforo
3. Bits de bandera
; bit de bandera de tráfico este-oeste; 02H: bit de bandera de evento de emergencia
;----------------------------- -----
SNF EQU 00H;;; Bit de bandera de tráfico norte-sur
EWF EQU 01H;;;Bit de bandera de tráfico este-oeste
URF EQU 02H;;; Bit de indicador de evento de emergencia
ORG 0000H
LJMP MAIN ;;; Encendido y transferencia al programa principal
ORG 000BH ;;; Entrada de interrupción de temporización
LJMP DSZD
ORG 0003H;;; Entrada de interrupción de emergencia
LJMP URZD
ORG 0030H
MAIN: LCALL INIT;;; subrutina de inicialización de llamada
LOOP: LCALL DIS;;; subrutina de visualización de ejecución de bucle
AJMP LOOP
;/// ////////Programa de inicialización
INIT: SETB SNF
SETB EWF
SETB URF
MOV R2, # 20;;; El temporizador interrumpe 20 veces durante 1 s
MOV TMOD, #01H ;;; Temporizador de inicialización
MOV TL0, #0B0H
MOV TH0, # 3CH
SETB EA ;;; Temporización de apertura Interrupciones e interrupciones de emergencia
SETB ET0
SETB TR0
SETB EX0
SETB IT0;;; Establece el modo de control del programa de interrupción
MOV DPTR, #TAB;;; Coloca la primera dirección numérica en DPTR
MOV 40H, #40;;; Configuración del tiempo de tránsito sureste y noroeste
MOV 41H, # 40
MOV 30H, #40;;; inicialización del tiempo de tránsito
MOV 31H, #60
MOV P0, #4CH;;; durante la inicialización
Tráfico norte y sur y ponga el estado del semáforo en 32H y 33H respectivamente
MOV 32H, #4CH
MOV P2, #15H
MOV 33H, # 15H
RET
;////////////Mostrar subrutina
DIS: MOV P3, #0DFH;;; y sur Tubo digital de diez dígitos en la dirección
MOV A, 30H;;; Envía los datos de visualización a la pantalla del tubo digital
MOV B, #10
DIV AB
MOVC A, @A DPTR
MOV P1, A;;;
LCALL D1MS
MOV P3, #0EFH;;; Seleccionar las unidades del tubo digital en dirección norte-sur
MOV A, B;;; Enviar a la pantalla del tubo digital
MOVC A, @A DPTR
MOV P1, A
LCALL D1MS
MOV P3, #7FH;;; Seleccione el tubo digital de diez dígitos en dirección este-oeste
MOV A, 31H;;; Enviar en Pantalla de tubo digital
MOV B, #10
DIV AB
MOVC A, @A DPTR
MOV P1, A p>
LCALL D1MS
MOV P3, #0BFH ;;; seleccione el tubo de dígitos de las unidades en dirección este-oeste
MOV A, B
MOVC A, @A DPTR
MOV P1, A
LCALL D1MS
SETB P3. 0
SETB P3.1
JNB P3.0, DIS_S;;; Consulta si se presiona el primer botón
JNB P3.1, DIS_E;; ; Consultar si se presiona el segundo botón
AJMP DIS_R;;; Regresar si no se presiona ninguna tecla
DIS_S: LCALL D5MS;;;Rebote del botón
JNB P3.0, DIS_SN
AJMP DIS_R
DIS_SN: MOV 40H, #50;;; Redistribuir el tiempo de tráfico, alargar el tiempo de tráfico norte-sur
MOV 41H, #30
AJMP DIS_R
DIS_E: LCALL D5MS;;; rebote de tecla
JNB P3.1, DIS_EW
AJMP DIS_R
<p>DIS_EW: MOV 40H, #30;;; Tiempo de viaje extendido de este a oeste
MOV 41H, #50
DIS_R: RET
;// // /// Manejador de interrupciones temporizadas
DS_C: LJMP DS_R;;; Salto de relé
DSZD: PUSH ACC;;;Proteger la escena
PUSH PSW
CLR TR0;;; Apague el temporizador y el bit de bandera de interrupción y reasigne el valor
CLR TF0
MOV TL0, #0B0H
MOV TH0, #3CH
DJNZ R2, DS_C;;; Determinar si se alcanza el tiempo de 1 m
MOV R2, #20;;; p>
DIC 30H ;;;Disminuir el tiempo para el tráfico norte-sur en uno
MOV A, 30H;;;Enviar el tiempo menos uno a la unidad de almacenamiento de visualización
;;;;;;;Tráfico norte-sur La luz amarilla parpadea al llegar a los últimos 4 segundos
DS_10: CJNE A, #4, DS_11;;; tiempo de paso
JNB SNF, DS_11;;; Determinar si es tráfico norte-sur
MOV P0, #8AH
MOV 32H, #8AH;; ; Almacenar el estado del semáforo en la unidad de almacenamiento (similar más adelante)
DS_11: CJNE A, #3, DS_12;;; No quedan 3 segundos, regresar
JNB SNF, DS_12 ;;; No tiempo de viaje norte-sur, regreso
MOV P0, #88H
p>MOV 32H, #88H
DS_12: CJNE A, # 2, DS_13
JNB SNF, DS_13
MOV P0, #8AH
MOV 32H, #8AH
DS_13: CJNE A, #1, DS_14
JNB SNF, DS_14
MOV P0, #88H
MOV 32H, #88H
;--- ---------------------
DS_14: JNZ DS_NE ;;; Si el tiempo de tráfico no termina, recurre al tubo digital que cambia la dirección este-oeste
CPL SNF ;;; Si el tiempo de tráfico termina, el bit de bandera se invierte
JNB SNF , DS_1;;; permitido
MOV 30H, 40H;;; Sí, enciende el semáforo correspondiente
MOV P0, #4CH
MOV 32H, #4CH;;; Almacenar estado del semáforo
MOV P2, #15H
MOV 33H, #15H;;; Almacenar estado del semáforo
DS_NE: DIC 31H;;; Disminuir el tiempo de viaje este-oeste en uno
MOV A, 31H;;;Enviar el tiempo de viaje restante a la unidad de almacenamiento de visualización
;;; ;;;; ;La luz amarilla parpadea faltando 4 segundos en dirección este-oeste (las notas del programa son similares a las de dirección norte-sur)
DS_20: CJNE A, #4, DS_21
JB EWF, DS_21
p>MOV P0, #51H
MOV 32H, #51H
DS_21: CJNE A, # 3, DS_22
JB EWF, DS_22
MOV P0, #41H
MOV 32H, #41H
DS_22: CJNE A, #2, DS_23
JB EWF, DS_23
MOV P0, #51H
MOV 32H, #51H
DS_23: CJNE A , #1, DS_24
JB EWF, DS_24
MOV P0, #41H
MOV 32H, #41H
-- ---------- ------------
DS_24: JNZ DS_R;;;La hora en dirección este-oeste no ha finalizado, regresa
CPL EWF;;;Invierte el estado del tráfico
JNB EWF, DS_2;;; llega la hora del tráfico de este a oeste, salta
MOV 31H, #80;;; Finaliza el tráfico de este a oeste, vuelve a mostrar la hora
MOV P0, #89H;;; Enciende el semáforo correspondiente
MOV 32H, # 89H
MOV P2, #29H
MOV 33H, #29H
AJMP DS_R
DS_1: MOV 30H, #80;; ; El tiempo de viaje norte-sur ha terminado, reasigne la unidad de almacenamiento de visualización
MOV P0, # 89H ;;; Ejecute el estado de giro 1
MOV 32H, #89H; p>
MOV P2, #26H
MOV 33H, #26H
AJMP DS_NE
DS_2: MOV 31H, 41H;;; la dirección comienza a pasar, asignada a la unidad de almacenamiento de visualización
MOV P0, #
61H;;; encender el semáforo correspondiente
MOV 32H, #61H
MOV P2, #15H
MOV 33H, #15H
DS_R: SETB TR0
POP PSW;;;Restaurar escena
POP ACC
RETI
;//// /////////Manejador de interrupciones de emergencia
URZD: PUSH ACC;;;Protege la escena
PUSH PSW
CLR IE0;;; Borrar bit de indicador de interrupción
CLR TR0 ;;; Temporizador de apagado
CPL URF ;;;Bit de indicador de emergencia
JB URF, UR_CON ;;;Bit de indicador de emergencia final; saltar
MOV P0, #49H;;; todas las luces de la intersección muestran luces rojas
MOV P2, #15H
AJMP UR_R
p >UR_CON: SETB TR0;;; reanudar el tráfico normal
MOV A, 32H
MOV P0, A
MOV A, 33H
p>MOV P2,A
UR_R: POP PSW;;;Restaurar escena
POP ACC
RETI
; ////////////Instrucciones de la tabla de búsqueda 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
TAB: DB 3FH, 06H, 5BH , 4FH, 66H, 6DH
DB 7DH, 07H, 7FH, 6FH
//////////Retraso 5ms y 1ms
; D5MS: MOV R7, #5
D1MS: MOV R7, #10
MOV R6, #50
L1: DJNZ R6, $
DJNZ R7, L1
RET
FIN