Вы находитесь на странице: 1из 37

Microprocessadores

2012-2013

Projecto

Relgio Digital com despertador Com a utilizao da comunicao srie

11 de Fevereiro de 2012 Docente: Antnio Abreu Mestrado em Engenharia Electrotcnica e Renovveis e Sistemas de Potencia

de

Computadores

Ramo

de

Energias

Lus Lopes n 120281007 Nuno Rosado n 120281033

ndice 1. Objectivos ............................................................................................................................................................................. 3 2. Constituio e funcionalidades..................................................................................................................................... 3 3. Manual de Utilizao........................................................................................................................................................ 7 4. Descrio do Cdigo de Programao ....................................................................................................................... 8 5. Lista de Material ............................................................................................................................................................ 20 6. Simulao e Montagem .................................................................................................................................................. 20 7. Cdigo do Programa em C............................................................................................................................................. 21 8. Cdigo HEX ......................................................................................................................................................................... 31 9. Concluso ........................................................................................................................................................................... 36 10. Bibliografia ...................................................................................................................................................................... 37

MEEC-ERSP

Pgina 2 de 37

1. Objectivos Neste projecto pretende-se a programao e montagem de um relgio digital com a funcionalidade de despertador, assim como a possibilidade de acertar as horas remotamente via comunicao porta srie RS232, e ainda o envio da hora a cada minuto pela mesma via de comunicao. Com este projecto pretende-se perceber os tpicos fundamentais da arquitectura do microcontrolador 80151, usando o quanto possvel os recursos de hardware que o microcontrolador disponibiliza.

2. Constituio e funcionalidades Este projecto constitudo por um relgio digital no modo de 24 horas, em que permite acertar as horas, activar despertador e acertar a respectiva hora de despertar atravs de botes de presso. Permite tambm acertar as horas remotamente via comunicao srie (RS232), assim como envia, a cada minuto, via comunicao srie a hora actual. O relgio constitudo por quatro displays de 7 segmentos, no qual os dois displays da esquerda representam as horas e os dois da direita representam os minutos. Os segundos so representados por um LED no meio dos displays que pisca a cada segundo. Alm disto tm diversos botes cujo modo de funcionamento descrito em 3- Manual de Utilizao. O modo detalhado do seu funcionamento ser apresentado na 4 - Descrio do Cdigo de Programao. Tm tambm um besouro que toca quando chega hora de despertar. Os displays utilizados na montagem so de nodo comum o qual os pinos esto representados na figura em baixo.

FIGURA 1 DISPLAY 7 SEGMENTOS DE NODO COMUM.

A codificao em termos binrios e hexadecimais para se poder representar no display de 7 segmentos em forma numrica apresentado pela tabela em baixo:

MEEC-ERSP

Pgina 3 de 37

TABELA 1 VALORES BINRIOS E HEXADCIMAIS PARA A REPRESENTAO DE VALORES NUMRICOS NO DISPLAY DE 7 SEGMENTOS.

Digito 0 1 2 3 4 5 6 7 8 9 A b C d E F

gfedcba 03F 006 05B 04F 066 06D 07D 007 07F 06F 077 07C 039 05E 079 071

abcdefg 07E 030 06D 079 033 05B 05F 070 07F 07B 077 01F 04E 03D 04F 047

a 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1

b 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0

c 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0

d 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0

e 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1

f 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1

g 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1

Para as ligaes dos displays, inicialmente, pensou-se ligar cada um deles directamente ao microprocessador 8051. Rapidamente foi abandonado a ideia porque iria ocupar praticamente todos os pinos do 8051, pois 7 pinos por display x 4 displays = 28 pinos do 8051. Depois iniciou-se a programao pensando em usar descodificadores de 7 segmentos. Seria um descodificador por cada display, o que perfazia um total de 4 descodificadores. Tinha a vantagem de usarmos apenas 4 pinos do 8051 por display, que equivalia a 16 pinos: os portos P0 e P2 estavam todos ocupados. Tinha a vantagem de manter o programa simples, no entanto menos controlo dos segmentos do display a mostrar. Em seguida para manter a montagem mais simples e com o menor hardware possvel, realizou-se a montagem para usar apenas 1 descodificador para os 4 displays. Isto conseguido interligando todos os pinos correspondentes do display aos pinos correspondentes do descodificador, e o controlo de alimentao (VCC) do display realizado pelo 8051. Com isto teramos uma montagem que usa 4 x 4 = 16 pinos usados do 8051. Finalmente optou-se por eliminar por completo o descodificador e controlar os 7 segmentos dos displays directamente dos displays atravs de 7 pinos: usa-se um porto por completo - P0; e mais 4 pinos para o controlo de alimentao do display (VCC). Usa mais ou menos o mesmo mtodo da montagem anterior, eliminando apenas o descodificador de 7 segmentos, ficando com 7 + 4 = 11 pinos do 8051. Desta forma conseguimos explorar melhor as potencialidades dos microprocessadores 8051, exigindo maior esforo na programao, e ter o controlo completo do que mostrado nos displays, conseguindo mostrar no apenas nmeros mas qualquer representao que o display permita.
MEEC-ERSP
Pgina 4 de 37

tambm reduzido a quantidade de hardware utilizado. A reduo de hardware, mantendo as mesmas funcionalidades sempre uma preocupao na engenharia, uma vez que mantem os equipamentos mais baratos. Quisemos aqui mostrar que so possveis vrios mtodos para montagens do display. Todas estas opes so uma questo de compromisso apresentando algumas das suas vantagens e desvantagens. Sendo assim, a montagem funcionar do seguinte modo: Como todos os displays partilham o mesmo controlo de codificao para mostragem do nmero, ou seja, utilizam o mesmo barramento de ligaes ou BUS, tal como apresentado na Figura 2. Ento necessrio que se faa o controlo de mostragem do dgito atravs do controlo de ligar o display (usado na montagem um transstor comandado pelo 8051). Portando nos passos do programa ir fazer "mostrar" para cada dgito (cada display), um a um, o respectivo nmero fazendo ligar o display correspondente e desligando os outros, e ao mesmo tempo a codificao do numero que se quer mostrar. Assim s mostra o dgito que se quer. Como tudo isto acontece muito rpido, o olho humano no consegue v-lo, logo tudo parece esttico.

FIGURA 2 LIGAES DOS DISPLAYS DE 7 SEGMENTOS AO MICROPROCESSAOR 8051.

A funcionalidade de despertador permite que quando o relgio atingir a hora marcada pelo despertador ele acciona um apito sinalizador de alarme, caso o modo despertador esteja activado. Caso esteja activado pode-se realizar o reconhecimento de alarme desligado o modo de despertador, atravs de interruptor para o efeito.

MEEC-ERSP

Pgina 5 de 37

A funcionalidade de comunicao srie conseguindo usando uma driver de comunicao srie (MAX233) para realizar o interface entre o microprocessador 8051 e um PC.

MEEC-ERSP

Pgina 6 de 37

3. Manual de Utilizao

SET
Acertar Horas 1. Para a acertar as horas, prima a tecla H e solte. O valor da hora no mostrador ir incrementar quantas vezes premir o boto. 2. Para acertar os minutos prima a tecla M e solte. O valor dos minutos no mostrador ir incrementar quantas vezes premir o boto. Mostrar Hora Despertador 1. Mantenha pressionado o boto SET e ir apresentar no mostrador o valor das horas e minutos do despertador. Acertar Hora Despertador 1. Mantenha pressionado o boto SET e ir apresentar no mostrador o valor das horas e minutos do despertador. a. Pressionar a tecla H para incrementar o valor das horas, enquanto premido a tecla SET. b. Pressione a tecla M para incrementar o valor dos minutos, enquanto premido a tecla SET. Activar/Desactivar Despertador 1. Para activar o despertador comute o boto Desp Para ON. 2. Para desactivar o despertador comute o boto Desp para OFF.

MEEC-ERSP

Pgina 7 de 37

4. Descrio do Cdigo de Programao Neste captulo ser realizado a descrio detalhada por excertos de cdigo em C que constituem o nosso programa. Este programa divido em 8 subprogramas, includo o programa principal main. Eles so: o main(), timer0(), delay(), acerta_tempo(), acerta_despertador(), servio_despertar() e mostra_tempo(). Cada subprograma ser chamado pelo programa principal (main) ou por os outros. Isto permite organizar melhor o cdigo e reduzir a necessidade de repetir cdigo. Ser descrito a funcionalidade de cada um dos subprogramas mais adiante. Antes de se iniciar os subprogramas h a necessidade de declarar as variveis gerais e as directivas a incluir. As directivas a incluir neste programa so as do microprocessador 8051 (reg51), sendo este programa compatvel por qualquer microprocessador desta famlia. tambm includo a stdio que permite utilizar as funes printf e getchar.
#include <reg51.h> #include <stdio.h>

A declarao de variveis gerais necessrio porque necessitamos que estas variveis sejam usadas em diversos subprogramas e que o seu valor seja transferido entre subprogramas.
sbit botao_acerta_horas = P1^1; //entrada para acertar horas do relogio sbit botao_acerta_minutos = P1^2; //entrada para acertar minutos do relogio sbit set_despertador = P1^3; //entrada para acertar o despertador sbit activa_despertador = P1^4; //entrada para activar o modo de despertador sbit pisca_pisca = P1^7; //sada para piscar os segundos sbit som = P1^0; //Som de sada do despertador; unsigned int contador;//contador de numero de ciclos que perfazem um segundo = 20. unsigned int segundos; unsigned char numero [10]; /*codificao display 7 segmentos*/ unsigned int horas1; /* 1 digito display horas*/ unsigned int horas2; /* 2 digito display horas*/ unsigned int minutos1; /* 1 digito display minutos*/ unsigned int minutos2; /* 2 digito display minutos*/ unsigned int despertador_horas1; /* 1 digito display horas*/ unsigned int despertador_horas2; /* 2 digito display horas*/ unsigned int despertador_minutos1; /* 1 digito display minutos*/ unsigned int despertador_minutos2; /* 2 digito display minutos*/ char activa_display[4]; //varivel para activao do display a mostrar bit flag_segundos; //valor incial da flag_segundos usado no programa main() int conta; //variavel usada no programa recebe_dados()

MEEC-ERSP

Pgina 8 de 37

O subprograma recebe_dados() permite receber os dados via comunicao srie e escrever esses valores, segundo a ordem enviada, para a varivel das horas e minutos. Desta forma possvel acertar as horas remotamente via comunicao srie (RS232). Este subprograma tem tambm a funcionalidade de filtrar os valores recebidos, aceitando apenas caracteres decimais, e para as horas de 0 a 23, e para os minutos de 0 a 59. Valores diferentes disto, ou outros caracteres (p.e. letras), escreve 0 no respectivo caracter. Isto conseguido atravs da funo switch. de salientar que os valores recebidos pela comunicao srie so na forma hexadecimal, referentes tabela ASCII. Desta forma foi necessrio converter este valor para o formato decimal inteiro, ao qual as nossas variveis horas1, horas2, minutos1 e minutos2, vo receber.
void recebe_dados (void) { char c; conta++; if (conta == 1) //acerta as horas para o caracter da esquerda das horas { while ((c = getchar ()) != 0x1B) break; { printf ("xH enviado o n %c\n", c); switch (c) { case 0x30: horas2 = 0; break; case 0x31: horas2 = 1; break; case 0x32: horas2 = 2; break; default: horas2 = 0; } } } if (conta == 2) //acerta as horas para o caracter da direita das horas { while ((c = getchar ()) != 0x1B) break; { printf ("Hx enviado o n %c\n", c); switch (c) { case 0x30: horas1 = 0; break; case 0x31: horas1 = 1; break; case 0x32: horas1 = 2; break; case 0x33: horas1 = 3; break; case 0x34:

MEEC-ERSP

Pgina 9 de 37

horas1 = 4; break; case 0x35: horas1 = 5; break; case 0x36: horas1 = 6; break; case 0x37: horas1 = 7; break; case 0x38: horas1 = 8; break; case 0x39: horas1 = 9; break; default: horas1 = 0; } } } if (conta == 3) //acerta as horas para o caracter da esquerda dos minutos { while ((c = getchar ()) != 0x1B) break; { printf ("xM enviado o n %c\n", c); switch (c) { case 0x30: minutos2 = break; case 0x31: minutos2 = break; case 0x32: minutos2 = break; case 0x33: minutos2 = break; case 0x34: minutos2 = break; case 0x35: minutos2 = break; default: minutos2 = } } } if (conta == 4) //acerta as horas para o caracter da direita dos minutos { while ((c = getchar ()) != 0x1B) break; // while ((c = _getkey ()) != 0x1B); { printf ("Mx enviado o n %c\n", c);

0;

1;

2;

3;

4;

5;

0;

MEEC-ERSP

Pgina 10 de 37

switch (c) { case 0x30: minutos1 = break; case 0x31: minutos1 = break; case 0x32: minutos1 = break; case 0x33: minutos1 = break; case 0x34: minutos1 = break; case 0x35: minutos1 = break; case 0x36: minutos1 = break; case 0x37: minutos1 = break; case 0x38: minutos1 = break; case 0x39: minutos1 = break; default: minutos1 = } conta = 0; } }

0;

1;

2;

3;

4;

5;

6;

7;

8;

9;

0;

O subprograma timer0() uma rotina que ser despoletado internamente de forma automtica sempre que o timer 0 atinja o overflow, ou seja quando o registo TF1 passar para 1. Como foi configurado o timer0() em modo 2 necessrio realizar uma recarga do contador (variveis TH0 e TL0). Neste subprograma feito o incremente da varivel segundos, cada vez que se der 20 interrupes. Os clculos para chegar a estes 20 ciclos corresponderem a 1 segundo e a configurao do timer0 ser justificado mais frente. Tambm se faz piscar o led a cada 1 segundo por 300ms, pois cada ciclo do timer0 corresponde a 50ms, ento 6x50ms = 300ms.
void timer0 (void) interrupt 1

MEEC-ERSP

Pgina 11 de 37

{ TH0=0x4B; TL0=0xFA; contador++; if (contador == 20) { segundos++; contador = 0; } if (contador == 0 ) pisca_pisca = 0; if (contador == 6 ) pisca_pisca = 1; }

O programa delay() criado para realizar atrasos, ou seja, consome tempo para incrementar uma varivel at chegar a um limite definido pela varivel num_delay.
void delay (int num_delay) { int troika = 0; while (troika < num_delay) troika++; }

O subprograma acerta_tempo() chamado para acertar as horas. Cada vez que se prime o boto H ou M, respectivamente as entradas P1.1 e P1.2 incrementado as horas e minutos. S ser incrementado depois de libertado o boto, ou seja na transio descendente (1 0). tambm tido o cuidado de ao acertar a hora de despertar, quando se chega ao minuto 59 passa para 00 e no incrementa a varivel das horas.
void acerta_tempo () { bit flag1_horas; bit flag1_minutos; if (!botao_acerta_horas) flag1_horas = 1; if (botao_acerta_horas && flag1_horas) { horas1++; flag1_horas = 0; } if (!botao_acerta_minutos) flag1_minutos = 1; if (botao_acerta_minutos && flag1_minutos { if (minutos2 == 5 && minutos1 == 9) { minutos2 = 0; minutos1 = 0; flag1_minutos = 0; } else { minutos1++; flag1_minutos = 0; } } }

MEEC-ERSP

Pgina 12 de 37

O subprograma acerta_despertador() muito semelhante ao subprograma acerta_tempo() . A diferena que necessrio a combinao de botes SET e H ou M. O boto SET corresponde entrada P1.3.
void acerta_despertador () { bit flag2_horas; bit flag2_minutos; if (!botao_acerta_horas) flag2_horas = 1; if (botao_acerta_horas && flag2_horas) { despertador_horas1++; flag2_horas = 0; } if (!botao_acerta_minutos) flag2_minutos = 1; if (botao_acerta_minutos && flag2_minutos) { if (despertador_minutos2 == 5 & despertador_minutos1 == 9) { despertador_minutos2 = 0; despertador_minutos1 = 0; } else despertador_minutos1++; flag2_minutos = 0; } }

Quando chega hora de despertar chamado o subprograma servio_despertar() ao qual o que faz activar a sada P1.0 (varivel som) de forma pulsada atravs dos delays que entre os complementos da varivel som.
void servico_despertar () { som = ~som; delay(1000); som = ~som; delay(100); }

Tando o subprograma mostra_tempo() como o mostra_despertador() permite representar de forma grfica os valores de horas e minutos. O porto 0 usado para a codificao do display de segmentos que toma o valor da varivel vetor numero. A varivel numero configurado de acordo com a codificao da Tabela 1, no programa principal main(). O subprograma mostra_tempo chamado em modo normal e o subprograma mostra_despertador() quando se prime a tecla SET, ou seja a entrada P1.3.
void mostra_tempo () { P2 = activa_display[0]; //activa 1Digito Minutos P0 = ~numero[minutos1]; delay (100); P0 = 0xFF;

MEEC-ERSP

Pgina 13 de 37

P2 = activa_display[1]; //activa 2Digito Minutos P0 = ~numero[minutos2]; delay (100); P0 = 0xFF; P2 = activa_display[2]; //activa 1Digito Horas P0 = ~numero[horas1]; delay (100); P0 = 0xFF; if (horas2 != 0){ //se o digito da esquerda das horas for zero no mostrar o zero apenas por esttica P2 = activa_display[3]; //activa 2Digito Horas P0 = ~numero[horas2]; } delay (100); P0 = 0xFF; }

//===================================================================

void mostra_despertador () { P2 = activa_display[0]; //activa 1Digito Minutos P0 = ~numero[despertador_minutos1]; delay (100); P0 = 0xFF; P2 = activa_display[1]; //activa 2Digito Minutos P0 = ~numero[despertador_minutos2]; delay (100); P0 = 0xFF; P2 = activa_display[2]; //activa 1Digito Horas P0 = ~numero[despertador_horas1]; delay (100); P0 = 0xFF; if (despertador_horas2 != 0){ //se o digito da esquerda das horas for zero no mostrar o zero apenas por esttica P2 = activa_display[3]; //activa 2Digito Horas P0 = ~numero[despertador_horas2]; } delay (100); P0 = 0xFF; }

A funo main() a funo principal, sendo esta a primeira a ser chamada e executada.
void main () {

Comea-se por atribuir os valores iniciais s variveis do subprograma main. A varivel numero usado para atribuir a codificao do display de 7 segmentos.

MEEC-ERSP

Pgina 14 de 37

A varivel activa_display usado para activar um determinado display, dos quatro, de cada vez.
conta = 0; //usado no programa recebe_dados() flag_segundos = 1; //usado no main() contador = 0;//contador de numero de ciclos que perfazem um segundo = 16. segundos = 0; numero [0] = 0x3F;/*codificao display 7 segmentos*/ numero [1] = 0x06; numero [2] = 0x5B; numero [3] = 0x4F; numero [4] = 0x66; numero [5] = 0x6D; numero [6] = 0x7D; numero [7] = 0x07; numero [8] = 0x7F; numero [9] = 0x6F; activa_display[0] activa_display[1] activa_display[2] activa_display[3] horas1 = horas2 = minutos1 minutos2 = = = = 0x1; //varivel para activao do display a mostrar 0x2; 0x4; 0x8;

0; /* 1 digito display horas*/ 0; /* 2 digito display horas*/ = 0; /* 1 digito display minutos*/ = 0; /* 2 digito display minutos*/ 0; /* 1 digito display horas*/ 0; /* 2 digito display horas*/ = 1; /* 1 digito display minutos*/ = 0; /* 2 digito display minutos*/

despertador_horas1 = despertador_horas2 = despertador_minutos1 despertador_minutos2

A porta srie configurada atravs da varivel SCON, em que definido para ser usado em modo 1, ou seja UART de 8 bits.
SCON = 0x50;

Em seguida configurado o contador horrio 0 (timer 0) atravs da varivel TMOD. configurado o Contador 0 para Modo 1 contagem de 16 bits a ser usado para a contagem dos segundos. O Contador 1 configurado para o Modo 2 contagem de 8 bits com auto recarregamento, usado para a comunicao srie.
TMOD=0x21;

O cristal na montagem de 11.0592MHz. A frequncia interna do relgio ser a frequncia do cristal a dividir por 12: 11.0592MHz / 12 = 921.6kHZ. O perodo de funcionamento do relgio ser o inverso da frequncia do relgio, que ser 1/921.6kHZ = 1.085069444s Queremos realizar contagens de 1 segundo para usar no nosso relgio deste programa mas o relgio interno do microprocessador rapidamente esgotado pelo que necessitamos de um acumulador no nosso programa.
MEEC-ERSP
Pgina 15 de 37

Estipulou-se que o acumulador ter o valor de 20. Tempo ciclo = 1 segundo / n ciclos acumulador = 1/20 = 50ms Iremos de seguida encontrar o valor de ciclos de mquina a que corresponde 50ms: N ciclos maquina do contador = tempo de contagem / tempo de ciclo de mquina = 50ms / 1.085069444s = 46080. Como o contador no realiza uma contagem decrescente ento tempos que subtrair este valor pelo valor mximo, ento: (65536 - 46080) = 19456 Este valor em hexadecimal ser 4C00 Ento carregamos em TL0 = 0x00 e TH0 = 0x4C; No entanto durante as simulaes chegou-se ao detalhe de verificar que durante a execuo da rotina de interrupo interna do temporizador 0 necessrio realizar a recarga do temporizado, o que se verifica que at essa recarga ser realizada decorre algum tempo. Esse tempo corresponde a 0x06, o que corresponde a 6 x 1.085069444s = 6.510416664s. Isto ao fim de algum tempo acrescenta alguma coisa. Desta forma necessitar subtrair esse valor em relao ao valor calculado anteriormente. Dessa forma 0x4C00 - 0x06 = 0x4BFA. Ento finalmente TL0 = 0xFA e TH0 = 0x4B.
TH0=0x4B; TL0=0xFA;

configurado o timer1 para que a velocidade de transferncia de dados da comunicao srie (RS232) seja de 9600Bps, aquando da utilizao de um cristal de 11.0592 Hz, atravs das variveis TL1 e TH1.
TL1 = 0xFD; TH1 = 0xFD;

Em seguida configurado as interrupes. Neste trabalho apenas se achou a necessidade de utilizar as interrupes internas: uma para o timer0, a ser utilizado para a contagem dos segundos e a interrupo para a comunicao srie. As interrupes no geral so controladas pelo registo EA que tem que ter valor verdadeiro (1). As interrupes do timer0 so activadas atravs do registo ET0, tomando este, tambm com valor verdadeiro.
EA = 1; ET0 = 1;

Inicia-se a contagem do timer0 e do timer1 utilizado para a comunicao da porta srie.

MEEC-ERSP

Pgina 16 de 37

TR0 = 1; TR1 = 1;

Activa-se o microprocessador para receber dados via RS232 atravs do registo REN e TI para transmisso de dados via RS232.
REN = 1; TI = 1;

Em seguida antes do ciclo infinito (loop) atravs da funo while (1) enviado via comunicao srie as instrues necessrias ao utilizador para este saber como acertar a hora remotamente.
printf ("##### ACERTAR AS HORAS REMOTAMENTE #####\n"); printf ("Introduza os numeros no teclado na seguinte ordem:\n"); printf ("XX horas XX minutos\n");

Como temos a necessidade que o microprocessador realize um lao eterno em que o programa executado infinitamente ento utilizado a funo while (1).
while (1) {

programado a forma como se relaciona os segundos, os minutos e horas, definindo a contagem do tempo. Os segundos depois do valor 59 assumem o valor 00 e incrementa uma unidade nos minutos. Os minutos da mesma forma que os segundos depois do valor 59 assumem o valor 00 e incrementa uma unidade nas horas. As horas depois do valor 23 assume o valor 00
if (segundos > 59) { segundos = 0; minutos1++; } if (minutos1 > 9) { minutos1 = 0; minutos2++; } if (minutos2 > 5) { minutos2 = 0; horas1++; } if (horas1 > 9) { horas1 = 0; horas2++;

MEEC-ERSP

Pgina 17 de 37

} if (horas2 >= 2 & horas1 > 3) { horas1 = 0; horas2 = 0; }

Para os minutos e segundos da hora do despertador d-se a mesma relao entre estes que no tempo do relgio.
if (despertador_minutos1 > 9) { despertador_minutos1 = 0; despertador_minutos2++; } if (despertador_minutos2 > 5) { despertador_minutos2 = 0; despertador_horas1++; } if (despertador_horas1 > 9) { despertador_horas1 = 0; despertador_horas2++; } if (despertador_horas2 >= 2 & despertador_horas1 > 3) { despertador_horas1 = 0; despertador_horas2 = 0; }

Em seguida, a cada minuto enviado via RS232 a hora actual. Para tal usado a funo printf. garantido que a mensagem s enviada uma vez por minuto, precisamente quando atinge o segundo 00, que imediatamente a seguir ao segundo 59.
if (segundos == 59) flag_segundos = 1; if (segundos != 59 && flag_segundos) { printf ("### Hora Actual. Actualiza a cada minuto ###\n"); printf ("%d%dH %d%dM %dS\n",horas2, horas1,minutos2,minutos1,segundos); flag_segundos = 0; }

A interrupo interna da porta srie despoletada sempre que o registo RI eTI transitarem valor 1. O registo TI j foi definido como 1 anteriormente. O registo RI transita para 1 quando enviado uma transmisso de dados para porta RX do microprocessador. Quando isso acontece executado o subprograma recebe_dados() que j foi explicado anteriormente.
if (RI) { recebe_dados (); MEEC-ERSP

Pgina 18 de 37

chamado o subprograma servico_despertador(), j explicado anteriormente, sempre que a hora programada do despertador seja igual hora actual e que esteja activado o despertador, isto entrada na porta P1.4. O despertador ir tocar durante 1 minuto ou ser interrompido quando a entrada da porta P1.4 estiver desactivada.
if (despertador_minutos1 == minutos1 && despertador_minutos2 == minutos2 && despertador_horas1 == horas1 && despertador_horas2 == horas2) { if (activa_despertador == 0) { servico_despertar (); } else { som = 1; } }

Sempre que seja premida o boto SET, ou seja, a entrada P1.3 activada mostrado nos displays de 7 segmentos os valores da hora do despertador. Quando no se est a premir o boto SET (situao normal) apresentado nos display de 7 segmentos a hora actual.
if (set_despertador) { mostra_tempo(); acerta_tempo (); } else { mostra_despertador(); acerta_despertador(); }

MEEC-ERSP

Pgina 19 de 37

5. Lista de Material 1 Microcontrolador ATMEL AT89S51 11 Resistncias 330 1 Resistncia 100 2 Condensadores 30pF 1 Condensador 1nF 1 Cristal oscilador 11.0592 MHz 3 botes presso 1 boto comutador 4 displays 7 segmentos anodo comum Driver RS232 MAX233 Conector RS232 Macho Cabo RS232 Femea-Femea

6. Simulao e Montagem Para a verificao do correto funcionamento deste programa utilizou-se o modo debug do programa Vison 4. Em baixo apresentado o diagrama da montagem.

FIGURA 3 ESQUEMA MONTAGEM

MEEC-ERSP

Pgina 20 de 37

7. Cdigo do Programa em C
#include <reg51.h> #include <stdio.h> //declarao das entradas e sada sbit botao_acerta_horas = P1^1; //entrada para acertar horas do relogio sbit botao_acerta_minutos = P1^2; //entrada para acertar minutos do relogio sbit set_despertador = P1^3; //entrada para acertar o despertador sbit activa_despertador = P1^4; //entrada para activar o modo de despertador sbit pisca_pisca = P1^7; //sada para piscar os segundos sbit som = P1^0; //Som de sada do despertador; unsigned int contador;//contador de numero de ciclos que perfazem segundo = 16. unsigned int segundos; unsigned char numero [10]; /*codificao display 7 segmentos*/ unsigned int horas1; /* 1 digito display horas*/ unsigned int horas2; /* 2 digito display horas*/ unsigned int minutos1; /* 1 digito display minutos*/ unsigned int minutos2; /* 2 digito display minutos*/ unsigned unsigned unsigned unsigned int int int int despertador_horas1; /* 1 digito display horas*/ despertador_horas2; /* 2 digito display horas*/ despertador_minutos1; /* 1 digito display minutos*/ despertador_minutos2; /* 2 digito display minutos*/ um

char activa_display[4]; //varivel para activao do display a mostrar

bit flag_segundos; //valor incial da flag_segundos main() int conta; //variavel usada no programa recebe_dados()

usado

no

programa

//======================================================================== ===================== void recebe_dados (void) { char c; conta++; if (conta == 1) //acerta as horas para o caracter da esquerda das horas { while ((c = getchar ()) != 0x1B) break; { printf ("xH enviado o n %c\n", c); switch (c) { case 0x30: horas2 = 0; break; case 0x31: horas2 = 1; break; case 0x32:

MEEC-ERSP

Pgina 21 de 37

horas2 = 2; break; default: horas2 = 0; } } } if (conta == 2) //acerta as horas para o caracter da direita das horas { while ((c = getchar ()) != 0x1B) break; { printf ("Hx enviado o n %c\n", c); switch (c) { case 0x30: horas1 = 0; break; case 0x31: horas1 = 1; break; case 0x32: horas1 = 2; break; case 0x33: horas1 = 3; break; case 0x34: horas1 = 4; break; case 0x35: horas1 = 5; break; case 0x36: horas1 = 6; break; case 0x37: horas1 = 7; break; case 0x38: horas1 = 8; break; case 0x39: horas1 = 9; break; default: horas1 = 0; } } } if (conta == 3) //acerta as horas para o caracter da esquerda dos minutos { while ((c = getchar ()) != 0x1B) break; { printf ("xM enviado o n %c\n", c); switch (c) { case 0x30: minutos2 = 0;

MEEC-ERSP

Pgina 22 de 37

break; case 0x31: minutos2 = break; case 0x32: minutos2 = break; case 0x33: minutos2 = break; case 0x34: minutos2 = break; case 0x35: minutos2 = break; default: minutos2 = } } }

1;

2;

3;

4;

5;

0;

if (conta == 4) //acerta as horas para o caracter da direita dos minutos { while ((c = getchar ()) != 0x1B) break; // while ((c = _getkey ()) != 0x1B); { printf ("Mx enviado o n %c\n", c); switch (c) { case 0x30: minutos1 = break; case 0x31: minutos1 = break; case 0x32: minutos1 = break; case 0x33: minutos1 = break; case 0x34: minutos1 = break; case 0x35: minutos1 = break; case 0x36: minutos1 = break; case 0x37: minutos1 = break; case 0x38: minutos1 = break; case 0x39: minutos1 =

0;

1;

2;

3;

4;

5;

6;

7;

8;

9;

MEEC-ERSP

Pgina 23 de 37

break; default: minutos1 = 0; } conta = 0; } }

//======================================================================== ===================== //inicio da rotina quando o timer0 esgota a sua contagem interna void timer0 (void) interrupt 1 { TH0=0x4B; TL0=0xFA; contador++; if (contador == 20) { segundos++; contador = 0; } if (contador == 0 ) pisca_pisca = 0; //funo para piscar o LED dos segundos a cada 1 segundo. if (contador == 6 ) pisca_pisca = 1; }

//======================================================================== ===================== //programa para criar atrasos void delay (int num_delay) { int troika = 0; while (troika < num_delay) troika++; } //======================================================================== ===================== //programa para acertar o tempo void acerta_tempo () { bit flag1_horas; bit flag1_minutos; if (!botao_acerta_horas) flag1_horas = 1; if (botao_acerta_horas && flag1_horas)//s ir contabilizar um input na comutao descendente do boto primido -> libertado { horas1++; flag1_horas = 0;

MEEC-ERSP

Pgina 24 de 37

} if (!botao_acerta_minutos) flag1_minutos = 1; if (botao_acerta_minutos && flag1_minutos)//s ir contabilizar um input na comutao descendente do boto primido -> libertado { if (minutos2 == 5 && minutos1 == 9) { minutos2 = 0; minutos1 = 0; flag1_minutos = 0; } else { minutos1++; flag1_minutos = 0; } } }

//======================================================================== ===================== //porograma para acertar o despertador void acerta_despertador () { bit flag2_horas; bit flag2_minutos; if (!botao_acerta_horas) flag2_horas = 1;//s ir contabilizar um input na comutao descendente do boto primido -> libertado if (botao_acerta_horas && flag2_horas) { despertador_horas1++; flag2_horas = 0; } if (!botao_acerta_minutos) flag2_minutos = 1; if (botao_acerta_minutos && flag2_minutos)//s ir contabilizar um input na comutao descendente do boto primido -> libertado { if (despertador_minutos2 == 5 & despertador_minutos1 == 9) { despertador_minutos2 = 0; despertador_minutos1 = 0; } else despertador_minutos1++; flag2_minutos = 0; } } //======================================================================== ===================== //programa a executar para despertar void servico_despertar () { som = ~som; delay(1000); som = ~som; delay(100); }

MEEC-ERSP

Pgina 25 de 37

//======================================================================== ===================== //programa para mostrar nos displays de 7 segmentos a hora actual void mostra_tempo () { P2 = activa_display[0]; //activa 1Digito Minutos P0 = ~numero[minutos1]; delay (100); P0 = 0xFF; P2 = activa_display[1]; //activa 2Digito Minutos P0 = ~numero[minutos2]; delay (100); P0 = 0xFF; P2 = activa_display[2]; //activa 1Digito Horas P0 = ~numero[horas1]; delay (100); P0 = 0xFF; if (horas2 != 0){ //se o digito da esquerda das horas for zero no mostrar o zero apenas por esttica P2 = activa_display[3]; //activa 2Digito Horas P0 = ~numero[horas2]; } delay (100); P0 = 0xFF; } //======================================================================== ===================== //programa para mostrar nos displays de 7 a hora de despertar void mostra_despertador () { P2 = activa_display[0]; //activa 1Digito Minutos P0 = ~numero[despertador_minutos1]; delay (100); P0 = 0xFF; P2 = activa_display[1]; //activa 2Digito Minutos P0 = ~numero[despertador_minutos2]; delay (100); P0 = 0xFF; P2 = activa_display[2]; //activa 1Digito Horas P0 = ~numero[despertador_horas1]; delay (100); P0 = 0xFF; if (despertador_horas2 != 0){ //se o digito da esquerda das horas for zero no mostrar o zero apenas por esttica P2 = activa_display[3]; //activa 2Digito Horas P0 = ~numero[despertador_horas2]; } delay (100); P0 = 0xFF; }

MEEC-ERSP

Pgina 26 de 37

//======================================================================== ===================== //======================================================================== ===================== //======================================================================== ===================== //======================================================================== ===================== void main () { //DECLARAO DAS VARIVEIS conta = 0; //usado no programa recebe_dados() flag_segundos = 1; //usado no main() contador = segundos = numero [0] numero [1] numero [2] numero [3] numero [4] numero [5] numero [6] numero [7] numero [8] numero [9] 0;//contador de numero de ciclos que perfazem um segundo = 16. 0; = 0x3F;/*codificao display 7 segmentos*/ = 0x06; = 0x5B; = 0x4F; = 0x66; = 0x6D; = 0x7D; = 0x07; = 0x7F; = 0x6F; = = = = 0x1; //varivel para activao do display a mostrar 0x2; 0x4; 0x8;

activa_display[0] activa_display[1] activa_display[2] activa_display[3] horas1 = horas2 = minutos1 minutos2

0; /* 1 digito display horas*/ 0; /* 2 digito display horas*/ = 0; /* 1 digito display minutos*/ = 0; /* 2 digito display minutos*/ 0; /* 1 digito display horas*/ 0; /* 2 digito display horas*/ = 1; /* 1 digito display minutos*/ = 0; /* 2 digito display minutos*/

despertador_horas1 = despertador_horas2 = despertador_minutos1 despertador_minutos2

//configurao da comunicao serial SCON = 0x50; //configurao da porta srie p/ modo 1 (UART 8 bits) //CONFIGURAO DO CONTADOR HORARIO N 0 TMOD=0x21; /* activado o contador0 em contagem de 16bits - Modo1*/ // e o contador1 em temporizado de 8 bits com auto recarregamento TH0=0x4B; /*Registos TH0 e TL0 para contar at 19456*/ TL0=0xFA; TL1 = 0xFD; //configurao do timer1 para uma velocidade de transferncia de 9600Bps TH1 = 0xFD; // com a utilizao de um cristal de 11.0592 Hz

MEEC-ERSP

Pgina 27 de 37

//configurao do interromper relogio 0 EA = 1; /*activa as interrupes - GERAL*/ ET0 = 1; /*activa interrupo Timer0*/ TR0 = 1; //inicia a contagem do timer 0 TR1 = 1; //incia a contagem do timer1 p/ porta srie REN = 1; //activa a recepo de dados via RS232 TI = 1;

//ENVIAR INFORMAO POR COMUNICAO SRIE DE COMO ACERTAR AS REMOTAMENTE printf ("##### ACERTAR AS HORAS REMOTAMENTE #####\n"); printf ("Introduza os numeros no teclado na seguinte ordem:\n"); printf ("XX horas XX minutos\n");

HORAS

//INCIO DO CICLO INFINITO while (1) { //condies da relao entre segundos, minutos e horas na definio do tempo if (segundos > 59) { segundos = 0; minutos1++; } if (minutos1 > 9) { minutos1 = 0; minutos2++; } if (minutos2 > 5) { minutos2 = 0; horas1++; } if (horas1 > 9) { horas1 = 0; horas2++; } if (horas2 >= 2 & horas1 > 3) { horas1 = 0; horas2 = 0; } //condies da relao entre segundos, minutos e horas na definio da hora de despertar if (despertador_minutos1 > 9) // condies da contagem do despertador { despertador_minutos1 = 0; despertador_minutos2++; }

MEEC-ERSP

Pgina 28 de 37

if (despertador_minutos2 > 5) { despertador_minutos2 = 0; despertador_horas1++; } if (despertador_horas1 > 9) { despertador_horas1 = 0; despertador_horas2++; } if (despertador_horas2 >= 2 & despertador_horas1 > 3) { despertador_horas1 = 0; despertador_horas2 = 0; }

//################################### //para enviar por porta RS232 as horas if (segundos == 59) flag_segundos = 1; //envia pela porta srie o tempo a cada minuto, e apenas 1 vez if (segundos != 59 && flag_segundos) { printf ("### Hora Actual. Actualiza a cada minuto ###\n"); printf ("%d%dH %d%dM %dS\n",horas2,horas1,minutos2,minutos1,segundos); flag_segundos = 0; } //#################################### //para receber da porta RS232 o valor das horas if (RI) { recebe_dados (); }

//CONDIO PARA DESPERTAR. O despertador ir tocar durante 1 minuto ou quando for desligado o despertador if (despertador_minutos1 == minutos1 && despertador_minutos2 && despertador_horas1 == horas1 && despertador_horas2 == { if (activa_despertador == 0){ servico_despertar (); } } else { som = 1; } //CONDIES PARA MUDAR PARA MODO TEMPO OU DESPERTADOR if (set_despertador) { mostra_tempo(); acerta_tempo (); } else

== minutos2 horas2)

MEEC-ERSP

Pgina 29 de 37

{ mostra_despertador(); acerta_despertador(); } } }

MEEC-ERSP

Pgina 30 de 37

8. Cdigo HEX Em baixo apresentado o cdigo HEX gerado do programa em C, usado para a programao do Microprocessador AT89S51. :10078400784820656E766961646F206F206EBA20A8 :1007940025630A00487820656E766961646F206F6E :1007A400206EBA2025630A00784D20656E76696153 :1007B400646F206F206EBA2025630A004D7820658F :1007C4006E766961646F206F206EBA2025630A001B :1007D4002323232323204143455254415220415390 :1007E40020484F5241532052454D4F54414D454EA0 :1007F40054452023232323230A00496E74726F6413 :10080400757A61206F73206E756D65726F73206EDB :100814006F207465636C61646F206E61207365671B :1008240075696E7465206F7264656D3A0A00585874 :1008340020686F726173205858206D696E75746FEB :10084400730A0023232320486F7261204163747567 :10085400616C2E2041637475616C697A612061203A :1008640063616461206D696E75746F202323230AAC :1008740000256425644820256425644D202564539F :020884000A0068 :100591000523E52370020522640145227038120A01 :1005A100D78F1CEF641B7BFF7A077984851C0B12A4 :1005B1000070E51C24CF600914600E2402701280C3 :1005C10010753800753901800D7538007539028054 :1005D10005E4F538F539E523640245226003020696 :1005E1007A120AD78F1CEF641B7BFF7A07799885F3 :1005F1001C0B120070E51C24D0B40A005076900642 :100601000D75F003A4C58325F0C5837302062B0283 :10061100062D02063502063D02064502064D02067A :100621005502065D02066502066D80487536007545 :1006310037018045753600753702803D7536007586 :1006410037038035753600753704802D7536007592 :1006510037058025753600753706801D753600759E :1006610037078015753600753708800D75360075AA :1006710037098005E4F536F537E523640345227033 :1006810059120AD78F1CEF641B7BFF7A0779AC855F :100691001C0B120070E51C24CF601214601714604B :1006A1001C1460211460262405702A8028753000EE :1006B1007531018025753000753102801D7530005E :1006C1007531038015753000753104800D7530006A :1006D1007531058005E4F530F531E52364044522E3 :1006E1006003020783120AD78F1CEF641B7BFF7A1A :1006F1000779C0851C0B120070E51C24D0B40A00D8 :10070100507690071175F003A4C58325F0C5837356 :1007110002072F0207310207390207410207490286
MEEC-ERSP
Pgina 31 de 37

:1007210007510207590207610207690207718048F0 :10073100752E00752F018045752E00752F02803DA5 :10074100752E00752F038035752E00752F04802DB1 :10075100752E00752F058025752E00752F06801DBD :10076100752E00752F078015752E00752F08800DC9 :10077100752E00752F098005E4F52EF52FE4F5227D :02078100F5235E :010783002253 :03000B00020A44A2 :100A4400C0E0758C4B758AFA0543E5437002054294 :100A540064144542700E0545E5457002054475422F :100A640000754300E54345427002C297E5436406BE :090A740045427002D297D0E03235 :090AA400F8E6F4F5807F647E00A1 :100AAD00E4FDFCC3ED9FEE6480F8EC648098500784 :070ABD000DBD00010C80ECEF :010AC400220F :1009FE00209102D20030910D30000A0537E5377094 :100A0E00020536C200209202D20130922830012512 :100A1E00E531640545307013E52F6409452E700BE2 :100A2E00F530F531F52EF52FC20122052FE52F7089 :050A3E0002052EC201BB :010A43002290 :10091400209102D20030910D30000A053FE53F706E :1009240002053EC200209202D201309238300135D5 :10093400E5336409453270047F0180027F00E535A8 :100944006405453470047E0180027E00EE5F600B16 :10095400E4F534F535F532F53380080533E53370C5 :05096400020532C20192 :01096900226B :100AC500B2907FE87E03120AADB2907F647E000289 :020AD5000AAD68 :10096A00853AA07424252F120AA47580FF853BA01E :10097A0074242531F8E6F4F580120AAD7580FF85F6 :10098A003CA074242537F8E6F4F580120AAD758088 :10099A00FFE5394538600C853DA074242539F8E611 :0A09AA00F4F580120AA97580FF22FF :1009B400853AA074242533120AA47580FF853BA0D0 :1009C40074242535F8E6F4F580120AAD7580FF85A8 :1009D4003CA07424253FF8E6F4F580120AAD758036 :1009E400FFE5414540600C853DA074242541F8E6AF :0A09F400F4F580120AA97580FF22B5 :10036A00E4F522F523D209F542F543F544F545753E :10037A00243F75250675265B75274F7528667529EE :10038A006D752A7D752B07752C7F752D6F753A0152 :10039A00753B02753C04753D08F536F537F538F5B9

MEEC-ERSP

Pgina 32 de 37

:1003AA0039F52EF52FF530F531F53EF53FF540F5E7 :1003BA0041F532753301F534F53575985075892153 :1003CA00758C4B758AFA758BFD758DFDD2AFD2A9E6 :1003DA00D28CD28ED29CD2997BFF7A0779D4120022 :1003EA00707BFF7A0779FE1200707BFF7A087932F8 :1003FA00120070D3E545943BE5449400400DE4F5C2 :10040A0044F545052FE52F7002052ED3E52F9409F3 :10041A00E52E9400400DE4F52EF52F0531E53170F7 :10042A00020530D3E5319405E5309400400DE4F53A :10043A0030F5310537E53770020536D3E5379409CB :10044A00E5369400400DE4F536F5370539E539709F :10045A00020538C3E5399402E538940040047F0167 :10046A0080027F00D3E5379403E536940040047E8A :10047A000180027E00EE5F6009E4F536F537F53853 :10048A00F539D3E5339409E5329400400DE4F532A9 :10049A00F5330535E53570020534D3E5359405E5C0 :1004AA00349400400DE4F534F535053FE53F70021C :1004BA00053ED3E53F9409E53E9400400DE4F53E40 :1004CA00F53F0541E54170020540C3E5419402E567 :1004DA0040940040047F0180027F00D3E53F9403EB :1004EA00E53E940040047E0180027E00EE5F6009D2 :1004FA00E4F53EF53FF540F541E545643B4544707A :10050A0002D209E545643B454460353009327BFF38 :10051A007A0879471200707BFF7A08797585380B5B :10052A0085390C85360D85370E85300F8531108556 :10053A002E11852F12854413854514120070C209A5 :10054A00E533B52F2BE532B52E26E535B53121E554 :10055A0034B5301CE53FB53717E53EB53612E541EF :10056A00B5390DE540B53808209407120AC580024E :10057A00D29030930912096A1209FE0203FD120988 :07058A00B41209140203FD85 :03000000020AE809 :0C0AE800787FE4F6D8FD75814502036AB2 :10000E00E517240BF8E60517227808300702780B5F :10001E00E475F0011208DE0208862000EB7F2ED276 :10002E00008018EF540F2490D43440D4FF30040BCA :10003E00EF24BFB41A0050032461FFE518600215C7 :10004E0018051BE51B7002051A30070D7808E475BC :10005E00F0011208DEEF0208CC020A7D7403D2070B :10006E008003E4C207F5178B088A09890AE4F5189C :10007E00F51AF51BE51860077F2012004980F5750B :10008E0019FFC201C200C202C203C205C206C208E3 :10009E00120017FF700D3007057F0012005AAF1BBC :1000AE00AE1A22B4255FC2D5C204120017FF24D0A7 :1000BE00B40A00501A75F00A781830D50508B6FF44 :1000CE000106C6A426F620D5047002D20380D924D8

MEEC-ERSP

Pgina 33 de 37

:1000DE00CFB41A00EF5004C2E5D20402025AD20184 :1000EE0080C6D20080C0D20280BCD2D580BAD205E2 :1000FE0080B47F201200492002077401B518004019 :10010E00F112000EFF120049020082D208D20680C0 :10011E009512000EFB12000EFA12000EF94A4B70E9 :10012E0006792B7A037BFF20022EE518602A7E00CB :10013E008E8275830012089F60060EEE651970F0B0 :10014E00C2D5EBC0E0EAC0E0E9C0E0EE1202A1D0F9 :10015E00E0F9D0E0FAD0E0FB120886FF60AAEBC00F :10016E00E0EAC0E0E9C0E0120049D0E02401F9D095 :10017E00E03400FAD0E0FBE5190460DCD519D98033 :10018E00877BFF7A02799DD202809C79108002795A :10019E0008C206C2088008D2D5790A8004790AC23C :1001AE00D5E519047002F519E4FAFDFEFF12000EF2 :1001BE00FC7B0820011312000EFD7B1030000A128A :1001CE00000EFE12000EFF7B20EC3382D592D5502E :1001DE0013C3E43000069FFFE49EFEE42001039D5E :1001EE00FDE49CFCE4CBF8C201EC700CCFCECDCC80 :1001FE00E824F8F870F38017C3EF33FFEE33FEED0B :10020E0033FDEC33FCEB33FB994002FB0FD8E9EBEB :10021E00300105F8D0E0C448B201C0E00AEC4D4E02 :10022E004F78207B0070C2EAB5190040BCC0E012C6 :10023E0002A3D0F0D0E0200104C4C0E0C4B201C0DB :10024E00F0120032D0F0D5F0EB0200821208EE016F :10025E001F5301995800F04C00EC42019D4F01A52F :0F026E004401A54901054301AB55018F46018F9E :10027D0045018F47034B5000F42D00F82E011B2B29 :10028D0000FC2301192003342A00B4480000011397 :10029D003F3F3F00790AA2D5200314300509B9105C :1002AD00020404B9080104A2D5200602500104205D :1002BD0002689202B518005034C0E07F2030031957 :1002CD007F30A20272067205500F1202FAC202C2EC :1002DD0006C205C2087F30800F300503E9C0E01269 :1002ED000049300503D0E0F9D0E0B518CC30051742 :1002FD007F30B9100C1200497F583004077F788089 :10030D0003B908031200493002057F2D0200497F11 :10031D00202008F87F2B2006F322920280CF286E32 :10032D00756C6C2900D20112000E3001F8C20178F3 :10033D001830D50108F60200B42D5043495812006B :10034D000E2403B405004001E49003469312003AD5 :0D035D00743A12003AD20375180402019997 :100AD700100A0B120AF4BF0D027F0A020A7DAF1D2E :010AE70022EC :10088600BB010689828A83E0225002E722BBFE0270 :09089600E32289828A83E49322A3 :10089F00BB010CE58229F582E5833AF583E022500E

MEEC-ERSP

Pgina 34 de 37

:1008AF0006E92582F8E622BBFE06E92582F8E22258 :0D08BF00E58229F582E5833AF583E4932272 :1008CC00BB010689828A83F0225002F722BBFE010B :0208DC00F32205 :1008DE00FAE6FB0808E6F925F0F618E6CA3AF6221B :1008EE00D083D082F8E4937012740193700DA3A399 :1008FE0093F8740193F5828883E4737402936860AD :06090E00EFA3A3A380DFAC :100A7D00EFB40A07740D120A88740A309811A899F8 :100A8D00B8130CC2983098FDA899C298B811F630D9 :070A9D0099FDC299F59922B1 :0A0AF4003098FDAF99C2987E0022F1 :00000001FF

MEEC-ERSP

Pgina 35 de 37

9. Concluso Na realizao deste projecto conseguiu-se comprir os objectivos estabelecidos. Utilizou-se a programao C e uma variedade de funcionalidades que o microprocessador nos oferece. Na linguagem de programao C utilizou-se os comandos e blocos de comandos While e If e If Else. Foi concerteza os comandos mais utilizados e mais uteis e que tornam a tarefa de programar mais fcil, quando comparado com o Assemble. Foi usado tambm o comando Switch, que no foi leccionado nas aulas, que apresenta bastantes potncialidades. Foi tambm utilizado a funcionalidade de vectores do C. Permitio-nos a reduo do numero de variveis, compilando alguns dados apenas numa varivel, assim como uma melhor organizao do cdigo. Recorreu-se a diversas funcionalidades oferecidas pelo microprossessador 8051, nomeadamente a utilizao de interrupes internas e temprizador interno. A temporizao interna em conjunto com as interrupes internas verificou-se bastante util umas vez que sempre que a temprizao defenida atige o valor pretendido possvel executar uma ou vrias instrues (solicitao). Isto permite que independetemente da instruo que o microprocessador esteja a executar a temporizao realizada internamente em background sem que o programador se tenha que preocupar com isso. Permite temporizaes mais precisas uma vez que o reiniciar da contagem realizada imediatamente independentemente daquilo que esteja a fazer. Sem esta funcionalidade as contagens de tempo eram dependentes da quantidade de instrues que o microprocessador tinha que percorrer. Em temporizaes menos precisas pode no ser importante, mas torna-se problemtico quando se quer realizar a temporizao de um relgio o mais preciso possvel. Com a utilizao da linguagem de programao em C verificou-se que a programao se torna bastante mais rpida, no s pela forma de organizao e estruturao da linguagem mas como a simplificao de comandos. Em comparao, o Assembler uma linguagem de programao que exige do programador um maior cuidado e ateno a muitos promenores. H a possibilidade de melhoramentos neste programa, nomeadamente na forma de se acertar as horas: Quando se manter primido a tecla das Horas ou do Minutos as horas ou os minutos comeam por incrementar lentamente e comea a acelerar com o tempo.

MEEC-ERSP

Pgina 36 de 37

10. Bibliografia Antnio Abreu; A srie MC51 de microcontroladores de oito bits da Intel, 1998. S, Maurcio Cardoso de Programao C para Microcontroladores 8051 Primeira Edio, So Paulo: Editora rica Ltda, 2005. Seven-segment display character representations - http://en.wikipedia.org/wiki/Sevensegment_display_character_representations. 21/12/2012. Seven-segment display - http://en.wikipedia.org/wiki/Seven-segment_display. 21/12/2012.

MEEC-ERSP

Pgina 37 de 37