发表于: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++;
}
}
}
是不是中断标志可以保留的, 但是电平触发就不可以了,
#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++;
}
}
}