La interfície amb LED és el primer que s’intentaria fer mentre es començava a utilitzar qualsevol microcontrolador. Així doncs, aquí en aquest tutorial farem una interfície amb un LED amb microcontrolador 8051 i escriurem un programa C per parpellejar el LED. Hem utilitzat un microcontrolador AT89S52, de la família 8051, molt popular per ATMEL.
Abans d’entrar en detall, hauríem de tenir una breu idea sobre el microcontrolador AT89S52. És un microcontrolador de 40 pins i té 4 ports (P0, P1, P2, P3), cada port té 8 pins. Podem considerar cada port com a registre de 8 bits, des del punt de vista del programari. Cada pin que té una línia d'entrada / sortida, significa que cada pin es pot utilitzar tant per a l'entrada com per a sortida, és a dir, per llegir dades d'un dispositiu com el sensor o per proporcionar la seva sortida a algun dispositiu de sortida. Alguns pins tenen la funcionalitat Dual, que s’ha esmentat entre parèntesis al diagrama de pins següent. Funcionalment dual com per a interrupcions, comptadors, temporitzadors, etc.

AT89S52 té dos tipus de memòria, la primera és la memòria RAM que té 256 bytes de memòria i la segona és la EEPROM (memòria només de lectura programable i esborrable electrònicament) que té 8k bytes de memòria. La RAM s'utilitza per emmagatzemar les dades durant l'execució d'un programa i l'EEPROM s'utilitza per emmagatzemar el propi programa. EEPROM és la memòria flash en què vam utilitzar per gravar el programa.
Diagrama del circuit i explicació
Estem utilitzant el pin 1 del port 1 per connectar el LED. A la programació C incrustada podem accedir al PIN 1 del port 1 mitjançant P1_0. Hem connectat un oscil·lador de cristall de 11,0592 MHz de freqüència al PIN 19 i 18, és a dir, XTAL1 i XTAL2. L’oscil·lador de cristall s’utilitza per generar polsos de rellotge i el pols de rellotge s’utilitza per proporcionar la mitjana del càlcul del temps, que és obligatori per sincronitzar tots els esdeveniments. Aquest tipus de cristalls que s'utilitzen en gairebé tots els equips digitals moderns, com en ordinadors, rellotges, etc. El cristall més utilitzat és el quars. Es tracta d’un circuit oscil·lador ressonant i s’utilitzen condensadors per oscil·lar el cristall, de manera que hem connectat aquí condensadors de 22pf. Podeu llegir sobre "circuits ressonants" per saber-ne més.

El diagrama de circuits per a la interfície LED amb el microcontrolador 8051 89S52 es mostra a la figura anterior. El pin 31 (EA) està connectat a Vcc, que és un pin baix actiu. Això s'hauria de connectar a Vcc quan no utilitzem cap memòria externa. El pin 30 (ALE) i el pin 29 (PSEN) s’utilitzen per connectar el microcontrolador a la memòria externa i el pin 31 indica al microcontrolador que utilitzi memòria externa quan estigui connectat a terra. No fem servir cap memòria externa, de manera que hem connectat Pin31 a Vcc.
El pin 9 (RST) és el PIN de restabliment que s’utilitza per restablir el microcontrolador i el programa torna a començar des del principi. Restableix el microcontrolador quan està connectat a HIGH. Hem utilitzat circuits de restabliment estàndard, resistència de 10k ohm i condensador 1uF per connectar el pin RST.
Ara, la part interessant aquí és que connectem el LED al revés, vol dir negatiu amb el PIN del microcontrolador, perquè el microcontrolador no proporciona prou energia per encendre un LED, de manera que aquí el LED funciona amb la lògica negativa com quan, el pin P1_0 és 1 llavors el LED s’apagarà i quan la sortida del pin serà 0, el LED s’encendrà. Quan la sortida del PIN és 0, es comporta com el terra i el LED s’encén.
Explicació del codi
S'ha inclòs la capçalera REGX52.h per incloure les definicions bàsiques de registre. Hi ha molts tipus de variables i constants a la C incrustada com int, char, unsigned int, float, etc., les podeu aprendre fàcilment. Aquí estem fent servir int sense signar el rang de la qual va de 0 a 65535. Estem utilitzant "for loop" per crear un retard, de manera que el LED estarà encès durant algun temps (P1_0 = 0, lògica de LED negatiu) i i OFF (P1_0 = 1, lògica LED negativa) per al temps retardat. En general, quan "for loop" s'executa 1275 vegades, es produeix un retard d'1 ms, de manera que hem creat la funció "delay" per crear DELAY i l'hem cridada des del programa principal (main ()). Podem passar el temps DELAY (en ms) mentre cridem a la funció "delay" des de la funció principal. Al programa, "While (1)" significa que aquest programa s'executarà infinitament.
Estic explicant breument, com el funcionament de 1275 vegades del bucle "per" dóna un retard d'1 ms:
El 8051, un cicle de màquina requereix 12 polsos de cristall per executar-se i hem utilitzat un cristall de 11.0592Mhz.
Per tant, temps necessari per a 1 cicle de màquina: 12 / 11.0592 = 1.085us
Per tant, 1275 * 1,085 = 1,3 ms, 1275 vegades de bucle "for" dóna gairebé 1 ms de retard.
El temps de retard exacte produït pel programa "C" és molt difícil de calcular, quan es mesura des de l'oscil·loscopi (CRO), per (j = 0; j <1275; j ++) donar un retard de gairebé 1 ms.
Així ho podem entendre simplement mitjançant la interfície del LED amb el microcontrolador 8051, que amb una simple codificació que permet interactuar i controlar el maquinari mitjançant programari (programació) mitjançant microcontrolador. També podem manipular cada port i pin del microcontrolador mitjançant la programació.
