当前位置: 代码迷 >> 单片机 >> 外部脉冲频率比较高,小弟我使用stc89c52的外部中断来计数,但是似乎计不到数,源代码在下面,请一下,有什么改进的地方,
  详细解决方案

外部脉冲频率比较高,小弟我使用stc89c52的外部中断来计数,但是似乎计不到数,源代码在下面,请一下,有什么改进的地方,

热度:28   发布时间:2016-04-28 16:05:35.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;
int h1=1000,h2=1,h3=2,z1,z2,z3,link=0;
int a[20]={2,0,0,0,0,2,0,0,0,3,0,0};
   
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main ()
{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;  

while(1) {if(link==0){
 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;
 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;}
  }
}
}
/*********************************************************************/
IN0() interrupt 0 using 1
 {EA=0;
  if(fang_xing1==1){h1++;}
  if(fang_xing1==0){h1--;}
  IE0=0;
  EA=1;
  }
/******************************************************************************************/
IN1() interrupt 2 using 2
 {
  EA=0;
  if(fang_xing2==1){h2++;}
  if(fang_xing2==0){h2--;}
  IE1=0;
  EA=1;
 }
/**********************************************************************************************************************/
Time() interrupt 1 using 1
 {
  EA=0;
  if(fang_xing3==1){h3++;}
  if(fang_xing3==0){h3--;}
  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;
  }
if(link==12)
link=0;
 EA=1;
}

------解决方案--------------------
我只是扫了一眼,说两点,未必和你的问题有关,我不想仔细看程序。
1 慎重考虑在中断中关闭总中断,在任何中断中都这样做并不是好的。
2 IE0=0;可见你不知道什么叫做硬件清除中断标志。