外部脉冲频率比较高,我使用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;可见你不知道什么叫做硬件清除中断标志。