Академический Документы
Профессиональный Документы
Культура Документы
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---------------------------
ORG 0x00
GOTO INICIO
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
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
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
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;
}