Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
8051 (znany również jako MCS-51) to konstrukcja MCU z lat 80-tych, która pozostaje popularna do dziś. Nowoczesne mikrokontrolery zgodne ze standardem 8051 są dostępne u wielu dostawców, we wszystkich kształtach i rozmiarach oraz z szeroką gamą urządzeń peryferyjnych. W tej instrukcji przyjrzymy się MCU AT89C2051 firmy Atmel.
AT89C2051 to mały (2 KB Flash, 128 bajtów RAM), tani (~ 1,40 USD za chip) mikrokontroler. Cechy:
- Praca 2,7-6 V
- 15 linii we/wy
- 2 timery (16 bitów)
- Przerwania wewnętrzne i zewnętrzne
- UART
- Komparator analogowy na chipie
- Do 2 MIPS z zegarem 24 MHz
Krok 1: Wymagania
Wymagania:
- Linux PC (wymagane oprogramowanie: Arduino IDE, git, make, sdcc)
- Arduino UNO
- Układ AT89C2051 (pakiet DIP20)
- 20-pinowe gniazdo ZIF
- Transoptor (najlepiej wyjście MOSFET)
- Tarcza do prototypowania Arduino
- Zasilanie 12V
- Zasilanie 5V
- Oscylator kwarcowy 16 MHz
- 2x kondensator 30pF
- Kondensator 100nF
- Dioda (np. 1N400X)
- Rezystory (1K, 3K3)
- Płyta prototypowa
- Zworki
- Kabel miedziany
Sprawdź wymagane oprogramowanie:
który pyton3
które tworzą które sdcc które git
Krok 2: Budowanie programisty
Ta sekcja będzie krótka, ponieważ jakiś czas temu zbudowałem swoją tarczę programistyczną. Załączam schemat i zdjęcia zmontowanej płytki. PDF schematu można znaleźć w repozytorium.
Będziesz musiał zaprogramować płytkę programatora:
1. Sklonuj repozytorium.
git klon
2. Otwórz plik AT89C2051_programmer/AT89_prog/AT89_prog.ino w Arduino IDE.
3. Zbuduj i prześlij szkic z Arduino IDE.
Krok 3: Instalowanie oprogramowania programatora
1. Utwórz wirtualne środowisko Pythona.
python3 -m venv venv
. venv/bin/aktywuj
2. Zainstaluj at89overlord. at89overlord to napisany przeze mnie programator Open Source dla układu AT89C2051. Jego kod źródłowy można znaleźć tutaj.
pip install at89overlord
3. Sprawdź instalację.
at89overlord -h
Krok 4: Programowanie chipa
1. Sklonuj prosty projekt migania.
cd ~
klon git https://github.com/piotrb5e3/hello-8051.git cd hello-8051/
2. Zbuduj aplikację.
robić
3. Podłącz Arduino do komputera, podłącz zasilanie 12V, umieść układ AT89C2051 w gnieździe ZIF.
4. Zlokalizuj port szeregowy Arduino.
ls /dev/tty*
5. Prześlij wbudowany plik IntelHex do chipa. Jeśli port twojego Arduino jest inny niż /dev/ttyACM0, musisz przekazać poprawną wartość za pomocą parametru wiersza poleceń -p.
at89overlord -f./hello.ihx
Krok 5: Montaż
Zmontuj obwód zgodnie ze schematem. Wersję PDF można znaleźć w repozytorium.
Powinieneś zobaczyć migającą zieloną diodę LED z częstotliwością około 0,5 Hz.
Krok 6: Wyjaśnienie kodu
#włączać
#włączać
Zaczynamy od dołączenia nagłówka AT89X051 z sdcc. Zawiera makra do interakcji z rejestrami tak, jakby były zmiennymi. Dołączamy również stdint.h, który zawiera definicje typów całkowitych uint8_t i uint16_t.
// Zakładając, że oscylator to 16 MHz
#define INTERRUPTS_PER_SECOND 5208
Przerwanie występuje, gdy Timer0 się przepełni. Jest skonfigurowany jako pojedynczy zegar 8-bitowy, więc dzieje się to co 2^8 cykli procesora. Jeden cykl procesora zajmuje 12 cykli zegara, a zatem dochodzimy do 16000000/12/2^8 = 5208.3333.
nietrwały uint8_t led_state = 0;
volatile uint16_t timer_counter = INTERRUPTS_PER_SECOND;
Deklarujemy zmienne kontroli stanu diody i licznika przerwań.
void Timer0_ISR(void) _interrupt (1) {
licznik_czasu--; if(timer_counter == 0) { led_state = !led_state; licznik_czasu = PRZERWANIA_PER_SEKUNDĘ; } }
Za każdym razem, gdy Timer0 się przepełni, licznik jest zmniejszany. Jeśli jest równy zero, jest resetowany, a stan diody zmienia się. Dzieje się to mniej więcej raz na sekundę, co skutkuje częstotliwością migania diody LED ~ 0,5 Hz.
int main() {
TMOD = 0x3; // Tryb timera - 8 bitów, bez preskalera. częst = OSCFREQ/12/2^8 TL0 = 0; // Wyczyść licznik TH0 = 0; // Wyczyść rejestr TR0 = 1; // Ustaw zegar do uruchomienia. ET0 = 1; // Ustaw przerwanie. EA = 1; // Ustaw globalne przerwanie. while(1) { if (led_state) { P1 = 0xFF; } inaczej { P1 = 0x00; } } }
Konfigurujemy moduł timera i czekamy na zmiany w zmiennej kontroli stanu diody. TMOD to rejestr kontrolny trybu timera. TL0 i TH0 są rejestrami sterującymi Timera0. ET0 to bit enable-timer0 w rejestrze sterującym timera (TCON). TR0 i EA to bity w rejestrze umożliwiającym przerwanie (IE).
Krok 7: Dodatkowe zasoby
- Arkusz danych AT89C2051:
- Kompilator języka C dla małych urządzeń (sdcc):
- Zasoby 8051:
- Repozytorium programistów AT89C2051:
- repozytorium hello-8051: