Este es un voltímetro mas de la colección, pero este trabaja multiplexando 3 displays 7-SEG cátodo comúm y según el proteus dá una buena precisión (a 10bits). le sustituí los transistores NPN por inversores para controlar los segmentos de los displays debido a q el proteus c pone muy lento y de todas maneras los inversores cumplen la misma función. ya sabes si lo van a implementar cambien por NPN
y el código fuente:
//*************************************************************//
// Simple voltimetro usando el 16F873, con:
// *- CAD a 10 bits
// *- 3 displays 7-seg cátodo común
// *- el valor mostrado corresponde al valor DC en la entrada del CAD
//**************************************************************
#include <16F873.h>
#device ADC=10
#use delay(clock=4000000)
#fuses NOCPD,NOWDT,BROWNOUT,PUT,XT,NOWRT,NOLVP,NODEBUG,NOPROTECT //0x3F71
//****************************************************************
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#DEFINE PASADOR PIN_A0 // el switche
#DEFINE Q1 PIN_B1 // transistor 1
#DEFINE Q2 PIN_B2 // transistor 2
#DEFINE Q3 PIN_B3 // transistor 3
#DEFINE punto PIN_C7 // punto decimal
#BYTE salida=7
long value;
float voltaje;
int a;
//****************************************************************
struct digitos_separados { // variables en bcd de unidad,decena,centena
int unidad, decena, centena;
} digito;
//****************************************************************
struct mis_datos { // variables de datos de entrada y salida
int dato1, dato2, resultado;
} numeros;
//****************************************************************
void separar_digitos(){ // separa resultado en unidad, decena y centena
int temp;
digito.unidad=0;
digito.decena=0;
temp=numeros.resultado;
while(temp>=10){
temp-=10;
digito.decena++;
}
digito.unidad=temp;
}
//****************************************************************
void mostrar(){ // multiplexa en tres display 7-seg anodo común
int const bcd_7seg[10]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x73};
int contador;
output_low(Q1);
output_low(Q2);
output_low(Q3);
output_low(punto);
for(contador=0;contador<11;contador++){
salida=bcd_7seg[digito.unidad]; // muestra unidad
output_high(Q1);
delay_ms(5);
output_low(Q1);
delay_cycles(4);
salida=bcd_7seg[digito.decena]; // muestra decena
output_high(Q2);
delay_ms(5);
output_low(Q2);
delay_cycles(4);
salida=bcd_7seg[digito.centena]; // muestra centena
output_high(Q3);
output_high(punto);
delay_ms(5);
output_low(Q3);
output_low(punto);
delay_cycles(4);
}
}
//****************************************************************
// RUTINA PRINCIPAL
// c puede hacer mediante poleo ó por interrupciones
//****************************************************************
#int_ad
CAD(){
value = Read_ADC();
delay_us(30);
}
//***************************************//
void main(){
set_tris_a(0x1); // ra0=entradas, los demas=salida
set_tris_b(0x0); // puertob=entrada
set_tris_c(0x0); // puertoc=salida
setup_adc_ports( ALL_ANALOG );
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
enable_interrupts(GLOBAL);
enable_interrupts(int_ad);
d: value = Read_ADC();
delay_us(30);
voltaje=0.00488758*(float)value;
a=(int)voltaje;
digito.centena=a;
voltaje=voltaje-(float)a;
numeros.resultado=(int)(100.0*voltaje);
separar_digitos();
mostrar();
goto d;
}
//****************************************
lo puedes modificar, usando interrupciones ó por "poleo". como qieras
aquí está el link para q bajes todo y lo montes en el proteus
ACTUALIZADO:Esta simulación se encuentra también en:
http://www.unpocodelectronica.netau.net/voltimetro-con-16f873-y-multiplexado-con-7-segSalu2