为什么不能进入AT89S52单片机的定时器2中断服务程序?程序在Keil编译没有问题,请高手指点。程序如下:
#include<AT89X52.H>typedefunsignedcharuchar;sbitLED=P1^0;unsignedintj=0;//-----------...
#include <AT89X52.H>
typedef unsigned char uchar;
sbit LED=P1^0;
unsigned int j=0;
//-------------------------------------------------------------------------------
void delay_s(unsigned int s) //延时函数,延时s*0.1 秒
{
int x;
int y=100;
for(x=0;x<=s;x++)
{
for(y=0;y<100;y++)
{
unsigned int k=110;
while(k--);
}
}
}
//---------------------------------------------------------------------------------------------------------
void init() //单片机初始化函数
{
T2MOD=0x00;
T2CON=0x00;
//TH2=0x6F; //将定时器2的定时时间40ms
//TL2=0x77;
RCAP2H=0x6F;
RCAP2L=0x77;
EA=1; //开总中断
ET2=1; //使能定时器2中断
TR2=1; //启动定时器2
TF2=0; //清除定时器2溢出标志
EXF2=0; //清定时器2外部中断
PT2=1; //设定定时器2为高优先级中断
}
//-----------------------------------------------------------------------------------------------------------
void T2_timer() interrupt 5 //定时器2中断服务函数
{
int xy=6;
TF2=0; //清除定时器2溢出标志
EXF2=0; //清定时器2外部中断
if(j>=66) //2.65秒
{
j=0;
while(xy--) //LED灯闪烁xy次
{
LED=0;
delay_s(4); //延时0.4s
LED=1;
delay_s(4);
}
}
}
//-------------------------------主函数main()-----------------------------------------------
main()
{
init(); //初始化单片机
while(1);
} 展开
typedef unsigned char uchar;
sbit LED=P1^0;
unsigned int j=0;
//-------------------------------------------------------------------------------
void delay_s(unsigned int s) //延时函数,延时s*0.1 秒
{
int x;
int y=100;
for(x=0;x<=s;x++)
{
for(y=0;y<100;y++)
{
unsigned int k=110;
while(k--);
}
}
}
//---------------------------------------------------------------------------------------------------------
void init() //单片机初始化函数
{
T2MOD=0x00;
T2CON=0x00;
//TH2=0x6F; //将定时器2的定时时间40ms
//TL2=0x77;
RCAP2H=0x6F;
RCAP2L=0x77;
EA=1; //开总中断
ET2=1; //使能定时器2中断
TR2=1; //启动定时器2
TF2=0; //清除定时器2溢出标志
EXF2=0; //清定时器2外部中断
PT2=1; //设定定时器2为高优先级中断
}
//-----------------------------------------------------------------------------------------------------------
void T2_timer() interrupt 5 //定时器2中断服务函数
{
int xy=6;
TF2=0; //清除定时器2溢出标志
EXF2=0; //清定时器2外部中断
if(j>=66) //2.65秒
{
j=0;
while(xy--) //LED灯闪烁xy次
{
LED=0;
delay_s(4); //延时0.4s
LED=1;
delay_s(4);
}
}
}
//-------------------------------主函数main()-----------------------------------------------
main()
{
init(); //初始化单片机
while(1);
} 展开
2个回答
展开全部
你的程序能进入中断服务,但是每次进入中断,你没有让变量j递增,所以j的值永远是0,就永远不会让LED闪烁了。
你把程序改成这样:
if(j>=66)
{
....
}else j++;
另外,尽量不要在中断中进行延时,虽然你这里是没有什么影响,但这种写法应该尽量避免。
你把程序改成这样:
if(j>=66)
{
....
}else j++;
另外,尽量不要在中断中进行延时,虽然你这里是没有什么影响,但这种写法应该尽量避免。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询