51单片机的默认中断优先级都是低级及中断嵌套
51单片机的中断优先级及中断嵌套
51 单片机的中断优先级及中断嵌套
说最基本的,老的51 单片机(80C51 系列)有5 个中断源,2 个优先级,
可以实现二级中断服务嵌套。
现在很多扩展的51 单片机已经有4 个优先级(或更多)和更多的中断源了。
在说到中断之前,我先来定义一下优先级,明白了什幺是优先级,后面的阐述就容易明白了。
实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。
中断的优先级有两个:查询优先级和执行优先级。
什幺是查询优级呢?我们从datasheet 或书上看到的默认(IP 寄存器不做设
置,上电复位后为00H)的优先级:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断
或int0,timer0,int1,timer1,serial port 或INT0、T0、INT1、T1、UART
或PX0>PT0>PX1>PT1>PS>......
其实都是查询优级。
首先查询优先级是不可以更改和设置的。
这是一个中断优先权排队的问题。
是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。
而这与是否发生中断服务程序的嵌套毫不。
51单片机中断:寄存器与优先级
51单⽚机中断:寄存器与优先级中断与定时器通常定时器⼀般⽤法都是采取中断⽅式来做,但中断和定时器并⾮同⼀种东西,定时器按照⼀定设置后会触发中断,但还有外部中断,UART这些设置后都可以触发中断.定时器是单⽚机模块的⼀个资源,确确实实存在的⼀个模块。
中断是单⽚机的⼀种运⾏机制。
中断相关寄存器IE: 中断使能寄存器的位分配(地址0xA8, 可位寻址)位76543210符号EA--ET2ES ET1EX1ET0EX0复位值0--000000中断使能寄存器的位描述位符号描述7EA总中断使能位,相当于总开关6--5ET2定时器 2 中断使能4ES串⼝中断使能3ET1定时器 1 中断使能2EX1外部中断 1 使能1ET0定时器 0 中断使能0EX0外部中断 0 使能中断函数的使⽤单⽚机如何找到中断函数的?单⽚机借助中断向量地址来调⽤中断函数,中断向量地址⼜是如何计算的?中断函数interrupt后⾯中断函数标号的数字x就是根据中断向量地址得出的,其计算⽅法为:向量地址=x∗8+3具体向量地址见下⼀节中断序列查询表中断序列查询中断序列查询表中断函数编号中断名称中断标志位中断使能位中断向量地址默认优先级0外部中断 0IE0EX00x00031(最⾼)1T0中断TF0ET00x000B22外部中断1IE1EX10x001333T1中断TF1ET10x001B44UART中断TI/RI ES0x002355T2中断TF2/EXF2ET20x002B6中断优先级寄存器中断优先级有两种,⼀种是抢占优先级,⼀种是固有优先级抢占优先级IP寄存器-中断优先级寄存器的位分配(地址 0xB8、可位寻址)位76543210符号----PT2PS PT1PX1PT0PX0复位值----000000中断优先级寄存器的位描述位符号描述7--6--5PT2定时器 2 中断优先级控制位4PS串⼝中断优先级控制位3PT1定时器 1 中断优先级控制位2PX1外部中断 1 中断优先级控制位1PT0定时器 0 中断优先级控制位0PX0外部中断 0 中断优先级控制位IP这个寄存器的每⼀位,表⽰对应中断的抢占优先级,每⼀位的复位值都是0,当把某⼀位设置为1的时候,这⼀位的优先级就⽐其它位的优先级⾼了。
单片机中的中断优先级与中断嵌套技术研究
单片机中的中断优先级与中断嵌套技术研究中断是单片机中的重要概念之一,它能够在特定条件下打断正常的程序执行流程,跳转到一个处理特定事件的子程序中执行,然后再回到原来的程序继续执行。
中断优先级和中断嵌套技术是单片机中处理中断的两个重要方面,对于中断服务程序的优化和系统性能的提升具有重要意义。
一、中断优先级的基本概念与作用中断优先级是指在多个中断请求同时到达时,根据设定的优先级确定哪个中断请求优先被处理。
单片机中的中断优先级是通过硬件电路实现的,不同的单片机具有不同数量的中断优先级位,即能够支持的中断请求个数。
中断优先级主要用于解决中断冲突问题。
当多个中断请求同时发生时,通过设置不同的中断优先级,可以确保高优先级的中断请求先被响应并进行处理。
这样可以提高系统的响应速度,保证重要事件的及时处理。
在设定中断优先级时,需要根据系统的实际需求来确定各个中断的优先级,一般会根据中断请求的紧急程度、重要性以及处理时间的长短等因素进行判断。
通常,系统关键性的中断请求具有较高的优先级,而次要的中断请求则具有较低的优先级。
二、中断嵌套技术的基本概念与实现中断嵌套是指在一个中断服务程序中,允许发生更高优先级的中断请求,并且暂时挂起当前正在执行的中断程序,转而处理更高优先级的中断请求。
中断嵌套技术在确保高优先级事件得到及时处理的同时,也提高了单片机系统的灵活性和效率。
1. 中断嵌套的实现方式单片机中的中断嵌套可以通过软件或硬件方式实现。
(1)软件方式:在编写中断服务程序时,可以通过设置相关的标志位来控制中断嵌套。
当中断请求到来时,会首先检查标志位,如果允许嵌套,则挂起当前中断程序,跳转到更高优先级的中断服务程序中执行;如果不允许嵌套,则忽略该中断请求。
(2)硬件方式:某些单片机芯片内部集成了硬件中断嵌套功能。
通过设置相应的硬件寄存器,可以实现中断嵌套的功能。
硬件方式能够更好地支持多个中断请求的处理和优先级设置,具有更高的灵活性和效率。
单片机题库 (1)
单片机题库一:判断题您的姓名: [填空题] *_________________________________1、#define LED P2是宏定义,即用P2来代替LED。
[判断题] *对错(正确答案)2、X>>1表示将X中的各个位都向左移动1位,右边空出来的位用0补足。
[判断题] *对错(正确答案)3、在C语言中,函数体部分需要用{ }括起来。
() [单选题] *A、对(正确答案)B、错4、a==1表示将变量a赋值为1 [判断题] *对错(正确答案)5、51单片机的每个中断源都具有高低两个中断优先级。
[判断题] *对错(正确答案)4、int型数据和无符号int型数据的取值范围是一样的。
[判断题] *对错(正确答案)5、数组中的数据可以是不同类型的。
[判断题] *对错(正确答案)6、在C语言中,常量可以是数值型常量也可以是符号型常量 [判断题] *对(正确答案)错7、数组可以分为一维数组,二维数组和多维数组。
[判断题] *对(正确答案)错8、在LED闪烁方式控制的电路所用的发光二极管具有单向导通性。
[判断题] *对(正确答案)错9、#define LED P2是宏定义,即用P2来代替LED。
[判断题] *对错(正确答案)10、算数运算符%表示取余运算,10%3的结果是1。
[判断题] *对(正确答案)错11、C语言中一个分号可以作为一个执行语句。
[判断题] *错12、拉幕灯实验中使用到的LED灯是发光二极管,它具有单向导通性。
[判断题] *对(正确答案)错13、同级优先级不能相互断。
[判断题] *对(正确答案)错14、除法运算7/3的结果是1。
[判断题] *对错(正确答案)15、void delay_1ms(uint x)该函数有一个参数x [判断题] *对(正确答案)错16、陶瓷电容和电解电容在结构上是相同的,在硬件电路中可互换。
[判断题] *对错(正确答案)13、8段LED数码管显示器只有共阳极结构。
第5章 习题参考答案
第五章习题参考答案一、填空题1、MCS-51有5个中断源,2个中断优先级,优先级由软件填写特殊功能寄存器 IP 加以选择。
2、外中断请求标志位是 IE0 和 IE1 。
3、 RETI 指令以及任何访问 IE 和 IP 寄存器的指令执行过后,CPU不能马上响应中断。
4、8051单片机响应中断后,产生长调用指令LCALL,执行该指令的过程包括:首先把 PC的内容压入堆栈,以进行断点保护,然后把长调用指令的16位地址送 PC ,使程序执行转向程序存储器中的中断地址区。
二、选择题:1、在中断服务程序中,至少应有一条( D )。
A、传送指令B、转移指令C、加法指令D、中断返回指令2、要使MCS-51能够响应定时器T1中断,串行接口中断,它的中断允许寄存器IE的内容应是( A )。
A、 98HB、 84HC、 42HD、 22H3、MCS-51响应中断时,下列哪种操作不会发生( A )A、保护现场B、保护PCC、找到中断入口D、保护PC转入中断入口4、MCS-51中断源有( A )A、 5个B、 2个C、 3个D、6个5、计算机在使用中断方式与外界交换信息时,保护现场的工作应该是( C )A、由CPU自动完成B、在中断响应中完成C、应由中断服务程序完成D、在主程序中完成6、MCS-51的中断允许触发器内容为83H,CPU将响应的中断请求是( D )。
A、 INT0,INT1B、 T0,T1C、 T1,串行接口D、 INT0,T07、若MCS-51中断源都编程为同级,当它们同时申请中断时,CPU首先响应( B )。
A、 INT1B、 INT0C、 T1D、T08、当CPU响应串行接口中断时,程序应转到( C )。
A、 0003HB、 0013HC、 0023HD、 0033H9、执行MOV IE,#03H后,MCS-51将响应的中断是( D )。
A、 1个B、 2个C、 3个D、0个10、外部中断1固定对应的中断入口地址为( C )。
MCS-51作业讲解
③ 位地址7CH与字节地址7CH如何区别?位地址 7CH具体在片内RAM中什么位置?
答:位地址7CH与字节地址7CH靠所使用的指令 或指令中所使用的寄存器来区别,当使用 位指令或指令中使用“C”寄存器时表明此 时的地址是位地址,其余情况均为字节地 址。 位地址7CH具体在片内RAM2FH单元中D4位。
CJNE A,30H,NEXT ;两数比较,不等转NEXT SJMP NOCHA ;相等转NOCHA(不交换位置)
NEXT:JNC NOCHA;C=0则(A)>(30H)不交换, 转NOCHA(@R1>R0@)
MOV @R0,A;交换R0与R1指向单元的数 XCH A,30H ;将@R1中的数(A)与30H
⒍ MCS-51单片机如何实现工作寄存器组 R0-R7的选择?
答:用户可通过改变PSW中的RS1和RS0的 两位的值选择相应的工作寄存器组。
⒎什么是时钟周期、机器周期、指令周期?当 单片机时钟频率为12 MHz时,一个机器周期 是多少?ALE引脚的输出频率是多少?
答:时钟周期:指为单片机提供时钟信号的振 荡源的周期.
(原R0 )交换 MOV @R1,A;使A(原R0中数)→@R1 NOCHA:INC R0;调节地址指针
INC R1 DJNZ R3,LOOP1;内循环结束判别 DJNZ R2,LOOP0;外循环结束判别
RET
MOV R0,#51H MOV R5,#07H MOV R4,#00H MOV A, @R0 INC R0 LP: ADD A, @R0 JNC LP1 INC R4 CLR C LP1:INC R0 DJNZ R5,LP
⒉在以3000H为首地址的外部单元中,存放了14 个ASCII码表示的0~9之间的数,试编写程序 将它们转换为BCD码,并以压缩型BCD码的 形式存放在以2000H为首地址的外部单元中. MOV DPTR,#2000H MOV P2,#20H MOV R0,#00H MOV R3,#07H LOOP: MOVX A,@R0
51单片机中断总结
51单片机中断总结:1. 查询优先级为固定的(外部中断0>定时器0>外部中断1>定时器1>串行中断)。
2. 执行优先级可以通过IP寄存器进行设置(高/低)。
3. CPU同时收到多个中断请求时,首先响应优先级较高者,然后相应优先级较低者;如果优先级相同,则按照查询优先级顺序依次响应。
4. 正在执行的中断服务,不能被同级或更低级的中断请求打断,但会被更高级的中断请求打断。
推论(1)高优先级的中断不能被任何其它中断所打断(2)低优先级的中断只能在没有任何中断服务运行时得到响应。
5. 对于定时器和外部中断,在进入中断服务后,其中断标志位会自动清零;对于串行中断,由于有两个中断源,需要手动查询并清零RI或/和TI。
if (RI) {// processingRI = 0;}if (TI) {// processingTI = 0;}6. 如果是使用汇编写中断服务,需要保护累加器、状态寄存器、寄存器组等8051 Tutorial: Interrupts/tutint.phpAs the name implies, an interrupt is some event which interrupts normal program execution.As stated earlier, program flow is always sequential, being altered only by those instructions which expressly cause program flow to deviate in some way. However, interrupts give us a mechanism to "put on hold" the normal program flow, execute a subroutine, and then resume normal program flow as if we had never left it. This subroutine, called an interrupt handler, is only executed when a certain event (interrupt) occurs. The event may be one of the timers "overflowing," receiving a character via the serial port, transmitting a character via the serialport, or one of two "external events." The 8051 may be configured so that when any of these events occur the main program is temporarily suspended and control passed to a special section of code which presumably would execute some function related to the event that occured. Once complete, control would be returned to the original program. The main program never even knows it was interrupted.The ability to interrupt normal program execution when certain events occur makes it much easier and much more efficient to handle certain conditions. If it were not for interrupts we would have to manually check in our main program whether the timers had overflown, whether we had received another character via the serial port, or if some external event had occured. Besides making the main program ugly and hard to read, such a situation would make our program inefficient since wed be burning precious "instruction cycles" checking for events that usually dont happen.For example, lets say we have a large 16k program executing many subroutines performing many tasks. Lets also suppose that we want our program to automatically toggle the P3.0 port every time timer 0 overflows. The code to do this isnt too difficult:JNB TF0,SKIP_TOGGLECPL P3.0CLR TF0SKIP_TOGGLE: ...Since the TF0 flag is set whenever timer 0 overflows, the above code will toggle P3.0 every time timer 0 overflows. This accomplishes what we want, but is inefficient. The JNB instruction consumes 2 instruction cycles to determine that the flag is not set and jump over the unnecessary code. In the event that timer 0 overflows, the CPL and CLR instruction require 2 instruction cycles to execute. To make the math easy, lets say the rest of the code in the program requires 98 instruction cycles. Thus, in total, our code consumes 100 instruction cycles (98 instruction cycles plus the 2 that are executed every iteration to determine whether or not timer 0 has overflowed). If were in 16-bit timer mode, timer 0 will overflow every 65,536 machine cycles. In that time we would have performed 655 JNB tests for a total of 1310 instruction cycles, plus another 2 instruction cycles to perform the code. So to achieve our goal weve spent 1312 instruction cycles. So 2.002% of our time is being spent just checking when to toggle P3.0. And our code is ugly because we have to make that check every iteration of our main program loop.Luckily, this isnt necessary. Interrupts let us forget about checking for the condition. The microcontroller itself will check for the condition automatically and when the condition is met will jump to a subroutine (called an interrupt handler), execute the code, then return. In this case, our subroutine would be nothing more than:CPL P3.0RETIFirst, youll notice the CLR TF0 command has disappeared. Thats because when the 8051 executes our "timer 0 interrupt routine," it automatically clears the TF0 flag. Youll also notice that instead of a normal RET instruction we have a RETI instruction. The RETI instruction does the same thing as a RET instruction, but tells the 8051 that an interrupt routine has finished. You must always end your interrupt handlers with RETI.Thus, every 65536 instruction cycles we execute the CPL instruction and the RETI instruction. Those two instructions together require 3 instruction cycles, and weve accomplished the same goal as the first example that required 1312 instruction cycles. As far as the toggling of P3.0 goes, our code is 437 times more efficient! Not to mention its much easier to read and understand because we dont have to remember to always check for the timer 0 flag in our main program. We just setup the interrupt and forget about it, secure in the knowledge that the 8051 will execute our code whenever its necessary.The same idea applies to receiving data via the serial port. One way to do it is to continuously check the status of the RI flag in an endless loop. Or we could check the RI flag as part of a larger program loop. However, in the latter case we run the risk of missing characters--what happens if a character is received right after we do the check, the rest of our program executes, and before we even check RI a second character has come in. We will lose the first character. With interrupts, the 8051 will put the main program "on hold" and call our special routine to handle the reception of a character. Thus, we neither have to put an ugly check in our main code nor will we lose characters.What Events Can Trigger Interrupts, and where do they go?We can configure the 8051 so that any of the following events will cause an interrupt:Timer 0 Overflow.Timer 1 Overflow.Reception/Transmission of Serial Character.External Event 0.External Event 1.In other words, we can configure the 8051 so that when Timer 0 Overflows or when a character is sent/received, the appropriate interrupt handler routines are called.Obviously we need to be able to distinguish between various interrupts and executing different code depending on what interrupt was triggered. This is accomplished by jumping to a fixed address when a given interrupt occurs.Interrupt Flag Interrupt Handler AddressExternal 0 IE0 0003hTimer 0 TF0 000BhExternal 1 IE1 0013hTimer 1 TF1 001BhSerial RI/TI 0023hBy consulting the above chart we see that whenever Timer 0 overflows (i.e., the TF0 bit is set), the main program will be temporarily suspended and control will jump to 000BH. It is assumed that we have code at address 000BH that handles the situation of Timer 0 overflowing.Setting Up InterruptsBy default at powerup, all interrupts are disabled. This means that even if, for example, the TF0 bit is set, the 8051 will not execute the interrupt. Your program must specifically tell the 8051 that it wishes to enable interrupts and specifically which interrupts it wishes to enable.Your program may enable and disable interrupts by modifying the IE SFR (A8h):Bit Name Bit Address Explanation of Function7 EA AFh Global Interrupt Enable/Disable6 - AEh Undefined5 - ADh Undefined4 ES ACh Enable Serial Interrupt3 ET1 ABh Enable Timer 1 Interrupt2 EX1 AAh Enable External 1 Interrupt1 ET0 A9h Enable Timer 0 Interrupt0 EX0 A8h Enable External 0 InterruptAs you can see, each of the 8051s interrupts has its own bit in the IE SFR. You enable a given interrupt by setting the corresponding bit. For example, if you wish to enable Timer 1 Interrupt, you would execute either:MOV IE,#08horSETB ET1Both of the above instructions set bit 3 of IE, thus enabling Timer 1 Interrupt. Once Timer 1 Interrupt is enabled, whenever the TF1 bit is set, the 8051 will automatically put "on hold" the main program and execute the Timer 1 Interrupt Handler at address 001Bh.However, before Timer 1 Interrupt (or any other interrupt) is truly enabled, you must also set bit 7 of IE. Bit 7, the Global Interupt Enable/Disable, enables or disables all interrupts simultaneously. That is to say, if bit 7 is cleared then no interrupts will occur, even if all the other bits of IE are set. Setting bit 7 will enable all the interrupts that have been selected by setting other bits in IE. This is useful in program execution if you have time-critical code that needs to execute. In this case, you may need the code to execute from start to finish without any interrupt getting in the way. To accomplish this you can simply clear bit 7 of IE (CLR EA) and then set it after your time-criticial code is done.So, to sum up what has been stated in this section, to enable the Timer 1 Interrupt the most common approach is to execute the following two instructions:SETB ET1SETB EAThereafter, the Timer 1 Interrupt Handler at 01Bh will automatically be called whenever the TF1 bit is set (upon Timer 1 overflow).Polling SequenceThe 8051 automatically evaluates whether an interrupt should occur after every instruction. When checking for interrupt conditions, it checks them in the following order:External 0 InterruptTimer 0 InterruptExternal 1 InterruptTimer 1 InterruptSerial InterruptThis means that if a Serial Interrupt occurs at the exact same instant that an External 0 Interrupt occurs, the External 0 Interrupt will be executed first and the Serial Interrupt will be executed once the External 0 Interrupt has completed.Interrupt PrioritiesThe 8051 offers two levels of interrupt priority: high and low. By using interrupt priorities you may assign higher priority to certain interrupt conditions.For example, you may have enabled Timer 1 Interrupt which is automatically called every time Timer 1 overflows. Additionally, you may have enabled the Serial Interrupt which is called every time a character is received via the serial port. However, you may consider that receiving a character is much more important than the timer interrupt. In this case, if Timer 1 Interrupt is already executing you may wish that the serial interrupt itself interrupts the Timer 1 Interrupt. When the serial interrupt is complete, control passes back to Timer 1 Interrupt and finally back to the main program. You may accomplish this by assigning a high priority to the Serial Interrupt and a low priority to the Timer 1 Interrupt.Interrupt priorities are controlled by the IP SFR (B8h). The IP SFR has the following format:Bit Name Bit Address Explanation of Function7 - - Undefined6 - - Undefined5 - - Undefined4 PS BCh Serial Interrupt Priority3 PT1 BBh Timer 1 Interrupt Priority2 PX1 BAh External 1 Interrupt Priority1 PT0 B9h Timer 0 Interrupt Priority0 PX0 B8h External 0 Interrupt PriorityWhen considering interrupt priorities, the following rules apply:Nothing can interrupt a high-priority interrupt--not even another high priority interrupt.A high-priority interrupt may interrupt a low-priority interrupt.A low-priority interrupt may only occur if no other interrupt is already executing.If two interrupts occur at the same time, the interrupt with higher priority will execute first. If both interrupts are of the same priority the interrupt which is serviced first by polling sequence will be executed first.What Happens When an Interrupt Occurs?When an interrupt is triggered, the following actions are taken automatically by the microcontroller:The current Program Counter is saved on the stack, low-byte first.Interrupts of the same and lower priority are blocked.In the case of Timer and External interrupts, the corresponding interrupt flag is cleared.Program execution transfers to the corresponding interrupt handler vector address.The Interrupt Handler Routine executes.Take special note of the third step: If the interrupt being handled is a Timer or External interrupt, the microcontroller automatically clears the interrupt flag before passing control to your interrupt handler routine. This means it is not necessary that you clear the bit in your code.What Happens When an Interrupt Ends?An interrupt ends when your program executes the RETI (Return from Interrupt) instruction. When the RETI instruction is executed the following actions are taken by the microcontroller:Two bytes are popped off the stack into the Program Counter to restore normal program execution.Interrupt status is restored to its pre-interrupt status.Serial InterruptsSerial Interrupts are slightly different than the rest of the interrupts. This is due to the fact that there are two interrupt flags: RI and TI. If either flag is set, a serial interrupt is triggered. As you will recall from the section on the serial port, the RI bit is set when a byte is received by the serial port and the TI bit is set when a byte has been sent.This means that when your serial interrupt is executed, it may have been triggered because the RI flag was set or because the TI flag was set--or because both flags were set. Thus, your routine must check the status of these flags to determine what action is appropriate. Also, since the 8051 does not automatically clear the RI and TI flags you must clear these bits in your interrupt handler.A brief code example is in order:INT_SERIAL: JNB RI,CHECK_TI ;If the RI flag is not set, we jump to check TIMOV A,SBUF ;If we got to this line, its because the RI bit *was* setCLR RI ;Clear the RI bit after weve processed itCHECK_TI: JNB TI,EXIT_INT ;If the TI flag is not set, we jump to the exit pointCLR TI ;Clear the TI bit before we send another characterMOV SBUF,#A ;Send another character to the serial portEXIT_INT: RETIAs you can see, our code checks the status of both interrupts flags. If both flags were set, both sections of code will be executed. Also note that each section of code clears its corresponding interrupt flag. If you forget to clear the interrupt bits, the serial interrupt will be executed over and over until you clear the bit. Thus it is very important that you always clear the interrupt flags in a serial interrupt.Important Interrupt Consideration: Register ProtectionOne very important rule applies to all interrupt handlers: Interrupts must leave the processor in the same state as it was in when the interrupt initiated.Remember, the idea behind interrupts is that the main program isnt aware that they are executing in the "background." However, consider the following code:CLR C ;Clear carryMOV A,#25h ;Load the accumulator with 25hADDC A,#10h ;Add 10h, with carryAfter the above three instructions are executed, the accumulator will contain a value of 35h.But what would happen if right after the MOV instruction an interrupt occured. During this interrupt, the carry bit was set and the value of the accumulator was changed to 40h. When the interrupt finished and control was passed back to the main program, the ADDC would add 10h to 40h, and additionally add an additional 1h because the carry bit is set. In this case, the accumulator will contain the value 51h at the end of execution.In this case, the main program has seemingly calculated the wrong answer. How can 25h + 10h yield 51h as a result? It doesnt make sense. A programmer that was unfamiliar with interrupts would be convinced that the microcontroller was damaged in some way, provoking problems with mathematical calculations.What has happened, in reality, is the interrupt did not protect the registers it used. Restated: An interrupt must leave the processor in the same state as it was in when the interrupt initiated.What does this mean? It means if your interrupt uses the accumulator, it must insure that the value of the accumulator is the same at the end of the interrupt as it was at the beginning. This is generally accomplished with a PUSH and POP sequence. For example:PUSH ACCPUSH PSWMOV A,#0FFhADD A,#02hPOP PSWPOP ACCThe guts of the interrupt is the MOV instruction and the ADD instruction. However, these two instructions modify the Accumulator (the MOV instruction) and also modify the value of the carry bit (the ADD instruction will cause the carry bit to be set). Since an interrupt routine must guarantee that the registers remain unchanged by the routine, the routine pushes the original values onto the stack using the PUSH instruction. It is then free to use the registers it protected to its hearts content. Once the interrupt has finished its task, it pops the original values back into the registers. When the interrupt exits, the main program will never know the difference because the registers are exactly the same as they were before the interrupt executed.In general, your interrupt routine must protect the following registers:PSWDPTR (DPH/DPL)PSWACCBRegisters R0-R7Remember that PSW consists of many individual bits that are set by various 8051 instructions. Unless you are absolutely sure of what you are doing and have a complete understanding of what instructions set what bits, it is generally a good idea to always protect PSW by pushing and popping it off the stack at the beginning and end of your interrupts.Note also that most assemblers (in fact, ALL assemblers that I know of) will not allow you to execute the instruction:PUSH R0This is due to the fact that depending on which register bank is selected, R0 may refer to either internal ram address 00h, 08h, 10h, or 18h. R0, in and of itself, is not a valid memory address that the PUSH and POP instructions can use.Thus, if you are using any "R" register in your interrupt routine, you will have to push that registers absolute address onto the stack instead of just saying PUSH R0. For example, instead of PUSH R0 you would execute:PUSH 00hOf course, this only works if youve selected the default register set. If you are using an alternate register set, you must PUSH the address which corresponds to the register you are using.Common Problems with InterruptsInterrupts are a very powerful tool available to the 8051 developer, but when used incorrectly they can be a source of a huge number of debugging hours. Errors in interrupt routines are often very difficult to diagnose and correct.If you are using interrupts and your program is crashing or does not seem to be performing as you would expect, always review the following interrupt-related issues:Register Protection: Make sure you are protecting all your registers, as explained above. If you forget to protect a register that your main program is using, very strange results may occur. In our example above we saw how failure to protect registers caused the main program to apparently calculate that 25h + 10h = 51h. If you witness problems with registers changing values unexpectedly or operations producing "incorrect" values, it is very likely that you've forgotten to protect registers. ALWAYS PROTECT YOUR REGISTERS.Forgetting to restore protected values: Another common error is to push registers onto the stack to protect them, and then forget to pop them off the stack before exiting the interrupt. For example, you may push ACC, B, and PSW onto the stack in order to protect them and subsequently pop only ACC and PSW off the stack before exiting. In this case, since you forgot to restore the value of "B", an extra value remains on the stack. When you execute the RETI instruction the 8051 will use that value as the return address instead of the correct value. In this case, your program will almost certainly crash. ALWAYS MAKE SURE YOU POP THE SAME NUMBER OF VALUES OFF THE STACK AS YOU PUSHED ONTO IT.Using RET instead of RETI: Remember that interrupts are always terminated with the RETI instruction. It is easy to inadvertantly use the RET instruction instead. However, the RETinstruction will not end your interrupt. Usually, using a RET instead of a RETI will cause the illusion of your main program running normally, but your interrupt will only be executed once. If it appears that your interrupt mysteriously stops executing, verify that you are exiting with RETI.11。
80c51单片机对中断源的中断优先级的处理原则
80c51单片机对中断源的中断优先级的处理原则
80C51单片机使用了5级中断优先级,具体的中断优先级处理
原则如下:
1. 不可屏蔽中断 (External Interrupt) 优先级最高,不能被其他
中断打断,且不可被软件修改。
2. 时钟中断 (Timer Interrupt) 优先级次高,用于定时器中断。
当出现同时中断请求时,时钟中断优先级高于串口中断。
3. 串行中断(Serial Interrupt) 优先级较低,用于串口通信中断。
当出现同时中断请求时,如果没有发生时钟中断,则串行中断可以打断其他低优先级中断。
4. 外部中断0 (External Interrupt 0) 优先级较低,用于外部中断
0的中断请求。
当出现同时中断请求时,如果没有发生时钟中
断或串行中断,则外部中断0可以打断其他低优先级中断。
5. 外部中断1 (External Interrupt 1) 优先级最低,用于外部中断
1的中断请求。
当出现同时中断请求时,如果没有发生时钟中断、串行中断或外部中断0,则外部中断1可以打断其他低优
先级中断。
总结起来,中断优先级的处理原则是按照中断的重要性和紧急程度进行排序,优先级高的中断可以打断优先级低的中断。
在80C51单片机中,不可屏蔽中断的优先级最高,其次是时钟中断,然后是串行中断,外部中断0和外部中断1的优先级最低。
mcs-51单片机中断系统的结构[整理版]
1.简述中断、中断源、中断源的优先级及中断嵌套的含义。
答: 当CPU 正在处理某项事件的时,如果外界或内部发生了紧急情况,要求CPU 暂停正在处理的工作转而去处理这个紧急情况,待处理完以后再回到原来被中断的地方,继续执行原来被中断了的程序,这样的过程称为中断。
单片机采用中断主要有如下几个优点:①可以提高CPU 工作效率;②具有实时处理能力;③具有故障处理能力;④实现分时操作,可控制多个外设同时工作。
向CPU 提出中断请求的源称为中断源;当系统有多个中断源时,就可能出现同时有几个中断源申请中断,而CPU 在一个时刻只能响应并处理中断优先高的请求;在实际应用系统中,当CPU 正在处理某个中断源,即正在执行中断服务程序时,会出现优先级更高的中断源申请中断。
为了使更紧急的级别高的中断源及时得到服务,需要暂时中断(挂起)当前正在执行的级别较低的中断服务程序,去处理级别更高的中断源,待处理完以后,再返回到被中断了的中断服务程序继续执行,但级别相同或级别低的中断源不能中断级别高的中断服务,这就是所谓的中断嵌套。
3.MCS-51 单片机能提供几个中断源?几个中断优先级?各个中断的源的优先级怎样确定?在同一优先级中各个中断源的优先级怎样确定?答: 51 单片机有5 个中断源,两个中断优先级:INT0 、T0、INT1 、T1、串行口中断(包括串行接收中断RI 和串行发送中断TI)。
这 5 个中断源的中断入口地址分别是0003H、000BH、0013H、001BH、0023H。
中断优先级是由片内的中断优先级寄存器IP(特殊功能寄存器)控制的。
PS:串行口中断优先级控制位。
PS=1,串行口定义为高优先级中断源;PS=0,串行口定义为低优先级中断源;PT1:T1 中断优先级控制位。
PT1=1,定时器/计数器 1 定义为高优先级中断源;PT1=0,定时器/计数器 1 定义为低优先级中断源;PX1:外部中断 1 中断优先级控制位。
51单片机中断优先控制的基本原则
51单片机中断优先控制的基本原则以51单片机中断优先控制的基本原则为标题中断是51单片机中的一种重要的工作模式,它可以在程序运行过程中,根据外部或内部事件的发生而中断正常的程序执行,执行相应的中断服务程序,处理完中断事件后再返回到原来的程序继续执行。
中断优先级控制是指当多个中断同时发生时,系统根据优先级确定中断服务程序的执行顺序。
本文将介绍51单片机中断优先级控制的基本原则。
1. 中断优先级的确定在51单片机中,中断的优先级是由中断源的优先级决定的。
一般来说,硬件中断具有更高的优先级,而软件中断(如定时器中断)具有较低的优先级。
在设计系统时,需要根据实际需求确定中断源的优先级,以确保高优先级中断能够及时响应。
2. 中断嵌套中断嵌套是指当一个中断正在执行时,另一个更高优先级的中断发生,系统会中断当前中断的执行,去执行更高优先级的中断服务程序。
在51单片机中,中断嵌套是默认开启的,可以通过设置中断标志位来禁止中断嵌套。
在设计系统时,需要考虑中断嵌套对系统性能的影响,合理设置中断嵌套的开启与禁止。
3. 中断优先级的编码在51单片机中,中断优先级是通过中断优先级编码来实现的。
中断优先级编码是一个二进制编码,通常使用8位来表示。
在设计系统时,需要根据中断源的优先级确定中断优先级编码,以确保中断优先级的正确设置。
4. 中断服务程序的编写中断服务程序是中断发生时要执行的一段代码,在设计系统时,需要根据实际需求编写相应的中断服务程序。
在编写中断服务程序时,需要注意以下几点:- 中断服务程序的执行时间应尽量短,以免影响其他任务的执行。
- 中断服务程序中的变量应使用关键字volatile进行声明,以确保其在中断和非中断代码之间的一致性。
- 中断服务程序中的关键代码应使用临界区保护,以防止多个中断同时修改共享资源导致数据错误。
5. 中断优先级的配置在51单片机中,中断优先级的配置是通过特定的寄存器来实现的。
具体的配置方法可以参考51单片机的相关资料或开发工具的使用手册。
单片机复习题
单片机习题1、填空题1.1、MCS-51系统中,当PSEN信号有效时,表示CPU要从(外部程序存储器)存储器读取信息。
1.2、PSW中的RS1RS0=10时,R2的地址为(12H),RS1RS0=11时,R2的地址为(1AH)。
1.3、一个机器周期=12个(振荡周期)=6个(状态周期/时钟周期)。
1.4、在MCS-51单片机中,如果采用9MHz晶振,1个机器周期为(1.5)us。
1.5、若(DPTR)=2000H,(A)=50H,执行指令“MOVC A,@A+DPTR”后,送入A的是程序存储器(2050H)单元的内容。
1.6、假定累加器(A)=50H,执行程序存储器2000H单元处的指令“MOVC A,@A+PC”后,送入A的是程序存储器(2051H)单元的内容。
1.7、访问内部RAM可使用MOV指令,而访问外部RAM使用(MOVX)指令,访问内部ROM使用(MOVC)指令,访问外部ROM使用(MOVC)指令。
1.8、指令“ORL A,#0F0H”的作用是将A的高4位置1,而低4位(保持不变)。
1.9、执行“ANL A,#0FH”指令后,累加器A的高4位= (0000B)。
1.10、若“SJMP rel”的指令操作码地址为1000H,rel=50H,那么它的转移目标地址为(1052H)。
1.11、假定(A)=54,执行指令“ADD A,#65”后,累加器A的内容为(01110111B),CY 的内容为(0)。
1.12、主频为12MHz的MCS-51单片机系统用T0方式1定时1ms,则时间常数应为(64536)。
1.13、假定(A)=86H,执行指令“A DD A,#8DH”后,累加器A的内容为(03H),CY的内容为(1),AC的内容为(1),OV的内容为(1)。
2、选择题2.1、当MCS-51复位时,下面说法正确的是(A)。
A、PC=0000H;B、SP=00H;C、SBUF=00H;D、P0=00H;2.2、PSW=01H时,则当前工作寄存器是(B)。
单片机概念复习题纲
单片机概念复习题纲单片机复习提纲1一.选择题:1.mc-51单片机登位后,程序计数器pc的内容就是c。
a.00hb.ffhc.0000hd.ffffh2.8031单片机芯片必须采用时应把ea信号插槽b.。
a.接高电平b.接地c.悬空d.接地址锁存器选通端3.mcs-51的程序计数器pc为16十一位计数器,因此其串行范围就是d.。
a.8kb.16kc.32kd.64k4.在mcs-51单片机中,唯一一个可供用户使用的16位寄存器是b.。
a.pswb.dptrc.acd.pc5.在mcs-51单片机中,唯一一个用户无法轻易采用的寄存器就是d.。
a.pswb.dptrc.acd.pc6.在单片机中,用作标志寄存器的一个特殊功能寄存器是a.。
a.pswb.dptrc.acd.pc7.单片机的指令地址存放在d.中。
a.pswb.dptrc.spd.pc8.提升单片机的晶振频率,则机器周期信号c.。
a.不变b.变长c.变短d.变长变短不定9.用2114芯片扩展8kb的数据存储器需要芯片。
a.4片b.8片c.12片d.16片10.地址空间3000h~37ffh共有存储单元。
a.1kb.2kc.4kd.8k11.采用线选法拓展3片2732作外部程序存储器,须要采用位地址线。
a.13b.14c.15d.1612.在生产过程中完成程序写入的只读存储器称为。
a.掩膜romb.promc.epromd.eeprom13.8031单片机系统拓展时采用的门锁存器用作锁存。
a.高8位地址b.低8位地址c.8位数据d.ale信号14.在mcs-51单片机的中断中,如果发生同级中断提出申请时,就按硬件查阅序列去处置积极响应次序,其优先级别中第三个为:()a、定时/计数器中断0b、定时/计数器中断1c、外部中断0d、外部中断1e、串行口中断15.msc-51在响应中断时,不会自动清除的标志为()a、tf0b、ric、ie0d、tf116.设(a)=f0h,若执行4次指令rla,则执行完后,a中的内容为:()a、ffhb、00hc、0fhd、f0h17.乘法指令是mcs-51单片机中执行时间最长的指令之一,当执行完mulab后,积的高8位在:()a、在寄存器a中b、在寄存器b中c、在cy中d、在psw中18.设执行add指令后,a中的内容为10011010b,再执行daa指令后,a的内容应为()a、10100000b、10010000c、00010000d、0000000019.设a=56h,r0=20h,(20h)=7ah,若执行xchda,@r0,则a中的内容为:()a、76hb、a6hc、5ahd、50h20.执行pushdirect指令时,sp将进行何种操作?()a、sp+0b、sp+1c、sp+2d、sp-121.8031不具备第二功能的i/o口就是:(b、)a、p0口b、p1口c、p2口d、p3口22.定时器t1中断的入口地址为:(c、)a、0023hb、000bhc、001bhd、0013h23.以下哪一个指令助记符就是非法字符?()a、rlcb、clrc、rrcd、orc24.在cpu内部,反映程序运行状态或反映运算结果的特征寄存器是()。
51单片机基础知识试题题库(含答案)
第二章习题参考答案一、填空题:1、当MCS-51引脚ALE有效时,表示从P0口稳定地送出了低8位地址。
2、MCS-51的堆栈是软件填写堆栈指针临时在片内数据存储器内开辟的区域。
3、当使用8751且EA=1,程序存储器地址小于 1000H 时,访问的是片内ROM。
4、MCS-51系统中,当PSEN信号有效时,表示CPU要从外部程序存储器读取信息。
5、MCS-51有4组工作寄存器,它们的地址范围是 00H~1FH 。
6、MCS-51片内20H~2FH范围内的数据存储器,既可以字节寻址又可以位寻址。
7、PSW中RS1 RS0=10时,R2的地址为 12H 。
8、PSW中RS1 RS0=11时,R2的地址为 1AH 。
9、单片机系统复位后,(PSW)=00H,因此片内RAM寄存区的当前寄存器是第 0 组,8个寄存器的单元地址为 00H ~ 07H 。
10、PC复位后为 0000H 。
11、一个机器周期= 12 个振荡周期= 6 个时钟周期。
12、PC的内容为将要执行的的指令地址。
13、在MCS-51单片机中,如果采用6MHz晶振,1个机器周期为 2us 。
14、内部RAM中,位地址为30H的位,该位所在字节的字节地址为 26H 。
15、若A中的内容为63H,那么,P标志位的值为 0 。
16、8051单片机复位后,R4所对应的存储单元的地址为 04H ,因上电时PSW=00H 。
这时当前的工作寄存器区是第 0 工作寄存器区。
17、使用8031芯片时,需将/EA引脚接低电平,因为其片内无程序存储器。
18、片内RAM低128个单元划分为哪3个主要部分:工作寄存器区、位寻址区和用户RAM区。
19、通过堆栈操作实现子程序调用,首先就要把 PC 的内容入栈,以进行断点保护。
调用返回时,再进行出栈保护,把保护的断点送回到 PC 。
20、MCS-51单片机程序存储器的寻址范围是由程序计数器PC的位数所决定的,因为MCS-51的PC是16位的,因此其寻址的范围为 64 KB。
单片机原理及应用选择题答案
第一章习题1.1 单项选择题(1)单片机又称为单片微计算机,最初的英文缩写是____。
答案(D)• A.MCP• B.CPU• C.DPJ• D.SCM(2) Intel公司的MCS-51系列单片机是______的单片机。
答案(C)• A.1位• B.4位• C.8位• D.16位(3)单片机的特点里没有包括在内的是______。
答案(C)• A.集成度高• B.功耗低• C.密封性强• D.性价比高(4)单片机的发展趋势中没有包括的是______。
答案(B)• A.高性能• B.高价格• C.低功耗• D.高性价比(5)十进制数56的二进制数是 ______。
答案(A)• A.00111000B• B.01011100B• C.11000111B• D.01010000B(6)十六进制数93的二进制数是______。
答案(A)• A.10010011B• B.00100011B• C.11000011B• D.01110011B(7)二进制数11000011的十六进制数是______。
答案(B)• A.B3H• B.C3H• C.D3H• D.E3H(8)二进制数11001011的十进制无符号数是______。
答案(B)• A.213• B.203• C.223• D.233(9)二进制数11001011的十进制有符号数是______。
答案(B)• A.73• B.-75• C.-93• D.75(10)十进制数29的8421BCD压缩码是______。
答案(A)• A.00101001B• B.10101001B• C.11100001B• D.10011100B(11)十进制数-36在8位微机中的反码和补码是______。
答案(D)• A. 00100100B、11011100B• B.00100100B、11011011B• C.10100100B、11011011B• D.11011011B、11011100B(12)十进制数+27在8位微机中的反码和补码分别是______。
51单片机中的中断优先级总结
51单片机中的中断优先级总结这段时间编写51的控制板程序,两个大牛技术指导对51中断嵌套问题的看法不一样,后来亲自验证了一下,得到了一下的一些结论,发上来大家参考,表达不清的地方还望理解,呵呵。
51单片机的中断可嵌套,但至多支持二级嵌套。
51单片机的默认(此时的IP寄存器不做设置)中断优先级为:外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;但这种优先级只是逻辑上的优先级,当同时有几种中断到达时,高优先级中断会先得到服务。
这种优先级实际上是中断同时到达的情况下,谁先得到服务的优先级,而不是可提供中断嵌套能力的优先级。
这种优先级被称为逻辑优先级。
例如:当计数器0中断和外部中断1(优先级计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
要实现真正的嵌套形式的优先级,也即高优先级中断服务可以打断低优先级中断服务的情况,必须通过设置中断优先级寄存器IP来实现;这种优先级被称为物理优先级。
例如:设置IP = 0x10,即设置串口中断为最高优先级,则串口中断可以打断任何其他的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数。
若串口中断没有触发,则其他几个中断之间还是保持逻辑优先级,相互之间无法嵌套。
回复于:2009-10-26 16:09:35只要硬件堆栈足够.嵌套没有级数限制。
#4楼得分:0回复于:2009-10-28 10:57:5851只有两个优先级所以只能有两级嵌套!SEI是AVR单片机的,他没有分优先级,所以支持这种嵌套!C51中interrupt和using的用法void INT0()interrupt 0 using 1{.........}interrupt 0 指明是外部中断0;interrupt 1 指明是定时器中断0;interrupt 2 指明是外部中断1;interrupt 3 指明是定时器中断1;interrupt 4 指明是串行口中断;using 0 是第0组寄存器;using 1 是第1组寄存器;using 2 是第2组寄存器;using 3 是第3组寄存器;51单片机内的寄存器是R0--R7(不是R0-R3)R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。
51单片机中断优先级基本原则
51单片机中断优先级基本原则中断是指在程序执行的过程中,由硬件或软件触发,跳转至另一个函数或子程序中执行一段代码,然后再返回原来的程序执行点。
中断可以提高系统的响应速度和效率,并且可以优先处理紧急事件。
在51单片机的编程中,正确设置中断优先级是一项重要的任务,本文将介绍51单片机中断优先级的基本原则。
1. 中断的分类51单片机中的中断主要分为外部中断和定时器中断两种。
外部中断是通过外部引脚触发的,例如按键、传感器等外部事件。
而定时器中断是由定时器计算得出的,用于定时触发一些任务。
2. 中断优先级的概念在51单片机中,有多个中断源时,中断优先级决定了哪个中断先被执行。
较高优先级的中断会打断正在执行的较低优先级中断,这样可以保证紧急任务的及时处理。
3. 默认的中断优先级在51单片机中,默认情况下,各个中断的优先级是相同的。
如果不进行设置,那么多个中断发生时会按照它们的优先级设置顺序进行处理。
4. 中断优先级的设置方法在51单片机的编程中,可以通过设置中断优先级来控制各个中断的执行顺序。
下面是一种设置中断优先级的方法:a. 在程序中开启中断:通过设置中断打开寄存器(IE)的对应位来开启相应的中断源。
b. 设置中断优先级:通过设置中断控制寄存器(IP)的对应位来设置中断的优先级。
IP寄存器的每一位对应一种中断源,可以根据需要设置为高优先级或低优先级。
5. 中断优先级的基本原则在设置中断优先级时,需要遵守一些基本的原则:a. 优先处理时间敏感的中断:对于需要立即响应的事件,例如紧急报警、高优先级的通信等,应该将其设置为较高的中断优先级。
这样可以保证紧急任务的及时处理。
b. 避免高优先级中断长时间持续运行:较高优先级的中断可能会一直打断低优先级的中断,导致低优先级的任务得不到处理。
因此,需要合理设置中断优先级,避免高优先级中断长时间占用CPU资源。
c. 合理规划定时器中断和外部中断的优先级:定时器中断一般用于周期性任务,例如控制任务的周期性执行。
微机原理习题库(51单片机)含答案
第一章单片机概述与结构一、选择题1.访问片外部数据存储器时,不起作用的信号是(C)。
A./RD B./WE C./PSEN D.ALE2.51单片机P0口用作输出时,应外接( A )。
A.上拉电阻B.二极管C.三极管D.下拉电阻3.进位标志CY在( C )中。
A.累加器B.算逻运算部件ALU C.程序状态字寄存器PSW D.DPTR4.堆栈数据的进出原则是( D )。
A.先进先出B.进入不出C.后进后出D.先进后出5.51单片机系统中,若晶振频率为6MHz,一个机器周期等于( D )μs。
A.1.5 B.3 C.1 D.26.在家用电器中使用单片机应属于微计算机的( B )。
A.辅助设计应用B.测量、控制应用C.数值计算应用D.数据处理应用7.PC的值是( C )。
A.当前正在执行指令的前一条指令的地址B.当前正在执行指令的地址C.当前正在执行指令的下一条指令的地址D.控制器中指令寄存器的地址8.单片机应用程序一般存放在( B )中。
A.RAM B.ROM C.寄存器D.CPU9.在堆栈操作中,当进栈数据全部弹出后,这时SP应指向( D )A.栈底单元B.7FH单元C.栈底单元地址加 1 D.栈底单元地址减 1 10.51单片机的并行I/O口信息有两种读取方法:一种是读引脚,还有一种是(A )。
A.读锁存器B.读数据库C.读A累加器D.读CPU二、填空题1.单片机复位后,SP、PC和I/O口的内容分别为07H\000H\FFH 。
2.单片机有四个工作寄存器区,由PSW状态字中的RS1和RS0两位的状态来决定。
单片机复位后,若执行SETB RS0指令,此时只能使用 1 区的工作寄存器,地址范围是08H---0FH 。
3.51单片机驱动能力最强的并行端口为P0端口。
4.51单片机PC的长度为16位,SP的长度为___8____位,DPTR的长度为_16__位。
5.访问51单片机程序存储器地址空间、片内数据存储器地址、片外数据存储器地址的指令分别为__movc_____,MOV和_movx______。
51单片机的中断嵌套怎么实现呢?
51单⽚机的中断嵌套怎么实现呢?今天在练习51单⽚机的嵌套中断时,发现了⼀个奇怪的点,就是中断服务函数在执⾏的时候,⽆论优先级的⾼低,都不能被打断。
嗯,就是外部中断0和外部中断1都不能打断定时器0的中断服务函数。
(优先级:外部中断0>定时器0>外部中断1).我本来想开启定时器0,外部中断0和外部中断1,实现中断嵌套.⽐如外部中断0到达时,执⾏中断服务函数Int0,因为它的优先级⾼,所以当外部中断1和定时器0到达时,不会打断外部中断0的中断服务函数。
⽽当定时器0中断时,外部中断0到达可以打断其执⾏,外部中断1到达不可打断。
但是很难实现,因为开启三个中断后,每个中断的服务函数执⾏函数超级短,当出现现象的时候(我设置了LED灯状态翻转表⽰中断到达),即⼩灯亮起或熄灭中断函数就已经执⾏完了,很难控制让中断同时到达。
所以我这样写了代码测试:interrupt.c#include<reg52.h>#include<interrupt.h>//外部中断0初始化void Int0_Init(){ IT0=1;EX0=1;EA=1;}//外部中断1初始化void Int1_Init(){IT1=1;EX1=1;EA=1;}//定时器0初始化,模式1,16位计数模式,1msvoid Timer0_Init(){ TMOD|=0x01;TH0=0xfc;//TL0=0x18;ET0=1;EA=1;TR0=1;}//中断服务函数void Int0() interrupt 0{ delay(1000);if(key1==0){ led1=~led1;}}void Int1() interrupt 2{ delay(1000);if(key2==0){ led1=~led1;}}void Timer0() interrupt 1{TH0=0xfc;TL0=0x18;i++;if(i==10000){led1=~led1;i=0;while(1);}}//延时函数,为了消抖void delay(u16 j){ while(j--);}interrupt.h#include<reg52.h>typedef unsigned char u8;typedef unsigned int u16;//初始化函数void Int0_Init();void Int1_Init();void Timer0_Init();void Timer1_Init();//中断服务函数void Int0();void Int1();void Timer0();void Timer1();void delay(u16 j);static u16 i=0;sbit key1=P3^2;sbit key2=P3^3;sbit led1=P0^0;main.c#include<reg52.h>#include<interrupt.h>int main(){ Int0_Init();Int1_Init();led1=0;Timer0_Init();// Timer1_Init();while(1);}嗯,这样写完后,我以为能实现我想要的结果,但是现象是这样的:我在定时器0的中断服务函数中加⼊的while(1)循环,Timer0函数就不会退出。
单片机时钟中断解析
单片机时钟中断解析本文根据<新概念51单片机C语言教程>整理一. 中断一般概念51单片机一共设有5个中断源. 引起CPU中断根源, 成为中断源. 中断嵌套, 也即单片机在处理一个中断时又发生了一个中断, 单片机中断当前中断程序, 转而去处理新的中断程序. 中断优先级, 通过中断优先级寄存器设置.1. 中断源及其默认优先级其中, T2是52单片机独有的.2. 中断控制中的特殊功能寄存器SFR(1). 中断允许寄存器IE(Interrupt Enable)(2). 中断优先级寄存器IP(Interrupt Priority)二. 单片机的定时器中断定时器/计数器实质是一个16位的加1计数器, 由高8位(THx)和低8位(TLx)两个寄存器组成. TMOD是定时器/计数器的工作方式寄存器, 确定工作方式和功能; TCON是控制寄存器, 控制T0, T1的启动和停止及设置溢出标志.1. 定时器/计数器工作方式寄存器TMOD定时器/计数器工作方式寄存器在特殊功能寄存器中, 字节地址为0x89, 不能位寻址, TMOD 用来确定定时器的工作方式及功能选择. 单片机复位时TMOD全部被清0. 各位的含义如下:2. 定时器/计数器控制寄存器TCON3. 中断服务程序的C语言写法C51的中断函数格式如下:void func_name() interrupt 中断号[using 工作组]{//中断服务程序内容}●中断号: 指单片机中几个中断源的序号. 是编译器识别不同中断的唯一符号.●工作组: 可选部分. 指这个中断函数使用单片机内存中4组工作寄存器中的哪一组, C51编译器在编译时会自动分配工作组, 故通常省略.C语言中断程序示例如下:void T1_time() interrupt 3{TH1 = (65536-10000)/256;TL1 = (65536-10000)%256;}三. 补充1. 普通51系列单片机存储空间资源分配情况。
(2021年整理)51单片机的默认中断优先级都是低级及中断嵌套
51单片机的默认中断优先级都是低级及中断嵌套编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(51单片机的默认中断优先级都是低级及中断嵌套)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为51单片机的默认中断优先级都是低级及中断嵌套的全部内容。
51单片机的默认中断优先级都是低级及中断嵌套51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。
现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了.实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。
中断的优先级有两个:查询优先级和执行优先级.什么是查询优级呢?我们从datasheet或书上看到的默认(IP 寄存器不做设置,上电复位后为00H)的优先级:外部中断0 〉; 定时/计数器0 >; 外部中断1 〉; 定时/计数器1 >;串行中断或 int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART或 PX0〉;PT0>;PX1〉;PT1〉;PS〉;.。
..。
其实都是查询优级。
首先查询优先级是不可以更改和设置的。
这是一个中断优先权排队的问题.是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序.而这与是否发生中断服务程序的嵌套毫不相干。
当CPU查询各个中断标志位的时候,会依照上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机的默认中断优先级都是低级及
中断嵌套
51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。
现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。
实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。
中断的优先级有两个:查询优先级和执行优先级。
什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级:外部中断0 >; 定时/计数器0 >; 外部中断1 >; 定时/计数器1 >; 串行中断
或 int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART
或 PX0>;PT0>;PX1>;PT1>;PS>;......
其实都是查询优级。
首先查询优先级是不可以更改和设置的。
这是一个中断优先权排队的问题。
是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。
而这与是否发生中断服务程序的嵌套毫不相干。
当CPU查询各个中断标志位的时候,会依照
上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。
例如:当计数器0中断和外部中断1(按查询优先级,计数器0中断>;外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
而中断的执行优先级就是你对IP寄存器的设置了。
在2个优先级的情况下,某位为1,则相应的中断源为高优先级;为0,则为低优先级。
关于中断的优先级有三条原则:
1、CPU同时接收到几个中断时,首先响应优先级最高的中断请求;
2、正在进行的中断过程不能被新的同级或低行优优先级的中断请求所中断;
3、正在进行的低行优优先级中断服务,能被高行优优先级中断请求中断;
若:同一执行优先级中的中断申请不止一个时,则有一个中断优先权排队问题。
优先权排队,由中断系统硬件确定的自然优先级形成,优先权自高到低的顺序即:
外部中断0>;定时/计数0>;外部中断1>;定时/计数1>;
串行接口(同级中断默认顺序)
例如:设置IP = 0x10,即设置串口中断为最高优先级,则串口中断可以打断任何其他的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数。
若串口中
断没有触发,则其他几个中断之间还是保持逻辑优先级,相互之间无法嵌套。
关于中断嵌套。
可以这样说,当一个中断正在执行的时候,如果事先设置了中断优先级寄存器IP,那么当一个
更高优先级的中断到来的时候会发生中断嵌套,如果没
有设置则不会发生任何嵌套;如果有同一个优先级的中
断触发,它并不是在“不断的申请”,而是
将它相应的中断标志位置即IE寄存器的某位置位,当CPU执行完当前中断之后,按照查询优先级重新去查询
各个中断标志位,进入相应中断。
要记住,没有设置IP时,单片机会按照查询优先级(或都说逻辑优先级)来排队进入服务。
如果要想让某个中断优先响应,则要设置IP,更改执行优先级(或者说物理优先级)。
要注意的是,当设置了IP后,当低执行优先级中断在运行时,如果有高执行优先级的中断产生,则
会嵌套调用进入高执行优先级的中断。
如果你是用C语
言写的程序,并在中断服务时 using 了寄存组,要注意,
两个不同优先级的中断不要 using 同一组寄存器。
否则进入一个中断会破坏之前中断用的寄存器数据。
看两个问题,如下:
1 在各个中断都是低优先级的时候,如果定时器0的溢
出进入中断。
在这个中断处理的过程中,外部中断0也
被触发了,那么是不是要发生中断嵌套?
2 如果定时器0发生中断的时候,进入中断处理程序,
这个时候外部中断1条件触发条件满足了。
因为定时器0自然优先级比外部中断1高,那么定时器0的中断处理程序继续执行。
假设定时器中断处理程序执行的过程中,
外部中断1的触发。
条件消失了,那么等定时器0的中断处理完后,程序还是会进入外部中断1处理程序吗?
答案1:在IP事先设置了外部中断0的优先级的情况下,CUP会中止定时器0的中断服务,进入外部中断0服务程序,执行完以后再回到定时器0中断服务程序。
否则不会。
答案2:肯定会进入中断的;外部中断1的触发条件满足后会置位外部1的中断标志,即使后来外部中断1的触发条件消失了,也不会清除已置位的中断标志,所以等定
时器0的中断处理完后,程序判断外部中断的中断标志
为1后依然会进入外部中断1处理程序的,只有在外部中断1处理程序中执行reti指令才会硬件清除外部中断1
的中断标志(这也正是为什么中断返回使用reti指令而不可以用ret替换的原因)...。