Gestione di un impianto semaforico
con microcontrollore PIC 16F84.
3 diodi LED di colore Rosso, Verde e Giallo. 3 Resistenze da 270Ω. 4 Resistenze da 10KΩ. 3 Pulsanti normalmente chiusi (NC), 1 Pulsante normalmente aperto (NA) per il RESET.
Descrizione
Si riporta il listato del programma in linguaggio assembly per il PIC 16F84.
La porta B è impostata come uscita.. Le linee RB0 RB1 RB2 pilotano, rispettivamente, i LED ROSSO , GIALLO e VERDE.
La porta A è impostata come ingresso. La subroutine SCELTA seleziona la modalità di funzionamento:
· Un impulso positivo su RA0 (RA2RA1RA0 = 001) attiva la sequenza del normale funzionamento del semaforo (subroutine FUNZ);
· Un impulso positivo su RA1 (RA2RA1RA0 = 010) attiva il ciclo notte per cui si ha il giallo lampeggiante (subroutine NOTTE);
· Un impulso positivo su RA2 (RA2RA1RA0 = 100) pone il PIC in modalità SLEEP (subroutine FERMA).
Per riprendere il funzionamento è necessario fornire un impulso di RESET sul piedino MCLR.
La subroutine DELAY imposta la durata dell’accensione dei diodi LED.
|
; **SEMAFORO** PROCESSOR 16F84 RADIX DEC INCLUDE "P16F84.INC" ORG 0CH Sema RES 1 Moda RES 1 Count RES 1 Count1 RES 1 INIZIO: ORG 00H bsf STATUS,RP0 movlw 00H movwf Sema movlw 255 movwf TRISA movlw 00000011B movwf OPTION_REG bcf STATUS,RP0 movlw 00H movwf Sema movlw 00H movwf Moda call SCELTA: goto 00H SCELTA: bcf STATUS,RP0 movf PORTA,0 movwf Moda BTFSC Moda,0 goto FUNZ BTFSC Moda,1 goto NOTTE BTFSC Moda,2 goto FERMA return FUNZ: bsf STATUS,RP0 movlw 00H movwf TRISB bcf STATUS,RP0 ;Accende VERDE movlw 100B movwf Sema movwf PORTB |
call DELAY call DELAY call DELAY call SCELTA: ;Accende GIALLO movlw 010B addwf Sema movf Sema,w movwf PORTB call DELAY call SCELTA: ;Accende ROSSO movlw 001B movwf Sema movf Sema,w movwf PORTB call DELAY call DELAY call SCELTA: goto FUNZ NOTTE: bsf STATUS,RP0 movlw 00H movwf OPTION_REG movlw 11111101B movwf TRISB bcf STATUS,RP0 bsf PORTB,1 GA ; Giallo Acceso call DELAY1 btfsc PORTB,1 goto GS bsf PORTB,1 call SCELTA: goto GA GS ; Giallo Spento bcf PORTB,1 call SCELTA: goto GA DELAY: movlw 00000101B movwf OPTION_REG movlw 6 movwf TMR0 |
movlw 125 movwf Count DelayLoop movf TMR0,W btfss STATUS,Z goto DelayLoop movlw 6 movwf TMR0 decfsz Count,1 goto DelayLoop return DELAY1: movlw 00000011B movwf OPTION_REG movlw 6 movwf TMR0 movlw 125 movwf COUNT1 DelayLoop1 movf TMR0,w btfss STATUS,Z goto DelayLoop1 movlw 6 movwf TMR0 decfsz COUNT1,1 goto DelayLoop1 return FERMA: BTFSC Moda,2 sleep goto INIZIO END |