打印

小菜向大家请教数码管的中断问题

[复制链接]
2429|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jackxn|  楼主 | 2009-8-15 08:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人目前菜鸟级!请各位大侠指点!

我写了一段程序,主程序是控制数码管由1-F显示,循环,我在程序中加入了中断服务程序,通过外部中断0控制一个LED点亮,触发方式为默认的电平触发,当我触发中断时,LED点亮,但数码管却继续循环,正常的话不是应该停住主程序吗?
请各位大侠指点!

相关帖子

沙发
chen3bing| | 2009-8-15 08:39 | 只看该作者
中断执行完了,就要继续执行主程序。

使用特权

评论回复
板凳
jackxn|  楼主 | 2009-8-15 08:42 | 只看该作者
我没让她执行完啊,处于联系中断中

使用特权

评论回复
地板
chen3bing| | 2009-8-15 09:10 | 只看该作者
你能否说的具体一点?或者干脆把程序贴出来。

使用特权

评论回复
5
jackxn|  楼主 | 2009-8-15 09:30 | 只看该作者
好的,我把程序贴下来。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit d1=P1^0;
uchar num;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x98,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void delay(uint z);

void main()
{
        EA=1;                                //开总中断
        EX0=1;                                 //开外部中断0
        wela=1;
        P0=0x55;
        wela=0;
        while(1)
        {
                for(num=0;num<16;num++)
                        {
                                dula=1;
                                P0=table[num];
                                dula=0;
                                delay(1000);       
                        }
        }
}

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);       
}

void exter0() interrupt 0
{
        d1=0;       
}

使用特权

评论回复
6
houfire007| | 2009-8-15 09:56 | 只看该作者
你这个中断根本没有用,程序中实际上没有执行。你缺少了中断标志位设置,在TCON中设置IE0为1,你试试。

使用特权

评论回复
7
chen3bing| | 2009-8-15 10:14 | 只看该作者
不知道。

使用特权

评论回复
8
s46410864| | 2009-8-15 12:21 | 只看该作者
6L说的不对,..IE0是检测到INT0引脚出现外部中断下降沿时,由硬件置位的..
你这个程序.当进行中断后,执行d1=0;后就反回主程序了,就是说主程序While(1)这个是一个死循环,
反回了之后,当然还是数码管显示了..

使用特权

评论回复
9
jackxn|  楼主 | 2009-8-15 13:42 | 只看该作者
谢谢楼上几位大侠,我在程序中加入了
TCON=0x01;语句之后现象没有变化,我是用一根导线把STC89C52的P3.2跟地连在一起的,连上时灯点亮,数码管继续循环,当把线拿开时灯熄灭,数码管继续循环。我真的是无奈了,还请各位大侠继续指导。

使用特权

评论回复
10
s46410864| | 2009-8-15 14:03 | 只看该作者
我不是和你说了么,WHILE(1)这个循环,当中断后,又回到这里,数码管还是显示的.
如果你要中断后不显示,那改成这样,前面定义个变量A=1之后 while(A){}中断中写:
void exter0() interrupt 0
{
        d1=0;  
        A=0;      
}
这样就跳出循环了..

使用特权

评论回复
11
jackxn|  楼主 | 2009-8-15 15:28 | 只看该作者
我明白前辈您的意思,但是我看单片机视频教程里面,
在中断时数码管停止。
中断返回时数码管继续,
这怎样解释呢?

使用特权

评论回复
12
s46410864| | 2009-8-15 15:35 | 只看该作者
中断的时候进入中断子程序..你那个数码显示就停了,.
但是你这个程序中.中断子程序所用的时间很短.你这个中断只有一句,用肉眼是看不出来中断时候的时间的
所以,再你看来,一直都是数码管再走,如果你在中断子程序中加个延时,你就会发现数码管停止的

使用特权

评论回复
13
救火车| | 2009-8-15 15:37 | 只看该作者
路过。顺便说一句,请把"using 1 "加到中断函数后边。
void exter0() interrupt 0 using 1

使用特权

评论回复
14
chen3bing| | 2009-8-15 16:10 | 只看该作者
果如12楼所说。

使用特权

评论回复
15
jackxn|  楼主 | 2009-8-15 20:38 | 只看该作者
十分感谢各位大侠的鼎力相助,在中断服务程序中加入延时可以使数码管停止。
当数码管停止到设定的时间后,数码管继续正常循环(此时P3.2仍给低电平),当我把P3.2的短接线拿掉以后,数码管还会出现一段时间的停止,停止时间为设定的时间,小弟不知这是为何?我拿掉短接线之后,P3.2就是高电平了,为什么会再次进入中断服务程序?再次请各位大侠指导!
谢谢!
非常感谢!

使用特权

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

本版积分规则

个人签名:STC16F2407

16

主题

136

帖子

0

粉丝