Contador 0-999 con displays 7 segmentos controlados por AT89C51
1. http://practicas8051.net84.net
Contador de 0-999 con 3displays de 7
Segmentos
http://practicas8081.net84.net
lenguaje c para sistemas embebidos con el µc AT89s52
Aguayo Adame Gilberto ING. comunicaciones y electronica 1
2. http://practicas8051.net84.net
Descripción
El programa incrementara el valor de una variable, la cual se mostrara a través de un par de
displays de 7 segmentos, los cuales se controlaran de manera multiplexada, uno a la vez, a una
velocidad que el ojo no alcance a detectar el cambio y perciba ambos displays encendidos a la vez.
Diagrama Esquemático
Materiales
2 Displays 7 segmentos
7 Resistencias de 220 Ohms
2 Resistencias de 10 kOhms
2 Transistores de pequeña señal
1 Microcontrolador ATmega8
Programador USBasp V3.0 25
Para poder representar los números con el display, es necesario generar la tabla que nos dará el
valor que será necesario para generar el numero deseado.
Por ejemplo, se puede observar que para hacer un cero se busca que enciendan todos los
segmentos menos el g (pin 10 del display el cual va conectado al PB0 del Micro), con esa
información del numero, tendremos el valor que tomara el puerto para mostrar el numero
deseado a través del display.
Para controlar dos displays a la vez, se hará uso de un par de transistores, en este caso
conmutaran entre uno y otro, mientras los displays están conectados al mismo puerto del micro.
Primero se mostrara las decenas mientras se desactiva el display de las unidades y después de una
fracción de tiempo, se activa el de la unidad y se desactiva el de las decenas y el micro manda el
valor de la
Aguayo Adame Gilberto ING. comunicaciones y electronica 2
3. http://practicas8051.net84.net
Introducción
Display 7 segmentos
PB6/ PB5/ PB4/ PB3/ PB2/ PB1/ PB0/ HEX
A B C D E F G
0 1 1 1 1 1 1 0 3F
1 0 1 1 0 0 0 0 06
2 1 1 0 1 1 0 1 5B
3 1 1 1 1 0 0 1 4F
4 0 1 1 0 0 1 1 66
5 1 0 1 1 0 1 1 6D
6 1 0 1 1 1 1 1 7D
7 1 1 1 0 0 0 0 07
8 1 1 1 1 1 1 1 7F
9 1 1 1 1 0 1 1 67
Programa
#include <stdio.h>
#include <reg51.h>
int counter=0;
int dec,uni,cent;//declaracion de variables
void retardo(unsigned int ms); //declaracion de funcion de retardo
int display[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; //tabla del display catodo
comun del 0 al 9
int showDisplay(int numero); //declaracion de la funcion de multiplexeo
int main (void) { //inicio cuerpo del programa
while(1){ //ciclo infinito while
char option; //declaracion de variable option para utilizar la sentensia switch
P3=0X00; // el puerto 3 leera la entrada de selecion segun sea el caso
option=P3;
Aguayo Adame Gilberto ING. comunicaciones y electronica 3
4. http://practicas8051.net84.net
switch(option){ //se inicia el switch case
case 0x01:
do{ //este do {se hara mientras} P2==0 , se oprimira el pusch botoon una sola ves
y se ara el caso 0x01: hasta que se oprima otro boton
showDisplay(counter); //se llama a la funcion showdisplay con el parametro counter
counter++; //el counter se ira sumando pues este caso es para el contador
ascendente
if(counter>9999) // y regresara a 0 cuando sea mayor que 999
counter=0;
}while(P3==0);
break;
case 0x02: //case 0x02
do{
showDisplay(counter);
counter--; //en este caso el cunter sera descendente
if(counter<0) //y regresara a 999 cuando sea menor que 0
counter=9999;
}while(P3==0);
break;
case 0x04:
do{
showDisplay(counter); //caso 0x04 solo mostrara el diplay sin hacer conteo
}while(P3==0);
Aguayo Adame Gilberto ING. comunicaciones y electronica 4
5. http://practicas8051.net84.net
break;
}}} //fin del cuerpo del programa
void retardo(unsigned int ms){ //en el siguiente parte se crean todas las funciones que
declaramos al principio
unsigned char y,t; //como en este caso el retardo
while (ms){
for(y=0;y<140;y++){
t++;
}
t++;
t++;
t++;
ms--;
}
}
int showDisplay(int numero){ //funcion del multiplexeo
uni =numero/10%10;
dec =numero/100%10;
cent=numero/1000%10;
P2&=0xFF;
P2=0x04;
P1=display[uni];
retardo(10);
Aguayo Adame Gilberto ING. comunicaciones y electronica 5
6. http://practicas8051.net84.net
P2&=0xFF;
P2=0x02;
P1=display[dec];
retardo(10);
P2&=0xFF;
P2=0x01;
P1=display[cent];
retardo(10);
P2&=0xFF;
}
Aguayo Adame Gilberto ING. comunicaciones y electronica 6
7. http://practicas8051.net84.net
(2)
U1
19 39
XTAL1 P0.0/AD0
38
P0.1/AD1
37
P0.2/AD2
18 36
XTAL2 P0.3/AD3
35
P0.4/AD4
34
P0.5/AD5
33
P0.6/AD6
9 32
RST P0.7/AD7
R10 21
P2.0/A8
a 22
P2.1/A9
23
70 P2.2/A10
29 24
PSEN P2.3/A11
R4 30 25
ALE P2.4/A12
b 31 26
EA P2.5/A13
27 U4
70 P2.6/A14
28 R1
P2.7/A15
c
R9 1 10
P1.0 P3.0/RXD 10k
2 11 U3
70 P1.1 P3.1/TXD NOT
R5 3 12 R2
P1.2 P3.2/INT0
d 4 13
P1.3 P3.3/INT1
5 14
70 P1.4 P3.4/T0 10k
6 15 U2
P1.5 P3.5/T1 NOT
R6 7 16 R3
P1.6 P3.6/WR
e 8 17
P1.7 P3.7/RD
70 10k
AT89C51
NOT
f
R7
70
g
R8
70
a a a
b b b
c c c
d d d
e e e
f f f
g g g
Aguayo Adame Gilberto ING. comunicaciones y electronica 7