[51单片机] 中断是以什么为基准判断是否执行中断

[复制链接]
2386|17
 楼主| 快鲨1 发表于 2019-4-8 07:15 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>

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

  7. sbit KEY4 = P2^7;

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

  12. bit KeySta = 1;

  13. void main()
  14. {
  15.         bit backup = 1;
  16.         unsigned char cnt = 0;

  17.         EA = 1;
  18.         ENLED = 0;
  19.         ADDR3 = 1;
  20.         ADDR2 = 0;
  21.         ADDR1 = 0;
  22.         ADDR0 = 0;
  23.         TMOD = 0x01;
  24.         TH0 = 0xF8;
  25.         TL0 = 0xCD;
  26.         ET0 = 1;
  27.         TR0 = 1;
  28.         P2 = 0xF7;
  29.         P0 = LedChar[cnt];

  30.         while(1)
  31.         {
  32.            if(KeySta != backup)
  33.            {
  34.                            if(backup == 0)
  35.                         {
  36.                                 cnt++;
  37.                                 if(cnt >= 10)
  38.                                 {
  39.                                         cnt = 0;
  40.                                 }
  41.                                 P0 = LedChar[cnt];
  42.                         }
  43.                         backup = KeySta;
  44.            }
  45.                
  46.         }
  47. }

  48. void InterruptTimer0() interrupt 1
  49. {
  50.         static unsigned char keybuf = 0xFF;

  51.         TH0 = 0xF8;
  52.         TL0 = 0xCD;

  53.         keybuf = (keybuf <<1) |KEY4;         
  54.         if(keybuf == 0x00)
  55.         {
  56.                 KeySta = 0;
  57.         }
  58.         else if(keybuf == 0xFF)
  59.         {
  60.                 KeySta = 1;
  61.         }
  62.         else
  63.         {
  64.         }

  65. }
这个代码是以什么基准判断是否进入中断的,是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 | 显示全部楼层
是否中断和按键无关
 楼主| 快鲨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后执行中断,但是变一个例子我就又不知道了。

评论

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

这就是计算机原理的问题了,
这与硬件有关,看相关书籍吧
tianxj01 发表于 2019-4-9 08:39 | 显示全部楼层
快鲨1 发表于 2019-4-9 07:20
还是有一点不明白,TMOD=0X01,TH0=0XF8,TL0=0XCD只是计时而已,没有像调用函数那样,那么中断函数是怎么 ...

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

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

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

就会自动执行了。
 楼主| 快鲨1 发表于 2019-4-9 17:30 | 显示全部楼层
tianxj01 发表于 2019-4-9 08:39
中断是一类特别的函数,他们的执行,不是由主函数调用,也不是中断函数本身去判断,而是符合中断条件的, ...

我应该怎么理解有中断函数的程序?我是不是可以理解成中断函数和main函数同时运行,当中断函数检测到条件满足时就运行中断?
tianxj01 发表于 2019-4-9 17:43 | 显示全部楼层
快鲨1 发表于 2019-4-9 17:30
我应该怎么理解有中断函数的程序?我是不是可以理解成中断函数和main函数同时运行,当中断函数检测到条件 ...

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

那我如何知道这个中断是因为什么原因执行的?例如上面程序计时2ms后进入中断,我怎么知道这个中断是因为2ms到了才进入的?
tianxj01 发表于 2019-4-10 08:38 | 显示全部楼层
快鲨1 发表于 2019-4-9 19:48
那我如何知道这个中断是因为什么原因执行的?例如上面程序计时2ms后进入中断,我怎么知道这个中断是因为2m ...

2mS,不是你怎么知道的。而是你在对time设置的时候由你的程序决定的,你设置了time在2mS间隔就会发生中断,那么当time运行了以后,中断自然就发生了。
你到现在还要这样问,我都不知道该回答你怎么知道的了。
不要在完全莫名其妙的时候提那种莫名其妙的问题,去好好的学习一下单片机关于中断部分的知识。
ayb_ice 发表于 2019-4-10 08:41 | 显示全部楼层
快鲨1 发表于 2019-4-9 19:48
那我如何知道这个中断是因为什么原因执行的?例如上面程序计时2ms后进入中断,我怎么知道这个中断是因为2m ...

这个取决于中断源,
对于定时器只有溢出后才产生中断(其实也可以软件置位相应标志产生中断),
这取决于具体芯片设计
中断程序可以通过判断中断标志判定产生中断的原因
少女姐姐 发表于 2019-4-10 08:42 | 显示全部楼层
快鲨1 发表于 2019-4-9 17:30
我应该怎么理解有中断函数的程序?我是不是可以理解成中断函数和main函数同时运行,当中断函数检测到条件 ...

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

然后
if(Interrupt)
{
   .....要做的事情....
}
少女姐姐 发表于 2019-4-10 08:44 | 显示全部楼层
tianxj01 发表于 2019-4-10 08:38
2mS,不是你怎么知道的。而是你在对time设置的时候由你的程序决定的,你设置了time在2mS间隔就会发生中断 ...

你设置的2ms,  那中断的条件则是2ms, 2ms即为中断条件
coody 发表于 2019-4-10 14:42 | 显示全部楼层
1、允许中断。
2、有中断函数。
3、有中断标志出现。
就会进入中断。
 楼主| 快鲨1 发表于 2019-4-13 10:18 | 显示全部楼层
十分感谢各位,我根据各位的解答在网上查找资料已经明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

45

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部