PIC16F877A-Ultrasonic-Ultrasonic&Main

by Marwen Maghrebi
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
    }
}
Are you sure want to unlock this post?
Unlock left : 0
Are you sure want to cancel subscription?
-
00:00
00:00
Update Required Flash plugin
-
00:00
00:00