我想在一个PIC16F877A上运行两个HC-SR04,并将两个超声波测量的值发送到串口。
这是我使用PIC C编译器的代码:
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#define e1 PIN_B6
#define t1 pin_B7
#define e2 pin_B4
#define t2 pin_B5
int a;
int distanse(int,int);
void main()
{
while(1){
int u1,u2;
u1=distanse(e1,t1);u2=distanse(e2,t2);
printf("%3u", u1);
printf("%3u", u2);
delay_ms(1000);
}
}
int distanse(int e,int t){
long long counter=0;
output_bit(t,1);delay_us(10);output_bit(t,0);
a=input(e);
while(a==0){a=input(e);}
while(a==1){counter=counter+1;a=input(e);}
return counter/3.333333;
}

但计算机收到随机值!有什么问题?
答案 0 :(得分:0)
根据设备的文档,
“你只需要 供应短10uS 脉冲到触发输入开始测距,一个 然后模块将发送出去 超声波的8周期突发,频率为40 kHz并升高 它的回声。回声是一个 距离对象是脉冲宽度和范围i n比例。 你可以 通过时间间隔计算范围 发送触发信号和 接收回波信号。 公式:uS / 58 =厘米 rs或uS / 148 =英寸;或者 范围=高水平时间*速度(340M / S)/ 2; 我们 建议使用超过60毫秒 测量周期,以防止触发标志 al到回声信号 “
测量不是信号保持高电平的时间长度,而是“开始”脉冲结束与输入信号开始高电平之间的时间。
因此,代码正在测量错误的间隔。
应该测量“低”区间,而不是“高”区间。
该文件可在以下网址获得: http://www.micropik.com/PDF/HCSR04.pdf
值得注意的是,由于您运行了两台设备,根据文档,测量(任何设备)之间的时间需要超过60毫秒。
我没有看到触发不同设备之间所需的时间间隔。
我建议使用delay_us()函数进行时间间隔测量而不是自由运行while循环
答案 1 :(得分:0)
连接时,请确保执行以下步骤
查看您的程序,不确定计数器是否会以这种方式运行。为了更好的准确性,使用带捕获模式的Timer在这里找到更多相关信息:PIC controller Timer Capture mode。
使用Timer计算超声波模块的距离,请参阅此处 Interfacing PIC controller with Ultrasonic sensor module HC-SR04