Вы находитесь на странице: 1из 7

Control de semforos en una vialidad usando un pic16f887 y ensamblador

Control de semforos en una vialidad usando un pic16f887 y ensamblador


Objetivos:

Interruptor de on/off
Interruptor de modo ( da o noche)

Diagrama Proteus:

Programa ASM:
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOREN_OFF & _CPD_OFF & _CP_OFF &
_MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _FOSC_INTRC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF;

LIST P=16F887
INCLUDE "P16F887.INC"

;ASIGNACION DE VARIABLES---------------------------

CONTADOR1 EQU 0X0C ; Registro auxiliar


CONTADOR2 EQU 0X0D
CONTADOR3 EQU 0X0F

;INICIO DEL PROGRAMA ---------------------------

ORG 0x00
GOTO INICIO

;SETEO DE PUERTOS ------------------------------------

INICIO
CLRF CONTADOR1
CLRF CONTADOR2
CLRF CONTADOR3

BANKSEL PORTA ;
CLRF PORTA ;

BANKSEL ANSEL ;
CLRF ANSEL ; DIGITAL I/O

BANKSEL TRISA ;
MOVLW b'11111111' ; PORT A ENTRAD
MOVWF TRISA ;

BANKSEL PORTC
CLRF PORTC ; Puerta C como salida

BANKSEL TRISC ;
MOVLW b'00000000' ;
MOVWF TRISC ; CLRF TRISC

BANKSEL PORTD
CLRF PORTD ; Puerta D como salida

BANKSEL TRISD ; Configuro el Puerto D como salida


MOVLW b'00000000' ;
MOVWF TRISD ;

;PARTE PRINCIPAL DEL PROGRAMA ------------------------


ONOFF
BANKSEL PORTA
BTFSC PORTA,5 ;PREGUNTO POR BOTON PREGUNTO SI RA5 ==0 ES CERO
GOTO ONOFF ; FALSO NO ES CERO RA3==1

SWITCH
BANKSEL PORTA
BTFSS PORTA,3 ; RA3==1 PREGUNTO POR ON/OFF
GOTO MODO_NOCHE ; FALSO RA3==0
GOTO MODO_DIA ; VERDAD RA3==1
MODO_DIA
BSF PORTC,1 ; ROJO PRINCIPAL
BSF PORTC,5 ;PASO PEATON PRINCIPAL
BSF PORTD,2 ;VERDE SECUNDARIA
BSF PORTD,3 ;ALTO PEATON SECUNDARIA
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS

BCF PORTC,1
CLRF PORTC ;PRINCIPAL
CLRF PORTD ;SECUNDARIA
BSF PORTC,1 ;ROJO
BSF PORTC,5 ;PASO PEATON PRINCIPAL
BSF PORTC,2 ;AMARILLO
BSF PORTC,5 ;PASO PEATON PRINCIPAL
BSF PORTD,3 ;ALTO PEATON SECUNDARIA
BSF PORTD,1 ;AMARILLO SECUNDARIA
BSF PORTD,3 ;ALTO PEATON SECUNDARIA
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS

BCF PORTC,1
CLRF PORTC
CLRF PORTD
BSF PORTC,3 ;VERDE
BSF PORTC,4 ;ALTO PEATON PRINCIPAL
BSF PORTD,0 ;ROJO
BSF PORTD,4 ;PASO PEATON SECUNDARIA
BSF PORTC,4 ;ALTO PEATON PRINCIPAL
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS

BCF PORTC,1
CLRF PORTC
CLRF PORTD
BSF PORTC,2 ;AMARILLO PRINCIPAL
BSF PORTC,4 ;ALTO PEATON PRINCIPAL
BSF PORTD,4 ;PASO PEATON SECUNDARIA
BSF PORTD,0 ;ROJO SECUNDARIA
BSF PORTD,1 ;AMARILLO SECUNDARIA
BSF PORTD,4 ;PASO PEATON SECUNDARIA
BSF PORTC,4 ;ALTO PEATON PRINCIPAL
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS

BCF PORTC,1
CLRF PORTC
CLRF PORTD
GOTO SWITCH

MODO_NOCHE
BSF PORTC,1 ; ROJO PRINCIPAL
BSF PORTC,5 ; PASO PEATON PRINCIPAL
BSF PORTD,1 ; AMARILLO SECUNDARIA
BSF PORTD,3 ; ALTO PEATON SECUNDARIA
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS

BCF PORTC,1 ;PRINCIPAL


CLRF PORTC
CLRF PORTD

CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS
CALL RETARDO_400MS

GOTO SWITCH

RETARDO_400MS
MOVLW 0X0
MOVWF CONTADOR1
MOVLW 0X08
MOVWF CONTADOR2
MOVLW 0X08
MOVWF CONTADOR3

RETARDO1
DECFSZ CONTADOR1,F
GOTO RETARDO1
DECFSZ CONTADOR2,F
GOTO RETARDO1
DECFSZ CONTADOR3,F
GOTO RETARDO1
RETURN

END

MOVLW 00H
MOVWF PORTB
SEPRENDE
BTFSS PORTA,0
goto SEPRENDE
VERDE
MOVLW b'01'
MOVWF PORTB
call Retardo_5s
MOVLW b'00'
MOVWF PORTB
call Retardo_1s
MOVLW b'01'
MOVWF PORTB
call Retardo_1s
MOVLW b'00'
MOVWF PORTB
call Retardo_1s
MOVLW b'01'
MOVWF PORTB
call Retardo_1s
AMARILLO
MOVLW b'10'
MOVWF PORTB
call Retardo_2s
ROJO
MOVLW b'100'
MOVWF PORTB
call Retardo_5s
GOTO VERDE
INCLUDE <RETARDOS.INC>
END

#include <16f84a.h> //PIC a utilizar


#fuses XT,NOWDT,NOPROTECT,NOPUT //ordenes para el programador
#use delay (clock=4000000) //Se usaran retardos tomando en cuenta que la
frecuencia del
//oscilador es de 4Mhz
#use fast_io(a) //Rpida entrada y salida

int Modo=1, Temp=1, i=0; //Declaracin de variables del tipo entero

//Prototipo de la funcion que configurara los puertos


void Config_Puertos(void);
//Funciones de interrupciones
#INT_EXT //Para la interrupcin INT (RB0)
void EXT_isr(void)
{
Modo++;
if(Modo==3)
{
Modo=1;
Temp=1;
}
}

#INT_RB //Para la interrupcin RB (RB4)

void RB_isr(void)
{
if(input(PIN_B4))
{
Temp++;
}
if(Modo==1 && Temp==3)
{
Temp=1;
}
if(Modo==2 && Temp==4)
{
Temp=1;
}
}
///Programa principal

void main(void)
{
Config_Puertos();//Llamado a funcion
while(true)
{
if(Modo==1)//Modo automatico
{
output_low(PIN_A2); //led verde off
output_low(PIN_A1); //led amarillo off
output_low(PIN_A0); //led rojo off
if(Temp==1)//Temporizacion 1
{
output_high(PIN_A2); //led verde on
delay_ms(6000);
output_low(PIN_A2); //led rojo off
for(i=0;i<=4;i++)
{
output_high(PIN_A1); //led amarillo on
delay_ms(500);
output_low(PIN_A1); //led amarillo off
delay_ms(500);
}
output_high(PIN_A0);//lrd rojo on
delay_ms(4000);
output_low(PIN_A0); //led rojo off
}
if(Temp==2)//Temporizacion 2
{
output_high(PIN_A2); //led verde on
delay_ms(4000);
output_low(PIN_A2); //led rojo off
for(i=0;i<=3;i++)
{
output_high(PIN_A1); //led amarillo on
delay_ms(500);
output_low(PIN_A1); //led amarillo off
delay_ms(500);
}
output_high(PIN_A0);//lrd rojo on
delay_ms(6000);
output_low(PIN_A0); //led rojo off
}
}
if(Modo==2)//Modo manual
{
while(Temp==1)
{
output_high(PIN_A2); //led verde on
output_low(PIN_A1); //led amarillo off
output_low(PIN_A0); //led rojo off
}
while(Temp==2)
{
output_low(PIN_A2); //led verde off
output_high(PIN_A1); //led amarillo on
delay_ms(500);
output_low(PIN_A1); //led amarillo off
delay_ms(500);
output_low(PIN_A0); //led rojo off
}
while(Temp==3)
{
output_low(PIN_A2); //led verde off
output_low(PIN_A1); //led amarillo off
output_high(PIN_A0); //led rojo on
}
}
} //bucle infinito
}

void Config_Puertos(void)
{
set_tris_A(0xF8); //portA como salidas(RA0, RA1 y RA2 ,las demas
desactivadas)
set_tris_B(0xFF);
enable_interrupts(GLOBAL); //todas las interrupciones activadas
enable_interrupts(INT_EXT);//Habilitando interrupcion externa (RB0)
enable_interrupts(INT_RB);//Habilitando interrupciones de cambio de nivel
(RB4-RB7)
ext_int_edge(H_TO_L);//Seleccionando flanco de interrupcion externa
output_low(PIN_A2); //led verde off
output_low(PIN_A1); //led amarillo off
output_low(PIN_A0); //led rojo off
Modo=1;
Temp=1;
}

Вам также может понравиться