c - PIC18f2520 + HCSR04

标签 c microcontroller pic proximitysensor

我正在为 PIC18f2520 开发一个简单的 HC SR04 代码,用于接收以厘米为单位的值。情况是,我收到了错误的值,并且没有随着近似值的变化而改变。传感器给出没有意义的值。 我正在使用内部晶体 8Mhz,带 16 位、1:8 预分频器和 TMR1CS =0 的 TIMER1 = 内部时钟 (FOSC/4)。 ms和us的延迟就是编译代码。 TRIGER 引脚为 RA2,ECHO 引脚为 RA5。有人可以帮助我吗?

#define TRIG RA2
#define echo RA5

void main(void)
{
   unsigned char duraca=0,duraca1=0,duraca2=0,duraca3=0;
   unsigned char distanci=0;
   int i;

   Config_micro();
   serialBegin();
   TRIG=0;
   TMR1L=0;
   TMR1H=0;
   while(1)
   {
      TRIG=1;
      DelayUs(10);
      TRIG=0;

      while(echo==1);
      TMR1ON = 1;
      while(echo==0);
      TMR1ON = 0;

      duraca1=(TMR1L+(TMR1H<<8));
      duraca2=(duracao1<<2);
      distanci=((duraca1)/58);
      printf("distancia: %2d cm\n\r",distanci);
      __delay_ms(90);
      __delay_ms(90);
      __delay_ms(90);
   }
}

最佳答案

问题是你想在一个不能包含那么多数据的变量中存储更多数据

duraca1=(TMR1L+(TMR1H<<8));

duraca1 被定义为 unsigned char duraca1=0; 所以它只有 8 位宽。
通过将 TMR1H 移动 8,您将超出范围。
由于那个不正确,以下也不正确。
试试 unsigned short duraca=0,duraca1=0,duraca2=0,duraca3=0;
而不是 unsigned char duraca=0,duraca1=0,duraca2=0,duraca3=0;
一个 short 是 16 位宽,应该可以解决您的问题。

关于c - PIC18f2520 + HCSR04,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23254579/

相关文章:

microcontroller - 微 Controller 的数据压缩

c - 统计结构段错误

objective-c - block 被释放时的回调

c - 如何为我的 ls-al c 程序添加权限?

c - 使用 MPLABX IDE 的适用于 PIC32MX120F064H 的 FreeRTOS

c - 在 PIC18 上从用户处获取数组值?

c - 两个字符串之间的最长关系

c - 指向 PIC 16F 和 Hitech C 的内联 asm 标签的指针

c - 如何在 C 编程的图片中连接 vars?