Download - Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

Transcript
Page 1: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

Contador de 0 a 99 con PIC16F887 en dos display de 7 segementos#include <16f887.h>#fuses hs,nowdt,noprotect,nolvp#use delay(clock=20000000)#byte portd=8

 int i,j; int tabla7s[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; 

void main()   {   set_tris_d(0x00);   do {      for (i=0; i<=9; i++)       {        for (j=0; j<=9; j++)         {           portd=(tabla7s[i]+0x80);           delay_ms(80);           portd=(tabla7s[j]);           delay_ms(80);         }       }   } while(true);   }

Contador de 0 a 99 con Display 7 Segmentos con el PIC16F887Hola gente!!, en esta ocasión les traigo el ejemplo mostrado en la pagina 63 del libro de Compilador C CCS y Simulador PROTEUS para microcontroladores PIC, en donde se realiza un contador de cero a noventa y nueve con la ayuda de dos Display 7 Segmentos, utilizando la tecnica de multiplexación o visualización estereoscopica, con el objetivo de compartir un solo puerto de salida para los dos display, y de esta manera economizar mas puertos de entrada y/o salida.

Para realizar el proyecto primero es necesarío determinar si el display es de anodo común o de catado común, tal como lo muestra esta imagen,

Para entregar las señales digitales y que puedan ser entendidas a la hora de visualizarlo en el Display es necesario realizar una decodificación para esto se puede utilizar el decodificador 7447, pero para este caso se ha realizado la decodificación internamente en el microcontrolador.

Page 2: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

CÁTODO COMÚNNUM A B C D E F G DP DECIMAL HEXA

0 1 1 1 1 1 1 0 0 63 0X3F1 0 1 1 0 0 0 0 0 6 0X062 1 1 0 1 1 0 1 0 91 0X5B3 1 1 1 1 0 0 1 0 79 0X4F4 0 1 1 0 0 1 1 0 102 0X665 1 0 1 1 0 1 1 0 109 0X6D6 1 0 1 1 1 1 1 0 125 0X7D7 1 1 1 0 0 0 0 0 7 0X078 1 1 1 1 1 1 1 0 127 0X7F9 1 1 1 1 0 1 1 0 111 0X6F

ÁNODO COMÚNNUM A B C D E F G DP DECIMAL HEXA

0 0 0 0 0 0 0 1 1 3 0X031 1 0 0 1 1 1 1 1 249 0XF92 0 0 1 0 0 1 0 1 164 0XA43 0 0 0 0 1 1 0 1 176 0XB04 1 0 0 1 1 0 0 1 163 0X995 0 1 0 0 1 0 0 1 146 0X926 0 1 0 0 0 0 0 1 130 0X827 0 0 0 1 1 1 1 1 248 0XF88 0 0 0 0 0 0 0 1 128 0X809 0 0 0 0 1 0 0 1 144 0X90

Contador 0-99 con PIC16F84A y MikrobasicRatings:  (0)|Views: 5.070|Likes: 33Publicado porCarlos Navarro M.

Bueno aquí el programa con proteus. Espero sea de utilidad: el objetivo es hacer un contador de 0-99

con el PIC16F84A Con el fin de hacerlo manualmente para contar ya sea con SW1 y Reset SW2.

También se podría cambiar este SW1, por algún sensor de movimiento u...Ver más

 

Page 3: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

 Bueno aquí el programa con pruteus. Espero sea de utilidad: el

objetivo es hacer un contador de 0-99 con el PIC16F84ACon el fin de hacerlo manualmente para contar ya sea con SW1 y Reset SW2. También se podría cambiar este SW1, poralgún sensor de movimiento u otro.

Page 4: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos
Page 5: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

  Les dejo también el programa con MIKROBASIC y arriba como programar las casillas que solo selecciono 4:program Cont7seg0a9CNM' *MikroElektronika, 2012' *Descripcion:TIEEE, FIME, UANL,MX. 2012-2013' Prof: Carlos Navarro Morín' *Este codigo demuestra el uso de 2 display de 7 segmentos de cátodo comun' en modo multiplexado trabajando en un contador de 0 a 99.' Todos los display connectados al portb(RB0..RB7, segment A a RB0,...G a RB6)' con refrescamiento a través de los pines RA0..RA3 en porta.' * Configuración:' MCU: PIC16F84A' Oscilador: XT, 4.000 MHz' SW: mikroBasic v7.2

  const display as byte[10]=(63,6,91,79,102,109,125,7,127,111) 'Códigos para 7 segdim millar as word 'Millares del conteodim centena as word 'Centenas del conteodim decena as word 'Decenas del conteodim unidad as word 'unidades del conteodim cuenta as word 'Cuenta el numero de sensados'ADCON1 = 7 'Puerto A digital este solo en PIC con puerto 

Page 6: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

digital en este caso no.trisa=%00010000 'RA4 entrada resto como salidatrisb=%10000000 'RB7 entrada, resto salidaporta=0 'Limpia Porta Aportb=0 'Limpia Porta Bcuenta=0 'Inicializa numero de cuentasporta.0=1delay_ms(2000)porta.0=0while true 'Ciclo INFINITOif Button(PORTB, 7, 10, 1) thencuenta=cuenta+1 'Incrementa la cuenta'porta.0=1 'BUZZER en on conectado en PA0'delay_ms(50) 'Espera'porta.0=0 'PA0 en OFF (extinguido buzzer)end if rem ------Si se supera la cuenta maxima o hay un reset----if (cuenta >= 10000) or (porta.4=1) thenporta.0=1 'BUZZER en on conectado en PA0

CONTADOR 0-99 DISPLAY 7 SEGMENTOS

Written by Hector Torres

Tuesday, 15 March 2011 00:16

There are no translations available.

Contador de 0-99 con 2 displays de 7 Segmentos

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

Page 7: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

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

INTRODUCCIÓN

DISPLAY 7 SEGMENTOS

El display de 7 segmentos es un dispositivo que nos sirve para mostrar números o caracteres, los cuales se visualizan al activar o desactivar los LEDs que este tiene, esto se hace conectando el común a la tierra y voltaje en el segmento que deseemos activar (en caso de ser cátodo común).

Para poder representar los números con el display, es necesario generar la tabla que nos dará el valor que

Page 8: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

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 unidad. Esto se repite determinadas veces a alta velocidad para dar la impresión de que siempre se encuentran prendidos los dos displays.

Para activar y desactivar los displays se les pondrá un transistor a modo de swhitch el cual se conectara del colector al común del display, y este controlara el display activándolo o desactivándolo desde la base.

Para este caso el transistor se está usando como un swhitch, eso es que se está trabajando en las regiones de corte y saturación, lo que nos dice que al pasar una corriente en la base, el transistor se comporta como un interruptor que se abre o se cierra.

PROGRAMA EN C

#include <avr/io.h>

#include <util/delay.h>

int contador=0;

int unidades, decenas,i;

int numeros[10]={0x7E,               //Se declara un vector de longitud 10 que contenga los

0x30,                                         //valores obtenidos de la tabla, acomodados en orden

0x6D,                                       //Según su posición del 0 al 9

0x79,

Page 9: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

0x33,

0x5B,

0x5F,

0x70,

0x7F,

0x7B};

int mostrar(int numero){                 //Creamos una función de tipo entero

unidades=numero%10;                   //Al dividir un valor entre 10 el residuo nos da las unidades

decenas =numero/10;                   //Se obtiene la decena dividiendo el numero entre 10

for(i=0;i<20;i++){

PORTD=0x02;                                 //Se activa el transistor de las unidades

PORTB=numeros[unidades];             //Se asigna al PORTB la variable numero en la posición unidades

_delay_ms(5);

PORTD=0x01;                               //Se activa el transistor de las decenas

PORTB=numeros[decenas];               //Se asigna al PORTB la variable numero en la posición decenas

_delay_ms(5);

} return 0;

}

int main(void){                             //Inicio del programa

DDRB=0xFF;

DDRD=0x03;

while(1){

mostrar(contador);                            //Llamar a la función mostrar, mandando la variable contador

contador++;                                     //Incrementar el valor de la variable contador

if (contador > 99)                             //Si llega a 99, que tome el valor de 0

contador=0;

}

}

DETALLES DEL PROGRAMA

int numeros[10]={0x7E,

0x30,

0x6D,

0x79,

0x33,

0x5B,

0x5F,

0x70,

0x7F,

Page 10: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

0x7B};

Aquí se está declarando un vector de tipo entero, el cual le indicamos la longitud del mismo, el cual tiene 10 datos, se acomodaron conforme a que la posición del vector corresponde al número que representa ese valor en el display, en el caso del 3 el cual es el 0x79 (previamente obtenido en la tabla), podemos ver que se encuentra en la tercera posición.

int mostrar(int numero){

Una función se declara como "tipo de dato" "nombre de la función" ( "tipo de dato" "nombre de entrada"), en este caso la función obtendrá la unidad y la decena de cualquier numero entre 0-99 y mandara el dato para mostrarlo en el display.

unidades=numero%10;

decenas =numero/10;

Operación para obtener separar un numero entre su unidad y decena. Por ejemplo el 45, si lo dividimos entre 10, esto es 45/10 = 4 (recuerde que como son variables de tipo entero es solo 4 y no 4.5), y con el operador mod (de modulo) "%" el resultado es 45%10 = 5. Gracias a esto tenemos en una variable el numero 4 y en otra el numero 5.

PORTB=numeros[unidades];

Al puerto B se le asigna el valor que tenga el vector números en la posición unidades, si tomamos el ejemplo anterior, unidades valía 5, si vamos al vector números y vemos la quinta posición, veremos un 0x5B la cual corresponde al número 5 en la tabla, esto es, que al mostrarlo por el puerto B aparecerá el 5 en el display.

mostrar(contador);

Aquí se manda a llamar a la función mostrar, a la cual se le manda el valor de la variable contador, el cual puede ser un numero del 0-99, al llamar la función, esta ejecutara todas las instrucciones que se encuentren dentro de la misma, al terminar regresara y continuara con la siguiente instrucción.

CONTADOR 0-99 MPLABCódigo del programa desarrollado en ensamblador con el programa MPLAB en el cual se establece la rutina para que en un par de displays de 7 segmentos observemos el conteo de 0 hasta 99.

;EXAMEN SEGUNDO PARCIAL

;ESTE PROGRAMA CONTABILIZA DE 0-99

;23 DE OCTUBRE DEL 2010

;JOSÉ LUIS MORELES LOZANO

;***************************************************************

;***************************************************************

list p=16f877a

#include<P16f877a.inc>

errorlevel -302

Page 11: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF

ORG 0x0000

;Variables de retardo, nos permitirán apreciar el conteo evitando que se realice a intervalos de tiempo muy rapidos.

valor1 equ h'21'

valor2 equ h'22'

valor3 equ h'23'

contador equ h'24'

;Hay que definir la asignación de segmentos apagados o encendidos, estas variables serán cargadas posteriormente.

;        HEXADECIMAL      BINARIO

CERO     EQU h'3F'   ;   01111110B

UNO      EQU h'06'   ;   01001000B

DOS      EQU h'5B'   ;   00111101B

TRES     EQU h'4F'   ;   01101101B

CUATRO   EQU h'66'   ;   01001011B

CINCO    EQU h'6D'   ;   01100111B

SEIS     EQU h'7D'   ;   01110111B

SIETE    EQU h'07'   ;   01001110B

OCHO     EQU h'7F'   ;   01111111B

NUEVE    EQU h'6F'   ;   01101111B

org 0h ;Reset

goto salidas

salidas:

       clrf PORTB

       clrf PORTC      ;Limpia puertos B y C para determinar que son salidas

       bsf STATUS,RP0 

       bcf STATUS,RP1 

       movlw h'0'

Page 12: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

       movwf TRISB   

       movwf TRISC    

       bcf STATUS,RP0  ;ir al Banco 0

INICIO:     

       clrf contador   ;Inicia las decenas

       clrf PORTC      

LOOP:  

     movlw CERO        ;carga a w el valor de cero

       movwf PORTB

    call RETARDO

     movlw UNO

       movwf PORTB

       call RETARDO

     movlw DOS

       movwf PORTB

       call RETARDO

     movlw TRES

       movwf PORTB

       call RETARDO

     movlw CUATRO

       movwf PORTB

       call RETARDO

     movlw CINCO

       movwf PORTB

       call RETARDO

     movlw SEIS

       movwf PORTB

       call RETARDO

     movlw SIETE

Page 13: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

       movwf PORTB

       call RETARDO

     movlw OCHO

       movwf PORTB

       call RETARDO

     movlw NUEVE

       movwf PORTB

       call RETARDO

       incf contador,1 ;Incrementa contador de decenas

       movlw h'A'

       xorwf contador,w

       btfsc STATUS,Z 

       goto  INICIO                                      

      

Decenas     

       movlw h'1'

       xorwf contador,w

       btfsc STATUS,Z  

       goto PRINT1

      

       movlw h'2'

       xorwf contador,w

       btfsc STATUS,Z 

       goto PRINT2

       movlw h'3'

       xorwf contador,w

       btfsc STATUS,Z  

Page 14: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

       goto PRINT3

       movlw h'4'

       xorwf contador,w

       btfsc STATUS,Z  

       goto PRINT4

       movlw h'5'

       xorwf contador,w

       btfsc STATUS,Z  

       goto PRINT5

      

       movlw h'6'

       xorwf contador,w

       btfsc STATUS,Z   

       goto PRINT6

       movlw h'7'

       xorwf contador,w

       btfsc STATUS,Z   

       goto PRINT7

       movlw h'8'

       xorwf contador,w

       btfsc STATUS,Z   

       goto PRINT8

       movlw h'9'

       xorwf contador,w

Page 15: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

       btfsc STATUS,Z  

       goto PRINT9

      

;Decenas en el display

PRINT1:

       movlw UNO       

       movwf PORTC

       goto LOOP

PRINT2:

       movlw DOS       

       movwf PORTC

       goto LOOP

PRINT3:

       movlw TRES       

       movwf PORTC

       goto LOOP

PRINT4:

       movlw CUATRO       

       movwf PORTC

       goto LOOP

PRINT5:

       movlw CINCO       

       movwf PORTC

       goto LOOP

PRINT6:

       movlw SEIS       

       movwf PORTC

       goto LOOP

Page 16: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos

PRINT7:

       movlw SIETE       

       movwf PORTC

       goto LOOP

PRINT8:

       movlw OCHO       

       movwf PORTC

       goto LOOP

PRINT9:

       movlw NUEVE       

       movwf PORTC

       goto LOOP

RETARDO

     movlw h'40'  ;Valor que  genera un retardo

     movwf valor1

tres movlw h'40'

     movwf valor2

dos  movlw h'40'

     movwf valor3

uno  decfsz valor3

     goto uno

     decfsz valor2

     goto dos

     decfsz valor1  

     goto tres

     return

  end

Page 17: Contador de 0 a 99 Con PIC16F887 en Dos Display de 7 Segementos