#include <16F877A.h> #device ICD=TRUE #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=10000000) #priority CCP1, TIMER1 #define send_us PIN_D7 #define receive_us PIN_C2 float temp[10] = {0}; float distance; float avg_dist; float time; float us_speed = 345.123; int1 echo = 0; #INT_TIMER1 void overflow() { disable_interrupts(GLOBAL); clear_interrupt(INT_CCP1); clear_interrupt(INT_TIMER1); setup_timer_1(T1_DISABLED); setup_ccp1(CCP_OFF); distance = 512; } #INT_CCP1 void receive() { if(!echo) { disable_interrupts(GLOBAL); clear_interrupt(INT_TIMER1); clear_interrupt(INT_CCP1); setup_ccp1(CCP_OFF); setup_timer_1(T1_DISABLED); time = (CCP_1) * 0.0000004; distance = time * us_speed; distance = distance / 2; distance -= 0.04; echo = 1; } } void send() { int i = 0; //set ccp and timer module setup_ccp1(CCP_CAPTURE_RE); setup_timer_1 (T1_INTERNAL); //all interrupts on enable_interrupts(GLOBAL); echo = 0; output_bit(send_us, 1); set_timer1(0); delay_us(200); output_bit(send_us, 0); } void analyze() { int i = 0, cnt_max = 0, max = 0, min = 0, count = 0, dist; float cur_sum = 0, cur_dist = 0; for(i = 0; i < 10; i++) { if(temp[i] == 512.0) cnt_max++; if(temp[i] > temp[max]) max = i; if(temp[i] < temp[min]) min = i; } if(cnt_max > 6) avg_dist = 255; else { for(i = 0; i < 10; i++) if(i != max && i != min && temp[i] != 512.0) { cur_sum += temp[i]; count++; } cur_dist = cur_sum / count; cur_dist = cur_dist * 100; dist = (int)cur_dist; if((cur_dist - dist) >= 0.5) dist++; avg_dist = dist; } } main() { //define variables int i = 0, j = 0; //set IO ports set_tris_b(0x00); set_tris_c(0x00); set_tris_d(0x00); //enable interrupts enable_interrupts(INT_TIMER1); clear_interrupt(INT_TIMER1); enable_interrupts(INT_CCP1); clear_interrupt(INT_CCP1); //clear IO ports output_b(0x00); output_c(0x00); output_d(0x00); for(j = 0; j < 25; j++) { for(i = 0; i < 10; i++) { send(); temp[i] = distance; delay_ms(20); } analyze(); } }