我正在为PIC18f2520开发一个简单的HC SR04代码,用于接收cm值。情况是,我接受了错误的价值,而不是用近似来改变。传感器给出的值没有意义。
我用的是内部晶体8Mhz,16位定时器1,1:8预分频器,TMR1CS=0
=内部时钟(FOSC/4)。ms和us的延迟是编译代码。触发针是RA2,回波针是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;
短的是16位宽,应该可以解决你的问题。

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

10-11 12:46