Sei sulla pagina 1di 3

Programa distancias en compilador MikroC

/*
Programa para el PIC16F818 para calcular distancias utilizando
el sensor de ultrasonidos HC-SR04 y mostrando la distancia en un LCD 2x16
Pin para el Trigger---->RA1
Pin para el ECO-------->RA2
Oscilador interno de 8 MHz
*/

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;

sbit LCD_D4 at RB6_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;

sbit LCD_D4_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Final de las conexiones del mdulo LCD

int centimetros=0;
char strvalor[7];

void main() {
//Oscilador interno -ojo cambiar palabra configuracion
OSCCON = 0x70; // 8 Mhz interno
while (OSCCON.IOFS=0){}; //Espera hasta qu se estabilice

//inicio lcd
Lcd_Init(); // Inicializacin del visualizador LCD
delay_ms(1000);

Lcd_Cmd(_LCD_CURSOR_OFF); // Comando LCD (apagar el cursor)
Lcd_Cmd(_LCD_CLEAR); // Comando LCD (borrar el LCD)
Lcd_Out(1,1,"cm=");

ADCON1.PCFG1= 1; //A1 ES DIGITAL
ADCON1.PCFG2= 1; //A2 ES DIGITAL
TRISA = 0b00000100; //PORTA como salidas excepto RA2 que es entrada
del ECO

while(1){
//disparo el trigger
RA1_bit = 1;
Delay_us(60);
RA1_bit = 0;

//espero a que el bit ECO se ponga a 1
while( RA2_bit == 0 ) {}

//entonces arranco el TMR0
OPTION_REG.T0CS = 0;

//espero que el bit ECO baje a 0 mientras cuento 1 cm cada 58us (ida y vuelta
del sonido para 1cm)
while( RA2_bit == 1 ) {
centimetros++;
delay_us(58);
}
//pausa exigida por el datasheet
delay_ms(50);

//paro el timer0
OPTION_REG.T0CS = 1;

//pinto distancia en el lcd
IntToStr(centimetros,strvalor);
Lcd_Out(1,7,strvalor);

//resete centimetros
centimetros = 0;
}

}

Potrebbero piacerti anche