浮想c51中断

上传人:mg****85 文档编号:34236229 上传时间:2018-02-22 格式:DOC 页数:6 大小:51.50KB
返回 下载 相关 举报
浮想c51中断_第1页
第1页 / 共6页
浮想c51中断_第2页
第2页 / 共6页
浮想c51中断_第3页
第3页 / 共6页
浮想c51中断_第4页
第4页 / 共6页
浮想c51中断_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《浮想c51中断》由会员分享,可在线阅读,更多相关《浮想c51中断(6页珍藏版)》请在金锄头文库上搜索。

1、自问:Q1:CPU 响应中断后标志位是在什么时候由硬件自动清零?是执行完中断服务后,还是响应了中断后?Q2:当中断标志位为 1 时, CPU 一定会响应吗?在各种情况下要等什么时候响应?Q3:总中断允许和局部中断允许的开启的作用是为了给中断标志位置 1 吗?至于 CPU 响不响应和它们有关吗?当它们全为 0,标志位还会置 1 吗?Q4:当 IP = 0, CPU 此刻在执行 T1 中断服务函数还没退出,此时若 T0 申请中断,CPU 会停止执行 T1 服务而响应 T0 吗?如果是 INT0,INT1,串口又会怎样呢?如果 T1 又来中断申请,CPU 如何处理?Q5:当 PT0 = 1,PT1

2、= 1;CPU 此刻在执行 T1 中断服务函数还没退出,此时若 T0 申请中断,CPU 会停止执行 T1 服务而响应 T0 吗?Q6:当 EA = 0,如果将中断标志位软件置 1,会发生什么情况?Q7:IP = 0,当 CPU 此刻在执行中断服务函数还没退出,此刻有比它同等级或低等级中断申请,CPU 如何处理?Q8:IP = 0xff,当 CPU 此刻在执行中断服务函数还没退出,此刻有比它同等级或低等级中断申请,CPU 如何处理?注:(/使用 24MHZ,STC89C52RC 单片机)自答 1:(不考虑多中断嵌套,优先级)关于定时/计数器 T0,T1。实验测试结果:(是用 T0 测试的,测试程

3、序如下附表 1)注:(/ 使用24MHZ,STC89C52RC 单片机)体会和结论 1:任一个中断允许而得到执行都必须同时将总开关和局部开关都开启!缺一不可!体会和结论 2:任一个中断请求标志是否置 1 都是由中断开启决定的,如只要将 RT0 = 1,标志 TF0 就将会被置 1,至于 CPU 会不会响应的决定权在于该中断是否被允许了。如EA=ET0=1 前提下,只要 TF0 = 1,CPU 就会响应!(注意不考虑多中断,优先级等问题,这里是总结一般的规律) 。这就就给出了中断的活用途径。如只要 EA=ET0=TF0=1,不管TR0 是否等于 1 都会被响应中断。这就验证了 EA,ET0 是主

4、控元素,TR0 是触发元素,引起置 1 而被中断。体会和结论 3:在总和局部都允许中断的情况下,只要中断标志位为 1,只会被响应,值得一提的是若在本中断服务还未执行完,该中断又来了的话,就会重新将标志位置 1,等前次中断服务结束后,CPU 就会第二次处理该中断服务函数。这就告诉我们在设置中断请求间隔时一定得注意中断服务所执行的时间,一般情况下,执行中断服务函数时间 t1 一定要小于中断请求的间隔 t2,对于阻止该中断再次产生而将 TR0 = 0,ET0 = 0,或在结束中断服务前 TF0 清零等做法都将会丢失数据和程序跑飞等预料不到的不合理的现象。体会和结论 4:任一个中断只要被响应后请求标志

5、就会立马随之清零,而不是等待服务函数执行完后再清零!关于中断 INT0,INT1 。实验测试结果:(是用 INT0 测试的,测试程序如下附表 2)注:(/ 使用24MHZ,STC89C52RC 单片机)体会和结论 5:对于外部中断 INT0,INT1, (这里以 INT0 为例) ,设置为低电平触发即IT0 = 0 时,当 P3.2 不少于一个机器周期的低电平时,硬件将 IE0 置 1,CPU 响应中断,并处理和进入中断服务函数,只要在中断服务函数未退出之前,外部引脚 P3.2 为低电平都没关系,但是一旦退出服务函数后,若还是低电平的话,那么将会再次产生此中断。这期间,若 P3.2 为低电平,

6、IE0 就为 1,若为高电平,就为 0。体会和结论 6:(这里以 INT1 为例)P3.3 引脚电平与中断标志位 IE1 始终成“非”的关系!不管其中断开关 IE1 和总中断 EA 是否都开启。体会和结论 7:在外部引脚 P3.3 为低电平也可就等于说是 IE1 为 1 时,一旦总中断和局部都打开时就会引起中断!但是若使得 IE1 为 1,那只有改变对应引脚 P3.3 为 0,而若对 IE1通过软件写 1 是不行的!这点可以说是与定时计数器的区别。因为即使要件写 1,也会通过内部反向器由外部 P3.3 引脚的高电平给拉低的!你能斗得过反相器吗?(这句是个人猜想) 。体会和结论 8:CPU 至于

7、是否响应你这个中断的本质的决定因素是你这个标志位是否为1!只要不涉及优先级等问题,该中断都会将被响应并执行的。对于外部中断设置为下降沿触发时,和定时计数器类似,这里不再赘述。注:由此可知外部中断比内部中断或许要容易一点,因为要考虑时间间隔问题!但总体来说,所有中断时序类似,可类推之。对于串口中断这里不再研究,因为一样!都晓得的!/*自答 1END*/自答 2:(考虑多中断嵌套,优先级)实验测试结果:(是用 T0,INT0 测试的,测试程序如下附表 3)注:(/ 使用24MHZ,STC89C52RC 单片机)体会和结论 9:暂且将书上所说的自然优先级定义为优先权!将中断优先级寄存器IP(B8H)

8、所规定的优先级定义为优先级!那么,优先权和优先级就是两码事了!中断嵌套的前夕无非是同时产生中断,和中断产生的不同时。当在两种中断申请同时产生时(就是看谁先向自己的标志寄存器写 1)就要看谁的优先权高!(就是谁的自然优先级高) ,然后再看谁的优先级高(IP 决定的)!(当然在 IP 中注册为 1 的要比注册为 0 的要先被响应啦) ;当在不同时申请时,就是说一个中断服务在执行,另外一个中断来了,那么是否产生嵌套就看着个后来者的优先级(IP 决定的)是否够高,如果在 IP 中都为 1,那么只有等了,如果只有后来者为 1,那么就要产生嵌套!概括一下:其实我想说的就是一句话:优先权和优先级是不同的,优

9、先权用在“同时申请” ,而优先级主要是用在“不同时” ,也用在“同时申请” 。这样才有效!/*自答 2END*/附表 1:/*START*/使用 24MHZ,STC89C52RC 单片机#include typedef unsigned char uint8;sbit LED1 = P10;sbit LED2 = P11;sbit LED3 = P12;sbit LED4 = P13;uint8 buf,t;void T0aa() interrupt 1 using 1Buf = TF0;LED3 = buf;TH0 = ( 65536 - 50000 ) / 256;TL0 = ( 6553

10、6 - 50000 ) % 256;t+;if (40 = t)LED1 = 0;t = 0;Buf = TF0;LED2 = buf;void All_Int_Init(void)TMOD = 0x01;TH0 = ( 65536 - 50000 ) / 256; /25ms = 25000usTL0 = ( 65536 - 50000 ) % 256;EA = 1;ET0 = 0; /标志 TF0TR0 = 0;void main()All_Int_Init();While (1)LED4 = buf;(利用 KEIL 自带调试工具。 )/*END*/附表 2:/*START*/使用 24

11、MHZ,STC89C52RC 单片机#include typedef unsigned char uint8;sbit LED1 = P10;sbit LED2 = P11;sbit LED3 = P12;sbit LED4 = P13;uint8 buf, t;void T0aa() interrupt 1 using 1Buf = TF0;LED3 = buf;TH0 = ( 65536 - 50000 ) / 256;TL0 = ( 65536 - 50000 ) % 256;t+;If ( 40 = t )LED1 = 0 ;t = 0; Buf = TF0;LED2 = buf;vo

12、id ex0() interrupt 0 using 2Buf = IE0;LED3 = buf;t+;If ( 40 = t) LED1 = 0;t = 0;Buf = IE0;LED2 = buf;void All_Int_Init(void)TMOD = 0x01;TH0 = ( 65536 - 50000 ) / 256; /25ms = 25000usTL0 = ( 65536 - 50000 ) % 256;EA = 1;ET0 = 0; /标志 TF0TR0 = 0;IT0 = 0;/低电平触发;EX0 = 1; /标志 IE0void main()All_Int_Init();

13、While (1)LED4 = buf;(利用 KEIL 自带调试工具。 )/*END*/附表 3:/*START*/使用 24MHZ,STC89C52RC 单片机#include typedef unsigned char uint8;sbit LED1 = P10;sbit LED2 = P11;sbit LED3 = P12;sbit LED4 = P13;uint8 buf,t,j;void T0aa() interrupt 1 using 1Buf = TF0;LED3 = buf;TH0 = ( 65536 - 50000 ) / 256;TL0 = ( 65536 - 50000

14、 ) % 256;t+;If (40 = t )LED2 = 0;t = 0;Buf = TF0;LED2 = buf;void ex0() interrupt 0 using 2Buf = IE0;LED3 = buf;j+;if(10 = j)LED1 = 0;t = 0;Buf = IE0;LED2 = buf;void All_Int_Init(void)TMOD = 0x01;TH0 = ( 65536 - 50000 ) / 256; /25ms = 25000usTL0 = ( 65536 - 50000 ) % 256;EA = 1;ET0 = 0; /标志 TF0TR0 = 0;IT0 = 0;/低电平触发;EX0 = 0; /标志 IE0PT0 = 0;PX0 = 0;void main()All_Int_Init();While (1)(利用 KEIL 自带调试工具。 )/*END*/

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号