📅  最后修改于: 2021-01-01 02:52:16             🧑  作者: Mango
8051单片机中断
这是一个子程序调用,由微控制器给出,它要求其他一些具有较高优先级的程序来获取系统总线,而不是当前正在运行的程序中发生中断。
中断提供了一种方法来推迟或延迟当前进程,执行子例程任务,然后再次重新启动标准程序。
8051微控制器中的中断类型
让我们看看8051微控制器中的五个中断源:
- 定时器0溢出中断-TF0
- 外部硬件中断-INT0
- 定时器1溢出中断-TF1
- 外部硬件中断-INT1
- 串行通讯中断-RI / TI
定时器和串行中断由微控制器内部产生,而外部中断由与微控制器外部连接的附加接口设备或开关产生。这些外部中断可以是电平触发或边沿触发。
当发生中断时,微控制器执行中断服务程序。因此,存储器位置对应于中断使能它。考虑下面的中断向量表中所示的与存储器位置相对应的中断。
8051单片机的中断结构
“复位”后,所有中断均被禁用,因此,所有中断均由软件启用。从所有五个中断中,如果任何一个或所有中断被激活,这将设置相应的中断标志,如图所示,该标志与8051微控制器的中断结构相对应:
所有中断都可以通过某些特殊功能寄存器来设置或清除,该特殊函数寄存器也称为中断使能(IE),它完全取决于优先级,该优先级是通过使用中断优先级寄存器执行的。
中断使能(IE)寄存器
IE寄存器用于启用和禁用中断。这是一个位可寻址的寄存器,其中必须将EA值设置为1才能使能中断。该寄存器中的各个位使能特定的中断,如定时器,串行和外部输入。考虑下面的IE寄存器,该位对应于1激活中断而0禁用中断。
中断优先级寄存器(IP)
如图所示,使用IP寄存器可以通过清除或设置中断优先级(IP)寄存器中的单个位来更改中断的优先级。它允许低优先级中断可以中断高优先级中断,但它通过使用另一个低优先级中断来禁止中断。如果未对中断的优先级进行编程,则微控制器以预定义的方式执行指令,其顺序为INT0,TF0,INT1,TF1和SI。
8051中的中断编程
- 定时器中断编程:在微控制器中,定时器1和定时器0中断由时间寄存器位TF0和TF1产生。此计时器中断通过C代码进行的编程涉及:
- 选择TMOD寄存器的配置及其操作模式。
- 启用IE寄存器和其中的相应定时器位。
- 通过使用适当的操作模式选择并加载TLx和THx的初始值。
- 设置用于启动计时器的计时器运行位。
- 编写计时器子例程,并在子例程末尾清除TRx的值。
让我们看一下使用Timer0模型的计时器中断编程,以使用中断方法使LED闪烁:
- #include < reg51 .h >
- 比特闪烁指示灯= P2 ^ 0; // LED连接到端口2的零引脚
- void timer0_ISR(void)中断1 //中断号定时器0为1
- {
- 闪烁指示灯=〜闪烁指示灯; //中断时闪烁LED
- TH0 = 0xFC ; //将初始值加载到计时器
- TL0 = 0x66 ;
- }
- 无效main()
- {
- TMOD = 0x0l ; // Timer0的模式1
- TH0 = 0xFC ://初始值已加载到计时器
- TL0 = 0x66 :
- ET0 = 1 ; //使能定时器0中断
- TR0 = 1 ; //启动计时器
- 而(1); // 没做什么
- }
- 外部硬件中断编程
单片机8051由两个外部硬件中断组成:如上所述的INT0和INT1。这些中断在引脚3.2和3.3启用。它可以是电平触发或边沿触发。在电平触发中,引脚3.2的低电平信号使能中断,而引脚3.2的高电平至低电平跃迁使能边沿触发的中断。
让我们看看8051微控制器的可编程功能是:
- 使能中断允许(IE)寄存器中外部中断的等效位。
- 如果是电平触发,则写入适合该中断的子程序,或者使能TCON寄存器中与边沿触发的中断相对应的位。
考虑边缘触发的外部硬件中断编程是:
- 无效main()
- {
- IT0 = 1 ; //将中断0配置为INT0的下降沿
- EXO = 1 ; //启用EX0中断
- EA = 1 ; //启用全局中断标志
- }
- ISR_ex0(无效)中断0
- {
- <中断主体>
- }
- 串行通信中断编程当需要发送或接收数据时使用。由于传输中断(TI)和接收方中断(RI)标志都使用了一个中断位,因此中断服务程序(ISR)必须检查这些标志以了解实际的中断。 RI和TI标志的逻辑或运算导致中断,并且仅由软件清除即可。考虑串行通信中断编程中涉及的步骤:-
- 配置中断使能寄存器以使能串行中断。
- 配置SCON寄存器以执行传输和接收操作。
- 为给定的中断编写一个具有适当函数的子程序。
让我们看一下使用串行中断通过9600波特率通过串行端口发送“ E”的程序:
- 无效main()
- {
- TMOD = 0x20 :
- TH1 = 0xFD ; // 9600 bps的波特率
- SCON = 0x50 ;
- TR1 = 1;
- EA = 1 ;
- whlle(l);
- }
- ISR_Serial(void)中断4
- {
- 如果( TI == l)
- {
- SBUF =?E ?;
- TI = 0 ;
- }
- 其他
- RI = 0 ;
- }