当前位置: 代码迷 >> 单片机 >> 使用STC89C52外部中断的下降沿触发方式来计数(测齿轮的转动的圈数),外部脉冲快慢不一样时,计数结果偏差比较大,请教有什么好的解决方式吗?们,帮帮忙吧
  详细解决方案

使用STC89C52外部中断的下降沿触发方式来计数(测齿轮的转动的圈数),外部脉冲快慢不一样时,计数结果偏差比较大,请教有什么好的解决方式吗?们,帮帮忙吧

热度:24   发布时间:2016-04-28 16:02:50.0
使用STC89C52外部中断的下降沿触发方式来计数(测齿轮的转动的圈数),外部脉冲快慢不一样时,计数结果偏差比较大,请问有什么好的解决方式吗?大虾们,帮帮忙吧!
使用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;
}

------解决方案--------------------