单片机学习笔记(四)——中断

来源:互联网 发布:怎么上传源码到空间 编辑:程序博客网 时间:2024/06/11 12:43
一、中断的概念:
            (1)CPU 在处理某一事件 A 时,发生了另一事件 B 请求 CPU 迅速去处理(中断发生);
            (2)CPU 暂时中断当前的工作,转去处理事件 B中断响应和中断服务);
            (3)待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被中断的地方继续处理事件 A中断返回),
    这一过程称为中断 。
        中断源:
            引起 CPU 中断的根源,称为中断源
        中断返回:
            中断源向 CPU 提出的中断请求。CPU 暂时中断原来的事务 A,转去处理事件 B。对事件 B 处理完毕后,再回到原来被中断的地方(即断点),称为中断返回
        中断系统:
             实现上述中断功能的部件(即中断机构),称为中断系统

        中断技术的优点:
                (1)分时操作:CPU 可以分时为多个 I / O 设备服务,提高了计算机的利用率;
                (2)实时响应:CPU 能够及时处理应用系统的随机事件,系统的实时性大大增强;
                (3)可靠性高:CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。
    二、80C51中断系统的结构:
        80C51的中断系统有 5 个中断源(8052有 6个) ,2个优先级,可实现二级中断嵌套 。
        1.P3.2)可由 IT0 (TCON.0)选择其为低电平有效还是下降沿有效。当 CPU 检测到 P3.2 引脚上出现有效的中断信号时,中断标志 IE0TCON.1)置 1,向 CPU 申请中断。
        2.P3.3可由 IT1 (TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到 P3.3 引脚上出现有效的中断信号时,中断标志 IE1 (TCON.3)置 1 ,向 CPU 申请中断。
        3. TF0TCON.5),片内定时 / 计数器 T0 溢出中断请求标志。当定时 / 计数器 T0 发生溢出时,置位 TF0,并向CPU 申请中断。
        4. TF1TCON.7),片内定时/计数器 T1 溢出中断请求标志。当定时/计数器 T1 发生溢出时,置位 TF1,并向CPU 申请中断。
        5. RISCON.0)或 TISCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位 RI 或当串行口发送完一帧串行数据时置位 TI,向CPU申请中断。 

    三、中断请求标志:
        1、TCON的中断标志:
        
            IT0TCON.0),外部中断0触发方式控制位。
                当 IT0 = 0 时,为电平触发方式
                 IT0 = 1 时,为边沿触发方式(下降沿有效)。
            IE0TCON.1),外部中断 0 中断请求标志位。
            IT1TCON.2),外部中断 1 触发方式控制位。
            IE1TCON.3),外部中断 1 中断请求标志位。
            TF0TCON.5),定时 / 计数器 T0 溢出中断请求标志位。
            TF1TCON.7),定时 / 计数器 T1 溢出中断请求标志位。

         2、SCON的中断标志:
         
            RISCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位 RI。            注意,RI 必须由软件清除。
            TISCON.1),串行口发送中断标志位。当 CPU 将一个发送数据写入串行口发送缓冲器时,就启动了发送过          程。每发送完一个串行帧,由硬件置位 TI 。CPU 响应中断时,不能自动清除 TITI 必须由软件清除。

    四、80C51 中断控制
        1、中断允许控制
                CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 IE 控制的。

          
                EX0IE.0,外部中断 0 允许位;
                ET0IE.1,定时/计数器T0中断允许位; 
                EX1IE.2),外部中断 0 允许位;
                ET1IE.3),定时 / 计数器 T1 中断允许位;
                ESIE.4,串行口中断允许位;
                EAIE.7), CPU 中断允许(总允许)位。
         2、中断优先级控制
                80C51 单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级          寄存器 IP 中的相应位的状态来规定的 。

            
                PX0IP.0),外部中断 0 优先级设定位;
                PT0IP.1),定时 / 计数器 T0 优先级设定位;
                PX1IP.2),外部中断 0 优先级设定位;
                PT1IP.3),定时 / 计数器 T1 优先级设定位;
                PS  (IP.4),串行口优先级设定位;
                PT2IP.5,定时 / 计数器 T2 优先级设定位。
 
        (1)同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:
        
        
         (2)80C51单片机中断优先级三条原则
               (1)CPU同时接收到几个中断时,首先响应优先级别最高的中断请求
                (2)正在进行的中断过程不能被新的同级或低优先级的中断请求所中断
                (3)正在进行的低优先级中断服务,能被高优先级中断请求所中断
         为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置 1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置 1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。

    五、中断响应条件
       (1)中断源有中断请求;
        (2)此中断源的中断允许位为 1;
        (3)CPU 开中断(即 EA = 1)。

    六、中断程序:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit dula = P2^6;//段选
  5. sbit wela = P2^7;//位选
  6. sbit d1 = P1^0;//P1 口 0 号 LED
  7. uchar num;
  8. uchar code table[]={ //LED 数字编码
  9. 0x3f,0x06,0x5b,0x4f,
  10. 0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,
  12. 0x39,0x5e,0x79,0x71};
  13. void delay(uint z);
  14. void main()
  15. {
  16. EA = 1;//开总中断
  17. EX0 = 1;//开外部中断0
  18. //IT0 = 1;
  19. TCON = 0x01;
  20. wela = 1;//11101010 打开锁存器
  21. P0 = 0xea;//选择数码管
  22. wela = 0;//锁住数码管
  23. while(1)
  24. {
  25. for(num = 0; num < 16; num++)
  26. {
  27. d1 = 1; //关闭LED
  28. dula = 1;//打开锁存器
  29. P0 = table[num];//数码管入值
  30. dula = 0;//锁住数码管输入值
  31. delay(1000);//延时1s
  32. }
  33. }
  34. }
  35. void Delay(unsigned int xx) //输入 xx :ms
  36. {
  37. while(xx--)
  38. {
  39. Delay1ms();
  40. }
  41. }
  42. void Delay1ms()//@11.0592MHz 1ms
  43. {
  44. unsigned char i, j;
  45. _nop_();
  46. _nop_();
  47. _nop_();
  48. i = 11;
  49. j = 190;
  50. do
  51. {
  52. while (--j);
  53. } while (--i);
  54. }
  55. void exter0() interrupt 0 //中断程序,0 为 中断号
  56. {
  57. d1=0;//打开LED
  58. }
1 0