我的世界做指令的网站,汕头网站开发定制,网站如何做关键词排名,罗城建设局网站一#xff0c;文字层面理解 反正我看下面的几段文字时脑壳没有正常运转。一个头几个大 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求#xff0c;要求CPU暂停当前的工作#xff0c;转而去处理这…
一文字层面理解 反正我看下面的几段文字时脑壳没有正常运转。一个头几个大 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求要求CPU暂停当前的工作转而去处理这个紧急事件处理完以后再回到原来被中断的地方继续原来的工作这样的过程称为中断。实现这种功能的部件称为中断系统请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源当几个中断源同时向CPU请求中断要求为它服务的时候这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队优先处理最紧急事件的中断请求源即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。 当CPU正在处理一个中断源请求的时候执行相应的中断服务程序发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序转而去处理优先级更高的中断请求源处理完以后再回到原低级中断服务程序这样的过程称为中断嵌套。这样的中断系统称为多级中断系统没有中断嵌套功能的中断系统称为单级中断系统。
二图形代码结合理解中断
还是上图片吧理解起来稍微容易下 再弄简单点 再入下面这两个图 对于程序员可能还是要用代码才能够直观体现这个逻辑。
void main()
{ //主程序//......//暂停跑去执行中断函数的代码//....中断函数执行中//恢复继续执行主程序代码//......//主程序
}void time0() interrupt 1 //定时器0中断函数 【友情提示在执行这个中断函数的代码时主函数的程序一直是暂停状态直到函数执行结束所以这里面的代码不要有死循环或者长时间执行的逻辑代码。否则下个中断进入时这个中断还没执行完。这个函数里面的代码尽量少逻辑尽量简单执行时间尽量短】
{//中断程序 //.......//中断程序
}
三STC89C52中断资源
3.1 中断源个数8个
外部中断0、
定时器0中断、
外部中断1、
定时器1中断、
串口中断、
定时器2中断、
外部中断2、
外部中断3
3.2 中断优先级个数4个 STC89C51RC/RD系列单片机的所有的中断都具有4个中断优先级对于这些中断请求源可编程为高优先级中断或低优先级中断可实现两级中断服务程序嵌套。一个正在执行的低优先级中断能被高优先级中断所中断但不能被另一个低优先级中断所中断一直执行到结束遇到返回指令RETI返回主程序后再执行一条指令才能响应新的中断申请。以上所述可归纳为下面两条基本规则 1.低优先级中断可被高优先级中断所中断反之不能。 2.任何一种中断(不管是高级还是低级一旦得到响应不会再被它的同级中断所中断当同时收到几个同一优先级的中断要求时哪一个要求得到服务取决于内部的查询次序。这相当于在每个优先级内还同时存在另一个辅助优先级结构STC89C51RC/RD系列单片机各中断优先查询次序如下 3.3 中断号 3.4 中断的结构 3.5 中断的触发 3.6 中断的处理
当某中断产生而且被CPU响应主程序被中断接下来将执行如下操作:
1.当前正被执行的指令全部执行完毕; 2.PC值被压入栈; 3.现场保护; 4阻止同级别其他中断; 5将中断向量地址装载到程序计数器PC;6.执行相应的中断服务程序。 当某中断被响应时被装载到程序计数器PC中的数值称为中断向量是同该中断源相对应的中断服务程序的起始地址。各中断源服务程序的入口地址即中断向量)为: 当“转去执行中断”时引起中断的标志位将被硬件自动清零。由于中断向量入口地址位于程序存储器的开始部分所以主程序的第1条指令通常为跳转指令越过中断向量区(LJMPMAIN)。
四如何开启中断 对于初学中断者来说这感觉就是要给自己插上飞天的翅膀。只要学会了开启各种系统的各种中断基本上其他难题也就迎刃而解。
4.1 开启中断 interrupt 0 用独立按键K3模拟INT0发生中断 控制LED 二进制方式亮灭
我这里只简单举例开启STC89C52RC的 第一个中断。也就是 interrupt 0 。
不要以为写了 个 interrupt 0 的函数 系统就会自动开启中断。错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错
先写个接收中断的函数 也就是 interrupt 0 /*** 函 数中断函数* 参 数无* 返 回 值无*/
void time0() interrupt 0
{P2;/*分析K3第一次按下P2最开始是0xFF,加上1后就变成了0x008个LED去亮起K3第二次按下P2有0x00变成了0x01第一个LED就会熄灭......*/
}
我们要想让程序发生中断进入到我们些的这个中断函数 timer0 中。我们还得配置好寄存器的开关。我们看电路结构需要开启那些开关如下图我圈上的几个开关都给他合上。从优往左看。
PX0:优先级系统默认是最高级不管
EA全局中断开关合上 EA1
EX0允许INT0的中断进入。EX01
IT0设置低电平或者下降沿触发我们先设置IT01下降沿触发 在看INT0 在板子上的针脚位置他和P32是同一个。 P32 我们在《51单片机STC89C52RC——2.1 独立按键控制LED亮灭》中有用到我们用独立按键K3模拟INT0的中断触发。 按一下K3 就会触发中断。LED就会依次亮灭注意LED的亮灭控制要写在中断函数中
#include REGX52.H
/*** 函 数主函数* 参 数无* 返 回 值无*/
void main()
{ P20xFF;//上电熄灭8个LEDIT01; //外部中断 低电平触发 这里用独立按键P32 可模拟触发EX01; //允许中断进入EA1; //打开全局中断开关while(1){}
}
/*** 函 数中断函数* 参 数无* 返 回 值无*/
void time0() interrupt 0
{P2;/*分析K3第一次按下P2最开始是0xFF,加上1后就变成了0x008个LED去亮起K3第二次按下P2有0x00变成了0x01第一个LED就会熄灭......*/
}
效果如下 分析 K3第一次按下P2最开始是0xFF,加上1后就变成了0x008个LED去亮起 K3第二次按下P2有0x00变成了0x01第一个LED就会熄灭 ......
外部中断 1 也就是INT1 引脚也可以用这个方式测试INT1与P33是公用的用独立按键K4可做中断测试。 4.2 开启中断 interrupt 1 (定时器Timer0/计数器 触发中断实现LED闪烁)
如下图。要开启标红的这一路。配置还是比较多。不要嫌麻烦。挨着来。走一遍后你会觉得像是打开了任督二脉。 按照图还是从下往从右往左一次配置。
PX0 优先级系统默认是最高级不管
EA全局中断开关合上 EA1
ET0允许Timer0/TF0 的中断进入。ET01
我们再单独分析定时器器/计数器 TR0定时器开始运行TR01
TMOD采用模式116位
TL064535%256(TL0TIMS; [TL0只有8位所以高位不会赋值过去只有地位有效])
TH064536/256;TH0TIMS8;TH0也只有8位TIMS右移8位后然低位溢出高位就自动在低位了
每次中断发生后都需要重新将TH0和TL0重新初始化。在中断函数中重新赋值TH0和TL0
#include REGX52.H
/*宏定义定时器的初始值*/
#define TIMS (65536-12000000/12/1000)
unsigned int count1000;//计数器 默认1000
void main()
{TMOD0x01; //设置模式1TL0TIMS; //设置定时器的低8位TH0TIMS8;//设置定时器的高8位TR01; //让定时器开始运行ET01; //允许定时器发生中断溢出EA1; //打开全局中断while(1); //主程序停止在此
}/*** 函 数定时器中断函数* 参 数无* 返 回 值无*/
void timer0_interrupt() interrupt 1
{TL0TIMS; //重新初始化低位TH0TIMS8; //重新初始化高位if(count--0) //1毫秒*10001秒{ count1000; //重置计数P2_0!P2_0; //第一个LED 每秒熄亮一次}
} 有了以上两种 开启中断的方式也就