L' 8051 prevede cinque sorgenti di interruzione distinte. Solo due linee di richiesta interruzione sono messe a disposizione dell'utente (INT0 e INT1). Le altre tre sorgenti di interruzione sono il timer 0, il timer 1 e I'interfaccia seriale.
In figura sono schematizzati i vari blocchi di controllo che gestiscono i segnali di interruzione:
(La posizione a riposo degli interruttori corrisponde allo zero del Bit che li pilota)
Gli interrupt esterni possono essere attivi o sul fronte o sul livello, a seconda del valore impostato nei bit ITO e IT1 del registro TCON (si veda la parte relativa ai timer).
Se un'interruzione viene generata da una transizione, il flag
corrispondente viene settato (TF0, TF1 per i timer,
IE0 e IEI per gli interrupt esterni, si veda ancora la
parte relativa ai timer) per poi essere automaticamente posto a 0
quando il salto al relativo sottoprogramma di gestione viene
portato a termine.
Se l'interruzione è stata attivata sul livello, allora il flag
viene controllato direttamente dalla sorgente richiedente.
L'interruzione generata dalla porta seriale viene ottenuta
dall'or fra i due flag TI e RI (si veda la parte
relativa alla porta seriale) .
Quando si ha il salto al sottoprogramma di gestione, nessuno dei
due flag viene azzerato. Ciò permette al sottoprogramma di
gestione di stabilire se l'interruzione è stata generata dal
flag TI oppure RI.
Tutti i bit che generano un'interruzione possono essere modificati via software. Ciò permette di generare interruzioni software oppure cancellare interruzioni non ancora servite
Ogni sorgente di interruzione può essere abilitata o disabilitata a generare I'interruzione. Per far questo 1'8051 mette a disposizione un registro di mascheramento (IE) interruzioni.
La struttura del registro IE è la seguente:
| EA | -- | -- | ES | ET1 | EX1 | ET0 | EX0 |
(1=abilitato; 0=disabilitato)
EA (IE.7): abilitazione e disabilitazione generale delle interruzioni.
ES (IE.4) : bit di abilitazione interruzione per la porta seriale.
ET1 (IE.3) : bit di abilitazione interruzione per il timer 1.
EX1 (IE.2) : bit di abilitazione interruzione esterna INTI.
ETO (IE.1): bit di abilitazione interruzione per il timer 0.
EXO (IE.0): bit di abilitazione interruzione esterna INT0.
A ciascuna sorgente di interruzione è possibile associare uno fra i due livelli di priorità gestiti da11'8051.
La priorità di ciascuna sorgente di interruzione viene memorizzata in un apposito registro di priorità (IP):
| - | - | - | PS | PT1 | PX1 | PT0 | PX0 |
PS, PT1, PX1, PT0 e PX0 (IP.4 - IP.0): rappresentano rispettivamente le priorità delle sorgenti di interruzione porta seriale, timer 1, interruzione esterna INT1, timer 0 e interruzione esterna INT0.
La priorità viene attivata settando il bit relativo al
segnale.
La priorità di un segnale fa sì che il microprocessore
possa rispondere alla richiesta di interruzione anche mentre stà
eseguendo un servizio di interruzione. Naturalmente si deve
trattare di un servizio di interruzione chiamato da un segnale
senza priorità attivata.
Il microprocessore, sempre durante l'esecuzione di una routine di servizio, non può rispondere a una richiesta di interruzione che abbi la stessa priorità di quella che sta servendo.
Se due interruzioni a medesima priorità pervengono contemporaneamente, mentre il micro sta eseguendo un normale programma, una sequenza interna di polling decide quale deve essere asservita:
Quando un'interruzione viene riconosciuta, 1'8051 effettua una LCALL ad uno dei seguenti indirizzi della memoria dei programmi solo se l'istruzione in corso è diversa da RETI e da un'istruzione che modifica il contenuto dei registri IP ed EI:
| Indirizzo di salto | Sorgente interruzione | Indirizzo di memoria scheda DB8051 |
| 0003H(3) | INTO | 80A1H |
| 000BH(11) | Timer0 | 80A4H |
| 0013H (19) | INT1 | 80A7H |
| 001BH(27) | Timerl | 80AAH |
| 0023H (35) | Porta seriale | 80ADH |
Si noti che tra un indirizzo di salto e l'altro vi sono a disposizione 8 byte. Se il sottoprogramma di gestione occupa uno spazio minore o uguale ad 8 byte può essere inserito direttamente tra l'indirizzo di salto e il successivo. I1 sottoprogramma deve terminare con un'istruzione RETI. L'istruzione RETI si differenzia dall'istruzione RET semplicemente per il fatto che RETI informa la CPU che il sottoprogramma di gestione interruzione è terminato ed è quindi possibile accettare ulteriori richieste di interruzione. Dal punto di vista dell'utilizzo dello stack (recupero dell'indirizzo di ritorno) RET e RETI si comportano in modo identico.
Nel caso si utilizzi la scheda emulatore DB8051 siccome non è possibile scrivere in Eprom per associare la routine di servizio al segnale richiedente basta immettere nella cella di memoria RAM indicata l'indirizzo di partenza della subroutine di servizio.
Esempio:
il servizio di interruzione per INT1 di trova alla 8500h
MOV DPTR,#80A7H
MOV A,#85H
MOVX @DPTR,A
INC DPTR
MOV A,#00
MOVX @DPTR,A