打印

求助:数码管显示---中断时为什么依然显示计数变化?

[复制链接]
3889|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
thanksgiving|  楼主 | 2009-7-10 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 
大侠们,恳请指点

按住INT0键不放,CPU应该在响应中断(低电平有效),数码管显示计数应该停止( IT0=0;//不写也可以,默认就是0,与 I/O口默认为1不同,,这是电平触发方式。保持电平则,永远在中断程序内部,不会出来。),我下面的程序为什么按住INT0键数码管还会有数字显示变化?只是变化得慢了些。
 
为什么中断程序变大(在中断程序中增加延时或语句)就没有上述现象了?


/**************************************************************************
*Project  :    数码管显示
*                
*File name:digtalled.c 
*       
* Author  : 
* Version : V1.0        
* Date    : 2009-6-30
* Description :
 
****************************************************************************/
#include <reg52.h>  
#define uchar unsigned char
#define uint unsigned int
 
sbit led=P1^0;
sbit du=P1^1;
sbit we=P1^2;
sbit BUZZ=P1^4;  
code uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,
                    0x6d,0x7d,0x07,0x7f,0x6f};
 
void delay(uint i)
{
 uint j;
 for(;i>0;i--)
  for(j=114;j>0;j--);
}
 
void main()
{
 uchar i;
 
 led=0;
 EA=1;//开总中断
 EX0=1;//开外部中断0
 //IT0=1;
 TCON=0x00;
 
 we=1;
 P0=0xaa;
 we=0;
 
 
 
 while(1)
 {
  for(i=0;i<10;i++)
  {
   
   du=1;
   P0=table;
   du=0;
   BUZZ=1;
   delay(500);
  }
 
 }
}
 
void exter0() interrupt 0
{

 
 BUZZ=0; 
// delay(500);//增加这些语句才会真正响应中断,显示才停止在某个数字。
// led=1;
// P0=0xfe;
// led=0;
 
// delay(500);

}

 

相关帖子

沙发
thanksgiving|  楼主 | 2009-7-10 11:11 | 只看该作者

另外:下面程序为什么响应中断时,只显示其中1位?

此程序显示正确(-----删除),本来就是应该显示哪位时中断,就停在哪位。。。。

使用特权

评论回复
板凳
ayb_ice| | 2009-7-11 10:11 | 只看该作者

建议LZ还是仔细看看外部中断章节

使用特权

评论回复
地板
5880527| | 2009-7-11 10:18 | 只看该作者

这里就是好

在学校里交那么多学费老师都不一定愿意仔细的来给你看程序

使用特权

评论回复
5
happystar| | 2009-7-11 17:26 | 只看该作者

re

只看了你最后一个中断程序。
首先你要明白中断是干啥的,之后你就会明白为什么中断里不能加延时了。

使用特权

评论回复
6
thanksgiving|  楼主 | 2009-7-13 17:18 | 只看该作者

我是在中断中增加了延时,显示才正确的。

否则显示数值会慢慢增加。变化速度不正常。


void exter0() interrupt 0
{


BUZZ=0; 
// delay(500);//增加这些语句才会真正响应中断,显示才停止在某个数字。
// led=1;
// P0=0xfe;
// led=0;

// delay(500);

}

使用特权

评论回复
7
bjc125| | 2009-7-13 20:13 | 只看该作者

加了延时也没彻底解决你的问题

“保持电平则,永远在中断程序内部,不会出来”的描叙是错误的。
中断相当于一个时常执行的条件调用,满足条件就执行,执行完就会退出来。而你“按住INT0键不放”程序只是不断在调用中断程序,而在中断退出与进入中段调用之间很可能执行了外面的一条指令(具体是不是每次中断出来都会执行一条指令我也不太清楚,单步运行一下就可以发现了)。
这样的话:你变慢的时间=原来时间*(中断运行周期数+1)。
所有你在中断中延时只是大大增加了变化的时间,其实是在变的。
建议楼主不用电平中断而用下降沿中断(在中断中以电平为高作为退出中断的条件)。
个人认为没有必要用外部中断来停下显示的数据,在显示前判断下按键的高低即可(注意消除干扰)。

使用特权

评论回复
8
ayb_ice| | 2009-7-13 20:59 | 只看该作者

我早建议LZ去看51的外部中断章节了

使用特权

评论回复
9
thanksgiving|  楼主 | 2009-7-20 11:48 | 只看该作者

看不懂啊

使用特权

评论回复
10
Black_Boy| | 2009-7-20 19:45 | 只看该作者

还是对中断的理解

单片机的编程中会涉及到中断函数的概念,其实中断函数不难理解,如果你学过C++,肯定也有接触过公用函数的概念,其实中断也相当于一个公用的函数,在中断里面你可以把你想要进行的处理放到里面进行处理。只不过进入这个中断处理函数是有前提的,你到底是电平跳变出发(按键)、还是定时中断(计数器)、还是……总之,就那你使用定时器来说,当你需要1s来让数码管跳一下,0k!那么你首先要明白你必须相隔1s的时间就要改变你要显示的数码的段码,由于定时器溢出是65536,所以不可能在一秒的时间进入中断,这时你就要将时间分块,若10ms进入一次中断,通过中断理设置计数变量,当累积到100的时候就将数码的标志位置位,在终端程序外部进行相应的操作,你好好看看书,再实践一下理解起来应该不难的。

使用特权

评论回复
11
hyg1984| | 2009-7-20 19:59 | 只看该作者

翻书看看

不认真看书,中断部分不是那么容易理解的

使用特权

评论回复
12
dc王| | 2014-7-31 22:50 | 只看该作者
请问一下你找到原因没有啊?是怎么回事呢?

使用特权

评论回复
13
xg3469| | 2014-8-1 08:49 | 只看该作者
认真看书学习,弄懂中断原理!

使用特权

评论回复
14
peter_wjp| | 2014-8-1 10:37 | 只看该作者
bjc125 发表于 2009-7-13 20:13
“保持电平则,永远在中断程序内部,不会出来”的描叙是错误的。中断相当于一个时常执行的条件调用,满足条 ...

认同你的观点,
如果仅仅针对LZ的所实现的功能,完全可以使用keyscan然后通过标志位进行判断。
或者如果程序不大,就用while(key)类似的语句判断是否按键释放,程序大的话 就用扫描计数法,触发标志位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

153

帖子

0

粉丝