0% encontró este documento útil (0 votos)
48 vistas2 páginas

Código de Multímetro con ADC y Display

El documento presenta un código en C para un multímetro que utiliza un microcontrolador para leer voltajes a través de un ADC. Incluye funciones para inicializar el ADC, leer valores y mostrar el voltaje en un display de 7 segmentos. Se definen configuraciones de puertos y se implementa un bucle principal para la operación continua del dispositivo.

Cargado por

k2cpc4dqfk
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
48 vistas2 páginas

Código de Multímetro con ADC y Display

El documento presenta un código en C para un multímetro que utiliza un microcontrolador para leer voltajes a través de un ADC. Incluye funciones para inicializar el ADC, leer valores y mostrar el voltaje en un display de 7 segmentos. Se definen configuraciones de puertos y se implementa un bucle principal para la operación continua del dispositivo.

Cargado por

k2cpc4dqfk
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

// MULTIMETRO

#include <xc.h>

#define _XTAL_FREQ 16000000 //Frecuencia del oscilador


#define AN0_CHANNEL 0 //Canal AN0 para el ADC

//Prototipos
void init_ADC(void);
unsigned int read_ADC(void);
void display_voltage(unsigned int value);

//Tabla de segmentos para los dígitos


const unsigned char segment[] = {0b00000011, 0b10011111, 0b00100101, 0b00001101,
0b10011001, 0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00011001};
const unsigned char uniseg[] = {0b00000010, 0b10011110, 0b00100100, 0b00001100,
0b10011000, 0b01001000, 0b01000000, 0b00011110, 0b00000000, 0b00011000};

//Configuración inicial
void init_ADC(void) {
ADCON0 = 0b00000001; //Canal AN0, encender ADC
ADCON1 = 0b00001110; //AN0 como entrada analógica
ADCON2 = 0b10101001; //Justificación derecha, FOSC/8, 2TAD
}

//Leer el valor del ADC


unsigned int read_ADC(void) {
[Link] = 1; //Iniciar conversión
while ([Link]); //Esperar a que termine la conversión
return ((ADRESH << 8) + ADRESL); //Combinar registros
}

//Mostrar el valor en el display de 7 segmentos


void display_voltage(unsigned int value) {
float voltage = (value * 4.995) / 1023; //Calcular voltaje real
voltage = voltage * 1000;
unsigned int display_val = (unsigned int)(voltage); //Escalar para mostrar
decimal

// Dividir el valor en decenas y unidades


unsigned int uni = display_val / 1000; //Parte de "volts" (unidad
completa)
unsigned int dec = (display_val / 100) % 10; //Centésimas
unsigned int cen = (display_val / 10) % 10; //Décimas
unsigned int mil = display_val % 10; //Milésimas

PORTD = segment[mil];
PORTB = 0b00001000;
__delay_ms(10);
PORTD = 0xFF;

PORTD = segment[cen];
PORTB = 0b00000100;
__delay_ms(10);
PORTD = 0xFF;

PORTD = segment[dec];
PORTB = 0b00000010;
__delay_ms(10);
PORTD = 0xFF;

PORTD = uniseg[uni];
PORTB = 0b00000001;
__delay_ms(10);
PORTD = 0xFF;
}

void main(void) {
TRISA = 0x01; //AN0 como entrada
TRISB = 0x00; //Puerto B como salida (para anodos)
TRISD = 0x00; //Puerto D como salida (para segmentos)

init_ADC(); //Inicializar el ADC

while (1) {
unsigned int adc_value = read_ADC(); // eer el ADC
display_voltage(adc_value); //Mostrar voltaje en displays
}
}

También podría gustarte