单片机双路计数,输出计数数据时,传感器发出的信号紊...-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 340|回复: 0

[未解决] 单片机双路计数,输出计数数据时,传感器发出的信号紊...

[复制链接]
发表于 2022-6-9 15:17 | 显示全部楼层 |阅读模式
我最近做了一个双路计数的程序,采用了两个外部中断和一个定时中断。单片机在数据输出的那一秒钟,我的探测器输出信号就会发生变化,如图所示。有没有大佬帮忙看看是程序哪里出问题了?(PS:单片机烧录空白程序的时候输出的信号是稳定的)
附上代码:



// Include the libraries we need
#include <SoftwareSerial.h>
#include <NewPing.h>

unsigned int cnt1;              
unsigned int cnt2;

unsigned int temp1[30]={0};
unsigned int temp2[30]={0};

unsigned int ping1_flag=0,ping2_flag=0,send1_flag=0,send2_flag=0,F1=0,F2=0,i1,i2,j;

void setup()
{
    Serial.begin(9600);
    attachInterrupt(0,FrequencyMeasurement1, RISING);  //外部中断0上升沿计数
    attachInterrupt(2,FrequencyMeasurement2, RISING);  //外部中断2上升沿计数
    NewPing::timer_ms(1000,CNT1_Work);
}

void loop()
{  
      if(send1_flag==1)
      {
        send1_flag=0;
      
        F1=0;
        for(j=0;j<30;j++)
        {
          F1 += temp1[j];
        }

        if(((F1%30)>=15)&&((F1%30)<=29))
        {
         F1 = F1/30+1;
        }
        else
        {
          F1 = F1/30;
        }
   
        if(F1>=9999)
        {
          F1=0;
        }
   
         Serial.write("F1:");
         Serial.write(F1/1000+0x30);
         Serial.write(F1%1000/100+0x30);
         Serial.write(F1%100/10+0x30);
         Serial.write(F1%10+0x30);
      }

      if(send2_flag==1)
      {
        send2_flag=0;
      
        F2=0;
        for(j=0;j<30;j++)
        {
          F2 += temp2[j];
        }

        if(((F2%30)>=15)&&(F2%30<=29))
        {
         F2 = F2/30+1;
        }
        else
        {
          F2 = F2/30;
        }
   
        if(F2>=9999)
        {
          F2=0;
        }
   
        Serial.print("F2:");
        Serial.write(F2/1000+0x30);
        Serial.write(F2%1000/100+0x30);
        Serial.write(F2%100/10+0x30);
        Serial.write(F2%10+0x30);
      }
}

void FrequencyMeasurement1()                    //计数
{
  cnt1++;
}


void FrequencyMeasurement2()                   //计数
{
  cnt2++;
}


void CNT1_Work(void)
{
  temp1[i1]=cnt1;
  temp2[i2]=cnt2;
  cnt1=0;
  cnt2=0;

   i1++;
   if(i1>=30)
   {
     i1=0;
     ping1_flag=1;
   }

   if(ping1_flag==1)
   {
     send1_flag=1;
   }

   i2++;
   if(i2>=30)
   {
     i2=0;
     ping2_flag=1;
   }

   if(ping2_flag==1)
   {
     send2_flag=1;
   }
}

输出信号错误

输出信号错误
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2025-1-1 20:20 , Processed in 0.075214 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表