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;
}