Taula de continguts:
2025 Autora: John Day | [email protected]. Última modificació: 2025-01-13 06:57
El 8051 (també conegut com MCS-51) és un disseny MCU dels anys 80 que continua sent popular avui en dia. Els microcontroladors moderns compatibles amb 8051 estan disponibles a diversos proveïdors, en totes les formes i mides, i amb una àmplia gamma de perifèrics. En aquest instructiu veurem l’AT89C2051 MCU d’Atmel.
AT89C2051 és un microcontrolador petit (2Kbyte Flash, 128byte RAM), econòmic (~ 1,40 $ per xip).
- Funcionament de 2,7-6V
- 15 línies d'E / S
- 2 temporitzadors (16 bits)
- Interrupcions internes i externes
- UART
- Comparador analògic amb xip
- Fins a 2 MIPS amb un rellotge de 24 MHz
Pas 1: requisits
Requisits:
- PC Linux (programari requerit: Arduino IDE, git, make, sdcc)
- Arduino UNO
- Xip AT89C2051 (paquet DIP20)
- Endoll ZIF de 20 pins
- Optocoplador (preferiblement sortida MOSFET)
- Escut de prototipatge Arduino
- Alimentació de 12V
- Alimentació de 5V
- Oscil·lador de cristall de 16 MHz
- Condensador de 2x 30pF
- Condensador 100nF
- Diodo (ex: 1N400X)
- Resistències (1K, 3K3)
- Protoboard
- Saltadors
- Filferro de coure
Comproveu si hi ha programari necessari:
quin pitó3
que fan quins sdcc quins git
Pas 2: crear el programador
Aquesta secció serà breu, ja que vaig construir el meu escut de programació fa temps. He adjuntat l’esquema i les imatges del tauler muntat. El PDF de l'esquema es pot trobar al dipòsit.
Haureu de programar la placa del programador:
1. Cloneu el dipòsit.
git clon
2. Obriu el fitxer AT89C2051_programmer / AT89_prog / AT89_prog.ino a Arduino IDE.
3. Construïu i pengeu l'esbós des de l'IDE Arduino.
Pas 3: Instal·lació del programari del programador
1. Creeu un entorn virtual python.
python3 -m venv venv
. venv / bin / activate
2. Instal·leu at89overlord. at89overlord és un programador de codi obert per al xip AT89C2051 escrit per mi. El seu codi font es pot trobar aquí.
instal·lar pip a 89overlord
3. Verifiqueu la instal·lació.
at89overlord -h
Pas 4: Programació del xip
1. Cloneu un simple projecte de parpelleig.
cd ~
git clone https://github.com/piotrb5e3/hello-8051.git cd hello-8051 /
2. Creeu l'aplicació.
fer
3. Connecteu Arduino al PC, connecteu el subministrament de 12V, col·loqueu el xip AT89C2051 al sòcol ZIF.
4. Localitzeu el port sèrie d'Arduino.
ls / dev / tty *
5. Pengeu el fitxer IntelHex integrat al xip. Si el port del vostre Arduino és diferent de / dev / ttyACM0, heu de passar el valor correcte amb el paràmetre de línia d'ordres -p.
at89overlord -f./hello.ihx
Pas 5: Muntatge
Muntar el circuit segons l’esquema. Es pot trobar una versió PDF al repositori.
Hauríeu de veure el flaix LED verd amb una freqüència d’uns 0,5 Hz.
Pas 6: explicació del codi
#incloure
#incloure
Comencem per incloure la capçalera AT89X051 de sdcc. Conté macros per interactuar amb registres com si fossin variables. També incloem stdint.h que conté definicions de tipus enters uint8_t i uint16_t.
// Suposant que l’oscil·lador és de 16 MHz
#define INTERRUPTS_PER_SECOND 5208
Es produeix una interrupció quan el Timer0 es desborda. Està configurat com un sol temporitzador de 8 bits, de manera que això passa cada 2 ^ 8 cicles de processador. Un cicle de processador dura 12 cicles de rellotge i, per tant, arribem a 16000000/12/2 ^ 8 = 5208.33333.
volàtil uint8_t led_state = 0;
volàtil uint16_t timer_counter = INTERRUPTS_PER_SECOND;
Declarem les variables de control de l'estat del led i de comptador d'interrupcions.
void Timer0_ISR (void) _interrupt (1) {
comptador_temporitzador--; if (timer_counter == 0) {led_state =! led_state; timer_counter = INTERRUPTS_PER_SECOND; }}
Cada vegada que el Timer0 desborda el comptador disminueix. Si és igual a zero, es restableix i es canvia l'estat del led. Això es produeix aproximadament una vegada per segon, cosa que provoca una freqüència de parpelleig del LED de ~ 0,5 Hz.
int main () {
TMOD = 0x3; // Mode temporitzador: 8 bits, sense prescaler. freq = OSCFREQ / 12/2 ^ 8 TL0 = 0; // Esborra el comptador TH0 = 0; // Esborra el registre TR0 = 1; // Estableix el temporitzador perquè s’executi. ET0 = 1; // Estableix la interrupció. EA = 1; // Estableix una interrupció global. while (1) {if (led_state) {P1 = 0xFF; } else {P1 = 0x00; }}}
Configurem el mòdul de temporitzador i esperem canvis a la variable de control de l’estat del led. TMOD és el registre de control del mode de temporitzador. TL0 i TH0 són registres de control Timer0. ET0 és el bit enable-timer0 del registre de control del temporitzador (TCON). TR0 i EA són bits del registre d’habilitació d’interrupcions (IE).
Pas 7: recursos addicionals
- Full de dades AT89C2051:
- Compilador de petits dispositius C (sdcc):
- 8051 recursos:
- Dipòsit del programador AT89C2051:
- repositori hola-8051: