PDA

View Full Version : giao tiếp 16f877a với cảm biến siêu âm srf05


hungcdt_k49
26-02-2013, 08:02 AM
Mọi người giúp em với ạ. E có biết là dùng 1 chân I/O, 1 chân RB0 dùng timer 1 để tính thời gian (2 chân CCP để điều khiển động cơ). Nhưng em không biết chuyển từ bắt cạnh lên sang bắt cạnh xuống thế nào ạ. Mong mọi người giúp em với, thanks

hungcdt_k49
26-02-2013, 11:06 AM
code nay do em viet nhung no khong chay. Moi nguoi sua giup em voi a
#include <16f877a.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT
#use delay(clock=12000000)
int8 i,j,k,led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0},dv,chuc,tram;
float time,kc;
#define trig pin_B1
#define echo pin_B0
#int_TIMER1
void trantimer1()
{
set_timer1(0);
}
#INT_EXT
void ngatngoai()
{
if(input(pin_b0)) //neu la xung canh len
{
set_timer1(0);
ext_int_edge(H_to_L);
}
else // neu la xung canh xuong
{
time=get_timer1(); // doc gia tri timer 1
kc=((time*(4*4/12))/58); // tinh khoang cach. moi nhip timer1 ung voi 1.33us
ext_int_edge(L_to_H); // chuyen sang do canh len
disable_interrupts(int_timer1); // khong cho phep ngat timer1
output_a(255);
for(i=0;i<50;i++)
{
dv=(int8)kc%10;
chuc=(int8)(kc/10)%10;
tram=(int8)(kc/100)%10;
output_d(led[dv]);
output_a(0xfe);
delay_ms(1);
output_a(0xfd);
output_d(led[chuc]);
delay_ms(1);
output_a(0xfb);
output_d(led[tram]);
delay_ms(1);
}
}
}
void trigger()
{
output_high(trig);
delay_us(12);
output_low(trig);
}
void main()
{
set_tris_a(0);
set_tris_d(0);
set_tris_b(0);

setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_EXT);
ext_int_edge(L_to_H);
enable_interrupts(global);
while(1)
{
trigger();
delay_ms(50);
}
}