#include <16f877.h>
#device adc=10
#define _XTAL_FREQ 4000000 // frecuencia de 4MHz
#fuses XT,NOWDT
#BYTE TRISC=0X87
void main(){
int16 valor;
int16 control;
float a;
float des_limit
float rT,eT,iT,dT,yT,uT,iT0,eT0,iT_1,eT_1;
float max,min;
min=2;
max =5;
iT_1=0.0;
eT_1=0.0;
a=5.66; // constant de proporcion K
des_limit=15;
TRISC=0;
setup_timer_2(t2_div_by_4,249,1);
long tecla;
char dato;
char adc[4];
void teclado (long x); // x es el valor de la conversión
// long define una variable de 16 bits
// el ADC tiene una resolución de 10 bits
void init_a2d (void){ // función para inicializar el ADC
ADCS0=0; // reloj para la conversión = Fosc/2
ADCS1=0;
ADCS2=0;
GO=0; // conversión finalizada
PCFG0=0; // todo el puerto A analógico
PCFG1=0;
PCFG2=0;
PCFG3=0;
ADFM=1; // ajuste a la derecha
ADON=1; // ADC encendido
}
int read_a2d (char channel){ // función para leer el dato
channel&=0x07;
ADCON0&=0xC5;
ADCON0|=(channel<<3);
GO=1;
while(GO)continue;
return((ADRESH*256)+ADRESL);
}
void main (void){
lcd_init();
lcd_goto(0); // selecciona la primera línea de escritura
lcd_puts("valor: "); // escribe en la primera línea
lcd_goto(64); // selecciona la segunda línea de escritura
init_a2d();
TRISB=0X00;
PORTB=0;
X=eT=rT-yT; //Calcular senal de error e(kT)
uT=a; //Calcular senal de control u(kT)
while(1){
dato=RA0; // lee el canal análogo RA0
tecla=read_a2d(dato); // convierte el valor de RA0
teclado(tecla); // envía el valor convertido
}}
void teclado (long x){
itoa(adc, x, 10);
if((a*x>946)&(a*x<1023)){
PORTB=0x00;
lcd_goto(7);
lcd_puts("in 4,99 V ");
lcd_goto(69);
lcd_puts(adc);
PORTB=0x01;
}
if((a*x>869)&(a*x<945)){
PORTB=0x00;
lcd_goto(7);
lcd_puts("in 4,63 V");
lcd_goto(69);
lcd_puts(adc);
PORTB=0x02;
}
if((a*x>794)&(a*x<868)){
PORTB=0x00;
lcd_goto(7);
lcd_puts("in 4,25 V ");
lcd_goto(69);
lcd_puts(adc);
PORTB=0x04;
}
if((a*x>716)&(a*x<793)){
PORTB=0x00;
lcd_goto(7);
lcd_puts("in 3.87 V");
lcd_goto(69);
lcd_puts(adc);
PORTB=0x08;
}
if((a*x>642)&(a*x<715)){
PORTB=0x00;
lcd_goto(7);
lcd_puts("in 3,49 V ");
lcd_goto(69);
lcd_puts(adc);
PORTB=0x10;
}
if((a*x>565)&(a*x<641)){
PORTB=0x00;
lcd_goto(7);
lcd_puts("in 3,11 V ");
lcd_goto(69);
lcd_puts(adc);
PORTB=0x20;
}
if((a*x>490)&(*x<564)){
PORTB=0x00;
lcd_goto(7);
lcd_puts("in 2,73 V ");
lcd_goto(69);
lcd_puts(adc);
PORTB=0x40;
}
if((a*x>416)&(a*x<489)){
PORTB=0x00;
lcd_goto(7);
lcd_puts("in 2,35 V");
lcd_goto(69);
lcd_puts(adc);
PORTB=0x80;
}
if((a*x<429)){
PORTB=0x00;
lcd_goto(7);
lcd_puts("in 2 V ");
lcd_goto(69);
lcd_puts(adc);
PORTB=0x00;
}
__delay_ms(500);
lcd_clear();
}

Codigo

  • 1.
    #include <16f877.h> #device adc=10 #define_XTAL_FREQ 4000000 // frecuencia de 4MHz #fuses XT,NOWDT #BYTE TRISC=0X87 void main(){ int16 valor; int16 control; float a; float des_limit float rT,eT,iT,dT,yT,uT,iT0,eT0,iT_1,eT_1; float max,min; min=2; max =5; iT_1=0.0; eT_1=0.0; a=5.66; // constant de proporcion K des_limit=15; TRISC=0; setup_timer_2(t2_div_by_4,249,1); long tecla; char dato; char adc[4]; void teclado (long x); // x es el valor de la conversión // long define una variable de 16 bits // el ADC tiene una resolución de 10 bits void init_a2d (void){ // función para inicializar el ADC ADCS0=0; // reloj para la conversión = Fosc/2 ADCS1=0; ADCS2=0; GO=0; // conversión finalizada PCFG0=0; // todo el puerto A analógico PCFG1=0; PCFG2=0; PCFG3=0; ADFM=1; // ajuste a la derecha ADON=1; // ADC encendido } int read_a2d (char channel){ // función para leer el dato
  • 2.
    channel&=0x07; ADCON0&=0xC5; ADCON0|=(channel<<3); GO=1; while(GO)continue; return((ADRESH*256)+ADRESL); } void main (void){ lcd_init(); lcd_goto(0);// selecciona la primera línea de escritura lcd_puts("valor: "); // escribe en la primera línea lcd_goto(64); // selecciona la segunda línea de escritura init_a2d(); TRISB=0X00; PORTB=0; X=eT=rT-yT; //Calcular senal de error e(kT) uT=a; //Calcular senal de control u(kT) while(1){ dato=RA0; // lee el canal análogo RA0 tecla=read_a2d(dato); // convierte el valor de RA0 teclado(tecla); // envía el valor convertido }} void teclado (long x){ itoa(adc, x, 10); if((a*x>946)&(a*x<1023)){ PORTB=0x00; lcd_goto(7); lcd_puts("in 4,99 V "); lcd_goto(69); lcd_puts(adc); PORTB=0x01; } if((a*x>869)&(a*x<945)){ PORTB=0x00; lcd_goto(7); lcd_puts("in 4,63 V"); lcd_goto(69); lcd_puts(adc); PORTB=0x02; } if((a*x>794)&(a*x<868)){ PORTB=0x00; lcd_goto(7); lcd_puts("in 4,25 V "); lcd_goto(69); lcd_puts(adc); PORTB=0x04; } if((a*x>716)&(a*x<793)){ PORTB=0x00; lcd_goto(7); lcd_puts("in 3.87 V"); lcd_goto(69); lcd_puts(adc); PORTB=0x08; }
  • 3.
    if((a*x>642)&(a*x<715)){ PORTB=0x00; lcd_goto(7); lcd_puts("in 3,49 V"); lcd_goto(69); lcd_puts(adc); PORTB=0x10; } if((a*x>565)&(a*x<641)){ PORTB=0x00; lcd_goto(7); lcd_puts("in 3,11 V "); lcd_goto(69); lcd_puts(adc); PORTB=0x20; } if((a*x>490)&(*x<564)){ PORTB=0x00; lcd_goto(7); lcd_puts("in 2,73 V "); lcd_goto(69); lcd_puts(adc); PORTB=0x40; } if((a*x>416)&(a*x<489)){ PORTB=0x00; lcd_goto(7); lcd_puts("in 2,35 V"); lcd_goto(69); lcd_puts(adc); PORTB=0x80; } if((a*x<429)){ PORTB=0x00; lcd_goto(7); lcd_puts("in 2 V "); lcd_goto(69); lcd_puts(adc); PORTB=0x00; } __delay_ms(500); lcd_clear(); }