|
我最近做了一个双路计数的程序,采用了两个外部中断和一个定时中断。单片机在数据输出的那一秒钟,我的探测器输出信号就会发生变化,如图所示。有没有大佬帮忙看看是程序哪里出问题了?(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;
}
}
|
-
输出信号错误
|