Diseño de un turnero o tomador de turno

#1
hola a todos.
necesito diseñar un turnero o tomador de turno como el que hay en algunos bancos.
este debe llevar solo flip flops y compuertas logicas, nada de pics.
el turnero debe tener 4 puestos ( cajas) en los cuales enviaran información de su turno a atender a un display el cual a su vez debe mostrar la hora exacta del dia.
este display puede ser conformado por varios, en los cuales se muestre el puesto y el turno y aleatoriamente la hora. ejm: 1- 98(1 es el puesto y 98 el turno en dicho puesto , cuando este este durante puede ser 2 minutos desaparece e inmediatamente aparece la hora, la cual puede durar 30 segundos y asi sucesivamente).
la orden de cada puesto la envia a travez de un pulsador.
ademas de todo esto debe tener otro display a parte donde mustre a cada cliente su turno ( lo ideal seria que lo imprimiera pero seria muy complicado ).

a quien me pueda ayudar con esto le doy las gracias de antemano.
colaboremen por favor.
gracias
 
#2
Pues ya puedes preparar un cacho placa que no veas.

Varios contadores para el reloj
dos contadores por cada puesto

Toda una logica de multiplexado para compartir el display con los datos del reloj y los contadores.

sobre una treintena de integrados para obtener un proyecto mediocre y obsoleto.
 
#4
Gracias es un gran aporte, yo debo diseñar un digiturno para ña universidad como tesis, quiero que sea por modulos y que el cliente al tomar el turno sea dependiendo del requerimiento que tenga, me toca diseñar los tableros digitales del que atiende y solicita el siguiente turno y los de control de tiempos de atensión si tienen mas aportes para darme se los agradeceria mucho, gracias.
 
#5
Necesitaria saber si tendrian el firmware para cargar en este PIC, ya que no cuento con los conocimientos requeridos sobre programacion de microcontroladores. Desde ya muchas gracias por el aporte, es genial.

Encontre una pagina: http://www.pablin.com.ar/electron/proyecto/turnero/index.htm
en la cual el diagrama en bloques es el mismo que en el de este proyecto, y me surgio una duda, el firm de esta pagina, sirve para este proyecto?
 
Última edición:
#6
Hola, yo quisiera implementar lo mismo pero con el mismo pulso del pulsador, con un latch o algo asi....Necesito implmentar un turno caja, pero solo con displys 7 segmentos, algun conversor de bcd a 7 segmentos, flip flops, pero no mas que ello, sin tener que programar nada, es solo para hacer una prueba del circuito al apretar pulsadores.
Me ayudan? gracias!
 
#8
Buenos días compañeros, espero que estén muy bien.
Gracias a todos ustedes he podido entregar mis trabajos satisfactoriamente, me ha ido súper bien y he aprendido mucho.

Esta vez les quiero pedir la colaboración por favor, para que me ayuden a organizar las ideas que tengo para realizar el programa que me piden.

En el PDF que anexo tengo las ideas de las estructura del programa pero no sé cómo empezar para escribir el código.
Hasta el momento ya escribí el programa para que me enciendan los tres display de 7 segmentos que son de ánodo común.

Programa Display:
Código:
#INCLUDE <16f887.h>
#FUSES INTRC_IO, NOMCLR, NOWDT
#USE delay(clock=4mhz)
Ubicar puertos en la RAM

while() { //para que me repita el bucle
visual_display(); // Indico la visualización con el 
bit_bandera=0; // debo incluir el bit bandera pero no sé usarlo :(
if (bit_test(bandera,0)==0){  // preguntar por el estado del bit bandera
if(bit_test(portc,0)==1){ // preguntar por el estado del pulsador de los asesores
Mostrar el número del asesor;
incrementar el turno;

Aquí debo convertir la variable a BCD para visualizarla en el display con esta instrucción:
conver_hex_bcd(); // no se como implementarla el el programa

bit_bandera=1;
} // todo este ciclo se repite 5 veces para los 5 asesores

Si el puerto c==0{
poner bit_bandera=0;
}

Para restablecer el bit bandera tengo esta instrucción
x=portc;
x=x&0x1F;
si (x==0);{
bit_bandera=0
}
Y éstas son las ideas que tengo para escribir el código, pero la verdad no sé cómo empezar para que me funcionen. Les agradecería mucho la asesoría.

Código:
#INCLUDE <16f887.h>
#FUSES INTRC_IO, NOMCLR, NOWDT
#USE delay(clock=4mhz)
Ubicar puertos en la RAM

while() { //para que me repita el bucle
visual_display(); // Indico la visualización con el 
bit_bandera=0; // debo incluir el bit bandera pero no sé usarlo :(
if (bit_test(bandera,0)==0){  // preguntar por el estado del bit bandera
if(bit_test(portc,0)==1){ // preguntar por el estado del pulsador de los asesores
Mostrar el número del asesor;
incrementar el turno;

Aquí debo convertir la variable a BCD para visualizarla en el display con esta instrucción:
conver_hex_bcd(); // no se como implementarla el el programa

bit_bandera=1;
} // todo este ciclo se repite 5 veces para los 5 asesores

Si el puerto c==0{
poner bit_bandera=0;
}

Para restablecer el bit bandera tengo esta instrucción
x=portc;
x=x&0x1F;
si (x==0);{
bit_bandera=0
}

Esas son las leves ideas que tengo de cómo estructurar el programa, pero la verdad no sé como escribirlo.
Si me pueden ayudar, les agradecería infinitamente como siempre.

Saludos y muchas gracias de nuevo!!
 

Adjuntos

Última edición por un moderador:
#9
Me tomó un rato hacerlo, pero ahí tienes, tomé como entradas el puerto B, para ahorrarse las resistencias Pull - Down del diagrama original, ya que el micro PIC16F887, tiene internamente resistencias elevadoras en ese puerto, y como salida el PUERTO C y PUERTO E. En la simulación no se notá el cambio de digito (bueno al menos en mi PC) así que tuve que armarlo en mi protoboard y si lo hace (por eso me tarde al subirlo). Espero que te sirva.

Código:
const unsigned short digito[] = {192,249,164,176,153,146,130,248,128,144};
short turno, asesor, unidad, decena;

void interrupt(void) {

if(RB0_bit == 0) {turno++; asesor = 1;} // Si se presiona C1.
if(RB1_bit == 0) {turno++; asesor = 2;} // Si se presiona C2.
if(RB2_bit == 0) {turno++; asesor = 3;} // Si se presiona C3.
if(RB3_bit == 0) {turno++; asesor = 4;} // Si se presiona C4.
if(RB4_bit == 0) {turno++; asesor = 5;} // Si se presiona C5.
while(PORTB != 255); //Espera que el pulsador este inactivo.
if(turno > 99) turno = 0; // Si el contador llegá a 100 se resetea.
RBIF_bit = 0; // Deshabilita la bandera de interrupción del puerto B.


}

void HEX_BCD(void) {

decena = turno /10;
unidad = turno - (decena *10);

PORTC = digito[unidad];
PORTE.f1 = 1;
Delay_ms(10);
PORTE = 0;
PORTC = digito[decena];
PORTE.f2 = 1;
Delay_ms(10);
PORTE = 0;

PORTC = digito[asesor];
PORTE.f0 = 1;
Delay_ms(10);
PORTE = 0;

}

void main(void) {

NOT_RBPU_bit = 0; // Resistencias push_pull del puerto B habilitadas.
  INTEDG_bit = 0; //

 ANSEL = 0; // Todas las I/O del microcontrolador son digitales.
ANSELH = 0;

TRISB = 0xFF; // Puerto B config. como entradas digitales.
TRISC = 0x00; // Puerto C config. como salidas digitales.
TRISE = 0x00; // Puerto E config. como salidas digitales.

 GIE_bit = 1; // Habilitación de interrupciones globales.
PEIE_bit = 1; // Habilitación de interrupciones periféricas.
RBIE_bit = 1; // Habilitación de interrupciones del puerto B.
    IOCB = 255;


PORTB = 0; // Pines del Puerto B puestos a cero.
PORTC = 0; // Pines del Puerto C puestos a cero.
PORTE = 0; // Pines del Puerto E puestos a cero.

while(1) {

HEX_BCD();

}
}
IMPORTANTE: yo utilizo el compilador MikroC de Microchip, muy diferente al compilador CCS, y el PROTEUS que utilizo es el v.8
 

Adjuntos

Última edición:
#10
Me tomó un rato hacerlo, pero ahí tienes, tomé como entradas el puerto B, para ahorrarse las resistencias Pull - Down del diagrama original, ya que el micro PIC16F887, tiene internamente resistencias elevadoras en ese puerto, y como salida el PUERTO C y PUERTO E. En la simulación no se notá el cambio de digito (bueno al menos en mi PC) así que tuve que armarlo en mi protoboard y si lo hace (por eso me tarde al subirlo). Espero que te sirva.

Código:
const unsigned short digito[] = {192,249,164,176,153,146,130,248,128,144};
short turno, asesor, unidad, decena;

void interrupt(void) {

if(RB0_bit == 0) {turno++; asesor = 1;} // Si se presiona C1.
if(RB1_bit == 0) {turno++; asesor = 2;} // Si se presiona C2.
if(RB2_bit == 0) {turno++; asesor = 3;} // Si se presiona C3.
if(RB3_bit == 0) {turno++; asesor = 4;} // Si se presiona C4.
if(RB4_bit == 0) {turno++; asesor = 5;} // Si se presiona C5.
while(PORTB != 255); //Espera que el pulsador este inactivo.
if(turno > 99) turno = 0; // Si el contador llegá a 100 se resetea.
RBIF_bit = 0; // Deshabilita la bandera de interrupción del puerto B.


}

void HEX_BCD(void) {

decena = turno /10;
unidad = turno - (decena *10);

PORTC = digito[unidad];
PORTE.f1 = 1;
Delay_ms(10);
PORTE = 0;
PORTC = digito[decena];
PORTE.f2 = 1;
Delay_ms(10);
PORTE = 0;

PORTC = digito[asesor];
PORTE.f0 = 1;
Delay_ms(10);
PORTE = 0;

}

void main(void) {

NOT_RBPU_bit = 0; // Resistencias push_pull del puerto B habilitadas.
  INTEDG_bit = 0; //

 ANSEL = 0; // Todas las I/O del microcontrolador son digitales.
ANSELH = 0;

TRISB = 0xFF; // Puerto B config. como entradas digitales.
TRISC = 0x00; // Puerto C config. como salidas digitales.
TRISE = 0x00; // Puerto E config. como salidas digitales.

 GIE_bit = 1; // Habilitación de interrupciones globales.
PEIE_bit = 1; // Habilitación de interrupciones periféricas.
RBIE_bit = 1; // Habilitación de interrupciones del puerto B.
    IOCB = 255;


PORTB = 0; // Pines del Puerto B puestos a cero.
PORTC = 0; // Pines del Puerto C puestos a cero.
PORTE = 0; // Pines del Puerto E puestos a cero.

while(1) {

HEX_BCD();

}
}
IMPORTANTE: yo utilizo el compilador MikroC de Microchip, muy diferente al compilador CCS, y el PROTEUS que utilizo es el v.8
Hola Ruben que detalle!! muchas gracias por la ayuda tan grande, esta noche llego a mi casa y empezaré a hacer el circuito como lo hiciste en el diagrama, muchas gracias de verdad!! Saludos!!
 

Temas similares

Arriba