您现在所在的是:

单片机论坛

回帖:1个,阅读:759 [上一页] [1] [下一页]
700
道痞
文章数:1
年度积分:50
历史总积分:700
注册时间:2010/12/24
发站内信
发表于:2010/12/24 20:17:13
#0楼
我这个程序, 主要是用来做个反应测试仪的, 定时器0工作在模式1, 想在10s   20s 两个时刻测试, 这两个都时刻为FFFFFF(6位数码管)时, 可按下外中断0,测试反应时间, ,  当IT0=1时,就是如果在10s 前有按下中断,过了10s, 程序员就不会执行下去, 达不到在其它时刻防止干扰的效果,IT0=0,电平触发的,虽然防止了其它时刻的干扰,但是在10S  ,  要是按下中断0的时候,有抖动的话, 就会出现程序不会执行到20s去,

是不是中断标志可以保留的, 但是电平触发就不可以了,


#include<reg52.h>
#include<absacc.h>
#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++;
  }
}
}    
758
hDragon
文章数:19
年度积分:50
历史总积分:758
注册时间:2011/3/30
发站内信
发表于:2011/3/31 13:40:54
#1楼
???
看了几遍你的描述,也没看明白你的意思,请描述清楚。
另外你贴的程序中下面这行有问题:
if(sec1>sec2|(sec1==sec2&&ms1>ms2))
如果我理解的对,应该写成如下形式:
if((sec1>sec2)||((sec1==sec2)&&(ms1>ms2)))
注意位运算符和关系运算符的不同。
建议多用括号。

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003