Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Se va proiecta un calculator electronic care efectueaza inmultirea a doua numere cu afisarea rezultatului, si cu o tastatura folosita la introducerea operanzilor si la configurari de lucru.

Informatica











TEMA DE PROIECTARE:


Se va proiecta un calculator electronic care efectueaza înmultirea a doua numere cu afisarea rezultatului, si cu o tastatura folosita la introducerea operanzilor si la configurari de lucru.



DATE DE PROIECTARE:


Se va folosi un microcontroler din seria 8051 a carui frecventa de ceas va fi 20MHz. Afisarea datelor va fi facuta prin tehnica multiplexarii. Primul operand va fi pe 4 digiti, respectiv al 2-lea operand pe 2 digiti. Se va folosi un numar de 4 taste.






























CAP I Proiectare hardware


Microsistemul va fi compus din doua parti principale:

*  Unitatea de calcul si de preluare a comenzilor ( tastatura ).

Este organizata în jurul unui controler din familia 8051 produs de INTEL. Aceasta are rolul de preluare a informatiei de la tastatura, procesarea soft a acesteia si gestionare a sistemului de afisare. Toate aceste operatii sunt efectuate conform unui program de lucru înscris in memoria ROM interna a microcontrolerului.

*  Unitatea de afisare

Aceasta cuprinde o tabela cu celule elementare de afisare cu leduri precum si circuitele de comanda ale acestora.


Proiectarea unitatii de afisare

Se foloseste tehnica afisarii multiplexate. Este o metoda eficienta din punct de vedere al consumului si al reducerii complexitatii circuitelor de comanda. Tehnica se bazeaza pe efectul de integrare al ochiului uman la stimuli luminosi cu frecventa ridicata.

Se utilizeaza un numar de 12 celule de afisare, pe care se reprezinta cei doi operanzi si rezultatul operatiei de înmultire. Primului operand îi revin 4 celule de afisare, celui de-al doi-lea operand - 2 celule si rezultatlui - 6 celule de afisare, conform urmatorului calcul :

6 celule

Dispunerea celulelor de afisare se face pe doua linii si sase coloane, conform schemei :

Conform logicii de afisare multiplexata, la un anumit moment trebuie sa fie activata doar o singura coloana. Forma de unda prezentata mai jos arata faptul ca fiecare celula de afisare se aprinde cu o frecventa de 50Hz, astfel ochiul va sesiza celula aprinsa tot timpul.



Celulele de afisare folosite sunt cu catod comun, produse de LITEON. Principalele caracteristici sunt :

*  Curent prin segment in regim continuu 25mA

*  Curent prin segment in regim de impulsuri 90mA

* Caderea de tensiune pe segment                     2V


Comanda liniilor si coloanelor este realizata de circuite speciale de comutatie cu tranzistoare. Este nevoie de doua astfel de circuite de comanda corespunzator activarii unei coloane (circuit ce trebuie sa asigure un curent relativ mai mare avand in vedere ca trebuie sa suporte consumul de 1,260A al tuturor segmentelor de pe coloana in starea ON), si un circuit corespunzator activarii unui singur segment ( el trebuie sa suporte curentul maxim prin segment in starea ON )

Aceste structuri vor interactiona cu trei dintre porturile controlerulului 8051. Având in vedere ca 8051 poate sustine pe port un curent de numai 2mA, rezulta ca o conditie de proiectare a circuitelor de comanda este ca intarea lor sa consume cat mai putin curent dintr-un astfel de port.





Schema circuitului de comanda pentru o celula de afisare:







*  Functionare :

Ledurile din cadrul celulei de afisare sunt comandate prin intermediul unui tranzistor BC177 care lucreaza in regim de comutatie. Fiecare segment al celulei este inseriat cu o rezistenta in vederea limitarii curentului maxim prin aceasta la valoarea recomandata in foaia de catalog, de 90mA. Organizarea afisajului prezentata anterior face ca tranzistorul raspunz& 515w2215f #259;tor de comanda coloanelor sa trebuiasca sa suporte un curent maxim de 2x7x90mA=1,260A. Interfata circuitelor de comanda la porturile controlerului se face cu buffere 7404.

Tranzistorul BC177 se blocheaza daca iesirea portii 7404 corespunzatoare trece în « 1 » logic. Rezistentele din baza vor fi in paralel si prin ele nu va circula curent deoarece curentul Ib este 0 la blocare. Caderea de tensiune de pe resistente va fi 0 iar in baza vom avea 5V. Deci Veb=0 si BC177 blocat. Daca la iesirea portii 7404 este nivel « 0 »logic, baza tranzistorului este polarizata prin divizorul resistiv astel încât Veb=0.7V si tranzistorul sa se deschida. Deci aprinderea unui segment se face aplicând pe portul de iesire al microcontrolerului un semnal cu nivel « 1 »logic. Pentru stingere « 0 »logic.

Comanda coloanelor este facuta de tranzistorul MOS FDS6680, care primeste comanda o tensiune cu nivel logic TTL. Trecerea din conductie in bocare si invers a acestui tranzistor presupune incarcarea si descarcarea capacitatii Vgs.

* Componenete folosite :

BC177 - Vce(sat)=0.95V

Icmax=100mA

Pdmax=300mW

FDS6680 (Logic level MOSFET canal N)

Rds(on)=0.013Ω

Id(max puls)=50A

Pdmax=2,5W

* Calculul elementelor de circuit :



Aleg Ir2=1mA

*

Vr2=0,7V Aleg R2=680Ω, 0.125W RPC


TKI:

TKII:

Aleg R1=470Ω, 0,125W RPC


Calculul rezistentei de limitare a curentului prin segment :


Aleg R2=24 , 0.25W RPC


Rezistenta din grila MOS are rolul de a limita curentul de incarcare/descarcare absorbit in momentele de comutatie directa si inversa. Având in vedere ca limita de curent pe portul de iesire al microcontrolerului este de 2mA, curentul de grila va trebui limitat la o valoare cel mult egala cu 2mA. Alegem pentru acesta o valoare de 1mA. Aceasta valoare va determina insa o comutatie mai lenta. Capacitatea Ggs se va incarca mai lent. Acesta nu constituie insa un dezavantaj deoarece pentru 1mA timpii de comutatie (us) ramân mult mai mici decât timpii de conductie (3.3ms) si de blocare (16.7ms)

Calculul rezistentei de limitare :



* Simulare ORCAD Pspice

Se simuleaza comutatia tranzistorului BC177. Sarcina acestuia este o rezistenta echivalenta (led+R4+RdsON). Se urmareste variatia curentului de colector si tensiunea pe sarcina la comutatia directa si inversa.






*  Simularea circuitului de control coloane

Se urmareste variatia in timp a curentului de drena (Id), a curentului de grila (Ig) si a tensiunii pe sarcina. Grupul BC177+led+Rled s-a înlocuit cu o rezistenta echivalenta de 3.88Ω:

Schema folosita in simulare :


Tastatura

Rolul tastelor T1,T2,T3,T4:

  • Tasta T1 produce la apasare intrarea in regimul de programare. In acest regim de lucru starea tastei T1 nu mai conteaza.
  • Tasta T2 produce incrementarea pe panoul de celule de afisare a pozitiei digitului care se programeaza. Acest digit va avea si un efect FLASH. Incrementarea pozitiei se face de la stînga la dreapta, cu revenire pe prima pozitie la depasire.
  • Tasta T3 produce la apasare incrementarea valorii afisate de digitul ce se programeaza. Incrementarea se face in zecimal.
  • Tasta T4 produce la apasare iesirea din regimul de programare si revenirea in regimul normal de lucru. În plus se declanseaza in programul principal si executia conversiilor si a inmultirii.


1.3 Circuit de RESET:


La punerea in functie a microcontrolerului, circuitul de reset trebuie sa actioneze un timp de cel putin 24 perioade ale semnalului de ceas. Înaintea conectarii tensiunii de alimentare condensatorul C este descarcat, tensiunea la borne fiind "0". Dupa alimentare, condensatorul scurtcircuiteaza intrarea RESET la tensiunea de alimentare. Timpul de scurtcircuitare este dependent de viteza de încarcare a condensatorului prin rezistorul R.

Aleg R=1k

Deci capacitatea minima necesara mentinerii intrarii RESET in "1" pe durata 24*Tosc este C=1nF

Se alege pentru C o valoare mai mare: C=1uF

Dioda D realizeaza descarcarea rapida a condensatorului la deconectarea alimentarii pentru ca resetul circuitului sa lucreze corect la urmatoarea conectare a tensiunii de alimentare.










Cap II Interfata software


Programul ce se înscrie în memoria microcontrolerului va realiza gestionarea tastaturii, a afisajului multiplexat, si va efectua operatia de înmultire în conformitate cu setarea modului de lucru ales de operator.

Softul este împartit in program principal si rutina timer:


Programul principal verifica in permanenta semaforul modului de lucru (prog), si daca acesta este gasit setat se trece in regim de programare, verificându-se daca a fost apasata o tasta. Când semaforul nu este gasit setat, programul reia testul acestuia pâna la îndeplinirea conditiei.

Schema bloc a programului principal este:






Functionare: Programul începe prin initializarea registrilor si a variabilelor de lucru, configurarea porturilor si a registrilor speciali din zona SFR referitori la gestiunea intreruperii.

Dupa aceste configurari initiale, se trece la testul regimului de lucru prin interogarea semaforului "prog". Daca acesta este gasit setat (ca in cadrul rutinei timer s-a detectat apasarea tastei T1) programul trece la resetarea registrilor de lucru in care se vor prelua date in vederea efectuarii operatiei de inmultire (câmpul registrilor de afisare si al celor de programare). Aceasta operatie este efectuata in urma testarii indicatorului "init_var", si este facuta doar la prima intrare in regimul de programare prin apelarea rutinei "init_nr". Semaforul este setat la detectia apasarii tastei T1 si resetat dupa operatia de resetare.

Dupa resetarea registrilor de lucru programul testeaza indicatoarele de apasare ale celor doua taste T2 si T3: "stare_t2" si "stare_t3"

Daca "stare_t2" este gasit "1"(rutina timer a detectat apasarea tastei T2) se efectueaza deplasarea unui pointer R1 in cadrul câmpului de digiti programabili (dig_prog_XX), si al unui pointer de stare Flash: R0 in cadrul câmpului de digiti pentru afisare (dig_afis_XX).

Daca "stare_t3" este gasit setat, este incrementat continutul locatiei RAM a carei adresa este pastrata in pointerul de programare R1, apoi se extrage din tabela de conversie BCD-7segmente codul 7segmente al numarului curent înscris in registru pentru a fi înscris in locatia corespunzatoare din câmpul variabilelor de afisare.

Dupa iesirea din gestionare a regimului de programare este interogat semaforul "executa". Iesirea din acest regim de lucru este facuta de apasarea tastei T4, care implicit seteaza si acest semafor. Setarea acestuia va declansa in programul principal apelarea rutinei care este responsabila cu efectuarea operatiilor de conversii si de inmultire.

In regimul normal de lucru se efectueaza doar testul celor doua flaguri: "prog" si "executa" .


2.11 Rutina de reset a operanzilor:


2.12 Rutina de calcul a produsului

În cadrul acesteia se preiau numerele reprezentate in cod BCD de la adresele digitilor programabili, se convertesc in binar apoi este efectuata înmultirea si conversiile binar-bcd si bcd-7segmente:


Conversia BCD_BINAR

Se realizeaza înainte o concatenare a octetilor in format BCD in registrii R2 si R3, cu acestia se va porni in efectuarea conversiei. Pentru operandul 1 numarul in binar se va obtine in registrii R4(ocms) si R5(ocmps), iar pentru al doilea in registrul R2.


Numarul maxim ce va fi convertit este 9999=270Fh (pe doi octeti: R4=27h R5=0Fh)

Operatia de inmultire  

Operanzii se preiau din registrii R4 si R5 respectiv R2. rezultatul se obtine in registrii bin1(ocms), bin2, bin3(ocmps). Registrul R2 se initializeaza in vederea operatiilor de rotire a lui R4 si R5. Rezultatul va fi pe trei octeti: 270Fh*63h=F1ACDh. bin1=0Fh; bin2=1Ah; bin3=CDh.




Conversia binar-bcd

Se preia rezultatul înmultirii din registrii bin1, bin2, bin3 si se transforma in cod bcd, in registrii R2(ocms), R3, R4(ocmps). Se initializeaza registrul "cont_bcd" cu numarul de pasi ce reprezinta numarul de biti ai rezultatului: 2410=18h (trei registrii).



Conversia bcd-7segmente

Se preia pe pozitia cmps a registrului A câte un nyble din registrii R2, R3, R4 ce contin codul BCD al rezultatului. Cu registrul A se va face apelarea indirecta a tabelei de conversie BCD-7SEGMENE ce se afla scrisa in zona memoriei de date. Dupa fiecare apelare, rezultatul se transfera in zona RAM rezervata octetilor ce se vor prelua in vederea afisarii.

La apelare se foloseste registrul DPTR pe 16 biti initializat cu adresa de început a tabelei de conversie. Tabela se depune in memoria de programe, intr-o zona ulterioara celei in care se scrie programul principal.


Subrutina de intreruperi de la TMER 0


Aceasta parte a programului este responsabila de gestionarea apasarii celor 4 taste, de controlul afisarii multiplexate si de controlul starii FLASH.

Subrutina contine doua parti:

* Intr-o prima faza se trateaza logica de afisare (trimiterea pe coloana activa a codurilor 7 segmente ce trebuie afisate in cadrul acesteia) si gestionarea apasarii tastei T1 cu care se face intrarea in regim de programare. Daca tasta T1 este apasata, rutina se comuta pe faza 2 dupa ce este tratata partea de afisare multiplexata.

* In faza a doua se intra doar la detectia apasarii tastei T1. In aceasta faza se trateaza pa rând tastele T2 (pentru incrementarea adresei digitului programabil) tasta T3 (pentru incrementarea digitului programabil) si tasta T4 (care permite iesirea din regimul de programare). Apasarea tastei T4 declanseaza de asemenea in programul principal si executia operatiei de înmultire (cu conversiile corespunzatoare).






Schema bloc a subrutinei:




Calculul constatei de numarare a canalului TIMER0:

Rutina ISR este apelata la fiecare 3.3ms (perioada de refresh la circuitele de afisare). Temporizarea de 3.3ms este realizata prin incrementarea constantei înscrise in registrii TH0 si TL0. Se pleaca de la frecventa de baza a cristalului de cuart: 20MHz. Timerul primeste impulsurile CLK divizate cu 12.



TH0=EAh ; TL0=84h

Constata de numarare se reîncarca în registrii corespunzatori TH0 si TL0 la fiecare început de gestionre a rutinei de întreruperi.


Configurarea registrului IE:

EA

X

X

ES

ET1

EX1

ET0

EX0









IE=82h

Configurarea registrului TMOD:

Gate1

C/T 1

M1

M0

Gate2

C/T2

M1

M0









IE=21h

Configurarea registrului TCON:

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0









IE=10H




Cap III Lista de variabile


variabila

adresa

val initiala

semnificatie

DIG_AFIS_11

30h

7Eh

Pastreaza codul 7SEG al primei cifre din operandul 1

DIG_AFIS_12

31h

7Eh

Pastreaza codul 7SEG al cifrei 2 din operandul 1

DIG_AFIS_13

32h

7Eh

Pastreaza codul 7SEG al cifrei 3 din operandul 1

DIG_AFIS_14

33h

7Eh

Pastreaza codul 7SEG al cifrei 4 din operandul 1

DIG_AFIS_21

34h

7Eh

Pastreaza codul 7SEG al primei cifre din operandul 2

DIG_AFIS_22

35h

7Eh

Pastreaza codul 7SEG al cifrei 2 din operandul 2

DIG_AFIS_31

36h

7Eh

Pastreaza codul 7SEG al primei cifre din rezultat

DIG_AFIS_32

37h

7Eh

Pastreaza codul 7SEG al cifrei 2 din rezultat

DIG_AFIS_33

38h

7Eh

Pastreaza codul 7SEG al cifrei 3 din rezultat

DIG_AFIS_34

39h

7Eh

Pastreaza codul 7SEG al cifrei 4 din rezultat

DIG_AFIS_35

3Ah

7Eh

Pastreaza codul 7SEG al cifrei 5 din rezultat

DIG_AFIS_36

3Bh

7Eh

Pastreaza codul 7SEG al cifrei 6 din rezultat

dig_prog_11

3Ch

00h

Pastreaza codul BCD al primei cifre din primul operand

dig_prog_12

3Dh

00h

Pastreaza codul BCD al cifrei 2 din primul operand

dig_prog_13

3Eh

00h

Pastreaza codul BCD al cifrei 3 din primul operand

dig_prog_14

3Fh

00h

Pastreaza codul BCD al cifrei 4 din primul operand

dig_prog_21

40h

00h

Pastreaza codul BCD al primei cifre din al doilea operand

dig_prog_22

41h

00h

Pastreaza codul BCD al cifrei 2 din al doilea operand

COL

42h

01h

Registru folosit in rutina ISR. El memoreaza codul coloanei de afisare activa pe durata dintre întreruperi

IMG_COL

43h


Registru folosit in rutina ISR. Are rolul de buffer pentru registrul COL pe durata cât acesta este testat in rutina de tratare a afisarii multiplexate

cont_t1,2,3,4

44h, 45h,46h,

47h


Registrii folositi la contorizarea rutinelor timer ce trebuie sa se scurga in vederea realizarii temporizarii de 10ms necesare in procesul de deboncing la apasarea si relaxarea tastelor T1, T2, T3, T4.

cont_flash

48h

00h

Contor de numarare a rutinelor timer in vederea realizarii temporizarii de 500ms necesare in realizarea efectului de flash la celula de afisare ce se programeaza

cont_bcd

4Ah


Contor de numarare al pasilor de lucru necesari in rutinele de conversie binar_bcd si bcd_binar.

buffer

49h

00h

Are rol de memorare al continutului registrului ce se programeaza in perioadele in care celula corespunzatoare este stinsa in starea de lucru flash

Temp, temp1

4Bh,4Ch


Registrii folositi la stocari temporare de date.

bin1

4Dh


Registru in care se depune OCMS al rezultatului inmultirii

bin2

4Eh


Memoreaza octetul al doilea din rezultatul inmultirii

bin3

4Fh


Memoreaza OCMPS din rezultatul înmultirii

rdy_t1,2,3,4

00h, 01h, 02h,

03h



Semafor ce valideaza începerea citirii starii tastei T1,2,3,4 in rutina ISR

rdy_tX=0- în acest caz tasta tX este apasata si programul nu va mai putea citi starea ei decât dupa relaxarea ei, când rdy_tX va fi facut "1". Valoarea la initializare este "1", adica toate tastele pot fi citite. Daca se apasa o tasta. A doua citire a ei se face doar dupa o relaxare si o apasare.

init_t1,2,3,4

04h,

05h,

06h,

07h,



Semafor care se seteaza la începutul detectarii apasarii unei taste si declanseaza procesul de deboncing prin încarcarea contorului de deboncing. El este resetat imediat dupa sfârsitul acestui proces. Valoarea la initializare este "0", adica nici o tasta nu a fost initiata in apasare.

rls_t1,2,3,4

08h,

09h,

0Ah,

0Bh


Semafor care se seteaza la începutul detectarii relaxarii unei taste si declanseaza procesul de deboncing prin încarcarea contorului de deboncing. El este resetat imediat dupa sfârsitul acestui proces. Valoarea la initializare este "0'

Prog

0Ch


Semafor care stabileste regimul de lucru. El este setat la apasrea tastei T1, si intrându-se in regimul de programare, si este resetat la apasarea tastei T4 când se trece in regim normal de functionare.Valoarea la initializare este "0" intrându-se in regim normal de functionare

OFF

0Dh


Semafor ce indica starea aprins(OFF=0) sau starea stins(OFF=1) pentru digitul ce efectueaza flash

stare_t2

0Eh


Semafor ce se seteaza la apasarea tastei T2. El se transmite in programul principal si declanseaza incrementatrea adresei digitului ce se programeaza

stare_t3

0Fh


Semafor ce se seteaza la apasarea tastei T3. El se transmite in programul principal si declanseaza incrementatrea continutului digitului ce se programeaza

Executa

10h


Semafor care se seteaza la apasarea tastei T4 si declanseaza in programul principal initierea efectuarii operatiei de inmultire. Valoarea la initializare este "0"

init_var

11h


Semafor folosit in programul principal. El declanseaza golirea registrilor de lucru (folositi la afisare si programare) la prima intrare in bucla ce trarteaza functionarea in regim de programare.


Cap IV Codul sursa


;soare adrian 2001 pitesti PROIECT SEP

;calculator pentru inmultirea a doi operanzi

;unul pe 4 octeti(bcd)celalalt pe doi octeti(bcd)

; declaratii registrii ram

DIG_AFIS_11 equ 30h ;pastreaza codul 7seg. pt OP11

DIG_AFIS_12 equ 31h ;pastreaza codul 7seg. pt OP12

DIG_AFIS_13 equ 32h ;pastreaza codul 7seg. pt OP13

DIG_AFIS_14 equ 33h ;pastreaza codul 7seg. pt OP14

DIG_AFIS_21 equ 34h ;pastreaza codul 7seg. pt OP21

DIG_AFIS_22 equ 35h ;pastreaza codul 7seg. pt OP22

DIG_AFIS_31 equ 36h ;pastreaza codul 7seg. pt rez31

DIG_AFIS_32 equ 37h ;pastreaza codul 7seg. pt rez32

DIG_AFIS_33 equ 38h ;pastreaza codul 7seg. pt rez33

DIG_AFIS_34 equ 39h ;pastreaza codul 7seg. pt rez34

DIG_AFIS_35 equ 3Ah ;pastreaza codul 7seg. pt rez35

DIG_AFIS_36 equ 3Bh ;pastreaza codul 7seg. pt rez36

dig_prog_11 equ 3Ch ;pastreaza codul BCD pt OP11

dig_prog_12 equ 3Dh ;pastreaza codul BCD pt OP12

dig_prog_13 equ 3Eh ;pastreaza codul BCD pt OP13

dig_prog_14 equ 3Fh ;pastreaza codul BCD pt OP14

dig_prog_21 equ 40h ;pastreaza codul BCD pt OP21

dig_prog_22 equ 41h ;pastreaza codul BCD pt OP22

COL equ 42h ;codul coloanei active in ISR

IMG_COL equ 43h ;buffer pt codul coloanei active in ISR

cont_t1 equ 44h ;contor debug pentru tasta T1

cont_t2 equ 45h ;contor debug pentru tasta T2

cont_t3 equ 46h ;contor debug pentru tasta T3

cont_t4 equ 47h ;contor debug pentru tasta T4

cont_flash equ 48h ;contor FLASH ( pt temporizarea flash de 500ms )

buffer equ 49h ;buffer de restaurare al cifrei care efectueaza flash

cont_bcd equ 4Ah ;contor de nr de pasi pt conversii

temp equ 4Bh ;pemntru stocari temporare de date

temp1 equ 4Ch ;pentru stocari temporare de date

bin1 equ 4Dh ;ocms rezultat inmultire

bin2 equ 4Eh

bin3 equ 4Fh ;ocmps rezultat inmultire

; declaratii variabile BIT in RAM

rdy_t1 equ 00h ;semafor de validare a citirii dupa relaxarea tastei t1

rdy_t2 equ 01h ;semafor de validare a citirii dupa relaxarea tastei t2

rdy_t3 equ 02h ;semafor de validare a citirii dupa relaxarea tastei t3

rdy_t4 equ 03h ;semafor de validare a citirii dupa relaxarea tastei t4

init_t1 equ 04h ;semafor de initializare a apasarii tastei t1

init_t2 equ 05h ;semafor de initializare a apasarii tastei t2

init_t3 equ 06h ;semafor de initializare a apasarii tastei t3

init_t4 equ 07h ;semafor de initializare a apasarii tastei t4

rls_t1 equ 08h ;semafor de relaxare a tastei t1

rls_t2 equ 09h ;semafor de relaxare a tastei t2

rls_t3 equ 0Ah ;semafor de relaxare a tastei t3

rls_t4 equ 0Bh ;semafor de relaxare a tastei t4

prog equ 0Ch ;semafor de intrare in regim de programare

OFF equ 0Dh ;semafor de stare STINS/APRINS in tratarea FLASH

stare_t2 equ 0Eh ;spune daca tasta t2 a fost apasata

stare_t3 equ 0Fh ;spune daca tasta t3 a fost apasata

executa equ 10h ;spune daca tasta t4 a fost apasata in vederea executiei

init_var equ 11h

; program principal

org 0000h

jmp start

org 0Bh ;vectorul de intrerupere de la TMR0

call ISR

reti

; initializare variabile

start: mov P3,#00h ;sting coloanele la inceputul functionarii

mov SP,#08h

mov R0,#30h ;pastreaza adresa digitului FLASH

mov R1,#3Ch ;pastreaza adresa digitului ce se programeaza

mov buffer,#00h

mov COL,#01h ;se incepe cu activarea coloanei 2

setb rdy_t1

setb rdy_t2

setb rdy_t3

setb rdy_t4

clr init_t1

clr init_t2

clr init_t3

clr init_t4

clr rls_t1

clr rls_t2

clr rls_t3

clr rls_t4

clr executa

setb OFF

clr prog

call init_nr ;initializare a operanzilor

; initializari registrii SFR

mov IE,#82h ;activarea intreruperilor la canalul TMR0

mov TMOD,#21h ;TMR0 pe modul 1 de functionare cu numarare pe 16 biti

mov TCON,#10h

mov TH0,#0EAh ;TH0(0EA)*256+TL0(84)=3300us=3.3ms

mov TL0,#084h ; 234 *256+ 132=60036

mov DPH,#03h ;pointer catre tabela de conversie BCD_7SEG

mov DPL,#0F0h

; inceput de program

intrare: jnb prog,eti1 ;testez daca am voie sa intru in regim de programare

jnb init_var,eti2 ;la prima intrare

call init_nr ;golesc registrii de date la afisare si de lucru

clr init_var

; tratare apasare t2

eti2: jnb stare_t2,eti3

clr stare_t2

mov @R0,buffer ;restaurez digitul ce FLASH

inc R0 ;incrementez adresa digitului flash

inc R1 ;incrementez adresa digitului programabil

cjne R0,#37h,eti3 ;test daca am depasit campul de valori

mov R0,#30h ;prima valoare in cod 7segm. ce efectueaza flash

mov R1,#3Ch ;primul operand (11) ce se incrementeaza

; tratare apasare tasta T3

eti3: jnb stare_t3,eti1 ;nu s-a apasat t2, testez t3

clr stare_t3

inc @R1 ;incrementez continutul digitului programabil

cjne @R1,#0Ah,eti4 ;testez depasire valoare permisa(09h)

mov @R1,#00h

eti4: mov A,@R1 ;copiez in A numarul BCD introdus de curand

movc A,@A+DPTR ;chem rutina conversie BCD_7seg

mov @R0,A ;returnez in R0 numarul in cod 7SEG

mov buffer,@R0

; testul executiei programului

eti1: jnb executa,intrare

clr executa

call MULT

jmp intrare


; rutina de initializare a operanzilor

init_nr: mov R0,#30h ;initializare pointer R0 cu adresa primului digit ce se afiseaza

eti40: mov @R0,#7Eh ;cifra 0 in cod 7seg

inc R0

cjne R0,#3Ch,eti40

mov R1,#3Ch ; initializare pointer R1 cu adresa primului digit ce se programeaza

eti41: mov @R1,#00h

inc R1

cjne R1,#42h,eti41

mov R0,#30h

mov R1,#3Ch

ret





;------------- rutina timer -------------


ISR: push ACC

push PSW

mov TH0,#0EAh

mov TL0,#84h

; gestionare afisaj multiplexat

mov A,COL

RL A

mov COL,A

cjne A,#40h,eti5

mov COL,#01h

eti5: mov IMG_COL,COL

mov COL,#00h

mov P3,COL

; verific daca trebuie sa activez coloana 1

mov A,IMG_COL

cjne A,#01h,eti6

mov P1,DIG_AFIS_11

mov P2,DIG_AFIS_31

jmp eti11

; verific daca trebuie sa activez coloana 2

eti6: cjne A,#02h,eti7

mov P1,DIG_AFIS_12

mov P2,DIG_AFIS_32

jmp eti11

; verifica daca trebuie sa aprind coloana 3

eti7: cjne A,#04h,eti8

mov P1,DIG_AFIS_13

mov P2,DIG_AFIS_33

jmp eti11

; verific daca trebuie sa aprind coloana 4

eti8: cjne A,#08h,eti9

mov P1,DIG_AFIS_14

mov P2,DIG_AFIS_34

jmp eti11

; verific daca trebuie sa aprind coloana 5

eti9: cjne A,#10h,eti10

mov P1,DIG_AFIS_21

mov P2,DIG_AFIS_35

jmp eti11

; aprind coloana 6

eti10: mov P1,DIG_AFIS_22

mov P2,DIG_AFIS_36


eti11: mov COL,IMG_COL

mov P3,COL

; gestionare apasare tasta T1

jb prog,eti12

jnb rdy_t1,eti13

jb init_t1,eti14

jb P0.0,eti15

mov cont_t1,#03h

setb init_t1

jmp eti15

eti14: djnz cont_t1,eti15

jnb P0.0,eti16

clr init_t1

jmp eti15

eti16: setb prog

setb init_var

clr init_t1

clr rdy_t1

jmp eti15

eti13: jb rls_t1,eti17

jnb P0.0,eti15

setb rls_t1

mov cont_t1,#03h

jmp eti15

eti17: djnz cont_t1,eti15

jb P0.0,eti18

clr rls_t1

jmp eti15

eti18: clr rls_t1

setb rdy_t1

eti15: pop PSW

pop ACC

reti

; gestionare flash

eti12: mov A,cont_flash

cjne A,#00,eti19

cpl OFF

mov cont_flash,#98h ; temporizare flash de 500ms. Rutina se apeleaza de 152de ori(98h)la fiecare 3,3ms

jnb OFF,eti21

mov buffer,@R0 ;salvare continut al locatiei flash pe durata cat este stins

;R0 din bank1 pastreaza ADR_DIG_FLASH

mov @R0,#0FFh ;valoarea 0FFh stinge celula flash

jmp eti20

eti19: dec cont_flash

jmp eti20

eti21: mov @R0,buffer

; gestionare apasare tasta T2

eti20: jnb rdy_t2,eti22

jb init_t2,eti23

jb P0.1,eti24

mov cont_t2,#03h

setb init_t2

jmp eti24

eti23: djnz cont_t2,eti24

jnb P0.1,eti25

clr init_t2

jmp eti24

eti25: setb stare_t2

clr init_t2

clr rdy_t2

jmp eti24

eti22: jb rls_t2,eti26

jnb P0.1,eti24

setb rls_t2

mov cont_t2,#03h

jmp eti24

eti26: djnz cont_t2,eti24

jb P0.1,eti27

clr rls_t2

jmp eti24

eti27: clr rls_t2

setb rdy_t2

; gestionare apasare tasta T3           

eti24: jnb rdy_t3,eti28

jb init_t3,eti29

jb P0.2,eti30

mov cont_t3,#03h

setb init_t3

jmp eti30

eti29: djnz cont_t3,eti30

jnb P0.2,eti31

clr init_t3

jmp eti30

eti31: setb stare_t3

clr init_t3

clr rdy_t3

jmp eti30

eti28: jb rls_t3,eti32

jnb P0.2,eti30

setb rls_t3

mov cont_t3,#03h

jmp eti30

eti32: djnz cont_t3,eti30

jb P0.2,eti33

clr rls_t3

jmp eti30

eti33: clr rls_t3

setb rdy_t3

; gestionare apasare tasta T4

eti30: jnb rdy_t4,eti34

jb init_t4,eti35

jb P0.3,eti39

mov cont_t4,#03h

setb init_t4

jmp eti39

eti35: djnz cont_t4,eti39

jnb P0.3,eti36

clr init_t4

jmp eti39

eti36: setb executa ;declansez executia in programul principal

clr prog ;ies din regimul de programare

clr init_t4

clr rdy_t4

jmp eti39

eti34: jb rls_t4,eti37

jnb P0.3,eti39

setb rls_t4

mov cont_t4,#03h

jmp eti39

eti37: djnz cont_t4,eti39

jb P0.3,eti38

clr rls_t4

jmp eti15

eti38: clr rls_t4

setb rdy_t4

; sfarsit rutina intrerupere            

eti39: pop PSW

pop ACC

ret

;----- ----- ----- ----- ----- RUTINA CONVERSIE BCD_BIN ----- ----- --------- ----- --------

; se obtin codurile binare: operand 1 =R4(OCMS) R5(OCMPS) maxim=270Fh

operand 2 =R3 maxim=63h

; concatenare operanzi BCD in registrii R2 si R3

MULT: mov A,dig_prog_11 ; dig_prog_1=0000XXXX

swap A

orl A,dig_prog_12

mov R2,A

mov A,dig_prog_13

swap A

orl A,dig_prog_14

mov R3,A

;conversie BCD_binar

mov cont_bcd,#10h

mov R4,#00h ;initializarea registrilor pt numarul binar in vederea rotirilor

mov R5,#00h

eti42: clr C ;rotatie initiala a lui R2 si R3 in R4 shi R5

mov A,R2

rrc A

mov R2,A

mov A,R3

rrc A

mov R3,A

mov A,R4

rrc A

mov R4,A

mov A,R5

rrc A

mov R5,A

;testez daca cmps NYB din R3 este >= cu 08h

mov A,R3

anl A,#0Fh ;maschez CMS NYB

mov temp,A ;salvez A in temp

clr C ;Cy=0

subb A,#08h ;Daca A>08h voi avea CY=0 si voi aduna 05h; Daca A<08H

; Cy=1(am imprumut) shi trec mai departe

jc eti43

add A,#05h

jmp eti44

eti43: mov A,temp

eti44: mov temp1,A

;repet acelasi pt NYB2

mov A,R3

anl A,#0F0h

mov temp,A

clr C

subb A,#80h

jc eti45

add A,#50h

jmp eti46

eti45: mov A,temp

eti46: orl A,temp1

mov R3,A

;reiau pt R2 CMPS

mov A,R2

anl A,#0Fh

mov temp,A

clr C

subb A,#08h

jc eti47

add A,#05h

jmp eti48

eti47: mov A,temp

eti48: mov temp1,A

mov A,R2

anl A,#0F0h

orl A,temp1

mov R2,A

djnz cont_bcd,eti42

; pentrul operandul al 2-lea

;concatenare a octetilor in R3

mov A,dig_prog_21

anl A,#0Fh

swap A

orl A,dig_prog_22

mov R3,A

;conversie

mov cont_bcd,#08h ; 99=63h = 0110 0011

mov R2,#00h ;R2 va pastra numarul in binar

eti51: clr C

mov A,R3

rrc A

mov R3,A

mov A,R2

rrc A

mov R2,A

mov A,R3

anl A,#0Fh

mov temp,A

clr C

subb A,#08h

jc eti49

add A,#05h

jmp eti50

eti49: mov A,temp

eti50: mov temp1,A

mov A,R3

anl A,#0F0h

orl A,temp1

mov R3,A

djnz cont_bcd,eti51








; rutina de inmultire a operandului de la R4,R5 cu operandul de la R2

;rezultatul(maxim F1ACD )se depune in registrii bin1, bin2, bin3, incepand cu ocms


mov bin1,#00h

mov bin2,#00h

mov bin3,#00h

mov R3,#00h ;vor urma roiri cu acest registru

eti53: clr C

mov A,R2

rrc A

mov R2,A

jnc eti52

clr C

mov A,bin3

addc A,R5

mov bin3,A

mov A,bin2

addc A,R4

mov bin2,A

mov A,bin1

addc A,R3

mov bin1,A


eti52: clr C

mov A,R5

rlc A

mov R5,A

mov A,R4

rlc A

mov R4,A

mov A,R3

rlc A

mov R3,A


mov A,R2

cjne A,#00h,eti53 ;numerele in binar sunt in registrii bin1,bin2,bin3












;rutina de conversie binar-bcd a octetilor din registrii bin1, bin2, bin3 cu

;depunerea rezultatului in registrii R2,R3,R4

mov R2,#00h

mov R3,#00h

mov R4,#00h

mov cont_bcd,#18h ;3octeti=24biti(18h)


eti54: mov A,R4

add A,R4

da A

mov R4,A


mov A,R3

addc A,R3

da A

mov R3,A


mov A,R2

addc A,R2

da A

mov R2,A


clr C

mov A,bin3

rlc A

mov bin3,A

mov A,bin2

rlc A

mov bin2,A

mov A,bin1

rlc A

mov bin1,A


mov A,R4

addc A,#00h

mov R4,A


djnz cont_bcd,eti54

;octetii in format BCD ramain in registrii R0, R1, R2








;------- rutina de conversie BCD 7SEG cu transfer in locatiile de afisare ---------

mov A,R2

anl A,#0F0h

swap A

movc A,@A+DPTR

mov DIG_AFIS_31,A


mov A,R2

anl A,#0Fh

movc A,@A+DPTR

mov DIG_AFIS_32,A


mov A,R3

anl A,#0F0h

swap A

movc A,@A+DPTR

mov DIG_AFIS_33,A


mov A,R3

anl A,#0Fh

movc A,@A+DPTR

mov DIG_AFIS_34,A


mov A,R4

anl A,#0F0h

swap A

movc A,@A+DPTR

mov DIG_AFIS_35,A


mov A,R4

anl A,#0Fh

movc A,@A+DPTR

mov DIG_AFIS_36,A

ret

; tabela BCD_7SEG

org 03F0h

db 07Eh

db 030h

db 06Dh

db 079h

db 033h

db 05Bh

db 05Fh

db 070h

db 07Fh

db 07Bh

end


Document Info


Accesari: 4729
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )