Contacte

Programarea Mcs 51 în c. Microcontrolere MCS - 51. Schema bloc, ALU, memorie de date. Registre de funcții speciale

Arhitectura familiei MCS-51 este în mare parte predeterminată de scopul său - construirea compactși ieftin dispozitive digitale. Toate funcțiile unui microcomputer sunt implementate folosind un singur microcircuit. Familia MCS-51 include un număr de microcircuite de la cele mai simple microcontrolere la cele mai complexe. Microcontrolerele familiei MCS-51 vă permit să efectuați atât sarcini de control pentru diferite dispozitive, cât și să implementați noduri individuale ale unui circuit analogic. Toate microcircuitele acestei familii funcționează la fel sistemul de comandă MCS-51, majoritatea sunt efectuate în aceleași cazuri cu potrivire pinout(numerotarea picioarelor pentru corp). Acest lucru permite utilizarea microcircuitelor de la diferite companii pentru dispozitivul dezvoltat - Maxim, Atmel, NXP etc. (catalog..php? page = components_list & id = 39 "> consultați căutarea după parametri) fără a modifica schema schemei dispozitivului și a programului.

Figura 1. Schema bloc a controlerului I8751

Diagrama bloc a controlerului este prezentată în Figura 1 și constă din următoarele unități funcționale principale: unitate de control, unitate logică aritmetică, unitate temporizator / contor, interfață serială și unitate de întrerupere, contor program, memorie date și memorie program. Schimbul bidirecțional se realizează utilizând o autostradă de date internă pe 8 biți.

Să aruncăm o privire mai atentă la scopul fiecărui bloc. Aproape toți reprezentanții familiei MCS-51 sunt construiți în conformitate cu această schemă.... Diverse microcircuite ale acestei familii diferă doar în registrele cu destinație specială (inclusiv numărul de porturi). Set de comenzi pentru toate controlerele familiei MCS-51 conține 111 comenzi de bază cu un format de 1, 2 sau 3 octeți și nu se modifică atunci când se trece de la un microcircuit la altul. Aceasta oferă o portabilitate excelentă a programelor de la un microcircuit la altul.

Unitate de control și sincronizare

Unitatea de sincronizare și control este proiectată pentru a genera semnale de sincronizare și control care asigură coordonarea funcționării comune a unităților OEVM în toate modurile de funcționare admisibile. Unitatea de control include:

  • - un dispozitiv pentru formarea intervalelor de timp;
  • - logica I / O,
  • - registru de comandă,
  • - registrul de control al consumului de energie electrică;
  • - decodor de comandă, logică de control al computerului.

Dispozitiv de modelare a slotului de timp este destinat formării și emiterii de semnale interne de sincronizare a fazelor, ceasurilor și ciclurilor. Numărul de cicluri de mașină determină durata execuției instrucțiunii. Aproape toate comenzile OEVM sunt executate în unul sau două cicluri de mașină, cu excepția comenzilor de multiplicare și divizare, al căror timp de execuție este de patru cicluri de mașină. Să desemnăm frecvența oscilatorului principal cu F g. Apoi, durata ciclului mașinii este egală cu 12 / F g sau 12 perioade ale semnalului oscilatorului principal. Logica de intrare - ieșire este concepută pentru a primi și emite semnale care asigură schimbul de informații cu dispozitive externe prin porturile de intrare / ieșire P0-P3.

Registrul de comandă este destinat înregistrării și stocării codului de operare pe 8 biți al comenzii executate. Codul de funcționare, cu ajutorul decodorului de comandă și a logicii de control al computerului, este convertit în microprograma de execuție a comenzii.

Registrul de control al consumului (PCON) vă permite să opriți microcontrolerul pentru a reduce consumul de energie și pentru a reduce nivelul de zgomot de la microcontroler. O reducere suplimentară a consumului de energie și reducerea zgomotului pot fi realizate prin oprirea oscilatorului principal al microcontrolerului. Acest lucru poate fi realizat prin răsucirea unui pic în registrul de control al consumului PCON. Pentru n-MOS (seriile 1816 sau IC-uri străine fără „c” în mijloc), Registrul de control al consumului PCON conține un singur bit pentru a controla rata de transmisie a portului serial SMOD și nu există biți de control al puterii.

Unitate logică aritmetică (ALU) este un dispozitiv paralel de opt biți care efectuează operații aritmetice și logice. ALU constă din:

  • - registre de acumulatoare, registre de păstrare TMP1 și TMP2,
  • - constante ROM,
  • - sumator,
  • - registru suplimentar (registrul B),
  • - baterie (ACC),
  • - registrul stării programului (PSW).

Inregistreaza-te baterieși tinand registre- registre de opt biți destinate recepționării și stocării operanzilor pe durata operațiunilor pe ele. Aceste registre nu sunt accesibile programatic.

Constantele ROM oferă generarea unui cod de corecție pentru reprezentarea de date binar-zecimală, un cod de mască pentru operații de biți și un cod constant.

Sumator paralel de opt biți este un circuit combinațional cu transport secvențial, conceput pentru a efectua operații aritmetice de adunare, scădere și operații logice de adunare, multiplicare, inegale și identice.

Registrul B- un registru de opt biți utilizat în timpul operațiilor de multiplicare și divizare. Pentru alte instrucțiuni, acesta poate fi privit ca un registru super-operativ suplimentar.

Baterie- un registru de opt biți conceput pentru a primi și stoca rezultatul obținut atunci când se efectuează operații aritmetico-logice sau operații de deplasare

Interfață serial și bloc de întrerupere (PIP) este destinat organizării intrării-ieșirii fluxurilor de informații secvențiale și organizării unui sistem de întrerupere a programului. Blocul include:

  1. - tampon PIP,
  2. - logica de control,
  3. - registru de control;
  4. - tampon transmițător,
  5. - tampon receptor,
  6. - emițător-receptor port serial,
  7. - întrerupeți registrul de priorități,
  8. - Înregistrați activarea întreruperii,
  9. - logică pentru procesarea semnalizărilor de întrerupere și a unui circuit de generare de vectori.

Program de numărare este conceput pentru a genera adresa curentă de 16 biți a memoriei interne a programului și adresa de 8/16 biți a memoriei externe a programului. Contorul de instrucțiuni include un buffer PC pe 16 biți, un registru PC și un circuit de incrementare (creșterea conținutului cu 1).

Memorie de date (RAM) este destinat stocării temporare a informațiilor utilizate în procesul de execuție a programului.

Porturile P0, P1, P2, P3 sunt porturi de intrare-ieșire cvasi-bidirecționale și sunt concepute pentru a asigura schimbul de informații între computer și dispozitive externe, formând 32 de linii de intrare-ieșire.

Dispozitiv cu temporizator Modelele de bază ale familiei au două temporizatoare / contoare programabile pe 16 biți (T / C0 și T / C1), care pot fi utilizate atât ca temporizatoare, cât și ca contoare de evenimente externe

Registrul stării programului (PSW) destinat stocării informațiilor despre starea ALU în timpul executării programului.

Memorie de program (EPROM) este destinat stocării programelor și este o memorie de numai citire (ROM). Diferite microcircuite utilizează ROM-uri de mască, șterse prin radiații ultraviolete sau FLASH ROM.

Registrul indicatorului de date (DPTR) este conceput pentru a stoca o adresă de 16 biți a memoriei de date externe sau a memoriei de program.

Stack Pointer (SP) este un registru de opt biți conceput pentru a organiza o zonă specială de memorie de date (stivă), în care orice celulă de memorie poate fi stocată temporar.



Microcontrolerele familiei MCS-51 sunt construite conform arhitecturii Harvard, în care memoria de program și memoria de date sunt partiționate, au propriile spații de adrese și metode de acces la ele.

Memoria programului


Dimensiunea maximă a memoriei este de 64K octeți, dintre care 4K, 8K, 16K sau 32K octeți de memorie (Tabelul 7.3.1) se află pe matriță, restul se află în afara matriței.
Cu tensiune la borna EA = V CC se utilizează atât memoria internă, cât și cea externă, cu EA = V CC = 0 - numai memorie externă.
Tabelul 7.3.1 prezintă adresele de memorie ale programului pentru cazurile indicate.
Zona de memorie a programului inferior este alocată pentru pornirea operației microcontrolerului (adresa de pornire 0000h după resetare) și pentru procesarea întreruperilor (adresele de întrerupere sunt localizate cu un interval de 8 octeți: 0003h, 000Bh, 0013h etc.).


Memoria de program este numai în citire, iar la accesare:

● la memorie externa programe, se generează semnalul ¯PSEN și se formează întotdeauna o adresă de 16 biți.
Octetul cel mai puțin semnificativ al adresei este transmis prin portul P0 în prima jumătate a ciclului mașinii și este fixat la marginea stroboscopului ALE din registru.
În a doua jumătate a ciclului, portul P0 este utilizat pentru a introduce un octet de date din memoria externă în MC.
Octetul de ordine înaltă al adresei este transmis prin portul P2 pe parcursul întregului timp de acces la memorie (Fig.7.1.11);

● la memorie interna semnalul citit nu este generat și ciclurile de schimb sunt utilizate pe magistrala internă a microcontrolerului.

Memorie de date

Memorie interna datele pot fi împărțite condiționat în trei blocuri (Tabelul 7.3.2).

Memoria internă este întotdeauna adresată de un octet, care adresează doar 256 de locații de memorie.
Prin urmare, așa cum se poate vedea din Tabelul 7.3.2, pentru adresarea celulelor superioare de 8 biți ale RAM interne și a registrelor funcțiilor speciale SFR, ocupând același spațiu de adrese, comenzile utilizează metode de adresare diferite: indirecte și drepte.

Caracteristici ale organizării zonei inferioare a RAM-ului intern sunt reflectate în tabelul 7.3.3.

Scăzut 32 de octeți de memorie RAM internă cu adrese 00h.
1Fh sunt grupate în patru bănci cu câte opt registre fiecare (R0.R7).
Următorii 16 octeți de RAM cu adrese de 20 de ore.
2Fh reprezintă o zonă de memorie de 8 × 16 = 128 biți, care permite accesarea fiecărui bit individual.
Pentru a selecta adresa registrului bancar, se folosește numele său R0.
R7, pentru a selecta o bancă - biți RS0, RS1 din registrul cuvântului de stare PSW.

Adrese bit

Adrese bit sunt prezentate în Tabelul 7.3.3.

Adresarea se efectuează direct cale.

O listă a tuturor registrelor de funcții speciale SFR cu adresele lor este prezentată în Tabelul 7.2.2.
Pentru claritate, în tabelul 7.3.

4 spectacole harta adreselor de înregistrareSFR din microcircuitele considerate ale familiei MCS-51.
Adresa SFR este determinată de o combinație de numere de coloane și linii în notație hexazecimală.

De exemplu, registrul CMOD are adresa D9h.

Pentru registrele SFR ale căror adrese se termină cu 0h sau 8h (acestea sunt cu caractere aldine), pe lângă octet permis în sensul bitului adresare.

În acest caz, adresa bitului care ocupă al N-lea bit din registru este definită ca XXh + ​​0Nh, unde XXh este adresa registrului SFR, N = 0,7.
Adresele de biți din această zonă variază de la 80H la FFH.
De exemplu, adresele de biți ale acumulatorului ACC sunt în intervalul E0h-E7h.

Memorie externa datele (până la 64 KB) sunt create de cipuri de memorie suplimentare care sunt conectate la MC.
Pentru a lucra cu memoria de date externă, se utilizează comenzi speciale, astfel încât spațiile de adresă ale memoriei externe și interne nu se suprapun și, prin urmare, ambele tipuri de memorie de date pot fi utilizate simultan.

Pentru a accesa celulele memoriei de date externe sunt utilizate (Figura 7.1.8):
● comenzi cu adresare indirectă;
● semnale pentru citirea ¯RD și scrierea ¯WR;
● portul P0 pentru transmiterea celui mai puțin semnificativ octet al adresei și primirea / transmiterea octetului de date;
● Port P2 pentru transmiterea octetului de ordine înaltă a adresei.
Metode de adresare.
Sistemul de comandă utilizează:
● direct, indirect, registru, registru indirect, adresare directă și index (adresare indirectă prin suma registrelor de bază și index) operanzi sursă;
● adresare directă, de înregistrare și de înregistrare indirectă operanzi de destinație.
Combinația acestor metode (adresare) oferă 21 de moduri de adresare.
Aceasta și următoarele tabele de sistem de comandă utilizează următoarea notație:

Adresare directă.

Cu această metodă de adresare, locația octetului sau bitului de date este determinată de adresa de 8 biți a celui de-al doilea (și al treilea) octet de comandă.
Adresarea directă este utilizată doar pentru a accesa memoria internă de date (128 byți mai mici de RAM) și registrele de funcții speciale.

Adresarea înregistrării.


Această metodă de adresare oferă acces la datele stocate într-unul din cele opt registre R0.
R7 al băncii actuale de registre de lucru.
Poate fi, de asemenea, utilizat pentru a accesa registrele A, B, AB (registru dual), registrul indicatorului DPTR și pentru a transporta semnalul C.
Adresa acestor registre este încorporată în codul de operație, reducând astfel numărul de octeți de comandă.

Adresare indirectă a registrului.


În acest caz, adresa datelor este stocată într-un registru de pointer, a cărui locație este determinată de codul de funcționare.
Această metodă de adresare este utilizată pentru a accesa memoria RAM externă și jumătatea superioară a memoriei interne.
Registrele-indicatoare ale adreselor de 8 biți pot fi registrele R0, R1 ale băncii selectate de registre de lucru sau indicatorul de stivă SP; pentru adresarea pe 16 biți, este utilizat doar registrul indicatorului de date DPTR.

Adresare directă.


Cu această metodă de adresare, datele sunt indicate direct în comandă și sunt situate în al doilea (sau în al doilea și al treilea) octeți ai comenzii, adică
nu este necesară adresarea memoriei.
De exemplu, prin comanda MOV A, # 50, numărul 50 este încărcat în acumulatorul A.

Adresare indexată.


Această metodă este o adresare indirectă a registrului, în care adresa octetului de date este determinată ca suma conținutului registrelor de bază (DPTR sau PC) și index (A).
Cale utilizat numai pentru acces la memoria programului și numai în modul de citire; face mai ușoară vizualizarea tabelelor cablate în memoria programului.

Structura de comandă.

Lungimea unei comenzi este de unul (49 de comenzi), două (45 de comenzi) sau trei (17 comenzi) octeți.
Primul octet al comenzii conține întotdeauna opcode (OP), în timp ce al doilea și al treilea octet sunt adresele operanzilor sau valorile de date imediate.

Biți individuali, tetrad, octeți și cuvinte cu doi octeți pot fi folosiți ca operanzi.
Există 13 tipuri de comenzi, care sunt prezentate în Tabelul 7.3.5:

● A, PC, SP, DPTR, Rn (n = 0, 7) - acumulator, contor de instrucțiuni, pointer de stivă, registru de pointer de date și registru bancar curent;
● Rm (m = 0, 1) - registru al băncii curente utilizate pentru adresarea indirectă;
● direct - adresa de 8 biți a operandului adresat direct;
● bit - adresa bitului direct adresat;
● rel - adresa relativă a tranziției;
● addr11, addr16 - adresa absolută de 11 și 16 biți a tranziției;
● # data8, # data16 - date directe (operanzi) cu lungimea de 8 și 16 biți;
● A10, A9, A0 - biți individuali ai adresei de 11 biți;
● (.) - conținutul celulei de memorie la adresa specificată între paranteze;
● SB, MB - octeți mari și mici ai operandului pe 16 biți.

Informații generale despre sistemul de comandă.

Sistemul de comandă oferă posibilități excelente pentru prelucrarea datelor sub formă de biți, notebook-uri, octeți, cuvinte cu doi octeți, precum și control în timp real.
Limbajul ASM51 macro assembler este utilizat pentru a descrie comenzile. Sintaxa pentru majoritatea comenzilor constă dintr-o desemnare mnemonică (abrevierea) operației care urmează a fi efectuată, urmată de operanzi.
Operanzii sunt utilizați pentru a indica diferite metode de adresare și tipuri de date.

În special, abrevierea MOV are 18 instrucțiuni diferite concepute pentru a procesa trei tipuri de date (biți, octeți, adrese) în spații de adrese diferite.
Setul de comenzi are 42 de denumiri mnemonice de 111 tipuri de comenzi pentru a concretiza 33 de funcții MK.

Dintre cele 111 instrucțiuni, 64 sunt executate într-un ciclu de mașină, 45 în două cicluri și doar două instrucțiuni (MUL - multiplicare și DIV - divizare) sunt executate în 4 cicluri. La o frecvență de ceas de 12 MHz, durata unui ciclu de mașină (12 cicluri de ceas) este de 1 μs. De caracteristică funcțională echipele pot fi împărțite în cinci grupe. Mai jos este o descriere a comenzilor pentru fiecare grup, prezentate sub formă de tabele. Pentru compactitatea tabelelor, să selectăm un grup de comenzi (Tabelul 7.3.6), a căror executare influențe(marcat cu +) pe starea steagurilor registru cuvânt stare PSW.

Comenzi de transfer de date

Comenzile de transfer pot fi împărțite în subgrupuri separate.
Comenzi pentru transferul și schimbul de date între celulele memoriei interne(Tabelul 7.3.7).

Comenzile 1-16, care au destinația mnemonică MOV, src, sunt pentru înaintare octeți sau doi octeți (comanda 16) de date de la sursa src la destinație destinație, în timp ce:
● pentru a indica sursă(src) sunt utilizate patru metode de adresare: registru (comenzi 2-4, 6, 8), direct (comenzi 1, 7, 9, 11), indirect (comenzi 5, 10) și direct (comenzi 12-16);
● pentru a indica receptor(dest) se folosesc trei metode: registru (comenzile 1, 3 ... 5, 9, 12, 14, 16), direct (comenzile 2, 7, 8, 10, 13), indirect (comenzile 6, 11, 15).

Echipele 17-20 asigură schimb valutar informații între două celule ale memoriei de date interne (sau transfer bidirecțional).
Când comenzile XCH sunt executate, octeții sunt schimbați, A din comanda XCHD este schimbată cu tetradele inferioare ale operanzilor de octeți.

Una dintre celule este întotdeauna acumulatorul A. Ca o altă celulă, la schimbul de octeți, este utilizat unul dintre registrele Rn ale băncii curente, A este, de asemenea, o celulă adresabilă direct sau indirect a memoriei interne; la schimbul de tetrade - doar o celulă adresabilă indirect a memoriei interne.

Deoarece în toate MCU-urile stiva se află în memoria RAM internă, acest subgrup include comenzi(20, 21) acces la stivă PUSH src, POP dest.
Aceste comenzi folosesc doar metoda de adresare directă, scriind un octet pe stivă sau recuperându-l din stivă.
Trebuie avut în vedere că în acele MCU-uri care nu au 128 de octeți superiori în RAM, mărirea stivei dincolo de 128 de octeți duce la pierderea datelor.

Comenzi de transfer de date între memoria de date internă și externă(Tabelul 7.3.8).

Aceste instrucțiuni utilizează doar adresarea indirectă, în timp ce adresa de un octet poate fi localizată în P0 sau R1 a băncii de registre curente, iar adresa de doi octeți poate fi localizată în registrul indicatorului de date DPRT.
În orice acces la memoria externă, bateria A joacă rolul de receptor sau sursă de operanzi din memoria internă.

Instrucțiuni de transfer de date din memoria programului(Tabelul 7.3.9).

Aceste comenzi sunt pentru citirea tabelelor din memoria programului.

Instrucțiunea MOVC A, @ A + DPTR este utilizată pentru a se referi la un tabel cu numărul de intrări de la 0 la 255.

Numărul intrării de tabel necesare este încărcat în acumulator, iar registrul DPTR este setat la punctul de pornire al tabelului. O caracteristică distinctivă a celeilalte comenzi este că PC-ul contorului de programe este folosit ca indicatorul de bază, iar tabelul este accesat din subrutină. În primul rând, numărul punctului de intrare necesar este încărcat în acumulator, apoi subrutina este apelată cu comanda MOVC A, @ A + PC. Tabelul poate avea 255 de intrări cu numere de la 1 la 255, deoarece 0 este utilizat pentru adresa comenzii RET a ieșirii subrutinei.

Comenzi de procesare a datelor aritmetice. Toate comenzile aritmetice sunt efectuate pe numere întregi nesemnate. Operații pe doi operanzi(Tabelul 7.3.10). În operațiuni adaosuri ADĂUGA, adaos reportat ADDC și deducerea împrumutului SUBB:

● sursa unui operand de 8 biți și receptorul rezultatului este acumulatorul;
● sursa unui alt operand este fie unul dintre registrele de lucru Rn (n = 0-7) ale băncii curente, fie direct direct sau indirect @Rm (m = 0, 1) locația de memorie adresabilă a RAM-ului sau datele directe #data.

Operațiuni multiplicare MUL și Divizia DIV-urile se efectuează peste conținutul registrelor A și B. Când se înmulțește, cei 8 biți superiori ai rezultatului sunt scrise în registrul B, cei 8 biți inferiori - pentru a înregistra A.
Dacă produsul este mai mare de 255, este setat semnalizatorul OV overflow; steagul de transport C este întotdeauna șters. Instrucțiunea DIV împarte operandul de 8 biți al acumulatorului A la operandul de 8 biți al registrului B.
În timpul divizării, coeficientul (biții cei mai semnificativi) este scris în registru în A, restul (biții cel mai puțin semnificativi) - în B. Semnalizările de transport C și OV de revărsare sunt șterse.
O încercare de împărțire la 0 setează semnalizatorul OV overflow. Operația de divizare este mai frecvent utilizată pentru schimbări și conversii de bază.

Când un număr binar este împărțit la 2 N, acesta este deplasat cu N biți spre stânga.
Biții suplimentari sunt transferați la registrul B.

Operații pe operandi cu un singur octet(Tabelul 7.3.11).

Comanda DA este utilizată pentru a efectua operații BCD. Comenzile INC, DEC permit respectiv creșterea sau scăderea conținutului celulei de memorie cu una.
Acestea se aplică conținutului acumulatorului A, unuia din registrele de lucru Rn sau unei celule de memorie adresate atât direct, cât și indirect.
Operația de incrementare se aplică și conținutului registrului de pointer DPTR pe 16 biți.

Comenzi booleene.

Operații duble

(Tabelul 7.3.12).

Comenzile AML, ORL, XRL permit efectuarea a trei operații logice în două locuri pe operanzi pe 8 biți: ANL - multiplicare logică (ȘI), ORL - adunare logică (SAU), XRL - SAU exclusiv (XOR).
Operațiile sunt efectuate pe biți individuali ai operanzilor. Sursa unuia dintre operanzi și, în același timp, receptorul rezultatului este fie un acumulator (A), fie o celulă de memorie direct adresabilă (directă).
Pentru sursa unui alt operand, se utilizează un registru, o metodă de adresare directă, indirectă sau directă.

Operații unice

(Tabelul 7.3.13).
Grupul include, de asemenea, o serie de operații cu un singur loc asupra conținutului acumulatorului A: compensare (CLR), complement logic sau inversiune (CPL), deplasări ciclice și ciclice extinse cu 1 bit spre dreapta (RL, RLC) și stânga ( RR, RRC), tetradele de schimb sau schimbarea ciclică a unui octet cu 4 biți (SWAP), A este, de asemenea, o operație goală (NOP), ca urmare a cărei stare a tuturor registrelor MC (cu excepția contorului de program) rămâne neschimbată .

Comandați comenzile de transfer

Comenzi de salt necondiționate

(Tabelul 7.3.14).

Comenzile 1-3 diferă doar în formatul adresei de destinație.

Comanda LJMP (L - Long) efectuează un salt necondiționat „lung” la adresa addr16 specificată, încărcând contorul PC-ului cu al doilea și al treilea octet de comandă.
Comanda oferă un salt către orice punct din spațiul de adrese de 64K octeți.

Comanda AJMP (A - Absolut) oferă un salt „absolut” la o adresă într-o pagină de 2K octeți, a cărei adresă de pornire este setată de cei mai semnificativi cinci biți ai contorului de programe PC (la început, conținutul PC-ului este mărită cu 2).

Comanda SJMP (S - Short) permite un salt necondiționat „scurt” la adresă, care se calculează prin adăugarea rel offsetului semnat în al doilea octet al comenzii cu conținutul contorului PC, crescut anterior cu 2.

Adresa de salt este cuprinsă între -128 + 127 octeți în raport cu adresa de comandă.
Pentru a trece la orice alt punct din spațiul de adrese de 64 de kilobyte, poate fi utilizată și comanda 4 cu o adresă indirectă @ A + DPTR.
În acest caz, conținutul lui A este interpretat ca număr întreg nesemnat.

Operațiune nulă (NOP), ca urmare a cărei stare a tuturor registrelor microprocesorului (cu excepția contorului de program) rămâne neschimbată.

Comenzi de ramificare condiționate

(Tabelul 7.3.15).

Cu ajutorul comenzilor JZ și JNZ, se efectuează un salt dacă conținutul acumulatorului este respectiv egal sau nu egal cu zero.
Adresa de salt este calculată prin adăugarea decalajului semnului relativ la conținutul contorului de comandă al computerului după adăugarea acestuia la numărul 2 (lungimea comenzii în octeți).

Conținutul bateriei rămâne neschimbat.
Comenzile nu afectează steagurile.

Comenzile CJNE (3-6) sunt utilizate pentru a implementa un salt condițional bazat pe rezultatul comparării a doi operanzi pe 8 biți, a căror locație este specificată în comenzi.
Dacă valorile lor nu sunt egale, se face o ramură.

Adresa de salt este calculată prin adăugarea relului offset cu conținutul contorului PC-ului, crescut anterior cu 3.
În caz contrar, următoarea comandă este executată.

Coloana Algoritm arată efectul valorilor operanzilor de 8 biți comparați asupra steagului de transport C.
Comenzile DJNZ (7) sunt concepute pentru a organiza bucle de program.

Registrul Rn sau locația direct adresabilă este contorul de repetare a buclei, iar decalajul rel (în al doilea și al treilea octet de comandă) este adresa relativă a saltului la începutul buclei.
Când comenzile sunt executate, conținutul contorului este decrementat cu unul și verificat pentru zero.
Dacă conținutul contorului nu este egal cu zero, se efectuează tranziția la începutul ciclului.
În caz contrar, se execută următoarea comandă.

Adresa de salt este calculată prin adăugarea decalajului la conținutul contorului, crescut anterior cu lungimea comenzii (cu 2 sau 3).
Steagurile de comandă nu sunt afectate.

Comenzi pentru apelarea subrutinelor și revenirea de la programe

(Tabelul 7.3.16).
Comenzile de apel lung LCALL și de apel absolut ACALL apelează necondiționat subrutina aflată la adresa specificată.

Diferența dintre aceste instrucțiuni și instrucțiunile de salt necondiționate discutate mai sus este că acestea stochează adresa de retur (conținutul contorului) în programul principal din stivă.
Comanda return din subrutina RET restabilește valoarea conținutului contorului de comenzi din stivă, iar comanda RETI permite, de asemenea, întreruperile nivelului de serviciu.

Adresarea relativă este utilizată pe scară largă în comenzile de transfer de control, care acceptă module de program relocabile.
Un rel offset semnat pe 8 biți acționează ca o adresă relativă, care asigură ramificarea din poziția curentă a contorului PC în ambele direcții cu ± 127 octeți.

Pentru a trece la orice alt punct din spațiul de adrese de 64K octeți, poate fi utilizată fie adresa directă addr16, fie adresa indirectă @ A + DPTR.
În acest din urmă caz, conținutul lui A este interpretat ca număr întreg nesemnat.

O variantă a adr11 de adresare directă scurtă într-o pagină curentă de 2K-octeți a fost introdusă pentru compatibilitatea cu arhitectura MK48.

Toate aceste tipuri de adresare pot fi aplicate doar operațiunii de sucursală, iar pentru operația de apel sunt permise doar metode directe de adresare addr16 și addr11 interne.
În toate operațiunile condiționate, numai adresarea relativă poate fi utilizată.

Când MK51 recunoaște o solicitare de întrerupere, generează una dintre comenzi, cum ar fi LCALL addr16, care asigură automat că adresa de returnare este stocată în stivă.
Cu toate acestea, spre deosebire de MK48, MK51 nu are informații de stare salvate automat.

În acest caz, logica de întrerupere nu mai răspunde la solicitările de nivel acceptat pentru service.
Pentru a scădea nivelul de întrerupere, se folosește comanda de a reveni de la întreruperea RETI, care, pe lângă operația echivalentă cu RET, include și operația de activare a întreruperii acestui nivel.
Operațiile JZ, JNZ aparțin, de asemenea, operațiunilor condiționale standard MK51.
Cu toate acestea, există o nouă operațiune „Compare and Go” CJNE.

Pentru această comandă, operandul este comparat mai întâi conform regulilor de scădere a numerelor întregi cu o constantă și, în conformitate cu rezultatul comparației, se stabilește steagul CY. Apoi, în cazul unei nepotriviri cu o constantă, ramificarea este efectuat. Comparând un acumulator, registru sau celulă de memorie cu o succesiune de constante, obținem un mod convenabil de a verifica coincidențele, de exemplu, pentru a identifica cazuri speciale.

De fapt, comanda CJNE este un membru al operatorului de limbă la nivel înalt CASE.

Echipa DJNZ a fost dezvoltată în continuare.
Acum programatorul ca contor poate folosi nu doar unul dintre registrele de lucru Rn, ci și orice celulă de memorie DSEG.

Comenzi operații bit.

Grupul este format din 12 comenzi care vă permit să efectuați operații pe unul sau doi biți (resetare, setare, inversare de biți, A și logică ȘI și OR) și 5 comenzi concepute pentru a implementa salturi condiționale (Tabelul 7.3.17).

Instrucțiunile furnizează adresarea directă a 128 de biți, localizați în șase până la unsprezece celule ale RAM-ului intern cu adrese de 20h.
2Fh (Tabelul 7.3.3) și 128 de biți localizați în registre cu destinație specială ale căror adrese sunt multiple de opt (evidențiate în Tabelul 7.3.4 cu caractere aldine).

Când se efectuează operații pe doi operanzi pe un bit, flip-flop-ul registrului PSW, care stochează steagul de transport C (Tabelul 7.1.2), este utilizat ca acumulator logic.

Se execută instrucțiunile MOV (1,2) expediere biți dintr-o singură celulă de biți adresabilă direct din RAM internă pe flip-flop C sau invers.
Comenzi CRL (3, 4), respectiv SETB (5, 6) dump la zero sau a stabili la un indicator de transport C sau bitul specificat.
Cu ajutorul comenzilor CPL, ANL, ORL (7-12), se efectuează operațiile logice de inversare, adunare și multiplicare.

Grupul include, de asemenea, comenzi (13-17) pentru implementarea operațiunilor de ramificare condiționată cu o relație relativă de offset de 8 biți.
Tranzițiile pot fi implementate atât atunci când este setat un semnal bit sau un carry (comenzile 13, 16), cât și când este șters (comenzile 14, 17).

Comanda JBC, pe lângă deplasarea la adresa calculată, când se îndeplinește condiția (bit) = 1, resetează acest bit la zero.
La executarea comenzilor de ramificare condiționată, adresa de salt este calculată după adăugarea numerelor 3 sau 2 la conținutul contorului (reflectând numărul de octeți din comandă).

Sistemul de comandă OMEVM oferă capacități excelente de procesare a datelor, asigură implementarea operațiilor logice, aritmetice, precum și controlul în timp real. Bitwise, tetrad (4 biți), octeți (8 biți) și procesarea datelor pe 16 biți sunt implementate. Familia LSI MCS-51 - 8-bit ОМЭВМ: ROM, RAM, registre cu destinație specială, ALU și autobuze externe au o organizație de octeți. Datele cu doi octeți sunt utilizate numai de Pointer Register (DPTR) și de Counter Command (PC). Trebuie remarcat faptul că registrul indicatorului de date poate fi utilizat ca registru DPTR cu doi octeți sau ca două registre cu destinație specială cu un octet DPH și DPL. Contorul de comandă este întotdeauna folosit ca un registru de doi octeți. Setul de instrucțiuni OMEVM are 42 de denumiri mnemonice de comenzi pentru a concretiza 33 de funcții ale acestui sistem. Sintaxa pentru majoritatea comenzilor în limbajul de asamblare constă dintr-o funcție mnemonică, urmată de operanzi care indică metode de adresare și tipuri de date. Diferitele tipuri de date sau modurile de adresare sunt determinate de operanzii setați, nu de modificările mnemonice. Sistemul de comandă poate fi împărțit condiționat în cinci grupuri:
  • Comenzi aritmetice;
  • Comenzi logice;
  • Comenzi de transfer de date;
  • Comenzi procesor de biți;
  • Comandări de ramificare și transfer de control.
Există următoarele tipuri de adresare a operanzilor sursă:
  • Adresarea înregistrării
  • Adresare directă
  • Adresare indirectă a registrului
  • Adresare directă
  • Adresarea indirectă a registrului prin suma registrelor de bază și index
Instrucțiuni aritmetice Setul de instrucțiuni conține următoarele operații aritmetice: adunare, adunare cu steagul de transport, scădere cu împrumut, incrementare, decrementare, comparație, corectare zecimală, înmulțire și divizare. În ALU, operațiile sunt efectuate pe numere întregi nesemnate. În operațiuni cu doi operandi: adunare (ADD), adunare și reportare (ADDC) și scădere și împrumut (SUBB), acumulatorul este primul operand și primește rezultatul operației. Al doilea operand poate fi un registru de lucru al băncii selectate de registre de lucru, un registru intern de memorie de date cu registru indirect și adresare directă sau un octet de date direct. Aceste operații afectează semnalizatoarele: finalizare, transport, intermediar și semnalizare paritate în cuvântul de stare procesor (PSW). Utilizarea cifrei de transport vă permite să îmbunătățiți semnificativ acuratețea operațiunilor de adunare (ADDC) și scădere (SUBB). Operațiile de adunare și scădere bazate pe semne pot fi efectuate prin controlul programatic al semnalizatorului de depășire (OV) al registrului PSW. Steagul intermediar de transport (AC) oferă aritmetică BCD. Operațiile de creștere și descreștere nu afectează semnalizatoarele. Operațiunile de comparație nu afectează nici destinația, nici operandul sursă, dar afectează steagurile de transport. Există trei operații aritmetice care se efectuează numai pe baterie: două comenzi pentru verificarea conținutului bateriei A (JZ, JNZ) și o comandă de corecție zecimală atunci când se adaugă coduri binare-zecimale. În timpul operației de multiplicare, conținutul acumulatorului A este înmulțit cu conținutul registrului B și rezultatul este plasat după cum urmează: octetul mic din registrul B, cel mare din registrul A. Comenzi logice cu variabile de octeți Sistemul de comandă vă permite pentru a implementa operațiuni logice: „ȘI”, „SAU”, „SAU EXCLUSIV” pe registrul acumulatorului (A) și pe octetul sursă. Al doilea operand (octet sursă) poate fi un registru de lucru în banca selectată de registre de lucru; un registru RAM intern adresat utilizând adresarea indirectă a registrului; celule direcționabile directe ale RAM interne și registre speciale; valoare imediata. Aceste operații logice pot fi implementate pe orice registru direct adresabil de memorie RAM internă sau registru cu scop special folosind conținutul acumulatorului A sau date directe ca al doilea operand. Există operații logice care se efectuează numai pe baterie: resetați și inversați toți cei opt biți de A; deplasare ciclică la stânga și la dreapta; deplasare ciclică spre stânga și spre dreapta, ținând cont de steagul de transport; schimbând locurile tetradelor senior și junior (nibls) din interiorul bateriei. Comenzi de transfer de date Tabelele de simboluri (coduri) încorporate în ROM-ul programului pot fi selectate folosind comenzi de transfer de date folosind adresarea indirectă. Octetul constant poate fi transferat la acumulator din celula de memorie a programului, adresată prin suma registrului de bază (PC sau DPTR) și registrul index (conținutul lui A). Aceasta oferă, de exemplu, un mijloc convenabil de implementare a unui algoritm pentru conversia codului ASCII în cod cu șapte segmente. Orice celulă a blocului de 256 de biți de memorie RAM externă poate fi selectată utilizând adresarea indirectă a registrului prin registrele de pointer R0 sau R1 (banca selectată de registre de lucru). O locație în spațiul de adresă RAM extern de 64 KB poate fi de asemenea selectată utilizând adresarea indirectă a registrului prin registrul indicatorului de date DPTR. Instrucțiunile de transfer între registrele cu adresare directă vă permit să introduceți o valoare dintr-un port într-o celulă RAM internă fără a utiliza registre de lucru sau o baterie. Într-un procesor logic, orice bit direcționabil înainte poate fi plasat într-un bit de transport și invers. Conținutul acumulatorului poate fi schimbat cu conținutul registrelor de lucru (ale băncii selectate) și cu conținutul celulelor RAM interne adresate prin intermediul adresării indirecte a registrelor, precum și cu conținutul celulelor cu adresare directă a memoriei RAM interne și cu conținutul registrelor cu destinație specială. Niblul minor (biții 3-0) al conținutului acumulatorului poate fi schimbat cu niblul minor al conținutului celulelor RAM interne, selectat utilizând adresarea indirectă a registrului. Instrucțiuni pentru procesorul de biți Procesorul de biți face parte din arhitectura familiei MCS51 și poate fi privit ca un procesor de biți independent. Procesorul de biți execută un set de instrucțiuni, are propria RAM bit-adresabilă și propriul I / O. Instrucțiunile de biți asigură adresarea directă a 128 de biți (0-127) în șaisprezece celule ale RAM-ului intern (celule cu adrese 20H-2FH) și adresarea directă a biților de registre cu destinație specială ale căror adrese sunt multiple de opt. Fiecare dintre biții adresabili individual poate fi setat la „1”, șters la „0”, inversat, verificat. Tranzițiile pot fi implementate: dacă bitul este setat; dacă bitul nu este setat; tranziție, dacă bitul este setat, cu compensarea acestui bit; bitul poate fi suprascris la (de la) bitul de transport. Operațiunile logice „ȘI”, „SAU” pot fi efectuate între orice bit direct adresabil și steagul de transport, unde rezultatul este introdus în bitul steagului de transport. Instrucțiunile de procesare bitwise asigură implementarea funcțiilor complexe ale logicii combinatorii și optimizarea programelor de utilizator. Comandări de ramificare și control al transferului Spațiul de adresă al memoriei programului nu are o structură de paginare, care vă permite să mutați în mod liber fragmente de program în spațiul de adrese, fără a reîncărca (modifica) numărul paginii. Mutarea fragmentelor de programe individuale oferă posibilitatea de a utiliza module de programe relocabile prin diferite programe. Instrucțiunile de apel pe ramuri și subrutine pe 16 biți vă permit să accesați orice punct din spațiul de adrese de memorie al programului de 64 KB. Salturile de 11 biți și instrucțiunile de apel pentru subrutină oferă salturi într-o unitate de program de 2 KB. În sistemul de comandă există comenzi pentru salturi condiționate și necondiționate în raport cu adresa de pornire a următorului program în intervalul de la (РС) -128 la (ЗС) +127. Comenzile pentru verificarea biților individuali permit tranziții condiționale la starea "0" sau "1" a biților adresați direct. Instrucțiunile pentru verificarea conținutului bateriei (pentru zero / non-zero) permit salturi condiționale la conținutul lui A. Salturile indirecte ale registrului din sistemul de instrucțiuni asigură ramificarea în raport cu registrul de bază (conținutul DPTR sau PC) cu un offset situat în acumulator A. Adresarea registrului Adresarea registrului este utilizată pentru a accesa opt registre de lucru ale băncii selectate de registre de lucru (aceleași registre pot fi selectate folosind adresarea directă și adresarea indirectă a registrelor ca celule normale ale RAM-ului intern de date). Adresarea registrului este utilizată pentru a accesa registrele A, B, AB (registru dublu), DPTR și steagul de transport C. Utilizarea adresării registrului vă permite să obțineți echivalentul de doi octeți al instrucțiunilor de adresă directă de trei octeți. Adresare directă Adresarea directă pe octeți este utilizată pentru a accesa locațiile memoriei interne de date (RAM) (0-127) și a registrelor speciale. Adresarea bit forward este utilizată pentru a se referi la 128 biți adresabili separat, aflați în locațiile de adresă 20H-2FH și la biții adresabili separat ai registrelor cu destinație specială. Cel mai semnificativ bit al octetului codului de adresă directă selectează unul dintre cele două grupuri de biți adresabili separat localizați în RAM sau registre speciale. Biții direct adresabili cu adrese 0-127 (00H-7FH) sunt localizați într-un bloc de 16 celule RAM interne cu adrese 20H-2FH. Celulele indicate sunt numerotate secvențial de la bitul cel mai puțin semnificativ al octetului cel mai puțin semnificativ la cel mai semnificativ bit al celui mai semnificativ octet. Biții adresabili separat din registrele cu destinație specială sunt numerotați după cum urmează: cei cinci biți cei mai semnificativi ai adresei se potrivesc cu cei mai semnificativi cinci biți ai registrului în sine, iar cei trei biți cel mai puțin semnificativi determină locația ibtului individual în registru. Adresarea indirectă a registrului Adresarea indirectă a registrului este utilizată pentru a se referi la celulele RAM de date interne. Registrele R10, R1 ale băncii de registre selectate sunt utilizate ca registre de pointer. Comenzile PUSH și POP utilizează conținutul indicatorului stivei (SP). Adresarea indirectă a registrului este de asemenea utilizată pentru a accesa memoria externă a datelor. În acest caz, utilizând registrele de indicatoare R0 și R1 (banca selectată de registre de lucru), o celulă este selectată dintr-un bloc de 256 de octeți de memorie de date externă. Numărul blocului este presetat de conținutul portului P2. Indicatorul de date pe 16 biți (DPTR) poate fi utilizat pentru a accesa orice locație din spațiul de adresă al memoriei de date externe de până la 64 KB. Adresare directă Adresarea directă vă permite să selectați constante din spațiul de adresă de memorie al programului care sunt specificate explicit în comandă. Adresarea indirectă a registrului prin suma registrelor de bază și indexul Adresarea indirectă a registrului prin sumă: registrul de bază plus registrul index (conținutul acumulatorului A) facilitează vizualizarea tabelelor conectate în memoria programului. Orice octet din tabel poate fi selectat la o adresă determinată de suma conținutului DPTR sau PC și a conținutului A. Tabelul simbolurilor și simbolurilor utilizate în sistemul de comandă
Desemnare, simbol Programare
DAR Baterie
Rn Registrele băncii de registru selectate în prezent
r Numărul registrului încărcat specificat în comandă
direct Adresă directă a celulei de date interne pe 8 biți care poate fi adresată direct, care poate fi o celulă de date RAM internă (0-127) sau SFR (128-255)
@Rr Celulă de 8 biți de RAM internă, adresabilă indirect
date8 Date directe pe 8 biți către CPC
dateH Cei mai semnificativi biți (15-8) de date directe pe 16 biți
dateL Cei mai puțin semnificativi biți (7-0) de date directe pe 16 biți
addr11 Adresa de destinație de 11 biți
addrL Biții cei mai puțin semnificativi ai adresei de destinație
disp8 Decalaj de octeți pe 8 biți cu semnul m
pic Bit direct adresabil a cărui adresă conține CPC localizat în memoria internă de date RAM sau SFR
a15, a14 ... a0 Biți de adresă de destinație
(NS) Conținutul elementului X
((NS)) Conținut la adresa stocată în elementul X
(X) [M] Descărcarea M a elementului X
+ - * / ȘI SAU XOR / X Operații: adunare scădere multiplicare divizare multiplicare logică (operație AND) adunare logică (operație OR) modulo 2 adunare (OR exclusivă) inversarea elementului X

Mnemonica funcțională este asociată în mod unic cu combinații specifice de metode de adresare și tipuri de date. Un total de 111 astfel de combinații sunt posibile în sistemul de comandă. Tabelul oferă o listă de comenzi, sortate alfabetic.

Mnemonică Funcţie Steaguri
Comanda ACALL Apel absolut subrutină
ADAUGĂ Echipa A,<байт-источник> Plus AC, C, OV
Echipa A ADDC,<байт-источник> Carry pliere AC, C, OV
Echipa AJMP Tranziție absolută
Echipa ANL<байт-назначения>, <байт-источникa> Logic „ȘI”
Echipa ANL C,<байт-источникa> "ȘI" logic pentru biți variabili
Echipa CJNE<байт-назначения>, <байт-источник>, <смещение> Comparați și săriți dacă nu este egal C
Comanda CLR A Resetarea bateriei
Comanda CLR Se curăță puțin C, bit
CPL Echipa A Inversion of ak umul ora
Echipa CPL Inversia biților C, bit
Echipa DA A Corecția zecimală a acumulatorului pentru așternut AC, C
Echipa DEC<байт> Decrement
Echipa DIV AB Divizia C, OV
Echipa DJNZ<байт>, <смещение> Decrement și tranziție dacă nu zero
Echipa INC<байт> Creştere
Echipa INC DPTR Incrementarea indicatorului de date
Echipa JB , Salt dacă bitul este setat
Echipa JBC , Salt dacă un bit este setat și ștergeți acel bit
Echipa JC Sari dacă transportul este setat
Comandă JMP @ A + DPTR Tranziție indirectă
Echipa JNB , Salt dacă bitul nu este setat
Echipa JNC Salt dacă transportul nu este setat
Echipa JNZ Salt dacă conținutul bateriei este diferit de zero
Echipa JZ Salt dacă conținutul acumulatorului este 0
Comanda LCALL Apel lung
Echipa LJMP Trecere lungă
Comanda MOV<байт-назначения>, <байт-источника> Trimiteți variabila de octeți
Comanda MOV<бит-назначения>, <бит-источника> Trimiteți bitul de date C
Comanda MOV DPTR, # date16 Încărcați indicatorul de date cu constantă pe 16 biți
Comanda MOVC A, @ A + ( ) Trimiteți octeți din memoria programului
Comanda MOVX<байт приемника>, <байт источника> Trimite date în memoria externă (din memoria externă)
Echipa MUL AB Multiplicare C, OV
Comanda NOP Fără operație PC
Echipa ORL<байт-назначения>, <байт-источникa> „SAU” logic pentru octeți variabili
Echipa ORL C,<бит источникa> „SAU” logic pentru biți variabili C
Comanda POP Citind din stivă
Comanda PUSH Stivuire
Comanda RET Reveniți din subrutină
Echipa RETI Revenind de la o întrerupere
Echipa RL A Deplasați conținutul bateriei spre stânga
Echipa RLC A Deplasați conținutul bateriei spre stânga prin intermediul steagului de transport
Echipa RR A Deplasați conținutul bateriei spre dreapta
Echipa RRC A Deplasați conținutul bateriei spre dreapta prin semnalizatorul de transport C
Comanda SETB Set bit C
Echipa SJMP<метка> Salt scurt
Echipa SUBB A,<байт источника> Scădere cu un împrumut AC, C, OV
SWAP O comandă Schimb de notebook-uri în interiorul bateriei
Echipa XCH A,<байт> Schimbarea conținutului acumulatorului cu octet variabil
Echipa XCHD A, @ R1 Schimbul unui caiet
Comandă XRL<байт-назначения>, <байт-источникa> Logic EXCLUSIV SAU pentru variabile de octeți

PLAN DE CONFERINȚĂ

1. Introducere

2. Instrucțiuni aritmetice și logice

3. Comenzi de transfer de date

4. Operații booleene

5. Instrucțiuni de tranziție

1. Introducere

Sistem de comandă MCS-51 acceptă un singur set de instrucțiuni, care este conceput pentru a executa algoritmi de 8 biți pentru controlul dispozitivelor executive. Este posibil să se utilizeze metode rapide de adresare a RAM-ului intern, efectuând operații de biți pe structuri de date mici. Există un sistem extins pentru adresarea variabilelor cu un singur bit ca un tip de date independent, care permite utilizarea biților separați în comenzile logice și de control ale algebrei booleene.

Moduri de adresare : set de comenzi MCS-51 acceptă următoarele moduri de adresare. Adresare directă: operandul este definit de adresa de 8 biți din instrucțiune. Adresarea directă este utilizată numai pentru jumătatea inferioară a datelor interne și a memoriei de înregistrare SFR. Adresare indirectă: instrucțiunea se adresează registrului care conține adresa operandului. Acest tip de adresare este utilizat pentru RAM externă și internă. Registrele pot fi utilizate pentru a indica adrese pe 8 biți R0și R1 banca de registru selectată sau indicatorul stivei SP... Pentru adresarea pe 16 biți, este utilizat doar registrul indicatorului de date DPTR.

Instrucțiuni de înregistrare : registre R0 - R7 banca de registre actuală poate fi adresată prin instrucțiuni specifice care conțin un câmp pe 3 biți care indică numărul de registru în instrucțiunea însăși. În acest caz, câmpul de adresă corespunzător lipsește în comandă. Operații folosind registre speciale: unele instrucțiuni utilizează registre individuale (de exemplu, operații cu bateria, DPTR, etc.). În acest caz, adresa operandului nu este deloc specificată în comandă. Este predefinit de codul opțional.

Constantele imediate : constanta poate fi găsită chiar în comandă după opcode.

Adresare indexată : adresarea index poate fi utilizată numai pentru accesul la memoria programului și numai în modul de citire. În acest mod, tabelele sunt vizualizate în memoria programului. Registru pe 16 biți ( DPTR sau contor program) indică adresa de bază a tabelului cerut, iar acumulatorul indică punctul de intrare în acesta.

Set de comenziare 42 de denumiri mnemonice de comenzi pentru a concretiza 33 de funcții ale acestui sistem. Sintaxa pentru majoritatea comenzilor în limbajul de asamblare constă dintr-o notație funcțională mnemonică urmată de operanzi care indică metode de adresare și tipuri de date. Diferitele tipuri de date sau modurile de adresare sunt determinate de operanzii setați, nu de modificările mnemonice.

Sistemul de comandă poate fi împărțit condiționat în cinci grupe: comenzi aritmetice; comenzi logice; comenzi de transfer de date; comenzi procesor de biți; ramificarea și controlul comenzilor de transfer. Abrevierile și simbolurile utilizate în sistemul de comandă sunt prezentate mai jos.

Masa. Notări și simboluri utilizate în sistemul de comandă

Desemnare, simbol

Programare

Baterie

Registrele băncii de registru selectate în prezent

Numărul registrului încărcat specificat în comandă

direct

Adresă directă de celulă de date internă pe 8 biți direct adresabilă, care poate fi o locație internă RAM de date (0-127) sau un registru de funcții speciale SFR (128-255)

Celulă de 8 biți de RAM internă, adresabilă indirect

8 biți direct date incluse în codul operațional (CPC)

dateH

Cei mai semnificativi biți (15-8) de date directe pe 16 biți

dateL

Cel mai puțin semnificativ biți (7-0) de date directe pe 16 biți

Adresa de destinație de 11 biți

addrL

Cel mai puțin semnificativ bit al adresei de destinație

Octet offset semnat pe 8 biți

Bit direct adresabil, a cărui adresă conține CPC, situat în memoria internă a datelor sau în registrul de funcții speciale SFR

a15, a14 ... a0

Biti de adresa de destinatie

Conținutul elementului X

Conținut la adresa stocată în elementul X

Descărcarea M a elementului X


+

*
ȘI
SAU
XOR
/ X

Operațiuni:
adaosuri
scădere
multiplicare
Divizia
multiplicare logica (operatie AND)
adăugare logică (operație SAU)
add mod 2 (SAU exclusiv)
inversarea elementului X

Mnemonica funcțională este asociată în mod unic cu combinații specifice de metode de adresare și tipuri de date. Un total de 111 astfel de combinații sunt posibile în sistemul de comandă.

2. Instrucțiuni aritmetice și logice

Cât de n exemplu comanda aritmetică, operația de adăugare poate fi efectuată de una dintre următoarele comenzi.

ADĂUGAA,7 F 16 - adăugați numărul 7 la conținutul registrului A F 16 și stocați rezultatul în registrul A;

ADĂUGAA,@ R0 - adăugați la conținutul registrului A numărul a cărui adresă (@ – comercial la ) este stocat în registru R 0 (adresare indirectă) și stocați rezultatul în registrul A;

ADĂUGAȚI A, R7- adăugați conținutul registrului la conținutul registrului A R 7 și salvați rezultatul în registrul A;

ADĂUGAȚI A, # 127- adăugați la conținutul registrului A un număr a cărui adresă de locație de stocare este 127 ( # - simbolul numărului) și salvați rezultatul în registru T- re A.

Toate instrucțiunile aritmetice sunt executate într-un singur ciclu de mașină, cu excepția instrucțiunii INC DPTR(indicator de date offset DPTR la următorul octet), care necesită două cicluri de mașină, precum și operații de multiplicare și divizare efectuate în 4 cicluri de mașini. Orice octet din memoria internă a datelor poate fi incrementat și decrementat fără a utiliza bateria.

Instrucțiuni MUL AB efectuează multiplicarea datelor din acumulator cu datele din registrul B, plasând produsul în registrele A (jumătate joasă) și B (jumătate înaltă).

Instrucțiuni DIV ABîmparte conținutul acumulatorului la valoarea din registrul B, lăsând restul în B și coeficientul din acumulator.

Instrucțiuni DA A este destinat operațiilor aritmetice binare-zecimale (operații aritmetice pe numere reprezentate în cod binar-zecimal). Nu convertește binarul în zecimal binar, dar oferă doar rezultatul corect atunci când se adaugă două numere BCD.

Exemplu comandă logică: Operațiunea AND logică poate fi efectuată de una dintre următoarele comenzi:

ANLA,7 F 16 - multiplicarea logică a conținutului registrului A cu numărul 7 F 16 iar rezultatul este stocat în registrul A;

ANLA,@ R1 - multiplicarea logică a conținutului registrului A cu numărul a cărui adresă este stocată în registru R 1 (adresare indirectă) și stocați rezultatul în registrul A;

ANL A, R6- multiplicarea logică a conținutului registrului A cu conținutul registrului R 6 și stocați rezultatul în registrul A;

ANL A, # 53 - multiplicarea logică a conținutului registrului A cu un număr a cărui adresă de locație de stocare este 53 16, iar rezultatul este stocat în registrul A.

Toate operațiile logice asupra conținutului acumulatorului sunt efectuate într-un ciclu de mașină, restul - în două. Operațiile logice pot fi efectuate pe oricare dintre cei 128 de octeți inferiori ai memoriei de date interne sau pe orice registru SFR (registre de funcții speciale) în modul de adresare directă fără a utiliza o baterie.

Operațiile de deplasare ciclică RL A, RLC A etc. mută conținutul acumulatorului cu un bit spre dreapta sau spre stânga. În cazul unei deplasări ciclice la stânga, bitul cel mai puțin semnificativ este mutat în poziția cea mai semnificativă. În cazul unei deplasări ciclice dreapta, se întâmplă opusul.

Operațiune SWAP A schimbă caietele junior și senior în acumulator.

3. Comenzi de transfer de date

Echipă MOV dest, src vă permite să transferați date între celulele RAM interne sau zona de înregistrare a funcțiilor speciale SFR fără a utiliza o baterie. În acest caz, lucrul cu jumătatea superioară a RAM-ului intern poate fi efectuat numai în modul de adresare indirectă și accesul la registre SFR- numai în modul de adresare directă.

În toate microcircuitele MCS-51 stiva este alocată direct memoriei rezidente de date și crește în sus. Instrucțiuni APĂSAȚI mai întâi crește valoarea în registrul indicatorului stivei SPși apoi împinge un octet de date pe stivă. Comenzi APĂSAȚIși POP sunt utilizate numai în modul de adresare directă (scrierea sau restabilirea unui octet), dar stiva este întotdeauna accesibilă atunci când se adresează indirect printr-un registru SP... Astfel, stiva poate utiliza 128 de octeți superiori de memorie de date. Aceleași considerații exclud posibilitatea utilizării instrucțiunilor stivei pentru adresarea registrelor. SFR.

Instrucțiunile de transfer de date includ o operațiune de transfer pe 16 biți MOV DPTR, # date16 care este utilizat pentru a inițializa registrul indicatorului de date DPTR când vizualizați tabele în memoria programului sau pentru a accesa memoria externă de date.

Operațiune XCH A, octet folosit pentru schimbul de date între acumulator și octetul adresat. Echipă XCHD A, @ Ri este similar cu precedentul, dar se efectuează numai pentru tetradele inferioare care participă la schimbul de operanzi.

Doar adresarea indirectă este utilizată pentru a accesa memoria externă de date. În cazul adreselor cu un singur octet, se utilizează registre R0 sau R1 banca de registre actuală, iar pentru 16 biți - registrul indicatorului de date DPTR... Cu orice metodă de accesare a memoriei de date externe, acumulatorul joacă rolul unei surse sau a unui receptor de informații.

Pentru a accesa tabelele situate în memoria programului, utilizați comenzile:

MOVC A, @ A + DPTR ;

MOVC A, @ A + PC .

Conținutul registrului indicatorului de date este utilizat ca adresă de bază a tabelului. DPTR sau PC(contor program), iar offsetul este preluat de la A... Aceste comenzi sunt utilizate exclusiv pentru citirea datelor din memoria programului, dar nu și pentru scrierea acestuia.

4. Operații booleene

Microcircuite MCS-51 conține un procesor "boolean". RAM-ul intern are 128 de biți direct adresabili. Spațiu special de înregistrare a funcțiilor SFR poate suporta, de asemenea, câmpuri de până la 128 biți Instrucțiunile de biți efectuează salturi condiționale, transferuri, descărcări, inversiuni și operațiuni ȘI SAU. Toți biții specificați sunt disponibili în modul de adresare directă.

Carry bit CFîn registrul de funcții speciale „cuvântul de stare al programului PSW"Este folosit ca acumulator pe un bit al unui procesor boolean.

5. Instrucțiuni de tranziție

Adresele operațiilor de tranziție sunt indicate în limbajul de asamblare printr-o etichetă sau printr-o valoare reală în spațiul de memorie al programului. Adresele de ramură condiționate sunt asamblate într-un decalaj relativ - un octet de semn adăugat contorului de program PC dacă condiția de tranziție este îndeplinită. Limitele unor astfel de tranziții se situează între minus 128 și 127 în raport cu primul octet care urmează instrucțiunii. În registrul funcției speciale „cuvântul de stare al programului PSW"Steagul zero lipsește, deci instrucțiunile JZși JNZ verificați starea „egală cu zero” ca testare a datelor din acumulator.

Există trei tipuri de comenzi ramuri necondiționate: SJMP, LJMPși AJMP- diferită în formatul adresei de destinație. Instrucțiuni SJMP codifică adresa ca un offset relativ și ia doi octeți. Distanța de salt este limitată la un interval de la minus 128 la 127 octeți în raport cu instrucțiunea următoare SJMP.

În instrucțiuni LJMP adresa de destinație este utilizată ca o constantă de 16 biți. Lungimea comenzii este de trei octeți. Adresa de destinație poate fi localizată oriunde în memoria programului.

Echipă AJMP folosește o constantă de adresă de 11 biți. Comanda este formată din doi octeți. Când se execută această instrucțiune, cei 11 biți inferiori ai contorului de adrese sunt înlocuiți cu adresa de 11 biți din instrucțiune. Cele mai semnificative cinci bucăți ale contorului software PC ramane neschimbat. Astfel, saltul poate fi efectuat în interiorul unui bloc de 2K octeți, care conține instrucțiunile care urmează instrucțiunii AJMP.

Există două tipuri de apeluri de subrutină de comandă: LCALLși UN APEL... Instrucțiuni LCALL folosește adresa de 16 biți a subrutinei numite. În acest caz, subrutina poate fi localizată oriunde în memoria programului. Instrucțiuni UN APEL folosește o adresă de subrutină de 11 biți. În acest caz, subrutina numită trebuie să fie localizată într-un bloc de 2K-octeți cu instrucțiunea următoare UN APEL... Ambele versiuni ale comenzii pun adresa stivei următoarei comenzi și o încarcă în contorul de programe PC noua valoare corespunzătoare.

Subrutina se încheie cu o instrucțiune RET pentru a reveni la instrucțiunea care urmează poruncii APEL... Această instrucțiune scoate adresa de returnare din stivă și o încarcă în contorul de programe. PC ... Instrucțiuni RETI folosit pentru a reveni de la rutine de servicii de întrerupere. Singura diferență RETI din RET este asta RETI informează sistemul că gestionarea întreruperilor sa încheiat. Dacă în momentul executării RETI nu există alte întreruperi, atunci este identic RET.

Instrucțiuni DJNZ conceput pentru a controla ciclurile. Pentru a rula ciclul N odată ce trebuie să încărcați octeți cu valoarea N și închideți corpul buclei cu comanda DJNZ indicând începutul ciclului.

Echipă CJNE compară cei doi operanzi ai săi ca numere întregi nesemnate și sare la adresa specificată în acesta dacă operanzii comparați nu sunt egali. Dacă primul operand este mai mic decât al doilea, atunci bitul de transport CF este setat la „1”.

Toate comenzile sub formă asamblată ocupă 1, 2 sau 3 octeți.

Arhitectura microcontrolerului

Înțelegerea arhitecturii microcontrolerelor este esențială atunci când învățați limbaje de programare precum asamblarea. Structura ansamblorului, formatul instrucțiunilor sale, adresarea operanzilor etc., sunt complet determinate de arhitectură. Scopul studierii arhitecturii este:

· Identificarea unui set de registre disponibile pentru programare, scopul funcțional și structura acestora;

· Înțelegerea organizării memoriei cu acces aleatoriu și ordinea utilizării acesteia;

· Familiarizarea cu tipurile de date;

· Studiul formatului instrucțiunilor mașinii;

· Clarificarea organizării gestionării întreruperilor.

Arhitectura familiei MCS-51 este în mare parte predeterminată de scopul său - construcția de dispozitive digitale compacte și ieftine. Toate funcțiile MK sunt implementate utilizând un singur microcircuit. Familia MCS-51 include un număr de microcircuite de la cele mai simple microcontrolere la cele mai complexe. Microcontrolerele familiei MCS-51 vă permit să efectuați atât sarcini de control pentru diferite dispozitive, cât și să implementați noduri individuale ale unui circuit analogic. Toate microcircuitele acestei familii funcționează cu același sistem de comandă, majoritatea fiind executate în aceleași pachete cu același pinout (numerotare pin pentru pachet). Aceasta permite utilizarea microcircuitelor de la diferiți producători (cum ar fi Intel, Dallas, Atmel, Philips etc.) pentru dispozitivul dezvoltat fără a modifica schema de circuit a dispozitivului și a programului.

MCS-51 se bazează pe arhitectura Harvard, unde memoria programului și spațiile adreselor de date sunt separate.

Diagrama bloc a controlerului este prezentată în Figura 2.3 și constă din următoarele unități funcționale principale: unitate de control, dispozitiv logic aritmetic, unitate temporizator / contor, interfață și întreruperi seriale, contor program (contor comandă), memorie date și memorie program.

Schimbul bidirecțional se realizează utilizând o autostradă de date internă pe 8 biți. Să aruncăm o privire mai atentă la scopul fiecărui bloc. Aproape toți reprezentanții familiei MCS-51 sunt construiți în conformitate cu această schemă. Diverse microcircuite ale acestei familii diferă doar în registrele cu destinație specială (inclusiv numărul de porturi). Sistemul de comandă al tuturor controlerelor din familia MCS-51 conține 111 comenzi de bază cu un format de 1, 2 sau 3 octeți și nu se schimbă atunci când se trece de la un microcircuit la altul. Aceasta oferă o portabilitate excelentă a programelor de la un microcircuit la altul.

Unitate de control și sincronizare(Timing and Control) este conceput pentru a genera semnale de sincronizare și control care asigură coordonarea funcționării comune a unităților OEVM în toate modurile admise de funcționare a acesteia. Unitatea de control include:


  • dispozitiv de modelare a slotului de timp,
  • circuit combinațional intrare-ieșire,
  • registru de comandă,
  • decodor de comenzi.

Intrare și weekend semnalele unității de control și sincronizare:

1 PSEN- rezoluția memoriei programului;

2 Ale- semnalul de ieșire al permisiunii de blocare a adresei;

3 PROG- semnal de programare;

4 EA- blocarea muncii cu memoria internă;

5 VPP- tensiunea de programare;

6 RST- semnal general de resetare.

Este necesar un dispozitiv de sincronizare pentru a sincroniza secvența stărilor CPU care formează un ciclu de mașină, precum și pentru funcționarea corectă a tuturor zăvorilor interne și a bufferelor de ieșire ale porturilor. Ciclul mașinii este format din șase stări consecutive (stări) de la S1 la S6, fiecare dintre acestea, la rândul său, fiind împărțită în două faze:

faza 1 (Faza 1 - P1) și faza 2 (Faza 2 - P2). Astfel, un ciclu de mașină poate fi definit ca o secvență de intervale de timp S1P1, S1P2, S2P1, ...., S6P2. Durata fazei este egală cu perioada de repetare a impulsului de ceas, prin urmare ciclul mașinii durează 12 perioade de ceas.

Numărul de cicluri de mașină determină durata execuției instrucțiunii. Aproape toate instrucțiunile sunt executate în unul sau două cicluri de mașină, cu excepția instrucțiunilor de multiplicare și divizare, al căror timp de execuție este de patru cicluri de mașină. Logica de intrare - ieșire este concepută pentru a primi și emite semnale care asigură schimbul de informații cu dispozitive externe prin porturile de intrare / ieșire P0-P3.

Registrul de comandă este destinat înregistrării și stocării codului de operare pe 8 biți al comenzii executate. Codul de funcționare, cu ajutorul decodorului de comandă și a logicii de control al computerului, este convertit în microprograma de execuție a comenzii.

Fig 2.3. Schema bloc a unui microcontroler cu un singur cip Intel 8051

(Familia MCS-51)

Unitate logică aritmetică(ALU) este un dispozitiv paralel de opt biți care efectuează operații aritmetice și logice. ALU constă din:

  • deținerea registrelor -TMP1 și TMP2,
  • Constante ROM,
  • sumator,
  • registru suplimentar - registr B,
  • baterie - ACC,
  • registrul cuvântului de stare al programului (registrul steagurilor) - PSW.

Deținerea registrelor TMP1, TMP2- registre de opt biți destinate recepționării și stocării operanzilor pe durata operațiunilor pe ele. Aceste registre nu sunt accesibile programatic.

Constantele ROM oferă generarea unui cod de corecție pentru reprezentarea de date binar-zecimală, un cod de mască pentru operații de biți și un cod constant.

Sumator paralel de opt biți este un circuit de tip combinație cu transport secvențial, conceput pentru a efectua operații aritmetice de adunare, scădere și operații logice de adunare, multiplicare, inegale și identice.

Registrul B- un registru de opt biți utilizat în timpul operațiilor de multiplicare și divizare. Pentru alte instrucțiuni, acesta poate fi privit ca un registru super-operativ suplimentar.

Baterie- un registru de opt biți conceput pentru a primi și stoca rezultatul obținut atunci când se efectuează operații aritmetico-logice sau operații de deplasare.

Registrul stării programului PSW (Programm Status Word) este destinat stocării cuvântului de stare al comenzilor executate. Atunci când executați multe comenzi în ALU, sunt generate un număr de semne de operare (semnalizatoare), care sunt fixate în registrul cuvântului de stare al programului (PSW). Masa 1 listează steagurile PSW, dă numele lor simbolice și descrie condițiile pentru formarea lor.

Blocare de întrerupere și serie - UART (receptor / emițător asincron universal) este destinat organizării intrării-ieșirii fluxurilor secvențiale de informații și organizării unui sistem de întrerupere a programului.

Prin definiție, o întrerupere înseamnă o întrerupere temporară a procesului principal de calcul pentru a efectua unele acțiuni planificate sau neplanificate cauzate de funcționarea hardware-ului sau a programului.

Aceste acțiuni pot avea un caracter de serviciu, pot fi o cerere din partea programului de utilizator pentru efectuarea întreținerii sau pot fi o reacție la situații anormale.



Ți-a plăcut articolul? Împărtășește-l