Control de 2 semáforos.
-Uso de contadores
-Subrutina de retardo calibrado a 1 s para un cristal de 10 MHz
Diagrama de conexión:
Funcionamiento:
La luz Verde dura 25 segundos.
La Luz Ámbar dura 5 segundos.
La Luz Roja dura 30 segundos.
- Se crea una variable TIME que se incrementa cada 1 segundo (calibrado mediante contadores para un cristal de 10 MHz).
- Se verifica la variable TIME para cambiar el estado de las luces según el siguiente diagrama:
Programa en Assembler:
;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa de control de 2 semaforos
;Salidas: Puerto B (RB0-RB5)
; RB0=Verde1, RB1=Ambar1, RB2=Rojo1
; RB3=Verde2, RB4=Ambar2, RB5=Rojo2
;---------------------------------------------------------
include "p16f84a.inc"
list P=16f84a
__CONFIG _WDT_OFF & _XT_OSC
TIME equ 0x0C
COUNT1 equ 0x0D
COUNT2 equ 0x0E
COUNT3 equ 0x0F
org 0x00 ; Inicio de programa
bsf STATUS,5 ; Inicio configiracion E/S
clrf PORTB ; Puerto B como salida
bcf STATUS,5 ; Fin configuracion E/S
movlw 0x21 ; b'000100001'
movwf PORTB ; RB0=Verde1 y RB5=Rojo2
BEGIN: call COUNTER ; Llama a subrutina COUNTER
movlw 0x00 ; 0 segundos
subwf TIME,0
btfsc STATUS,2 ; Si TIME =0 segundos saltar a FIRST
goto FIRST
movlw 0x19 ; 25 segundos
subwf TIME,0
btfsc STATUS,2 ; Si TIME=25 segundos saltar a SECOND
goto SECOND
movlw 0x1E ; 30 segundos
subwf TIME,0
btfsc STATUS,2 ; Si TIME=30 segundos saltar a THIRD
goto THIRD
movlw 0x37 ; 55 segundos
subwf TIME,0
btfsc STATUS,2 ; Si TIME=55 segundos saltar a FOURTH
goto FOURTH
goto FINISH
FIRST: movlw 0x21 ; b'000100001'
movwf PORTB ; RB0=Verde1 y RB5=Rojo2
goto FINISH
SECOND: movlw 0x22 ; b'000100010'
movwf PORTB ; RB1=Ambar1 y RB5=Rojo2
goto FINISH
THIRD: movlw 0x0C ; b'00001100'
movwf PORTB ; RB2=Rojo1 y RB3=Verde2
goto FINISH
FOURTH: movlw 0x14 ; b'00010100'
movwf PORTB ; RB2=Rojo1 y RB4=Ambar2
goto FINISH
FINISH: goto BEGIN
;Subrutinas
COUNTER movlw 0xFA ; Subrutina para que TIME
movwf COUNT1 ; se incremente cada 1 segundo
movlw 0xC8 ; calibrado para cristal de 10 MHz
movwf COUNT2 ; modificar COUNT1, COUNT2 y COUNT3
movlw 0x12 ; para otras frecuencias
movwf COUNT3
LOOP: decfsz COUNT1,1
goto LOOP
movlw 0xFA
movwf COUNT1
decfsz COUNT2,1
goto LOOP
movlw 0xFA
movwf COUNT1
movlw 0xC8
movwf COUNT2
decfsz COUNT3,1
goto LOOP
incf TIME,1
movlw 0x3C ; 60 segundos entonces reiniciar TIME
subwf TIME,0
btfsc STATUS,2
clrf TIME
return
end ; Fin de programa
****Programa Pic Basic (Microcode)****
'****************************************************************
'* Name : SEMAFORO.BAS *
'* Author : LONELY113 *
'* Notice : Copyright (c) 2011 LONELY113 *
'* : All Rights Reserved *
'* Date : 12/05/2011 *
'* Version : 1.0 *
'* Notes : PIC16F84a *
'* : RB0=GREEN1, RB1=YELLOW1, RB2=RED1 *
'* : RB3=GREEN2, RB4=YELLOW2, RB5=RED2 *
'****************************************************************
@ __config _HS_OSC & _WDT_OFF
DEFINE OSC 10 '10 MHz
trisb=$00 'Puerto B como salida
loop1:
portb=100001 'Green1, Red2
PAUSE 25000 'Retardo de 25 segundo
portb=100010 'Ambar1, Red2
PAUSE 5000 'Retardo 5 segundos
portb=001100 'Red1, Green2
PAUSE 25000 'Retardo 25 segundos
portb=010100 'Red1, Yellow2
PAUSE 5000 'Retardo 5 segundos
GOTO loop1
END
Archivos .ASM y .HEX
Descargar
ke bien .. falta ke el verde parpadee antes de cambiar al ambar :)
ResponderEliminarTe quedo muy buien, solo una pregunta, como le isiste para simular el semaforo en el proteus??
ResponderEliminarA que te refieres exactamente, sabes simular pics en proteus?
EliminarSaludos.
quien me podría ayudar a programar 2 semáforos con su paso peatonal
ResponderEliminarcomo hago pa que se choquen mis autos con el semaforo desconpuesto
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarComo modifico el U1(MLCR) por que cuando o inserto no enciende le modifique a una opcion pero solo enciende el rojo y el verde respectivos de cada semaforo
ResponderEliminareso yo mismo me pregunto
Eliminar