Proiect Sisteme cu Microprocesoare: Ceas de birou

 

SEREDIUC CORINA IOANA - 333 AC

TUDOSE ANDREEA LAURA – 333 AC

 

 

Introducere

 

     Toate ceasurile, netinand cont de tehnologia folosita de acestea (cu pendul, cu quart, digitale, atomice), au nevoie de cateva componente anume: o sursa de curent pentru ca ceasul sa functioneze, o baza de timp precisa care sa se comporte ca o bataie de inima pentru ceas, un mod de a manevra aceasta baza de de timp pentru a sustrage diferitele componente ale timpului (ore, minute, secunde) si un mod de afisare a timpului. Ceasul digital are aceste functii sub format digital, si anume: exista o sursa de curent electrica – o baterie sau o priza de 220 V -, o baza de timp electronica care “ticaie” cu o rata cunoscuta si precisa, o componenta electronica numita “counter” pentru a numara diviziunile timpului si un afisaj, care poate fi format din LED-uri (Light Emitting Diodes) sau poate fi un LCD (Liquid Crystal Display).

          Sursa de curent. Exista 2 posibilitati:

1.     Semnalul poate fi extras din oscilatiile de 60 de Hz pe care le are o linie de curent. Multe ceasuri folosesc aceasta metoda pentru ca este mai ieftina si mai usor de folosit. Semnalul de 60 de Hz obtinut din linia de curent prezinta o acuratere rezonabila in acest scop.

2.     Semnalul poate fi generat cu ajutorul uni oscilator de cristal. Aceasta metoda e folosita pentru ceasurile ce merg pe baterie sau pentru ceasurile de mana. Desi este mai complicata datorita necesitatii unui numar mai mare de componente, aceasta metoda prezinta in general mai multa acuratete.

Folosind un circuit TTL (si anume un numarator de 7490 de decade) impartim baza de timp de 60 de Hz la 10, si apoi la 6, obtinand astfel un semnal de 1 Hz, adika o oscilatie pe secunda. Cei doi counteri dau ca rezultat un numar binar, cel care imparte la 10 produce secventele :0,1,2,3,4,5,6,7,8,9, iar cel ce imparte la 6 secventa: 0,1,2,3,4,5. Afisarea acestor cifre pe un display format din 7 segmente face prin transmiterea codului binar adecvat fiecarei cifre (adika aprinderea numai unora dintre leduri pentru a fi conturata cifra dorita). Daca se doreste eliminarea acestor circuite se va face un ceas in timp real bazat pe softare.

 

Ceasul de birou, folosit la afisarea orei si a datei curente  este un produs utilizat la scara larga, fiind de mare folos atat copiilor, cat si adultilor. Necesitatea de fi la curent cu ora actuala a crescut foarte mult in zilele noastre, iar cum munca predominanta este cea de birou, acet ceas devine un accesoriu util. Concurenta in acest segment de piata este foarte mare, exista numeroasa modele, care difera incepand de la gama de culori folosita, forme mai mult sau mai putin aerodonamice si marimi pana la functiile speciale ale acestora, display-uri din ce in ce mai sofisticate si inglobarea a mult mai multor functii in acest ceas.

Ceasul prezentat in acest proiect este un model standard, de baza, care are ca unica functie afisarea datei si a orei curente, cu posibilitatea modificarii in orice timp a acestora de catre utilizator.

In viitor, acest ceas va avea nevoie de imbunatatiri, atat la nivel de design, cat si la cel al functiilor cu care este inzestrat, deoarece tehnica ne conduce catre unificarea unor mutitudini de functii in acelasi obiect (de ex,la acest simplu ceas putem adauga un buzzer, pentru a avea alarma, un senzor de temperatura, pentru a o afisa la cererea utilizatorului, un calendar – ceea ce necesita si un diplay adecvat..etc)

 

 

Schema de simulare din Porteus 5.2

 

 

Codul ASM

 

ORG 0000h                            ;adresa la care se incepe asamblarea - 0000h

          LJMP MAIN                    ;se produce saltul la rutina principala

 

          LUNI            EQU 07Ah     ;se pun variabilele folosite frecvent in intreruperi la adresele de sfarsit  

          ZILE          EQU 07Bh     ;ale RAM-ului intern; aceste variabile retin : luna, ziua, ora, minutul, secunda

          ORE             EQU 07Ch            

          MINUTE          EQU 07Dh          

          SECUNDE         EQU 07Eh          

          TICKS           EQU 07Fh     ;timerul ce numara cele 20 de ticuri ce formeaza o secunda

          RESET_VALUE     EQU 19456    ;valoarea de reset a timerului 1

          DB0            EQU P1.0   

          DB1            EQU P1.1

          DB2            EQU P1.2

          DB3            EQU P1.3     ;redenumirea porturilor folosite

          DB4            EQU P1.4

          DB5            EQU P1.5

          DB6            EQU P1.6

          DB7            EQU P1.7

          EN              EQU P2.7

          RS               EQU P2.6

          RW             EQU P2.5

          date            EQU P1

 

 

 

  

 

 

ORG 001Bh                         ;la aceasta adresa incep rutina de intrerupere a tinerului 1

          PUSH ACC                  ;Pentru a ne asigura ca intreruperea nu va afecta variabilele din main, vom depozita

          PUSH PSW                  ;registrii in stiva, si ii vom scoate de acolo la terminarea intreruperii (ACC si PSW)

          CLR TR1                   ;inchidem timerul 1 pentru a ii reseta valoarea, copiem in partea low si high valoarea de rest

          MOV TH1,#HIGH RESET_VALUE ;corespunzatoare si il redeschidem

          MOV TL1,#LOW RESET_VALUE 

          SETB TR1                 

          DJNZ TICKS,EXIT       ;se decrementeaza tickul, daca nu e inca zero se iese

          MOV TICKS,#20             ;se reseteaza valoarea (valoarea de reset va fi 20)

         

          INC SECUNDE               ;incrementarea secundelor, odata ce s-a ajuns la 20 de tickuri-> a trecut o sec

          LCALL AFISARE_SEC         ;se afiseaza secundele pe display

          MOV A,SECUNDE             ;se muta valoarea din var "secunde" in acumulator

          CJNE A,#60,EXIT       ;daca nu sunt numarate 60 de sec se iese

          MOV SECUNDE,#0            ;se reseteaza var secunde la 0

         

          INC MINUTE               ;incrementarea minutelor odata ce s-a ajuns la 60 de sec

          LCALL AFISARE_MIN

          MOV A,MINUTE            

          CJNE A,#60,EXIT      

          MOV MINUTE,#0           

         

          INC ORE                 ;incrementarea orelor odata ce s-a ajuns la 60 de min

          LCALL AFISARE_ORe

          MOV A,ORE

          cjne A,#24,EXIT

          MOV ORE,#0

         

          INC ZILE                  ;incrementarea zilelor o data ce s-a ajuns la 24 de ore

          ;LCALL AFISARE_ZILE

          MOV A,ZILE

          CJNE A,#31,EXIT      

          MOV ZILE,#1

         

          INC LUNI                ;incrementarea lunilor daca s-a ajuns la 30 de zile

          ;LCALL AFISARE_LUNI

          MOV A,LUNI

          CJNE A,#13,EXIT

          MOV LUNI,#1

         

 

 EXIT:

         

         

          POP PSW                   ;Registrii revin la valoare de dinaintea intreruperii

          POP ACC                  

         

RETI                              ;se iese din rutina de intrerupere

 

MAIN:

          MOV TH1,#HIGH RESET_VALUE ;resetarea valorii timerului 1

          MOV TL1,#LOW RESET_VALUE 

          MOV TMOD,#10h             ;timerul e setat sa mearga pe 16 biti

         

          LCALL INIT_LCD            ;initializarea LCD

          LCALL CLEAR_LCD           ;clear LCD

          CLR RS                    ;urmeaza o instructiune

          MOV DATE,#84h            

          SETB EN                   ;setarea locului unde se vor afisa ":" intre ore si minute

          CLR EN

          LCALL WAIT_LCD

          MOV A,#':'

          LCALL scrie_text

         

          CLR RS                   

          MOV DATE,#87h

          SETB EN                   ;setarea locului unde se vor afisa ":" intre minute si secunde

          CLR EN

          LCALL WAIT_LCD

          MOV A,#':'

          LCALL scrie_text

 

          CLR RS

          MOV DATE,#08Dh

          SETB EN                  ;setarea locului unde se vor afisa ":" intre zi si luna

          CLR EN

          LCALL WAIT_LCD

          MOV A,#':'

          LCALL scrie_text

 

          SETB TR1                  ;se porneste timer 1

          mov LUNI,#1             ;initializarea variabilelor

          mov ZILE,#1

          MOV ORE,#00            

          MOV MINUTE,#00          

          MOV SECUNDE,#00          

          MOV TICKS,#20            

          CALL AFISARE_ore

          CALL AFISARE_min

          CALL AFISARE_ZILE

          CALL AFISARE_luni

          SETB EA                   ;initializare intreruperi

          SETB ET1                 

 

LOOP:

          mov r1,#'0'

          ;JB P3.0, LOOP             ; P3.0 buton de oprire

          jmp loop

 

WAIT_LCD:

          CLR EN                  ;procedura de asteptare a LCD-ului pentru a terminat comanda precedenta

          CLR RS                                                     

          SETB RW            ;comanda de citire                                    

          MOV DATE,#0FFh                        

          SETB EN                                                  

          MOV ACC,DATE                                              

          CLR EN

          JB ACC.7,WAIT_LCD           ;daca bitul 7 este 2 LCD-ul este inca ocupat

          CLR EN                        ;terminare comanda

          CLR RW                                                   

 RET

 

INIT_LCD:                       ;initializare LCD

          CLR RS

          MOV DATE,#38h           ;bus pe 8 biti si font de 5x8

          SETB EN

          CLR EN

          LCALL WAIT_LCD

          CLR RS

          MOV DATE,#0Eh           ;aprindem LCD-ul si cursorul

          SETB EN

          CLR EN

          LCALL WAIT_LCD

          CLR RS

          MOV DATE,#06h           ;dupa afisarea unui caracter cursorul se muta automat un pas la dreapta

          SETB EN

          CLR EN

          LCALL WAIT_LCD

 RET

 

CLEAR_LCD:                      ;eliberam/stergem LCD-ul

          CLR RS

          MOV DATE,#01h

          SETB EN

          CLR EN

          LCALL WAIT_LCD

 RET

 

scrie_text:                     ;afisare pe LCD

          SETB RS

          CLR RW

          MOV DATE,A

          SETB EN

          CLR EN

          LCALL WAIT_LCD

 RET

 

AFISARE_SEC:                    ;afisare secunde

          CLR RS

          MOV DATE,#88h

          SETB EN

          CLR EN

          LCALL WAIT_LCD

         

        MOV A,SECUNDE

          DA A

          SWAP A

          ANL A,#00001111b     ;cifra ZECILOR DIN secunde

          ADD A,#'0'

          LCALL scrie_text

  

          MOV A,SECUNDE

          DA A

          ANL A,#00001111b        ;CIFRA UNITATILOR DIN secunde

          ADD A,#'0'

          LCALL scrie_text

RET

 

AFISARE_min:

          CLR RS

          MOV DATE,#85h

          SETB EN

          CLR EN

          LCALL WAIT_LCD

         

        MOV A,MINUTE

          DA A

          SWAP A

          ANL A,#00001111b     ;cifra ZECILOR DIN minute

          ADD A,#'0'

          LCALL scrie_text

  

          MOV A,MINUTE

          DA A

          ANL A,#00001111b        ;CIFRA UNITATILOR DIN minute

          ADD A,#'0'

          LCALL scrie_text

         

         

 RET

 

AFISARE_ore:

          CLR RS

          MOV DATE,#82h

          SETB EN

          CLR EN

          LCALL WAIT_LCD

         

        MOV A,ORE

          DA A

          SWAP A

          ANL A,#00001111b     ;cifra ZECILOR DIN ore

          ADD A,#'0'

          LCALL scrie_text

  

          MOV A,ORE

          DA A

          ANL A,#00001111b        ;CIFRA UNITATILOR DIN ore

          ADD A,#'0'

          LCALL scrie_text

         

         

 RET

 

AFISARE_zile:

          CLR RS

          MOV DATE,#08Bh

          SETB EN

          CLR EN

          LCALL WAIT_LCD

         

        MOV A,ZILE

          DA A

          SWAP A

          ANL A,#00001111b     ;cifra ZECILOR DIN zile

          ADD A,#'0'

          LCALL scrie_text

  

          MOV A,ZILE

          DA A

          ANL A,#00001111b        ;CIFRA UNITATILOR DIN zile

          ADD A,#'0'

          LCALL scrie_text

         

         

 RET

 

AFISARE_luni:

          CLR RS

          MOV DATE,#08Eh

          SETB EN

          CLR EN

          LCALL WAIT_LCD

         

        MOV A,luni

          DA A

          SWAP A

          ANL A,#00001111b     ;cifra ZECILOR DIN luni

          ADD A,#'0'

          LCALL scrie_text

  

          MOV A,luni

          DA A

          ANL A,#00001111b        ;CIFRA UNITATILOR DIN luni

          ADD A,#'0'

          LCALL scrie_text

         

         

 RET

 

end