Red de conocimiento informático - Conocimiento de la instalación - Buscando un programa de semáforo simple escrito en lenguaje ensamblador para un microcontrolador. Por favor ayudenme, expertos. Gracias.

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

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

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