51单片机:为什么在定时器中断里面改变的全局变量值没能传回主函数?在线等,急啊!!
#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineWeiP2#defineDua...
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Wei P2
#define Duan P0 //数码管位选和段选
#define T0_M1 50000 //T0(Mode 1)计数0.05s,用于1s计时
#define TH0_M1 (65535-T0_M1)/256
#define TL0_M1 (65535-T0_M1)%256
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//数字0-9,'-',共阳数码管
uchar flag=0; //设计一个状态标志位标志定时1s完成
uchar T0count=0;
void main(void)
{
while(1)
{
TMOD=0x01; //定时器0模式1
TH0=TH0_M1;
TL0=TL0_M1;
EA=1; //总中断
ET0=1; //T0中断
TR0=1; //启动T0
if(flag==1)//为什么在定时器中断里面改变的flag值没能传回
{
flag=0;
Wei=0x00;
Duan=tab[10];
while(1);
}
}
}
void T0_1s(void) interrupt 1
{
TH0=TH0_M1;
TL0=TL0_M1;
if(++T0count==20)
{
T0count=0;
flag=1;
}
} 展开
#define uchar unsigned char
#define uint unsigned int
#define Wei P2
#define Duan P0 //数码管位选和段选
#define T0_M1 50000 //T0(Mode 1)计数0.05s,用于1s计时
#define TH0_M1 (65535-T0_M1)/256
#define TL0_M1 (65535-T0_M1)%256
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//数字0-9,'-',共阳数码管
uchar flag=0; //设计一个状态标志位标志定时1s完成
uchar T0count=0;
void main(void)
{
while(1)
{
TMOD=0x01; //定时器0模式1
TH0=TH0_M1;
TL0=TL0_M1;
EA=1; //总中断
ET0=1; //T0中断
TR0=1; //启动T0
if(flag==1)//为什么在定时器中断里面改变的flag值没能传回
{
flag=0;
Wei=0x00;
Duan=tab[10];
while(1);
}
}
}
void T0_1s(void) interrupt 1
{
TH0=TH0_M1;
TL0=TL0_M1;
if(++T0count==20)
{
T0count=0;
flag=1;
}
} 展开
4个回答
展开全部
这个有个问题。。。
while(1)
{
TMOD=0x01; //定时器0模式1
TH0=TH0_M1;
TL0=TL0_M1;
EA=1; //总中断
ET0=1; //T0中断
TR0=1; //启动T0
设置好定时器之后,如果还没有到1S,也就是下面的if语句不成立,那么就会循环的执行while(1)里面的程序。这样就会重复的设置定时器。。。然后再判断if语句不成立,在循环。。。。。。
if(flag==1)//为什么在定时器中断里面改变的flag值没能传回
{
flag=0;
Wei=0x00;
Duan=tab[10];
while(1);
}
}
while(1)
{
TMOD=0x01; //定时器0模式1
TH0=TH0_M1;
TL0=TL0_M1;
EA=1; //总中断
ET0=1; //T0中断
TR0=1; //启动T0
设置好定时器之后,如果还没有到1S,也就是下面的if语句不成立,那么就会循环的执行while(1)里面的程序。这样就会重复的设置定时器。。。然后再判断if语句不成立,在循环。。。。。。
if(flag==1)//为什么在定时器中断里面改变的flag值没能传回
{
flag=0;
Wei=0x00;
Duan=tab[10];
while(1);
}
}
追问
重复设置。。。设置一次定时器进入一次中断,T0count的值仍然加1,加到20后flag仍然可以置1,然后数码管显示。。为什么不对?
追答
你这个根本就不会进中断。 总在执行这一段程序 TMOD=0x01; //定时器0模式1
TH0=TH0_M1;
TL0=TL0_M1;
EA=1; //总中断
ET0=1; //T0中断
TR0=1; //启动T0
怎么可能进中断呢
展开全部
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Wei P2
#define Duan P0 //数码管位选和段选
#define T0_M1 50000 //T0(Mode 1)计数0.05s,用于1s计时
#define TH0_M1 (65535-T0_M1)/256
#define TL0_M1 (65535-T0_M1)%256
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//数字0-9,'-',共阳数码管
uchar flag=0; //设计一个状态标志位标志定时1s完成
uchar T0count=0;
void main(void)
{
TMOD=0x01; //定时器0模式1
TH0=TH0_M1;
TL0=TL0_M1;
EA=1; //总中断
ET0=1; //T0中断
TR0=1; //启动T0
while(1)
{
if(flag==1)//为什么在定时器中断里面改变的flag值没能传回
{
flag=0;
Wei=0x00;
Duan=tab[10];
}
}
}
void T0_1s(void) interrupt 1
{
TH0=TH0_M1;
TL0=TL0_M1;
if(++T0count==20)
{
T0count=0;
flag=1;
}
}
#define uchar unsigned char
#define uint unsigned int
#define Wei P2
#define Duan P0 //数码管位选和段选
#define T0_M1 50000 //T0(Mode 1)计数0.05s,用于1s计时
#define TH0_M1 (65535-T0_M1)/256
#define TL0_M1 (65535-T0_M1)%256
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//数字0-9,'-',共阳数码管
uchar flag=0; //设计一个状态标志位标志定时1s完成
uchar T0count=0;
void main(void)
{
TMOD=0x01; //定时器0模式1
TH0=TH0_M1;
TL0=TL0_M1;
EA=1; //总中断
ET0=1; //T0中断
TR0=1; //启动T0
while(1)
{
if(flag==1)//为什么在定时器中断里面改变的flag值没能传回
{
flag=0;
Wei=0x00;
Duan=tab[10];
}
}
}
void T0_1s(void) interrupt 1
{
TH0=TH0_M1;
TL0=TL0_M1;
if(++T0count==20)
{
T0count=0;
flag=1;
}
}
追问
非常感谢,同样感谢其他热心网友~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
进中断了么,中断标志清零了么
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询