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
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
LCALL AFISARE_ORe
MOV A,
cjne A,#24,EXIT
MOV
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
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
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
mov r1,#'0'
;JB P3.0,
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