Sunteți pe pagina 1din 12

Universitatea "POLITEHNICA" din Timioara.

Centrul de Studii - Invatamant la Distanta


Informatica Aplicata

PROIECT SINCRETIC
Proiectarea Microsistemelor Digitale

Student :
Bob Adrian-Vasile

Cuprins

1. Tema proiectului ................................................................................................................. 3


2. Descrierea aplicatiei ............................................................................................................ 3
2.1. Resursele microcontrolerului utilizate in aplicatie si modul lor de programare ............ 4
2.2. Codul comentat al programului ..................................................................................... 4
3. Concluzii ............................................................................................................................... 9
Bibliografie ............................................................................................................................. 10

1. Tema proiectului
Realizarea unui ceas care sa numere secunda sub forma ziua(din luna):ora:min:sec,
programind
Timer0 in mod 3.Valoarea curenta a ceasului(11octeti : ziua,ora, min, sec si caracterele :)
se transmite la portul

serial programat fara intreruperi, la 800ms (rata de transfer4800bauds la11.0592MHz).


Aplicatiile propuse se implementeaza in limbaj C, in mediul de dezvoltare Keil, cu
microcontroler80C552.
Validarea programului se face prin simulare in mediul de dezvoltare Keil

2. Descrierea aplicatiei
In mediul de dezvoltare Keil se incepe cu alegerea microcontrolerului 80C552, si se seteaza
frecventa, conform cerintelor, la 11.0592 MHz.
2.1.Resursele microcontrolerului utilizate in aplicatie si modul lor de programare
Microcontrolerul 80C552 contine trei numaratoare / temporizatoare de 16 biti denumite
Timer 0 (T0) , Timer 1 (T1), Timer 2 (T2) i un temporizator de control, de 8 biti, Timer
3 (T3).

In modul de lucru temporizator ("timer"), continutul registrului este incrementat la fiecare


ciclu masina executat. Astfel, deoarece un ciclu masina contine 12 perioade de tact,
frecventa maxima de numarare este de 1/12 din frecventa de tact.
Resursele hard ale T0, respectiv T1, sunt urmatoarele:
3

- 2 registre de numarare pe 8 biti, TL0 si TH0 (pentru T0), respectiv TL1 si TH1 (pentru
T1), care pot fi utilizate concatenate, pentru a obtine un registru pe 16 biti
- 1 registru pe 8 biti pentru programarea modului de lucru, TMOD (Timer MODe)

- 1 registru pe 8 biti pentru control, TCON (Timer CONtrol)

In modul registrul de numarare este configurat pe 8 biti (TL1) cu incarcare automata din
registrul TH1. Astfel, la depasirea capacitatii registrului TL1, se seteaz fanionul de
ntrerupere TF1 din TCON si se incarca TL1 cu continutul lui TH1 (TH1 trebuie incarcat
in prealabil prin program).
TMOD se va defini (TMOD & 0xF0) | 0x02 deoarece TMOD configureaza atat Timer 0,
cat si Timer 1. Deoarece Timer 1 e configurat in init_serial si setat pe intrerupere, daca lam fi definit 0x02 l-am fi suprascris.

2.2.Codul comentat al programului


#include <REG552.H>

void T0M3Delay(void)
{
TMOD = (TMOD & 0xF0) | 0x02;

TL0 = 0;
TH0 = 0;

/* Timer0 Mod3 00000010, 8-bit */

/* setare timer 0 low to 0 */


/* setare timer 0 high to 0 */
4

TR0 = 1;
EA =0;

/*start /restart*/
/*dezactivare global intreruperi */

while(TF0 == 0) ;

/*initial TF=0; la depasirea capacitatii TL, TF=1 */

TR0 = 0;

/* T0 oprit*/

TF0 = 0;

/* TF0 resetat la 0 */

EA = 1;

/*activeaza global intreruperile*/

unsigned char timer1_uart_running=0;


unsigned char time_string[12];

char* conIntToChar(int number)

/*converteste un numar intreg din 2 cifre in


sirul de caractere aferent*/

char* conIntToChar(int number)

/*converteste un numar intreg din 2 cifre in


sirul de caractere*/

{
char count = 0;
char string[3] = {'0','0','0'};
if (number != 0)
{
while (number>0)
{
string[count]=(number%10)+48;
caracterului '0'*/
number/=10;

/*adunarea restului impartirii la 10, la codul

/*impartire la 10 pentru reducerea unui 0*/

count++;
}
5

return &string;
}
else
return &string;
}

void init_uart(void)

/*se initializeaza interfata seriala*/

{
S0CON = 0x40;

/*mod 1, multiprocesor, receptie validata*/

TMOD |= 0x20;

/*Timer 1 mod 2, temporizator*/

PCON |= 0x80;

/*bit SMOD = 1*/

TH1 = 0xFD;

/* rata de transfer 19200 bauds*/

TL1 = 0xFD;
TR1 = 1;

/*start Timer 1*/

ET1 = 0;

/*Timer 1 nu genereaza intrerupere*/

ES0 = 1;

/*genereaza intrerupere UART*/

EA = 1;
PS0 = 0;

/*activeaza intreruperile globale */


/*prioritate redusa a intreruperii UART*/

void writetoserial(int hour, int min, int sec, int msec)


{
unsigned char i;
unsigned char * intToChar;

intToChar = conIntToChar(hour);
time_string[0] = *intToChar;

/*ora - primul caracter*/


6

time_string[1]= *(intToChar+sizeof(char));

/*ora - al doilea caracter*/

intToChar = conIntToChar(min);
time_string[3] = *intToChar;

/*minut - primul caracter*/

time_string[4] = *(intToChar+sizeof(char));

/*minut - al doilea caracter*/

intToChar = conIntToChar(sec);
time_string[6] = *intToChar;

/*secunda - primul caracter*/

time_string[7] = *(intToChar+sizeof(char));

/*secunda - al doilea caracter*/

intToChar = conIntToChar(msec);
time_string[9] = *intToChar;
caracter*/

/*milisecunda - primul

time_string[10] = *(intToChar+sizeof(char));
caracter*/

/*milisecunda - al doilea

time_string[11] = *(intToChar+2*sizeof(char));
caracter*/

/*secunda - al treilea

/* scrierea celor 12 caractere ale orei, minutului, secundei si al milisecundei


(hh:mm:ss:msmsms->00:00:00:000) pe serial 0 */
for (i=0; i<12;i++)
{
TB8 = 0;
S0BUF = time_string[i];
timer1_uart_running = 1;
while(timer1_uart_running==1);
}
return;

/*-----------------------------------------------main
------------------------------------------------*/
void main (void)
{
int hour = 0;
int min = 0;
int sec = 0;
int msec = 0;
int ms50count = 0;

time_string[2]=time_string[5]=time_string[8]=':';
init_uart();

while (1)

/*bucla care se repeta la infinit pentru a nu se


opri microcontrolerul*/

{
int i;
for (i=0; i<720; i++)

/* (11.0592 * 10^6) / 12 / 256 / 5 = 720 Hz */

{
T0M3Delay();
}
ms50count+= 1;
if (ms50count == 3)

/*contorul a ajuns la 150 milisecunde*/

{
8

writetoserial(hour, min, sec, msec);


}
if (ms50count == 4)

/*contorul a ajuns la 200 ms*/

{
ms50count = 0;
msec = msec + 200;
if (msec == 1000)
{
msec = 0;
sec = sec + 1;
if (sec == 60 )
{
sec = 0;
min = min + 1;

if (min == 60 )
{
min = 0;
hour = hour + 1;
if (hour == 24 )
{
hour = 0;
}
}
}
}
}
9

}
}

Serial0 () interrupt 4
{
TI = 0;

/* byte-ul a fost transmis*/

timer1_uart_running = 0;
}
3. Concluzii
Keil permite simularea functionarii microcontrolerelor si pune la dispozitie o serie de
instrumente care ne faciliteaza activitatea. Astfel putem seta modul Timer-ului, porturile,
intreruperile si datele transmise pe UART.

10

Bibliografie

http://elearning.vtu.ac.in/10/enotes/06ES42/Unit6-RK.pdf
http://www.keil.com/support/man/docs/is51/is51_ov_cpu251.htm
http://www.8052.com/tutser.phtml
http://www.keil.com/support/docs/685.htm
http://www.8052.com/tutint.phtml
http://www.8052.com/tuttimer.phtml

11

12

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