Solicitud urgente: Control de semáforo con 51 microcontroladores
ORG 0000H; Dirección de entrada del programa principal
LJMP MAIN; Saltar al principio del programa principal
ORG 0003H Interrumpir la entrada del programa de interrupción externa; 0 Dirección
ORG 000BH; Dirección de entrada del programa de interrupción del temporizador 0
LJMP T0_INT; Saltar a la rutina de servicio de interrupción
ORG 0013H Interrupción externa 1 Interrupción del programa; dirección de entrada
PRINCIPAL: MOV SP, #50H
MOV IE, #8EH; la CPU activa la interrupción, permite la interrupción T0, la interrupción T1 y la interrupción externa 1
MOV TMOD, #51H; configure T1 en modo de conteo, T0 en modo de sincronización y ambos funcionan en modo 1
MOV TH1, #00H; Borre el contador T1
MOV TL1; , #00H
SETB TR1; Iniciar temporizador T1
SETB EX1; Permitir interrupción INT1
SETB IT1; Seleccionar modo de disparo de borde
MOV DPTR, #0003H
MOV A, #80H; Asignar valor inicial a 8255, 8255 funciona en modo 0
MOVX @DPTR, A
OTRA VEZ: JB P3.1, N0; determine si se debe establecer el valor inicial del tiempo del semáforo este-oeste, si P3.1 es 1, salte
MOV A, P1
JB; P1.7, RED; determine si P1.7 es 1. Si es 1, configure el tiempo de luz roja; de lo contrario, configure el tiempo de luz verde
MOV R0, #00H;
MOV R0, A; almacena el tiempo inicial de luz verde este-oeste
MOV R3, A
LCALL DISP1
LCALL DELAY
AJMP OTRA VEZ
ROJO: MOV A, P1
ANL A, #7FH; P1.7 está configurado en 0
MOV R7, # 00H se borra R7
MOV R7, A; almacena el tiempo inicial de la luz roja este-oeste
MOV R3, A
LCALL DISP1
p>RETRASO DE LLAMADA
AJMP OTRA VEZ
--------------------------; -------- ---------
N0: SETB TR0; iniciar temporizador T0
MOV 76H, R7; el tiempo de luz roja se almacena en 76H
N00: MOV A, 76H; la dirección este-oeste está prohibida, se permite la dirección norte-sur
MOV R3, A
MOV DPTR, #0000H; configurado en el puerto 8255A, la luz roja está encendida en dirección este-oeste y la luz verde está encendida en dirección norte-sur.
MOV A, #0DDH
MOVX @DPTR, A
N01: JB P2.0, B0
N02: SETB P3.0
CJNE R3, #00H, N01; comparar si el valor en R3 es 0, y si no es 0, girar Ir al comando actual y ejecutar
;------La luz amarilla parpadea durante 5 segundos, programe------
N1: SETB P3.0
MOV R3, #05H
MOV DPTR, #0000H; al puerto 8255A, este-oeste, norte-sur luz amarilla encendida
MOV A, #0D4H
MOVX @ DPTR, A
N11: MOV R4, #00H
N12: CJNE R4, #7DH, $; la luz amarilla permanece encendida durante 0,5 segundos
N13: MOV DPTR, #0000H; configure el puerto 8255A, la luz amarilla está encendida la dirección norte-sur está apagada
MOV A, #0DDH
MOVX @DPTR, A
N14: MOV R4, #00H
CJNE R4, #7DH, $; la luz amarilla continúa apagada por 0.5 segundos
CJNE R3, #00H, N1 el tiempo de parpadeo llega a 5 segundos y se apaga
-------------------------------------------------- -------------
N2: MOV R7, #00H
MOV A, R0; circulación este-oeste, norte-sur prohibido p>
MOV R3, A
MOV DPTR, #0000H; configurado en el puerto 8255A, la luz verde en dirección este-oeste está encendida, la luz roja en dirección norte-sur está encendida
MOV A, #0EBH
MOVX @DPTR, A
N21: JB P2.0, T03
N22: CJNE R3 , #00H, N21
;----- -Programa de luz amarilla intermitente durante 5 segundos------
N3: MOV R3, #05H
MOV DPTR, #0000H; Establezca el puerto 8255A, este-oeste, norte-sur, la luz amarilla está encendida
MOV A, #0E2H
MOVX @DPTR, A p>
N31: MOV R4, #00H
CJNE R4, #7DH , $; la luz amarilla permanece encendida durante 0,5 segundos
N32: MOV DPTR, #0000H; Configure el puerto 8255A, la luz amarilla se apaga en las direcciones norte y sur
MOV A, #0EBH
MOVX @D
PTR, A
N33: MOV R4, #00H
CJNE R4, #7DH, $; la luz amarilla permanece apagada por 0.5 segundos
CJNE R3, #00H, N3; Salir si el tiempo de parpadeo alcanza los 5 segundos
SJMP N00
------Programa de alarma de luz roja------
B0: MOV R2, #03H; La duración de la alarma es de 3 segundos
B01: MOV A, R3
JZ N1; ya no ocurre
CLR P3.0; Alarma
CJNE R2, #00H, B01; Determinar si han transcurrido 3 segundos
SJMP N02
; ------Subrutina de retardo de 1 segundo -------
N7: RETI
T0_INT: MOV TL0, #9AH; 10 ms al temporizador T0
MOV TH0, #0F1H
INC R4
INC R5
CJNE R5, #0FAH, T01; si el retraso es suficiente para un segundo o no. Luego llame a la subrutina de visualización
MOV R5, #00H Clear R5
DEC R3 Disminuya el valor de cuenta regresiva inicial en uno; p>
DEC R2; Disminuir el valor de alarma inicial 1
T01: ACALL DISP; Llamar a la subrutina de visualización
RETI; ----Mostrar subrutina----- -
DISP: JNB P2.4, T02
DISP1: MOV B, #0AH
MOV A , R3 mediana de dos a diez conversión de pantalla
DIV AB
MOV 79H, A
MOV 7AH, B
DIS: MOV A, 79H; muestra el dígito de las decenas
p>
MOV DPTR, #TAB
MOVC A, @A DPTR
MOV DPTR, #0002H
MOVX @DPTR, A
MOVX @DPTR, #0001H
MOV A, #0F7H
MOVX @DPTR, A p>
RETARDO DE LLAMADA
DS2: MOV A, 7AH; muestra los dígitos
MOV DPTR, #TAB
MOVC A, @A DPTR
MOV DPTR, #0002H
MOVX @DPTR,A
MOV DPTR, #0001H
MOV A, #0FBH
MOVX @DPTR, A
RET
----- -Programa de detección de flujo de tráfico en dirección este-oeste------
T03: MOV A, R3
SUBB A, #00H Si se completa la cuenta regresiva de la luz verde; , ya no se detectará el flujo de tráfico
JZ N3
JB P2.0, T03
INC R7
CJNE R7, #64H, E1
MOV R7, #00H; despejado después de 100 interrupciones
E1: SJMP N22
------Tráfico este-oeste programa de visualización de flujo----- -
T02: MOV B, #0AH
MOV A, R7 mediana de conversión de visualización de dos a diez
DIV AB
MOV 79H, A
MOV 7AH, B
DIS3: MOV A, 79H; muestra dígitos de decenas
MOV DPTR, #TAB
MOVC A, @A DPTR
MOV DPTR, #0002H
MOVX @DPTR, A
MOV DPTR, # 0001H
MOV A, #0F7H
MOVX @DPTR, A
LCALL DELAY
DS4: MOV A, 7AH; dígito
MOV DPTR, #TAB
MOVC A, @A DPTR
MOV DPTR, #0002H
MOVX @DPTR, A
MOV DPTR, #0001H
MOV A, #0FBH
MOVX @DPTR, A
LJMP N7
;---- --Subrutina Delay 4MS----------
RETARDO: MOV R1, #0AH
BUCLE: MOV R6, #64H
NOP
LOOP1: DJNZ R6, LOOP1
DJNZ R1, LOOP
RET
-- ----Tabla de caracteres ------
TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
END