打印
[51单片机]

中断是以什么为基准判断是否执行中断

[复制链接]
1740|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
快鲨1|  楼主 | 2019-4-8 07:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

sbit KEY4 = P2^7;

unsigned char code LedChar[]={
        0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
        0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
        };

bit KeySta = 1;

void main()
{
        bit backup = 1;
        unsigned char cnt = 0;

        EA = 1;
        ENLED = 0;
        ADDR3 = 1;
        ADDR2 = 0;
        ADDR1 = 0;
        ADDR0 = 0;
        TMOD = 0x01;
        TH0 = 0xF8;
        TL0 = 0xCD;
        ET0 = 1;
        TR0 = 1;
        P2 = 0xF7;
        P0 = LedChar[cnt];

        while(1)
        {
           if(KeySta != backup)
           {
                           if(backup == 0)
                        {
                                cnt++;
                                if(cnt >= 10)
                                {
                                        cnt = 0;
                                }
                                P0 = LedChar[cnt];
                        }
                        backup = KeySta;
           }
               
        }
}

void InterruptTimer0() interrupt 1
{
        static unsigned char keybuf = 0xFF;

        TH0 = 0xF8;
        TL0 = 0xCD;

        keybuf = (keybuf <<1) |KEY4;         
        if(keybuf == 0x00)
        {
                KeySta = 0;
        }
        else if(keybuf == 0xFF)
        {
                KeySta = 1;
        }
        else
        {
        }

}
这个代码是以什么基准判断是否进入中断的,是2ms后还是按下按键那一刻开始进入中断?

使用特权

评论回复

相关帖子

沙发
请叫我树人| | 2019-4-8 08:26 | 只看该作者
帮你顶住啊!

使用特权

评论回复
板凳
ayb_ice| | 2019-4-8 08:40 | 只看该作者
定时中断,
中断里读按键,类似于队列,只不过变量为一个BIT,利用一个字节(8BIT)当缓冲区而已,队列全为0表示稳定按下,为全1(0xFF)为稳定松开,部分这0状态不变,主程序检测状态是否改变,改变则做相应动作

使用特权

评论回复
地板
mcu5i51| | 2019-4-8 09:09 | 只看该作者
是否中断和按键无关

使用特权

评论回复
5
快鲨1|  楼主 | 2019-4-9 07:20 | 只看该作者
ayb_ice 发表于 2019-4-8 08:40
定时中断,
中断里读按键,类似于队列,只不过变量为一个BIT,利用一个字节(8BIT)当缓冲区而已,队列全为 ...

还是有一点不明白,TMOD=0X01,TH0=0XF8,TL0=0XCD只是计时而已,没有像调用函数那样,那么中断函数是怎么知道是时间到了就进入中断呢?我不了解的就是这个地方,这个中断函数不像main调用函数那样会在主函数main里面写出调用函数InterrupTimer0()。我不知道什么时候执行中断,什么时候不执行。虽说现在是知道是定时2ms后执行中断,但是变一个例子我就又不知道了。

使用特权

评论回复
评论
congfenglong 2019-4-9 08:25 回复TA
这就需要你多了解单片机原理了,这是有中断源和中断入口的,你只需要知道如果你开了定时器溢出中断,那么就会产生这个中断地址的中断向量,就像你写的那个interrupt后面那个如果你写的不是1,是其他数值就不会进入执行这个中断函数,因为中断地址不匹配 
6
ayb_ice| | 2019-4-9 08:37 | 只看该作者
快鲨1 发表于 2019-4-9 07:20
还是有一点不明白,TMOD=0X01,TH0=0XF8,TL0=0XCD只是计时而已,没有像调用函数那样,那么中断函数是怎么 ...

这就是计算机原理的问题了,
这与硬件有关,看相关书籍吧

使用特权

评论回复
7
tianxj01| | 2019-4-9 08:39 | 只看该作者
快鲨1 发表于 2019-4-9 07:20
还是有一点不明白,TMOD=0X01,TH0=0XF8,TL0=0XCD只是计时而已,没有像调用函数那样,那么中断函数是怎么 ...

中断是一类特别的函数,他们的执行,不是由主函数调用,也不是中断函数本身去判断,而是符合中断条件的,就会自动执行,一旦触发,它会打断别的正常线程,所以叫做中断函数。比如IO口中断,在检测到端口的边沿或者电平变化,就会触发该中断。又比如串口接受中断,当串口接受到一个完整的8或9位数据,就会申请串口接受中断。
定时器中断函数是不需要知道是不是时间到了,像这里的定时器中断,是在定时器设置里面,预先确定了计数模式等等定时器工作条件,然后打开中断允许开关,一旦定时器启动,到了设定的时间,就会引发这个定时中断。
中断是单片机能够非常迅速实时处理各种情况的唯一最强大手段,没有之一。如果没有中断,单片机不是很傻,就是很迟钝。所以,详细的理解中断及其运行机理,是单片机学习的核心课程,好好下点功夫吧..............

使用特权

评论回复
8
diy1997| | 2019-4-9 11:18 | 只看该作者
快鲨1 发表于 2019-4-9 07:20
还是有一点不明白,TMOD=0X01,TH0=0XF8,TL0=0XCD只是计时而已,没有像调用函数那样,那么中断函数是怎么 ...

中断响应处理不用在主函数里调用,

只要触发中断事件发生并允许中断,

就会自动执行了。

使用特权

评论回复
9
快鲨1|  楼主 | 2019-4-9 17:30 | 只看该作者
tianxj01 发表于 2019-4-9 08:39
中断是一类特别的函数,他们的执行,不是由主函数调用,也不是中断函数本身去判断,而是符合中断条件的, ...

我应该怎么理解有中断函数的程序?我是不是可以理解成中断函数和main函数同时运行,当中断函数检测到条件满足时就运行中断?

使用特权

评论回复
10
tianxj01| | 2019-4-9 17:43 | 只看该作者
快鲨1 发表于 2019-4-9 17:30
我应该怎么理解有中断函数的程序?我是不是可以理解成中断函数和main函数同时运行,当中断函数检测到条件 ...

这么理解马马虎虎部分算对。
准确的说法是,中断函数平时是不运行的,只有符合中断触发条件,才运行,而且运行的时候,main函数或者其他正在调用的子函数将被打断运行,待中断函数完成后,继续一步一步的退回到中断现场,继续执行。所以,同时运行的说法并不准确。
一个完整的程序,可能有10个子函数,一个main函数,还有4-5个中断函数,为了准确的处理各个不同中断同时发生的中断请求,单片机还设置了中断优先级,也就是优先级高的中断,可以中断优先级低的中断函数的运行,待优先级高的中断完成后,再完成优先级低的中断函数,然后再返回main。
正因为中断函数是打断运行的其他主函数或者子函数,所以,中断函数运行时候,就必须进行断点现场保护,单片机中一般用堆栈来解决这个问题。
现在用C语言编程的单片机,这些具体的实现动作,都由编译器本身来完成,而我们并不需要去干涉,我们只需要搞清楚中断优先级和中断函数入口号就OK了。

使用特权

评论回复
11
快鲨1|  楼主 | 2019-4-9 19:48 | 只看该作者
本帖最后由 快鲨1 于 2019-4-9 19:51 编辑
tianxj01 发表于 2019-4-9 17:43
这么理解马马虎虎部分算对。
准确的说法是,中断函数平时是不运行的,只有符合中断触发条件,才运行,而 ...

那我如何知道这个中断是因为什么原因执行的?例如上面程序计时2ms后进入中断,我怎么知道这个中断是因为2ms到了才进入的?

使用特权

评论回复
12
tianxj01| | 2019-4-10 08:38 | 只看该作者
快鲨1 发表于 2019-4-9 19:48
那我如何知道这个中断是因为什么原因执行的?例如上面程序计时2ms后进入中断,我怎么知道这个中断是因为2m ...

2mS,不是你怎么知道的。而是你在对time设置的时候由你的程序决定的,你设置了time在2mS间隔就会发生中断,那么当time运行了以后,中断自然就发生了。
你到现在还要这样问,我都不知道该回答你怎么知道的了。
不要在完全莫名其妙的时候提那种莫名其妙的问题,去好好的学习一下单片机关于中断部分的知识。

使用特权

评论回复
13
ayb_ice| | 2019-4-10 08:41 | 只看该作者
快鲨1 发表于 2019-4-9 19:48
那我如何知道这个中断是因为什么原因执行的?例如上面程序计时2ms后进入中断,我怎么知道这个中断是因为2m ...

这个取决于中断源,
对于定时器只有溢出后才产生中断(其实也可以软件置位相应标志产生中断),
这取决于具体芯片设计
中断程序可以通过判断中断标志判定产生中断的原因

使用特权

评论回复
14
少女姐姐| | 2019-4-10 08:42 | 只看该作者
快鲨1 发表于 2019-4-9 17:30
我应该怎么理解有中断函数的程序?我是不是可以理解成中断函数和main函数同时运行,当中断函数检测到条件 ...

可以这么理解 ,我以前也总是理解不了中断,有些理论不需要过多纠结,只要会用就行了,你可以这么理解,中断属于内核事件,与主函数无关,当达到了中断的条件后就产生中断,一般的51单片机中断的用法都是当中断产生时,起一个标识符,
if(满足中断条件)
{
    Interrupt = 1;
}

然后
if(Interrupt)
{
   .....要做的事情....
}

使用特权

评论回复
15
少女姐姐| | 2019-4-10 08:44 | 只看该作者
tianxj01 发表于 2019-4-10 08:38
2mS,不是你怎么知道的。而是你在对time设置的时候由你的程序决定的,你设置了time在2mS间隔就会发生中断 ...

你设置的2ms,  那中断的条件则是2ms, 2ms即为中断条件

使用特权

评论回复
16
coody| | 2019-4-10 14:42 | 只看该作者
1、允许中断。
2、有中断函数。
3、有中断标志出现。
就会进入中断。

使用特权

评论回复
17
快鲨1|  楼主 | 2019-4-13 10:18 | 只看该作者
十分感谢各位,我根据各位的解答在网上查找资料已经明白了。

使用特权

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

本版积分规则

13

主题

45

帖子

0

粉丝