722
void initialize_pins(void) { TRIG_PIN_DIR = 0; // Set TRIG_PIN as output ECHO_PIN_DIR = 1; // Set ECHO_PIN as input TRIG_PIN = 0; // Ensure trigger pin is low initially } uint16_t measure_distance(void) { uint16_t pulse_duration = 0; // Generate 10s trigger pulse TRIG_PIN = 1; __delay_us(10); TRIG_PIN = 0; // Wait for echo pin to go high while (!ECHO_PIN); // Wait for rising edge // Start Timer1 TMR1H = 0; TMR1L = 0; TMR1ON = 1; // Start Timer1 // Wait for echo pin to go low while (ECHO_PIN); // Wait for falling edge // Stop Timer1 TMR1ON = 0; // Calculate pulse duration pulse_duration = ((uint16_t)TMR1H << 8) | TMR1L; // Convert pulse duration to distance in cm return pulse_duration / US_ROUNDTRIP_CM; } void main(void) { uint16_t distance; // Initialize peripherals initialize_pins(); initialize_uart(); // Timer1 configuration T1CON = 0x10; // Prescaler 1:2, internal clock (Fosc/4) while (1) { distance = measure_distance(); // Send distance over UART sprintf(uart_buffer, "Distance: %ucm\r\n", distance); uart_send_string(uart_buffer); __delay_ms(500); // Delay before next measurement } }