Sunteți pe pagina 1din 10

Proiect la Microsisteme cu Microcontrolere și Microprocesoare

pentru control

Ceas digital folosind microcontroler 8051

1
Cuprins:

1. Proiectare hardware ................................................................ 3


2. Proiectare software ................................................................. 4
3. Rezultatul simulării .................................................................. 10

2
Capitolul 1. Proiectare hardware

Date de proiectare:
Sa se realizeze un ceas digital cu ajutorul microcontrolerului 8051.
In acest ceas digital să se afișeze data si ora.
De asemenea să ajusta data și ora după cum doriţi.

Figura 1.Schema electrică a ceasului digital

3
Capitolul 2. Proiectare software

Proiectarea software cuprinde realizarea programului ce trebuie implementat în microcontroller.


Microcontrollerul va primi semnale pe pinul de recepţie al comunicaţiei seriale, le va transforma în
caractere și le va afișa pe display-ul alphanumeric.
Programul a fost editat în limbajul de programare C cu ajutorul software-lui Kiel. După
compilarea programului obţinem direct fișierul în format “hex” si nu ne mai rămâne decât să
programam microcontrollerul cu acest fișier.

Codul sursa a programului :

#include<reg51.h> //fisier antet


sbit p=P3^0; //pentru a mari orele
sbit q=P3^1; //pentru a reduce minutele
sbit r=P3^2; //pentru a reduce orele
sbit l=P3^4; //alarma pentru a indica ora
sbit bu=P3^3; //pentru a mari minutele
sbit t=P3^5; //pentru a mari date
sbit u=P3^6; //pentru a reduce date
sbit w=P3^7; //pentru a mari luna
sbit rs=P2^1; //comanda LCD pentru selectarea rezistentei din interiorul lcd-ului
sbit rw=P2^2; //comanda LCD pentru scrierea informatiilor pe lcd
sbit en=P2^3; //comanda LCD pentru blocarea informatiilor prezentate pe pinul sau de date
sfr lcddata=0x90; //P2=pin de date LCD
void delay(unsigned char n)
{
unsigned char i,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);
}
void command(unsigned char s)
{
lcddata=s; //pune valoarea pe pin
rs=0;
rw=0;
en=1; //strobe pinul de activare
delay(40);
en=0;
}
void lcddisplaydata(unsigned char s)
{
lcddata=s; //pune valoarea pe pin
rs=1;
rw=0;
en=1; //strobe pinul de activare

4
delay(40);
en=0;
}
void main()
{
int h,m,s,y,mo,d,y1,y2,y3,y4,mo1,mo2,d1,d2,h1,h2,m1,m2,s1,s2,i,j,k;
unsigned char array[]={'0','1','2','3','4','5','6','7','8','9'};
command(0x38); //codul de comanda LCD pentru 2 linii si matrice 5*7
command(0x0c);
command(0x06); //codul de comanda LCD pentru cursoare incremental (deplasare cursorul la
dreapta)
while(1)
{
y=2018; //incepand cu anul 2018
while(y>=2018)
{
for(mo=1;mo<=12;mo++)
{
if(mo==1) //conditie pentru luna ianuarie
{
d=31;
}
else if(mo==2) //conditie pentru luna februarie
{
if((y%4)==0) //conditie pentru anul bisect
{
d=29;
}
else
{
d=28;
}
}
else if(mo==3) //conditie pentru luna martie
{
d=31;
}
else if(mo==4) //conditie pentru luna aprilie
{
d=30;
}
else if(mo==5) //conditie pentru luna mai
{
d=31;
}
else if(mo==6) //conditie pentru luna iunie
{
d=30;
}
else if(mo==7) //conditie pentru luna iulie
{

5
d=31;
}
else if(mo==8) //conditie pentru luna august
{
d=31;
}
else if(mo==9) //conditie pentru luna septembrie
{
d=30;
}
else if(mo==10) //conditie pentru luna octombrie
{
d=31;
}
else if(mo==11) //conditie pentru luna noiembrie
{
d=30;
}
else if(mo==12) //conditie pentru luna decembrie
{
d=31;
}
for(i=1;i<=d;i++)
{
for(h=0;h<=23;h++) //conditie pentru ore intr-o zi
{
for(m=0;m<=59;m++) //conditie pentru minute intr-o
ora
{
for(s=0;s<=59;s++) //conditie pentru secunde intr-
un minut
{
y1=y/1000;

j=y%1000; //cod pentru afisarea anului


y2=j/100;
k=j%100;
y3=k/10;
y4=k%10;
mo1=mo/10; //cod pentru adisarea lunii
mo2=mo%10;
d1=i/10;
d2=i%10; //cod pentru afisare zi
h1=h/10;
h2=h%10; //cod pentru afisare ora
m1=m/10; //cod pentru afisare minute
m2=m%10;
s1=s/10; //cod pentru afisare secunda
s2=s%10;
command(0x80); //comanda LCD pentru prima pozitie din prima linie
lcddisplaydata(array[d1]);

6
lcddisplaydata(array[d2]);
command(0x84); //comanda LCD pentru a cincea pozitie din prima linie
lcddisplaydata('-');
command(0x86); //comanda LCD pentru a saptea pozitie din prima linie
lcddisplaydata(array[mo1]);
lcddisplaydata(array[mo2]);
command(0x89); //comanda LCD pentru a zecea pozitie din prima linie
lcddisplaydata('-');
command(0x8b); //comanda LCD pentru a douasprezecea din prima linie
lcddisplaydata(array[y1]);
lcddisplaydata(array[y2]);
lcddisplaydata(array[y3]);
lcddisplaydata(array[y4]);
command(0xc0); //comanda LCD pentru prima pozitie din a doua linie
lcddisplaydata(array[h1]);
lcddisplaydata(array[h2]);
command(0xc4); //comanda LCD pentru a patra pozitie din a doua linie
lcddisplaydata(':');
command(0xc6); //comanda LCD pentru a sasea pozitie din a doua linie
lcddisplaydata(array[m1]);
lcddisplaydata(array[m2]);
command(0xca); //comanda LCD pentru a unsprezecea pozitie din a doua
linie
lcddisplaydata(':');
command(0xcc); //comanda LCD pentru a treisprezecea pozitie din a doua
linie
lcddisplaydata(array[s1]);
lcddisplaydata(array[s1]);
delay(100);
if(p==0) //comutator pentru cresterea orelor
{
h++; //conditie pentru a seta ore
s=-1; //a doua resetare la zero dupa eliberarea comutatorului h+
+
if(h==24) //daca h = 24 atunci orele încep de la zero
{
h=0;
s=-1;
}
}
else if(q==0) //comutator pentru scaderea minutelor
{
if(m>0) //daca minutul este mai mare decât zero
{
m--; //minutul este redus la zero
s=-1; //dupa eliberarea butonului de micsorare a minutului
secunda se initializeaza de la zero
}
}
else if(r==0) //comutator pentru scaderea orelor
{

7
if(h>0) //daca ora este mai mare decat zero
{
h--; //ora este redus pana la zero
s=-1; //dupa eliberarea butonului de micsorare a ora
secunda se initializeaza de la zero
}
}
else if(l==0) //comutator pentru cresterea minutelor
{
m++;
s=-1;
if(m>60) //daca minutele depasesc 60 atunci incep din nou de la zero
{
m=0;
s=-1;
}
}
else if(t==0) //comutator pentru cresterea zilelor
{
i++;
if(i>31) //daca zilele depasesc 31 atunci incep din nou de la zero
{
i=0;
}
}
else if(u==0) //comutator pentru scaderea zilelor
{
if(i>0) //scade zilele pana la zero
{
i--;
}
}
else if(w==0) //comutator pentru cresterea lunilor
{
mo++;
if(mo>12) //daca lunile depasesc 12 atunci încep din nou de la zero
{
mo=0;
}
}
else
{
h=h;
m=m;
i=i;
mo=mo;
}
command(0x82); //pentru a porni ecranul LCD de la pozitia a treia a primei
linii
command(0x06); //pentru a seta ecranul LCD in modul de intrare
}

8
}
}
}
}
}
}
}

9
Capitolul 3. Rezultatul simulării

Figura 2. Rezultatul de pe urma simulării in Proteus

10

S-ar putea să vă placă și