Challenge

Project 2 - Measuring distance of an object using ultrasonic sensor (HC-SR04)

In this project, the implementation of code for “Measuring distance of an object using ultrasonic distance sensor (HC-SR04)

#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "avr/interrupt.h"
#define lcdport PORTB
#define rs_high PORTD |= (1<<0);
#define rs_low PORTD &= ~(1<<0);
#define en_high PORTD |= (1<<2);
#define en_low PORTD &= ~(1<<2);
#define Trig_pin PA0

int timerOverflow =0;

void lcd_cmd(unsigned char cmd)
{
	lcdport = (cmd & 0xf0);
	rs_low;
	en_low;
	_delay_ms(1); //after 1ms disable LCD
	en_high;
	lcdport = ((cmd<<4) & (0xf0)); // LCD port
	rs_low;
	en_high;
	_delay_ms(1); //after 1ms disable LCD
	en_high; // enable the LCD

}

void lcd_data(unsigned char data)
{
	lcdport = (data & 0xf0);
	rs_high; //access data register
	en_low;
	_delay_ms(1);
	en_high;
	lcdport = ((data<<4) & (0xf0));
	rs_high; //access data register
	en_low;
	_delay_ms(1);
	en_high;
}

void lcd_init()
{
	lcd_cmd(0X28);
	_delay_ms(10);
	lcd_cmd(0X38);
	_delay_ms(10);
	lcd_cmd(0X02);
	_delay_ms(10);
	lcd_cmd(0X01);
	_delay_ms(10);
	lcd_cmd(0X0C);
	_delay_ms(10);
	lcd_cmd(0X06);
	_delay_ms(10);
	lcd_cmd(0X80);  // R0 C0
	_delay_ms(10);
}

void cursor_pos(char x, char y)
{
	if((x<1||x>2)||(y<1||y>16))
	{
		x=1;
		y=1;
	}
	if(x==1)
	{
		lcd_cmd(0X7F+y);
	}
	else if(x==2)
	{
		lcd_cmd(0XBF+y);
	}
}




void lcd_out(char x, char y, char *str)
{
	cursor_pos(x,y);
	while(*str)
	{
		lcd_data(*str);
		str++;
	}
}


int main(void)
{
	char string[10];
	long count;
	double distance;
	PORTC = 0xFF;
	PORTA = 0XFF;
	TCCR1A = 0;

	lcd_init();
	lcd_out(1, 0, "Ultrasonic");
	sei(); // Enable global interrupt
	TIMSK = (1 << TOIE1); // Enable timer1 overflow interrupts 

	while(1)
	{
		PORTA |= (1 << Trig_pin);
		_delay_us(10);
		PORTA &= (~(1 << Trig_pin));

		TCNT1 = 0; /* Clear Timer counter */
		TCCR1B = 0x41; /* Capture on rising edge, No prescaler*/
		TIFR = 1<<ICF1; /* Clear ICP flag (Input Capture flag) */
		TIFR = 1<<TOV1; /* Clear Timer Overflow flag */

		/*Calculate width of Echo by Input Capture (ICP) */

		while ((TIFR & (1 << ICF1)) == 0);/* Wait for rising edge */
		TCNT1 = 0; /* Clear Timer counter */
		TCCR1B = 0x01; /* Capture on falling edge, No prescaler */
		TIFR = 1<<ICF1; /* Clear ICP flag (Input Capture flag) */
		TIFR = 1<<TOV1; /* Clear Timer Overflow flag */

		while ((TIFR & (1 << ICF1)) == 0); /* Wait for falling edge */
		count = ICR1 + (65535 * timerOverflow); /* Take count */
		/* 8MHz Timer freq, sound speed =343 m/s */
		distance = (double)count / 466.47;
		
		dtostrf(distance,2,2,string);
		lcd_out(2, 0, "Dist = ");
		lcd_out(2, 7, string); /* Print distance */
		_delay_ms(200);
	}
}

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.