登录
首页 单片机论坛
回帖 发帖
正文

主题:关于单片机中断的问题:

点击:778 回复:1

我这个程序, 主要是用来做个反应测试仪的, 定时器0工作在模式1, 想在10s   20s 两个时刻测试, 这两个都时刻为FFFFFF(6位数码管)时, 可按下外中断0,测试反应时间, ,  当IT0=1时,就是如果在10s 前有按下中断,过了10s, 程序员就不会执行下去, 达不到在其它时刻防止干扰的效果,IT0=0,电平触发的,虽然防止了其它时刻的干扰,但是在10S  ,  要是按下中断0的时候,有抖动的话, 就会出现程序不会执行到20s去,
是不是中断标志可以保留的, 但是电平触发就不可以了,
#include
#include
#define PA XBYTE[0xd1ff]
#define PB XBYTE[0xd2ff]
#define CON XBYTE[0xd6ff]
typedef unsigned char uchar;
typedef unsigned int uint;
uchar min,sec,flag,sec1,sec2;
uint ms,ms1,ms2;
code unsigned char tab[]={0xA0, 0xBB,0x62,0x2A,0x39,0x2C,0x24,0xBA,
                     0x20, 0x28,  };//共阳数码管 0-9
         
void delay(unsigned int cnt)
{
while(--cnt);
}
display(uchar min,uchar sec)
{
  uchar min_shi,min_ge,sec_shi,sec_ge;
  min_shi=min/10;
  min_ge=min%10;
  sec_shi=sec/10;
  sec_ge=sec%10;
     
  PB=tab[min_shi];
  PA=0xfe;
  delay(200);
  PB=tab[min_ge];
  PA=0xfd;
  delay(200);
 
PB=0x7f;
   PA=0xf3;
  delay(200);
 
  PB=tab[sec_shi];
  PA=0xef;
  delay(200);
 
  PB=tab[sec_ge];
  PA=0xdf;
  delay(200);
}
display_test(uchar zu,uchar sec,uchar ms)
{
  uchar sec_ge,ms_bai,ms_shi;
  ms_bai=ms/100;
  ms_shi=ms/10%10;
  sec_ge=sec%10;
     
  PB=tab[zu];
  PA=0xfe;
  delay(200);
   
PB=0x7f;
   PA=0xf5;
  delay(200);
 
  PB=tab[sec_ge];
  PA=0xfb;
  delay(200);
 
  PB=tab[ms_bai];
  PA=0xef;
  delay(200);
 
   PB=tab[ms_shi];
  PA=0xdf;
  delay(200);
}
void init()
{
TMOD=0x01;
TH0=0xFC;
TL0=0x18;
EA=1; //打开中断
ET0=1;
EX0=0;  
IT0=1;IT1=1;
TR0=1;
CON=0x81;
}
void main()
{  
 init();
 while(1)
 { if(flag==2)
   {
if(sec1>sec2|(sec1==sec2&&ms1>ms2))
display_test(2,sec2,ms2);
else display_test(1,sec1,ms1);
}
else{
   if((min==0&&sec==10)|(min==0&&sec==20))
{
 PA=0x00;
 PB=0x74;
 EX0=1;
}
else display(min,sec);
  }
}
IE0=0;
}
void int0(void) interrupt 0 using 1 //测反应速度
{  
  EX0=0;
  flag++;
  if(flag==1)
  {
  sec1=sec-10;
ms1=ms;
  }
  if(flag==2)
  {
  sec2=sec-20;
ms2=ms;
  }  
 
}
void tim0(void) interrupt 1 using 1
{
TH0=0xFC;                             //重新赋值
TL0=0x18;
ms++;
if (ms==1000)
   {
   ms=0;
   sec++;
if(sec==60)
  {
  sec=0;
  min++;
  }
}
}    
10-12-24 20:17
看了几遍你的描述,也没看明白你的意思,请描述清楚。
另外你贴的程序中下面这行有问题:
if(sec1>sec2|(sec1==sec2&&ms1>ms2))
如果我理解的对,应该写成如下形式:
if((sec1>sec2)||((sec1==sec2)&&(ms1>ms2)))
注意位运算符和关系运算符的不同。
建议多用括号。
11-03-31 13:40

工控新闻

更多新闻资讯