Introducere în programarea 8051 în limbaj de asamblare

Încercați Instrumentul Nostru Pentru Eliminarea Problemelor





Limbajul de asamblare este un limbaj de programare de nivel scăzut folosit pentru a scrie codul programului în termeni de mnemonică. Chiar dacă există multe limbi cu nivel ridicat care sunt solicitate în prezent, limbajul de programare a asamblării este utilizat în mod popular în multe aplicații și poate fi utilizat pentru manipulări directe ale hardware-ului. De asemenea, este folosit pentru a scrie Cod de programare 8051 eficient cu un număr mai mic de cicluri de ceas consumând mai puțină memorie în comparație cu celelalte limbi de nivel înalt.

8051 Programare în limbaj de asamblare

8051 Programare



8051 Programare în limbaj de asamblare

Limbajul de asamblare este un limbaj de programare complet legat de hardware. Proiectanții încorporați trebuie să aibă cunoștințe suficiente despre hardware-ul unui anumit procesor sau controlere înainte de a scrie programul. Limbajul de asamblare este dezvoltat de mnemonics, prin urmare, utilizatorii nu îl pot înțelege cu ușurință pentru a modifica programul.


8051 Programare în limbaj de asamblare

8051 Programare în limbaj de asamblare



Limbajul de programare a ansamblului este dezvoltat de diferiți compilatori și popicărie' este cel mai potrivit pentru microcontrolerprogramare dezvoltare. Microcontroleresau procesoarele pot înțelege numai limbajul binar sub forma „0s sau 1s”. Un asamblator convertește limbajul de asamblare în limbaj binar, apoi îl stochează înmicrocontrolermemorie pentru a efectua sarcina specifică.

8051 Microcontroler Architecuture

8051microcontrolereste Arhitectura bazată pe CISC Harvard , și are periferice precum 32 I / O, temporizatoare / contoare, comunicații seriale și memorii.microcontrolernecesită un program pentru a efectua operațiile care necesită o memorie pentru salvare și pentru a citi funcțiile. 8051microcontrolerconstă din memorii RAM și ROM pentru a stoca instrucțiuni.

8051 Microcontroler Arctitecuture

8051 Microcontroler Architecuture

Un registru este partea principală în procesatorii șimicrocontrolere care este conținut în memorie care oferă un mod mai rapid de colectare și stocare a datelor. Programarea limbajului de asamblare 8051 se bazează pe registrele de memorie. Dacă dorim să manipulăm datele către un procesor sau controler prin efectuarea scăderii, adunării etc., nu putem face acest lucru direct în memorie, dar are nevoie de registre pentru a procesa și stoca datele.Microcontrolereconțin mai multe tipuri de registre care pot fi clasificate în conformitate cu instrucțiunile sau conținutul lor care operează în ele.

8051 Programe de microcontroler în limbaj de asamblare

Limbajul de asamblare este format din elemente în care toate sunt folosite pentru a scrie programulmanieră secvențială. Urmați regulile date pentru a scrie programarea în limbaj de asamblare.


Regulile limbajului de asamblare

  • Codul de asamblare trebuie să fie scris cu majuscule
  • Etichetele trebuie să fie urmate de două puncte (etichetă :)
  • Toate simbolurile și etichetele trebuie să înceapă cu o literă
  • Toate comentariile sunt tastate cu litere mici
  • Ultima linie a programului trebuie să fie directiva END

Mnemonicile de limbaj de asamblare sunt sub formă de cod op, cum ar fi MOV, ADD, JMP și așa mai departe, care sunt utilizate pentru a efectua operațiile.

Cod op: Op-code este o singură instrucțiune care poate fi executată de CPU. Aici codul op este o instrucțiune MOV.

Operanzi: Operanzii sunt o singură bucată de date care poate fi operată prin codul op. Exemplu, operația de multiplicare este realizată de operanzii care sunt înmulțiți cu operandul.

Sintaxă: MUL a,b

Elementele programării unui limbaj de asamblare:

  • Asamblați liniile directoare
  • Set de instructiuni
  • Moduri de adresare

Instrucțiuni de asamblare:

Directivele de asamblare dau indicațiile către CPU. 8051microcontrolerconstă din diverse tipuri de directive de asamblare pentru a da direcția unității de control. Cele mai utile directive sunt programarea 8051, cum ar fi:

  • ORG
  • DB
  • EQU
  • SFÂRȘIT

ORG(origine): Această directivă indică începutul programului. Aceasta este utilizată pentru a seta adresa registrului în timpul asamblării. De exemplu, ORG 0000h îi spune compilatorului toate codurile ulterioare începând de la adresa 0000h.

Sintaxă: ORG 0000h

DB(definește octetul): Octetul de definire este utilizat pentru a permite un șir de octeți. De exemplu, tipăriți „EDGEFX” în care fiecare caracter este preluat de adresă și, în final, tipărește „șirul” de DB direct cu ghilimele duble.

Sintaxă:

ORG 0000h

MOV a, # 00h
————-
————-
DB „EDGEFX”

EQU (echivalent): Directiva echivalentă este utilizată pentru a echivala adresa variabilei.

Sintaxă:

reg ech,09h
—————–
—————–
MOVreg,# 2h

SFÂRȘIT: Directiva END este utilizată pentru a indica sfârșitul programului.

Sintaxă:

reg ech,09h

—————–
—————–
MOVreg,# 2h
SFÂRȘIT

Moduri de adresare:

Modul de accesare a datelor se numește mod de adresare. CPU poate accesa datele în moduri diferite prin utilizarea modurilor de adresare. 8051microcontrolerconstă din cinci moduri de adresare, cum ar fi:

  • Mod de adresare imediată
  • Înregistrați modul de adresare
  • Mod de adresare directă
  • Mod de adresare indirectă
  • Mod de adresare a indexului de bază

Mod de adresare imediată:

În acest mod de adresare, sursa trebuie să fie o valoare care poate fi urmată de „#” și destinația trebuie să fie Registre SFR, registre de uz general și adresa. Este utilizat pentru stocarea imediată a valorii în registrele de memorie.

Sintaxă:

MOV A, # 20h // A esteunregistrul acumulatorului, 20 este stocat în A //
MOV R0,# 15 // R0 este un registru de uz general 15 este stocat în registrul R0 //
MOV P0, # 07h // P0 este un registru SFR07 este stocat în P0 //
MOV 20h,# 05h // 20h este adresa registrului 05 stocat în 20h //

Fost:

MOV R0, # 1
MOV R0, # 20 // R0<—R0[15] +20, valoarea finală este stocată în R0 //

Înregistrați modul de adresare:

În acest mod de adresare, sursa și destinația trebuie să fie un registru, dar nu registre cu scop general. Deci datele nu sunt mutate în registre bancare de uz general .

Sintaxă:

MOV A, B // A este un registru SFR, B este un registru de uz general //
MOV R0, R1 // Instrucțiuni nevalide, GPR la GPR nu este posibil //

FOST:

MOV R0, # 02h
MOV A, # 30h
ADĂUGAȚI R0, A // R0<—R0+A, the final value is stored in the R0 register//

Mod de adresare directă

În acest mod de adresare, sursa sau destinația (sau ambele sursă și destinație) trebuie să fie o adresă, dar nu o valoare.

Sintaxă:

MOV A,20h // 20h este o adresă A este un registru //
MOV 00h, 07h // ambele sunt adresate din registrele GPS //

Fost:

MOV 07h,# 01h
MOV A, # 08h
ADAUGA O,07h // A<—A+07h the final value is stored in A//

Mod de adresare indirectă:

În acest mod de adresare, sursa sau destinația (sau destinația sau sursa) trebuie să fielaadresa indirectă, dar nu o valoare. Acest mod de adresare acceptă conceptul de pointer. Pointerul este o variabilă care este utilizată pentru a stoca adresa celeilalte variabile. Acest concept de pointer este utilizat numai pentru registrele R0 și R1.

Sintaxă:

MOVR0, # 01h // 01 valoarea este stocată în registrul R0, adresa R0 este 08h //
MOV R1, # 08h // R1 este variabila pointer caremagazineadresa (08h) a R0 //
MOV 20h,@ R1 // 01 valoarea este stocată în adresa de 20 de ore a registrului GP //

Mod de adresare indirectă

Mod de adresare indirectă

Mod de adresare a indexului de bază:

Acest mod de adresare este utilizat pentru a citi datele din memorie externă sau memorie ROM . Toate modurile de adresare nu pot citi datele din memoria codului. Codul trebuie să citească prin registrul DPTR. DPTR este utilizat pentru a indica datele în cod sau în memoria externă.

Sintaxă:

MOVC A, @ A + DPTR // C indică memoria de cod //
MOCX A, @ A + DPTR // X indică memoria externă //
EX: MOV A, # 00H // 00H este stocat în registrul A //
MOV DPTR, # 0500H // DPTR punctează adresa 0500h în memorie //
MOVC A, @ A + DPTR // trimiteți valoarealaregistrul A //
MOV P0, A // data trimiterii către registratorul PO //

Set de instructiuni:

Setul de instrucțiuni este structura controlerului sau procesorului care furnizează comenzi controlerului pentru a ghida controlorul pentru prelucrarea datelor. Setul de instrucțiuni constă din instrucțiuni, tipuri de date native, moduri de adresare, registre de întreruperi, manipulare excepțională și arhitectură de memorie. 8051microcontroler poate urma instrucțiunile CISC cu arhitectura Harvard. În cazul programării 8051, diferite tipuri de instrucțiuni CISC includ:

  • Set de instrucțiuni de transfer de date
  • Set de instrucțiuni secvențiale
  • Set de instrucțiuni aritmetice
  • Ramificare Instructiona stabilit
  • Set de bucle de instrumente
  • Set de instrucțiuni condiționate
  • Set de instrucțiuni necondiționate
  • Set de instrucțiuni logice
  • Set de instrucțiuni booleene

Set de instrucțiuni aritmetice:

Instrucțiunile aritmetice efectuează operațiuni de bază, cum ar fi:

  • Plus
  • Multiplicare
  • Scădere
  • Divizia

Plus:

ORG 0000h
MOV R0, # 03H // mutați valoarea 3 în registrul R0 //
MOV A, # 05H // mutați valoarea 5 în acumulatorul A //
Adăugați A, 00H //adauga ovaloare cu valoare R0 și stochează rezultatulînA//
SFÂRȘIT

Multiplicare:

ORG 0000h
MOV R0, # 03H // mutați valoarea 3 în registrul R0 //
MOV A, # 05H // mutați valoarea 5 în acumulatorul A //
MUL A, 03H //Înmulțitrezultatul este stocat în acumulatorul A //
SFÂRȘIT

Scădere:

ORG 0000h
MOV R0, # 03H // mutați valoarea 3 pentru a înregistra R0 //
MOV A, # 05H // mutați valoarea 5 în acumulatorul A //
SUBB A, 03H // Valoarea rezultatului este stocată în acumulatorul A //
SFÂRȘIT

Divizia:

ORG 0000h
MOV R0, # 03H // mutați valoarea 3 pentru a înregistra R0 //
MOV A, # 15H // mutați valoarea 5 în acumulatorul A //
DIV A, 03H // valoarea finală este stocată în acumulatorul A //
SFÂRȘIT

Instrucțiuni condiționate

CPU execută instrucțiunile pe baza condiției verificând starea unui singur bit sau starea de octet. 8051microcontrolerconstă din diverse instrucțiuni condiționate, cum ar fi:

  • JB -> Salt mai jos
  • JNB -> Salt dacă nu mai jos
  • JC -> Salt dacă Carry
  • JNC -> Salt dacănuTransporta
  • JZ -> Salt dacă zero
  • JNZ -> Salt dacănuZero
Instrucțiuni condiționate

Instrucțiuni condiționate

1. Sintaxă:

JB P1.0, etichetă
- - - - - - - -
- - - - - - - -
Eticheta: - - - - - - - -
- - - - - - - -
SFÂRȘIT

2. Sintaxă:

JNB P1.0, etichetă
- - - - - - - -
- - - - - - - -
Eticheta: - - - - - - - -
- - - - - - - -
SFÂRȘIT

3. Sintaxă:

JC, etichetă
- - - - - - - -
- - - - - - - -
Eticheta: - - - - - - - -
- - - - - - - -
SFÂRȘIT

4. Sintaxă:

JNC, etichetă
- - - - - - - -
- - - - - - - -
Eticheta: - - - - - - - -
- - - - - - - -
SFÂRȘIT
5. Sintaxă:

JZ, etichetă
- - - - - - - -
- - - - - - - -
Eticheta: - - - - - - - -
- - - - - - - -
SFÂRȘIT

6. Sintaxă:

JNZ, etichetă
- - - - - - - -
- - - - - - - -
Eticheta: - - - - - - - -
- - - - - - - -
SFÂRȘIT

Instrucțiuni de apelare și salt:

Instrucțiunile de apelare și salt sunt utilizate pentru a evita replicarea codului programului. Când un anumit cod folosit de mai multe ori în diferite locuri din program, dacă menționămnume specificlacodul atunciam putea folosi acest nume oriunde în program fără a introduce un cod de fiecare dată. Acest lucru reduce complexitatea programului. Programarea 8051 constă din instrucțiuni de apel și sărituri precum LCALL, SJMP.

  • LCALL
  • UN APEL
  • SJMP
  • LJMP

1. Sintaxă:

ORG 0000h
- - - - - - - -
- - - - - - - -
ACALL, eticheta
- - - - - - - -
- - - - - - - -
SJMP STOP
Eticheta: - - - - - - - -
- - - - - - - -
- - - - - - - -
dreapta
STOP:NOP

2. Sintaxă:

ORG 0000h
- - - - - - - -
- - - - - - - -
LCALL, etichetă
- - - - - - - -
- - - - - - - -
SJMP STOP
Eticheta: - - - - - - - -
- - - - - - - -
- - - - - - - -
dreapta
STOP:NOP

Instrucțiuni de apelare și saltare

Instrucțiuni de apelare și saltare

Instrucțiuni buclă:

Instrucțiunile de buclă sunt folosite pentru a repeta blocul de fiecare dată în timp ce efectuați operațiile de creștere și descreștere. 8051microcontrolerconstă în două tipuri de instrucțiuni de buclă:

  • CJNE -> comparați și săriți dacă nu este egal
  • DJNZ -> decrementează și sare dacă nu zero

1. Sintaxă:

deCJNE
MOV A, # 00H
MOV B, # 10H
Eticheta: INC A
- - - - - -
- - - - - -
CJNE A, etichetă

2. Sintaxă:

deDJNE

MOV R0, # 10H
Eticheta: - - - - - -
- - - - - -
DJNE R0, etichetă
- - - - - -
- - - - - -
SFÂRȘIT

Set de instrucțiuni logice:

Setul de instrucțiuni pentru microcontroler 8051 oferă AND, OR, XOR, TEST, NOT și instrucțiuni logice booleene pentru set și șterge biții în funcție de necesitatea din program.

Set de instrucțiuni logice

Set de instrucțiuni logice

1. Sintaxă:

MOV A, # 20H / 00100000 /
MOV R0, # 03H / 00000101 /
ORL A, R0 // 00100000/00000101 = 00000000 //

2. Sintaxă:

MOV A, # 20H / 00100000 /
MOV R0, # 03H / 00000101 /
ANL A, R0

3. Sintaxă:

MOV A, # 20H / 00100000 /
MOV R0, # 03H / 00000101 /
XRL A, R0

Operatori de schimbare

Operatorii de schimb sunt folosiți pentru trimiterea și primirea eficientă a datelor. 8051microcontrolerconstau din patru operatori de schimb:

  • RR -> Rotire dreapta
  • RRC -> Rotiți la dreapta prin transport
  • RL -> Rotire la stânga
  • RLC -> Rotiți la stânga prin transport

Rotiți la dreapta (RR):

În această operație de schimbare, MSB devine LSB și toți biții se deplasează spre partea dreaptă bit cu bit, în serie.

Sintaxă:

MOV A, # 25h
RR A

Rotiți la stânga (RL):

În această operațiune de schimbare, MSB devine LSB și toți biții se deplasează spre partea stângă bit cu bit, în serie.

Sintaxă:

MOV A, # 25h
RL A

RRC Rotire dreapta prin transport:

În această operațiune de deplasare, LSB se deplasează pentru a transporta și transportul devine MSB și toți biții sunt deplasați spre poziția dreaptă bit cu bit.

Sintaxă:

MOV A, # 27h
RRC A

RLC Rotire stânga prin Carry:

În această operațiune de schimbare, MSB se deplasează pentru a transporta și transportul devine LSB și toți biții se deplasează spre partea stângă într-o poziție bit-by-bit.

Sintaxă:

MOV A, # 27h
RLC A

Programe de bază Embedded C:

microcontrolerprogramarea diferă pentru fiecare tip de sistem de operare. Sunt multe sisteme de operare precum Linux, Windows, RTOS și așa mai departe. Cu toate acestea, RTOS are mai multe avantaje pentru dezvoltarea sistemului încorporat. Unele dintre exemplele de programare la nivel de asamblare sunt date mai jos.

LED intermitent folosind cu 8051microcontroler:

  • Afișarea numărului pe afișajul pe 7 segmente utilizând microcontrolerul 8051
  • Calculatoare de timp / contor și program folosind 8051microcontroler
  • Calcule și program de comunicare în serie folosind 8051microcontroler

Programe LED cu 8051 Microcontrller

1. WAP pentru a comuta LED-urile PORT1

ORG 0000H
TOGLE: MOV P1, # 01 //mutare00000001 la registrul p1 //
CALL DELAY // executați întârzierea //
MOV A, P1 // mutațivaloarea p1la acumulator //
CPL A // complementează valoarea A //
MOV P1, A // mutați 11111110 în registrul port1 //
CALL DELAY // executați întârzierea //
SJMP TOGLE
Întârziere: MOV R5, # 10H // registrul de încărcare R5 cu 10 //
DOUĂ: MOV R6, # 200 // registrul de încărcare R6 cu 200 //
ONE: MOV R7, # 200 // registrul de încărcare R7 cu 200 //
DJNZ R7, $ // scade R7 până când este zero //
DJNZ R6, ONE // scade R7 până la zero //
DJNZ R5, DOUĂ // scade R7 până când este zero //
RET // reveniți la programul principal //
SFÂRȘIT

Timer / Contor Calcule și program folosind 8051 Microcontroler:

Întârzierea este unul dintre factorii importanți în dezvoltarea software-ului de aplicații. cronometre și contoare sunt componente hardware alemicrocontroler, care sunt utilizate în multe aplicații pentru a oferi întârzierea precisă cu impulsuri de numărare. Balte sarcini sunt implementate prin tehnica software.

1. WAP pentru a calcula întârzierea de 500us.

MOV TMOD, # 10H // selectați modul cronometru prin registre //
MOV TH1, # 0FEH // stochează timpul de întârziere în bit mai mare //
MOV TL1, # 32H // stochează timpul de întârziere în bit redus //
JNB TF1, $ // scade valoarea temporizatorului până când este zero //
CLR TF1 // ștergeți semnalizatorul temporizatoruluipic//
CLR TR1 // OPRIT cronometrul //

2. WAP pentru a comuta LED-urilecu5secîntârziere

ORG 0000H
RETURN: MOV PO, # 00H
ÎNTÂRZIERE APEL
MOV P0, # 0FFH
ÎNTÂRZIERE APEL
ÎNTORNIRE SJUMP
Întârziere: MOV R5, # 50H // registru de încărcare R5 cu 50 //
DELAY1: MOV R6, # 200 // registru de încărcare R6 cu 200 //
DELAY2: MOV R7, # 229 // registru de încărcare R7 cu 200 //
DJNZ R7, $ // scade R7 până când este zero //
DJNZ R6, DELAY2 // scade R6 până când este zero //
DJNZ R5, DELAY1 // scade R5 până la zero //
RET // reveniți la programul principal //
SFÂRȘIT

3. WAP pentru a număra cele 250 de impulsuri folosind modul0 count0

Sintaxă:

ORG 0000H
MOV TMOD, # 50H // selectați contorul //
MOV TH0, # 15 // mutați impulsurile de numărare bit mai sus //
MOV TH1, # 9FH //mutareimpulsurile de numărare, bit inferior //
SET TR0 // PE cronometru //
JNB $ // scade valoarea contorului până la zero //
CLR TF0 // ștergeți contorul, semnalizațipic//
CLR TR0 // opriți temporizatorul //
SFÂRȘIT

Programare comunicare în serie folosind 8051 Microcontroler:

Comunicare în serie este utilizat în mod obișnuit pentru transmiterea și primirea datelor. 8051microcontrolerconstau din comunicații seriale UART / USART, iar semnalele sunt transmise și recepționate deTxși pinii Rx. Comunicarea UART transferă datele bit-by-bit în serie. UART este un protocol semi-duplex care transferă și primește datele, dar nu în același timp.

1. WAP pentru a transmite caracterele către Hyper Terminal

MOV SCON, # 50H // setează comunicarea serial //
MOV TMOD, # 20H // selectați modul temporizator //
MOV TH1, # -3 // setează rata de transmisie //
SETAȚI TR1 // PE cronometru //
MOV SBUF, # ’S’ // transmite S la fereastra serială //
JNB TI, $ // scade valoarea temporizatorului până când este zero //
CLR RI // ștergeți primi întreruperea //
CLR TR1 // cronometru clar //

2. WAP pentru a transmite Primirea caracterului de către Hyper Terminal

MOV SCON, # 50H // setează comunicarea serial //
MOV TMOD, # 20H // selectați modul temporizator //
MOV TH1, # -6 // setează rata de transmisie //
SET TR1 // pe temporizator //
MOV SBUF, # ’S’ // transmite S la fereastra serială //
JNB RI, $ // scade valoarea temporizatorului până când este zero //
CLR RI // ștergeți primi întreruperea //
MOV P0, SBUF // trimiteți valoarea registrului SBUF la port0 //
CLR TR1 // cronometru clar //

Aceasta este totul despre programarea 8051 în limbaj de asamblare pe scurt, cu programe bazate pe exemple. Sperăm că aceste informații adecvate despre limbajul asamblării vor fi cu siguranță utile cititorilor și așteptăm cu nerăbdare comentariile lor valoroase în secțiunea de comentarii de mai jos.