Exemplo I Semforo
Este exerccio utiliza a porta P1 para controlar as lmpadas de um conjunto de trs
semforos. O semforo S3 do pedestre e s utiliza as lmpadas vermelha e verde. Veja a
descrio do funcionamento dos semforos que encontra-se impressa junto ao esquemtico do
circuito. Por simplicidade o circuito foi simplificado ao mximo. As lmpadas do semforo so
consideradas ideiais, e portanto no consomem corrente da porta lgia. Portanto no h
necessidade de resistores para limitao de corrente. Alm disto, os semforos possuem os
circuitos necessrios para acionar uma lmpada conectada a rede eltrica, atravs de um sinal
lgico do tipo TTL. Na prtica, o projeto deveria contemplar tanto os resistores de limitao de
corrente quanto os circuitos de disparo das lmpadas. Para quem tiver curiosidade, procure a
documentao do circuito MOC3020. Ele um circuito de disparo para tiristores que pode ser
utilizado nesta tarefa.
Soluo em Assembly
Obs.: Este programa foi elaborado sem a adio das bibliotecas disponveis e portanto, a
listagem do programa ficou consideravelmente maior.
;
; **** SEMAF_I.ASM *********************************************************
; **
**
; ********************************************************* by [JCLima ] ***
;
$MOD51
; *** Exemplo de Declarao de Pinos de I/ O *******************************
; **
**
; **************************************************************************
;
VM3
EQU
P1.0
; VM3
equ
90h
AM3
EQU
P1.1
; AM3
equ
91h
VD3
EQU
P1.2
; VD3
equ
92h
EQU
EQU
EQU
EQU
EQU
85h
45h
32h
29h
28h
;
;
;
;
;
S1
S1
S2
S2
S2
Verde
Amarelo
Verde
Amarelo e S3 Vermelho On
Amarelo e S3 Vermelho Off
LOOP_REPETE:
delay 22s
MOV
MOV
LCALL
P1,#estado2
A,#3
DELAYx1000ms
; delay 3s
MOV
MOV
LCALL
P1,#estado3
A,#15
DELAYx1000ms
; delay 15s
MOV
MOV
LCALL
contador,#3
P1,#estado4
DELAY500ms
MOV
LCALL
DJNZ
P1,#estado5
DELAY500ms
; delay 0.5s
contador,LOOP_REPETE
LJMP
REPETE
; delay 0.5s
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ
POP
RET
R7,_LOOP1ms
07H
LCALL
LCALL
LCALL
LCALL
LCALL
DJNZ
DELAY1ms
DELAY1ms
DELAY1ms
DELAY1ms
DELAY1ms
R7,_LOOP500ms
POP
07H
;
;
;
;
;
;
Aguarda 1ms!!!
Aguarda 1ms!!!
Aguarda 1ms!!!
Aguarda 1ms!!!
Aguarda 1ms!!!
Repete 100x
RET
; *** DELAYx1000ms(A) ******************************************************
; ** Baseada na rotina de 1ms!
**
; ********************************************* [ MSC1211 @ 11.0592MHz ] ***
;
DELAYx1000ms: PUSH
07H
PUSH
06H
MOV
_LOOPxx1000ms: MOV
R7,A
R6,#200
_LOOPx1000ms:
LCALL
LCALL
LCALL
LCALL
LCALL
DJNZ
DELAY1ms
DELAY1ms
DELAY1ms
DELAY1ms
DELAY1ms
R6,_LOOPX1000ms
DJNZ
R7,_LOOPxx1000ms
POP
POP
RET
06H
07H
; Aguarda
; Aguarda
; Aguarda
; Aguarda
; Aguarda
; Repete
1ms!!!
1ms!!!
1ms!!!
1ms!!!
1ms!!!
200x = 1segundo
; Repete A vezes
END
// aguarda 22s
// aguarda 3s
delay(15000);
// aguarda 15s
for(i=0; i<3;i++)
// Vermelho piscante por 3s
{
semaforo = estado[3];
delay(500);
semaforo = estado[4];
delay(500);
}
}
}
//
// ****************************************************************
// ** D E L A Y D E 1 m s
@11.0592MHz
**
// ****************************************************************
//
// mov r7,#212 ; <-- para um MSC1211 (4 pulsos/ciclo!!!)
// mov r7,#70 ; <-- para um AT89C52 (12 pulsos/ciclo!!!)
//
void delay1ms(void) _naked
{
_asm
push
ar7
mov
r7,#70
DELAY_1ms: nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
djnz
r7,DELAY_1ms
pop
ar7
ret
_endasm;
}
//
// ****************************************************************
// ** D E L A Y P A R A M E T R I Z V E L
@11.0592MHz
**
// ****************************************************************
//
void delay(unsigned int tempo)
{
while (tempo > 0)
{
tempo--;
delay1ms();
}
}
Exerccio I
Modifique o cdigo acima, de modo que o sinal de vermelho piscante do semforo S3
fique neste estado por 5 segundos, mas o estado de ateno do semforo S2 permanea em 3
segundos.
Exerccio II
Escreva o cdigo para fazer o acionamento de um novo conjunto de semforos que
esto representados no circuito dado a seguir. Veja a descrio do funcionamento das lmpadas
que se encontra impresso junto ao circuito eltrico.
Soluo em Assembly
;
; **** UMDIGITO.ASM ********************************************************
; **
**
; ********************************************************* by [JCLima ] ***
;
;
$MOD51
; *** Declarao de Pinos de I/O *******************************************
; **
**
; **************************************************************************
;
display
EQU
P1
anodo
EQU
P3.2
;
ORG
RETI
000BH
; A = contador
; Converte para 7 segmentos
; Escreve no display...
; Incrementa o contador
; Testa se contador = 10
Soluo em Linguagem C
#include <8052.h>
#include <stdio.h>
//
// ****************************************************************
// ** Pinos do MICROCONTROLADOR
**
// ****************************************************************
//
sfr at 0x90 display; // Display na porta P1 (A - P1.0, B - P1.1 ...)
sbit at 0xb2 anodo;
// Controle do anodo (P3.2)
//
// ****************************************************************
// ** V A R I V E I S E C O N S T A N T E S
**
// ****************************************************************
//
const unsigned char Tabela[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xd8, 0x80, 0x90};
//
// ****************************************************************
// ** P R O T O T Y P E S
**
// ****************************************************************
//
void delay1ms(void) _naked;
void delay(unsigned int tempo);
//
// ****************************************************************
// ** M A I N
**
// ****************************************************************
//
void main(void)
{
unsigned char i = 0;
anodo = 0; // Liga o anodo...
while(1)
{
display = Tabela[i];
i++;
if(i == 10) i = 0;
delay(1000);
}
}
//
// ****************************************************************
// ** D E L A Y D E 1 m s
@11.0592MHz
**
// ****************************************************************
//
void delay1ms(void) _naked
{
_asm
push
ar7
mov
r7,#70
DELAY_1ms: nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
djnz
pop
ret
_endasm;
}
r7,DELAY_1ms
ar7
//
// ****************************************************************
// ** D E L A Y P A R A M E T R I Z V E L
@11.0592MHz
**
// ****************************************************************
//
void delay(unsigned int tempo)
{
while (tempo > 0)
{
tempo--;
delay1ms();
}
}
Exerccio III
Modifique os programas em C e assembly do exemplo descrito acima (exemplo II), de
modo a que o mesmo possa realizar a contagem em hexadecimal.
Obs.: Para que se possa acessar o display necessrio saber em que posio da memria o
mesmo foi colocado. O endereo obtido pela anlise do circuito eltrico.
Soluo em Assembly
;
; **** UM_MEM.ASM **********************************************************
; **
**
; ********************************************************* by [JCLima ] ***
;
$MOD51
MOV
MOVX
DPTR,#display
@DPTR,A
LCALL
INC
CJNE
MOV
LJMP
DELAY1000ms
R7
R7,#10,REPETE
R7,#0
REPETE
; Delay de 1 segundo...
; contador = contador + 1
; contador = 10?
Soluo em Linguagem C
#include <8052.h>
#include <stdio.h>
//
// ****************************************************************
// ** Pinos do MICROCONTROLADOR
**
// ****************************************************************
//
xdata at 0xee00 unsigned char display; // Endereo da RAM ext.
//
// ****************************************************************
// ** V A R I V E I S E C O N S T A N T E S
**
// ****************************************************************
//
const unsigned char Tabela[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xd8, 0x80, 0x90};
//
// ****************************************************************
// ** P R O T O T Y P E S
**
// ****************************************************************
//
void delay1ms(void) _naked;
void delay(unsigned int tempo);
//
// ****************************************************************
// ** M A I N
**
// ****************************************************************
//
void main(void)
{
unsigned char i = 0;
while(1)
{
display = Tabela[i];
if(++i == 10) i = 0;
delay(1000);
}
}
//
// ****************************************************************
// ** D E L A Y D E 1 m s
@11.0592MHz
**
// ****************************************************************
//
void delay1ms(void) _naked
{
_asm
push
ar7
mov
r7,#70
DELAY_1ms: nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
djnz
pop
ret
_endasm;
}
r7,DELAY_1ms
ar7
//
// ****************************************************************
// ** D E L A Y P A R A M E T R I Z V E L
@11.0592MHz
**
// ****************************************************************
//
void delay(unsigned int tempo)
{
while (tempo > 0)
{
tempo--;
delay1ms();
}
}
Exerccio IV
Modifique os programas em C e assembly do exemplo descrito acima (exemplo III), de
modo a que o mesmo possa realizar uma contagem em octal.
so acionados com nvel lgico 0 e os anodos so acionados com nvel lgico 1. O circuito foi
simplificado ao mximo, tanto com relao ao microcontrolador quanto com relao ao circuito
de multiplexao do display. Desta forma no aparecem as chaves (transistores) responsveis
pelo chaveamento dos displays. Admita que estes circuitos esto embutidos nos prprios
displays. Em um circuito real no possvel conectar o display ao microcontrolador da
forma como est representado no diagrama eltrico. Seria necessrio acrescentar os
resistores para limitao de corrente e os transistores para o chaveamento dos displays.
Para o circuito proposto deseja-se implementar um contador de 0 99 que ser
atualizado a cada segundo. A contagem ser feita empregando apenas um contador, ou seja, o
programa deve tratar de separar a unidade da dezena, utilizando as operaes de diviso inteira
e resto da diviso.
Soluo em Assembly
;
; **** DOIS_DGT.ASM ********************************************************
; **
**
; ** Ultima Modificacao em: 05/10/2008
**
; **
**
; ********************************************************* by [JCLima ] ***
;
;
$MOD51
anodo_u
anodo_d
EQU
EQU
P3.2
P3.3
; Contador da varredura
LOOP_VAR:
MOV
MOV
DIV
MOVC
MOV
SETB
LCALL
CLR
A,R7
B,#10
AB
A,@A+DPTR
P1,A
ANODO_D
DELAY10ms
ANODO_D
; Carrega Contador...
MOV
A,B
MOVC
MOV
SETB
LCALL
CLR
DJNZ
A,@A+DPTR
P1,A
ANODO_U
DELAY10ms
ANODO_U
R6,LOOP_VAR
INC
CJNE
MOV
LJMP
R7
R7,#100,REPETE
R7,#0
REPETE
Soluo em Linguagem C
#include <8052.h>
#include <stdio.h>
#include <delay.h>
//
// ****************************************************************
// ** Pinos do MICROCONTROLADOR
**
// ****************************************************************
//
sfr at 0x90 display; // Display na porta P1 (A - P1.0, B - P1.1 ...)
sbit at 0xb2 anodou; // Controle da dezena (P3.2)
sbit at 0xb3 anodod; // Controle da unidade (P3.3)
//
// ****************************************************************
// ** V A R I V E I S E C O N S T A N T E S
**
// ****************************************************************
//
const unsigned char Tabela[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xd8, 0x80, 0x90};
//
// ****************************************************************
// ** P R O T O T Y P E S
**
// ****************************************************************
//
void delay1ms(void) _naked;
void delay(unsigned int tempo);
//
// ****************************************************************
// ** M A I N
**
// ****************************************************************
//
// Obs:. As rotinas de delay foram includas em uma biblioteca
//
denominada de delay.lib
//
void main(void)
{
unsigned char i, contador = 0;
anodod = 0;
// Desliga Dezena e...
anodou = 0;
// desliga unidade
while(1)
{
for(i=0; i<50; i++)
{
display = Tabela[contador/10];
anodod = 1;
delay(10);
anodod = 0;
display = Tabela[contador%10];
anodou = 1;
delay(10);
anodou = 0;
// Separa a dezena...
// e liga display dezena
// Seapara a Unidade
// e liga display unidade
}
if(++contador == 100) contador = 0;
}
}
Exerccio V
Modifique os programas em C e assembly do exemplo anterior (exemplo IV) de modo
que o mesmo implemente um contador de 0 59, o qual ser atualizado a cada segundo, mas
com numerao em octal e em hexadecimal. A contagem ser feita empregando apenas um
contador, ou seja, o programa deve tratar de separar a unidade da dezena, utilizando as
operaes de diviso inteira e resto da diviso.
Exemplo V
Neste exemplo, quatro displays de 7 segmentos esto conectados a porta P1. Para que
seja feita a seleo de qual dgito ser acionado, foram utilizadas quatro linhas de controle: P3.2
P3.5, para o acionamento do dgito da unidade (P3.5) at o dgito do milhar (P3.2). De modo
que o usurio no perceba que os dgitos esto piscando, sugere-se que cada dgito seja
acionado pelo menos 50 vezes por segundo (varredura de 200Hz). O display do tipo anodo
comum. Os segmentos so acionados com nvel lgico 0 e os anodos so acionados com nvel
lgico 1. O circuito foi simplificado ao mximo, tanto com relao ao microcontrolador quanto
com relao ao circuito de multiplexao do display. Desta forma no aparecem as chaves
(transistores) responsveis pelo chaveamento dos displays. Admita que estes circuitos esto
embutidos nos prprios displays. Em um circuito real no possvel conectar o display ao
microcontrolador da forma como est representado no diagrama eltrico. Seria necessrio
acrescentar os resistores para limitao de corrente e os transistores para o chaveamento dos
displays.
Para o circuito proposto deseja-se implementar um contador de 0 9999 que ser
atualizado a cada dcimo de segundo. A contagem ser feita empregando vrios contadores,
cada um responsvel pelo valor do dgito correspondente, ou seja, sero utilizados quatro
contadores.
Soluo em Assembly
;
; **** DOIS_DGT.ASM ********************************************************
; **
**
; ** Ultima Modificacao em: 05/10/2008
**
; **
**
; ********************************************************* by [JCLima ] ***
;
;
$MOD51
; **
**
; ****************************************************** Endereco: 0000H ***
;
ORG
0000H
LJMP
START
MILHAR,#0
CENTENA,#0
DEZENA,#0
UNIDADE,#0
CLR
CLR
CLR
CLR
ANODO_M
ANODO_C
ANODO_D
ANODO_U
;
;
;
;
Desliga
Desliga
Desliga
Desliga
o
o
o
o
anodo
anodo
anodo
anodo
do
da
da
da
milhar...
centena...
dezena...
unidade...
; Contador da varredura
MOV
MOVC
MOV
SETB
LCALL
CLR
A,MILHAR
A,@A+DPTR
P1,A
ANODO_M
DELAY5ms
ANODO_M
MOV
A,CENTENA
MOVC
MOV
SETB
LCALL
CLR
A,@A+DPTR
P1,A
ANODO_C
DELAY5ms
ANODO_C
MOV
MOVC
MOV
SETB
LCALL
CLR
A,DEZENA
A,@A+DPTR
P1,A
ANODO_D
DELAY5ms
ANODO_D
MOV
MOVC
MOV
SETB
LCALL
CLR
A,UNIDADE
A,@A+DPTR
P1,A
ANODO_U
DELAY5ms
ANODO_U
DJNZ
R6,LOOP_VAR
; Repete por 5x
; 50x(5ms+5ms+5ms+5ms)=100ms-->Delay da varredura
MOV
INC
CJNE
MOV
A,#10
UNIDADE
A,UNIDADE,REPETE
UNIDADE,#0
INC
CJNE
MOV
DEZENA
A,DEZENA,REPETE
DEZENA,#0
; Incrementa dezena...
; dezena = 10?
INC
CJNE
MOV
CENTENA
A,CENTENA,REPETE
CENTENA,#0
; Incrementa centena...
; centena = 10?
INC
CJNE
MOV
MILHAR
A,MILHAR,REPETE
MILHAR,#0
; Incrementa milhar...
; milhar = 10?
LJMP
REPETE
; Incrementa unidade...
; unidade = 10?
Soluo em Linguagem C
#include <8052.h>
#include <stdio.h>
#include <delay.h>
//
// ****************************************************************
// ** Pinos do MICROCONTROLADOR
**
// ****************************************************************
//
sfr at 0x90 display; // Display na porta P1 (A - P1.0, B - P1.1 ...)
sbit
sbit
sbit
sbit
at
at
at
at
0xb2
0xb3
0xb4
0xb5
dig1;
dig2;
dig3;
dig4;
//
//
//
//
Controle
Controle
Controle
Controle
do
do
do
do
digito
digito
digito
digito
1
1
1
1
(P3.2)
(P3.3)
(P3.4)
(P3.5)
//
// ****************************************************************
// ** V A R I V E I S E C O N S T A N T E S
**
// ****************************************************************
//
const unsigned char Tabela[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xd8, 0x80, 0x90};
//
// ****************************************************************
// ** P R O T O T Y P E S
**
// ****************************************************************
//
void delay1ms(void) _naked;
void delay(unsigned int tempo);
//
// ****************************************************************
// ** M A I N
**
// ****************************************************************
//
// Obs:. As rotinas de delay foram includas em uma biblioteca
//
denominada de delay.lib
//
void main(void)
{
unsigned char i, unidade, dezena, centena, milhar;
dig1
dig2
dig3
dig4
=
=
=
=
0;
0;
0;
0;
unidade = 0;
dezena = 0;
centena = 0;
milhar = 0;
while(1)
{
for(i=0; i<50; i++)
{
display = Tabela[milhar];
dig1 = 1;
delay(5);
dig1 = 0;
display = Tabela[centena];
dig2 = 1;
delay(5);
dig2 = 0;
display = Tabela[dezena];
dig3 = 1;
delay(5);
dig3 = 0;
display = Tabela[unidade];
dig4 = 1;
delay(5);
dig4 = 0;
}
if(++unidade == 10)
{
unidade = 0;
if(++dezena == 10)
{
dezena = 0;
if(++centena == 10)
{
centena = 0;
if(++milhar == 10) milhar = 0;
}
}
}
}
}
//
// ****************************************************************
// ** V A R I V E I S E C O N S T A N T E S
**
// ****************************************************************
//
const unsigned char Tabela[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xd8, 0x80, 0x90};
//
// ****************************************************************
// ** P R O T O T Y P E S
**
// ****************************************************************
//
void delay1ms(void) _naked;
void delay(unsigned int tempo);
//
// ****************************************************************
// ** M A I N
**
// ****************************************************************
//
// Obs:. As rotinas de delay foram includas em uma biblioteca
//
denominada de delay.lib
//
void main(void)
{
unsigned char i, unidade, dezena, milhar;
unsigned int centena, contador;
dig1 = 0;
dig2 = 0;
dig3 = 0;
dig4 = 0;
contador = 0;
unidade = 0;
dezena = 0;
centena = 0;
milhar = 0;
while(1)
{
for(i=0; i<5; i++)
{
display = Tabela[milhar];
dig1 = 1;
delay(5);
dig1 = 0;
display = Tabela[centena];
dig2 = 1;
delay(5);
dig2 = 0;
display = Tabela[dezena];
dig3 = 1;
delay(5);
dig3 = 0;
display = Tabela[unidade];
dig4 = 1;
delay(5);
dig4 = 0;
}
if(++contador == 10000) contador = 0;
milhar = contador/1000;
centena = contador%1000;
dezena = centena%100;
centena = centena/100;
unidade = dezena%10;
dezena = dezena/10;
}
}
Exerccio VI
Modifique os programas em C e assembly do exemplo anterior (exemplo V) de modo
que o mesmo implemente um cronmetro centesimal de 00.00 59.99, o qual ser atualizado a
cada centsimo de segundo.
Exerccio VII
No exemplo de hardware apresentado a seguir, so utilizados seis displays de 7
segmentos, os quais esto conectados a porta P1, e duas chaves do tipo Push Button nas portas
P3.0 e P3.1. Para que seja feita a seleo de qual dgito ser acionado, foram utilizadas seis
linhas de controle: P3.2 P3.7. De modo que o usurio no perceba que os dgitos esto
piscando, sugere-se que cada dgito seja acionado pelo menos 50 vezes por segundo (varredura
de 300Hz). O display do tipo anodo comum. Os segmentos so acionados com nvel lgico 0
e os anodos so acionados com nvel lgico 1. O circuito foi simplificado ao mximo, tanto com
relao ao microcontrolador quanto com relao ao circuito de multiplexao do display. Desta
forma no aparecem as chaves (transistores) responsveis pelo chaveamento dos displays.
Admita que estes circuitos esto embutidos nos prprios displays. Em um circuito real no
possvel conectar o display ao microcontrolador da forma como est representado no
Exerccio VIII
No circuito apresentado a seguir, quatro displays de 7 segmentos multiplexados esto
conectados a memria RAM externa, atravs de dois latchs. Um dos latchs (U4), controla o valor
dos dgitos, enquanto que o outro latch (U5) controla qual dgito ser acionado naquele
momento. De modo a que o usurio no perceba que os dgitos esto piscando, sugere-se que
cada dgito seja acionado pelo menos 50 vezes por segundo (varredura de 200Hz). O display
do tipo anodo comum. Os segmentos so acionados com nvel lgico 0 e os anodos so
acionados com nvel lgico 1. O circuito foi simplificado ao mximo, tanto com relao ao
microcontrolador quanto com relao ao circuito de multiplexao do display. Desta forma no
aparecem as chaves (transistores) responsveis pelo chaveamento dos displays. Admita que
estes circuitos esto embutidos nos prprios displays. Em um circuito real no possvel
conectar o display ao microcontrolador da forma como est representado no diagrama
eltrico. Seria necessrio acrescentar os resistores para limitao de corrente e os transistores
para o chaveamento dos displays.
Para o circuito proposto implemente, um contador de 0 9999 que indique o valor da
contagem em dcimos de segundo. Implemente tambm com este circuito, um cronmetro
centesimal, de 00.00 59.99, com indicao em centsimos de segundo. Neste exemplo, faa
uso do ponto decimal para separa os segundos dos centsimos de segundo.
Exerccio IX
No circuito apresentado a seguir, quatro displays de 7 segmentos multiplexados esto
conectados a memria RAM externa, atravs de dois latchs. Um dos latchs (U4), controla o valor
dos dgitos, enquanto que o outro latch (U5) controla qual dgito ser acionado naquele
momento. Ao circuito foi foi acrescentado um conversor A/D do tipo ADC0831 (protocolo serial) e
um potencimetro, de modo a variar o sinal na entrada do A/D de 0 1Volts.
Para o circuito proposto, implemente um termmetro digital com a utilizao do
conversor A/D e do potencimetro, o qual vai simular um sensor de temperatura, que varia de 0
a 100C gerando um sinal de 10mV/ C (LM35). A indicao no display ser feita da seguinte
forma
Exerccio X
No circuito apresentado a seguir, um display LCD 20x4 est conectado diretamente as
portas P1 (dados do LCD) e P3 (controle do LCD sinais RS e E do LCD). Ao circuito foi foi
acrescentado um conversor A/D do tipo ADC0831 (protocolo serial) e um potencimetro, de
modo a variar o sinal na entrada do A/D de 0 1Volts. O conversor A/D controlado pela porta
P3.
Para o circuito proposto, implemente um termmetro digital com a utilizao do
conversor A/D e do potencimetro, o qual vai simular um sensor de temperatura, que varia de 0
a 100C gerando um sinal de 10mV/ C (LM35).
Exerccio XI
No circuito apresentado a seguir, um display LCD 20x4 est conectado a memria RAM
externa, atravs de dois latchs. Um dos latchs (U4), controla o valor do barramento de dados,
enquanto que o outro latch (U5) controla os sinais de controle RS e E. Ao circuito foi foi
acrescentado um conversor A/D do tipo ADC0831 (protocolo serial) e um potencimetro, de
modo a variar o sinal na entrada do A/D de 0 1Volts. O Conversor A/D controlado por meio
da porta P1.
Para o circuito proposto, implemente um termmetro digital com a utilizao do
conversor A/D e do potencimetro, o qual vai simular um sensor de temperatura, que varia de 0
a 100C gerando um sinal de 10mV/ C (LM35).