使用STC89C52外部中断的下降沿触发方式来计数(测齿轮的转动的圈数),外部脉冲快慢不一样时,计数结果偏差比较大,请问有什么好的解决方式吗?大虾们,帮帮忙吧!急啊!!!!源程序如下:
#include<reg52.h>
sbit fang_xing1=P2^1;
sbit fang_xing2=P2^3;
sbit fang_xing3=P2^5;
sbit sha_che1=P2^0;
sbit sha_che2=P2^2;
sbit sha_che3=P2^4;
sbit c1=P1^0;
sbit c2=P1^1;
sbit c3=P1^2;
int h1=0,h2=0,h3=0,z1=0,z2=0,z3=0,link=0,n1=0,n2=0,n3=0;
int a[20]={0,0,0,0,0,0,0,0,0,0,0,0};
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main ()
{
for(n1=1;n1<1000;n1++){
for(link=1;link<500;link++){
sha_che1=0;fang_xing1=0;
sha_che2=0;fang_xing2=0;
sha_che3=0;fang_xing3=0;
}}
n1=0;
link=0;
TMOD=0x26;
TL1=0xfd;
TH1=0xfd;
TL0=0xff;
TH0=0xff;
TR0=1;
TR1=1;
IT0=1;
IT1=1;
SCON=0x50;
ES=1;
ET1=1;
ET0=1;
EX1=1;
EX0=1;
EA=1;
z1=a[0]*1000+a[1]*100+a[2]*10+a[3]*1;
z2=a[4]*1000+a[5]*100+a[6]*10+a[7]*1;
z3=a[8]*1000+a[9]*100+a[10]*10+a[11]*1;
while(1) {
if(n1<2) c1=1;
if(n1>2) c1=0;
if(n1>=10)n1=0;
if(n2<2) c2=1;
if(n2>2) c2=0;
if(n2>=10)n2=0;
if(n3<4) c3=1;
if(n3>4) c3=0;
if(n3>=11) n3=0;
if(link==12){
z1=a[0]*1000+a[1]*100+a[2]*10+a[3]*1;
z2=a[4]*1000+a[5]*100+a[6]*10+a[7]*1;
z3=a[8]*1000+a[9]*100+a[10]*10+a[11]*1;
link=0;}
if(link==0){
if(h1<z1){sha_che1=0;fang_xing1=1;}
if(h1>z1){sha_che1=0;fang_xing1=0;}
if(h2<z2){sha_che2=0;fang_xing2=1;}
if(h2>z2){sha_che2=0;fang_xing2=0;}
if(h3<z3){sha_che3=0;fang_xing3=1;}
if(h3>z3){sha_che3=0;fang_xing3=0;}
if(h1==z1){sha_che1=1;}
if(h2==z2){sha_che2=1;}
if(h3==z3){sha_che3=1;}
}
n1++;
n2++;
n3++;
}
}
/*********************************************************************/
IN0() interrupt 0 using 1
{EA=0;
if(fang_xing1==1){h1++;}
if(fang_xing1==0){h1--;}
if(h1==z1){sha_che1=1;}
IE0=0;
EA=1;
}
/******************************************************************************************/
IN1() interrupt 2 using 2
{
EA=0;
if(fang_xing2==1){h2++;}
if(fang_xing2==0){h2--;}
if(h2==z2){sha_che2=1;}
IE1=0;
EA=1;
}
/**********************************************************************************************************************/
Time() interrupt 1 using 1
{
EA=0;
if(fang_xing3==1){h3++;}
if(fang_xing3==0){h3--;}
if(h3==z3){sha_che3=1;}
TF0=0;
EA=1;
}
/******************************************************************/
/* 串口中断程序 */
/******************************************************************/
void UART_SER () interrupt 4 using 3//串行中断服务程序
{ unsigned char k;
EA=0;
if(RI)
{
RI=0;
k=SBUF;
SBUF=k;
while(TI==0);
TI=0;
a[link]=k-48;
++link;
}
EA=1;
}
------解决方案--------------------