51单片机的c程序,程序编译通过,但是中断没反应,在板子上按!INT中断按键一点反应都没有,求高手解答 5

#include<reg51.h>#defineulongunsignedlong#defineLEDP2//P2为段选#defineWXP1//P1为数码管位选char... #include<reg51.h>
#define ulong unsigned long
#define LED P2 //P2为段选
#define WX P1 //P1为数码管位选
char table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0X07,0X7F,0X6F}; //共阴极

ulong t;
ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi;

void init();
void display();
void delay(int);
int stop() interrupt 0
{
TR0=0; //关闭T0计时器
display();//显示当前时间
}

void main()
{
init();
EA=1; //开总中断和T0中断
ET0=1;
EX0=1; //允许!INT0中断
IT0=1; //下降沿产生中断
while(1)
{
TR0=1; //启动T0工作
display();

}
}

void init()
{
t=WX=0;
sec_ge=sec_shi=sec=min_ge=min_shi=min=hour_ge=hour_shi=hour=0;
TMOD=0x01; //定义定时器0工作于方式1
TH0=(65536-5536)/256; //定时器赋初值
TL0=(65536-5536)/256;

}

void delay(int x)
{
int i,j;
for(i=x;i>0;i--)
for(j=255;j>0;j--);
}

void display()
{
int i=0;
if(TF0==1) //如果定时器溢出
{
TF0=0; //清中断标志位
t++;
if(t==10)
{
t=0;
sec++;
if(sec==60)
{
sec=0;
min++;
}
if(min==60)
{
min=0;
hour++;
}
if(hour==24)
{
hour=0;
}
}
}
sec_ge=sec%10;
sec_shi=sec/10;
min_ge=min%10;
min_shi=min/10;
hour_ge=hour%10;
hour_shi=hour/10;
WX=0x20; //循环扫描
LED=table[sec_ge];
delay(1);
WX=0x10;
LED=table[sec_shi];
delay(1);
WX=0x08;
LED=table[min_ge];
delay(1);
WX=0x04;
LED=table[min_shi];
delay(1);
WX=0x02;
LED=table[hour_ge];
delay(1);
WX=0x01;
LED=table[hour_shi];
delay(1);
}
谢谢大家,我已经找到解决办法了

#define key P0 //P0口是8位开关
void main()
{
init();
/* EA=1; //开总中断和T0中断
ET0=1;
EX0=1; //允许!INT0中断
IT0=1; //下降沿产生中断
*/ 上面这一段可以不要,因为用了开关,不需要用中断了
TR0=1; //启动T0工作
while(1)
{
if(key==0XFF) //开关全1则停止计时
{
TR0=0;
display();
}
else
{
TR0=1;
display();
}
}
}
展开
 我来答
百度网友2d9a1c683
2011-06-30 · TA获得超过370个赞
知道小有建树答主
回答量:137
采纳率:0%
帮助的人:93.9万
展开全部
第一个问题:你干嘛都用用长整行呀?浪费呀,long型可是四个字节呀,你大多都是char型的呀。
第二个问题:这个程序你仿真过吗?貌似你开了定时器1的中断,但是没有他的中断函数,这是一个致命的错误,当T0中断的时候,程序就不知道飞到那个爪哇过去了,有反应才怪了呢!
第三个问题:你的定时器重装了没?没重装就是FFFFH的定时器了,误差大大的哦!
追问
谢谢你的回答,long型,char型这个不是重点,程序可以正常运行,数码管可以正常工作,计时也正常,实验板是实验室固定的。关键问题是中断,麻烦给个解决办法~~(板子上只有!INT0中断按钮)
这一句EA=1; //开总中断, ET0=1;//T0开中断,这一句TMOD=0x01; //定义定时器0工作于方式1。程序写的很清楚呀,不明白你所说的开了定时器1的中断指的是哪里(⊙o⊙)?
追答
关于数据类型,实验室里怎么搞都没问题,如果是工程中这么应用,是绝对不允许的,程序的健壮性,实时性很重要,这个程序短,看起来问题不大,当你写到几十K上百K的程序,再这么写你倒时候估计头发都会被自己抓掉的,习惯是从开始就养成的。
你ET0=1了,开了T0的中断,当T0进入中断的时候,PC会装载T0的中断向量0X000B,正常情况下,这个地方是放了一个绝对跳转,跳到T0的中断函数,而你的程序里没有定义,所以这一跳就不中断跳哪里去了,程序跑非了,自然定时器也就没有重装了,应该加 time0() interrupt 1{}这个函数进去,这个函数里还应该给T0重载初值,要不你的定时器到FFFFH就又从0开始了,你的定时范围第二次就是从0到FFFFH了,把你的记数累加都可以放到中断里面去;还有,中断函数不能反回数据,所以你的INT0前面就不用INT来限定了,或者你关掉你的定时器中断,你也要重装定时器初值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一灯
2011-07-02 · TA获得超过1167个赞
知道小有建树答主
回答量:2614
采纳率:0%
帮助的人:1288万
展开全部
Sever_INT0() interrupt 0 using 2
{
……
}

说明:Sever_INT0:中断函数
0:为外部中断入口
2:使用寄存器组2

中断源 Keil中断编号 矢量地址
最高优先级 6 0x0033
外部中断0 0 0x0003
定时器0溢出 1 0x000B
外部中断1 2 0x0013
定时器1溢出 3 0x001B
串口 4 0x0023
定时器2溢出 5 0x002B
DMA 7 0x003B
硬件断点 8 0x0043
JTAG 9 0x004B
软件断点 10 0x0053
监视定时器 12 0x0063

内部寄存器组有3组:1~3
平时也可以不用,如果有相互嵌套的最好指定,否则可能会出问题

当开启电断后,一旦INT0口出现低电平时,自动进入Sever_INT0()函数,处理函数内部程序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tony_sgt
2011-07-01 · TA获得超过8423个赞
知道大有可为答主
回答量:5330
采纳率:66%
帮助的人:1217万
展开全部
把while(1)
{
TR0=1; //启动T0工作
display();

}
改成
TR0=1; //启动T0工作
while(1)
{

display();

}
这样就OK了,因为你在外部中断产生时去停止定时器0的计时,但在主程序内却不断的使TR0=1.
所以外部中断过後又自动计时了
追问
你们的建议我都试过了,而且还试了别的很多方法,但是没有效果~~我在想是不是我的思路出了问题,我是想在计时器工作时(现在这个计时器就相当于秒表),然后按一下板子上的INT0中断按钮,让它停止计时,再按一下,恢复计时,跟秒表差不多。因为我是第一次写单片机的程序,对这些不是很清楚。然后我也试了通过P0口的开关来实现,#define key P0   main(){。。。if(key=0xff){TR0=0;display()}。。。}但是也没效果,希望大家指教
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
luoggll
2011-06-30 · 超过20用户采纳过TA的回答
知道答主
回答量:65
采纳率:0%
帮助的人:50.2万
展开全部
int stop() interrupt 0
{
TR0=0; //关闭T0计时器
display();//显示当前时间
}
有问题

TMOD=0x01; //定义定时器0工作于方式1
TH0=(65536-5536)/256; //定时器赋初值
TL0=(65536-5536)/256;

应该在主函数开始 程序 才能响应 ,而且 中断里 还得重赋值
你学过没有啊
追问
说实话,以前没有接触过单片机,这是写的第一个程序~~~谢谢你的回答
追答
你要实现什么功能 啊  把你的电路图发过了 我给你看看   有空的话帮你看看程序嘛
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式