您的位置 首页 编程

51单片机之寄存器-3.2单片机中止

讲单片机中断之前,先来个通俗的例子。假如今天有快递来,你要知道快递什么时候到有两种方式,第一种,每隔一分钟你到楼下看快递到了没,这

单片机中止之前,先来个浅显的比方。假设今天有快递来,你要知道快递什么时分到有两种方法,第一种,每隔一分钟你到楼下看快递到了没,这样总有一次能碰到快递。第二种,快递来了,给打电话,然后你去取快递。第一种称为查询法,很明显这种方法很糟蹋膂力。第二种便是中止了,比较轻松。这样咱们来具体的评论一下这个进程。假设你在家里正在看电影,遽然电话响了告诉你取快递,所以你把电影暂停,下楼取快递,然后回来持续看电影,如下图所示

图1 日常日子中的中止

这个便是日常日子中的中止场景。咱们再概述一下这个进程,当你正在处理某件作业的时分(看电影),外界产生了比较急的作业恳求(电话告诉快递到了), 你暂停当时的作业(看电影),转而去处理这个比较急的作业(取快递),处理完今后,再回到本来的当地,持续本来的作业(看电影)。把前面这句话中的”你”换成CPU便是单片机的中止进程了。电话铃响便是中止源用来告诉你(CPU), 然后你(CPU)暂停当时作业,去取快递。取快递总共CPU进入中止服务程序,也便是你承受中止恳求源后决议做什么。日常日子中的中止源多种多样,比方水烧开了,敲门声,闹钟响了等等。相同单片机中也有多种中止源,STC89C52单片机有8种中止源,外部中止(外部中止0-3),守时器中止(0-2),串口中止. 那么问题又来了,已然这么多中止源,假如一起产生应该处理哪个呢?比方电话响起的时分,家里的水也烧开了,你该优先处理哪个,当然要把烧水的先关掉,这个或许产生风险,因而水烧开了的优先级要于取快递。相同在单片机中止源也有优先级凹凸之分,这样一起向CPU宣布恳求的时分,CPU能判别回复哪一个。并且这些中止源能够经过软件来设置,总共能够设置成四个优先级。

如上表所示,你能够经过IPH,IP来设置中止源的优先级,比方Timer0经过设置PT0H,PT0为1,1,那么Timer0便是最高优先级3了。这样又有一个问题,假如现在我把Timer1也设置成最高优先级3,Timer0和Timer1一起向CPU宣布恳求,CPU该怎样办呢?相同在上表中给出了答案,经过相同优先级内的查询次第来处理。每个中止都有两个开关,一个总开关和一个分开关操控。CPU要能顺畅进入中止服务程序,每个中止对应的两个中止答应操控位有必要翻开。如上表中的Timer0中止答应位ET0/EA,其间EA为总中止开关,EA假如封闭,一切中止均无效,别的ET0为分开关。关于中止中的中止(中止嵌套),咱们后边评论,现在咱们举个比方体会一下。

例3-2经过守时器0中止来操控LED亮1秒,灭1秒

现在来剖析一下这个比方,题目中说要经过守时器中止来操控LED0。已然是中止,那么中止谁?CPU怎样知道产生中止了,怎么处理?很简单得出如下处理过程:

(1) CPU正在干什么(看电影)

(2) 产生了什么比较急的作业(快递来了)

(3) 怎么告诉CPU(电话铃响)

(4) CPU怎么处理(取快递)

(5)处理完后回到本来的作业(看电影)

第1步,CPU正在干什么。这儿能够让CPU什么都不干,或许点亮别的一个LED1等候. 第2步,守时器计时并溢出。第3步,硬件TF0置1,告诉CPU。第4步,CPU怎么处理?便是指CPU进入中止服务程序。在中止服务程序中,咱们判别假如守时1秒则点亮或许平息LED0. 这儿需求留意守时器0的中止号为interrupt 1,其他中止号如下:

  • void MyInt0(void) interrupt 0;//外部中止0
  • //MyInt0中止函数名,能够自己修正,interrupt 0中止号,不能修正,以下相似
  • void MyTimer0(void) interrupt 1;//守时器0中止
  • void MyInt1(void) interrupt 2;//外部中止1
  • void MyTimer1(void) interrupt 3;//守时器1中止
  • void MyUART(void) interrupt 4;//串口中止
  • void MyTimer2(void) interrupt 5;//守时器2中止
  • void MyInt2(void) interrupt 6;//外部中止2
  • void MyInt3(void) interrupt 7;//外部中止3
参阅代码如下:

  • #include “reg52.h”
  • void timer0_init(void);
  • sbit LED0=P1^0;//设置LED0引脚
  • sbit LED1=P1^6;//设置LED1引脚
  • unsigned char i=0;
  • void main(void)
  • {
  • ET0=1;//翻开守时器0中止
  • EA=1;//翻开总中止
  • timer0_init();//产生了什么作业
  • while(1)//CPU正在干什么?
  • {
  • LED0=0;
  • }
  • }
  • void timer0_init(void)
  • {
  • TMOD=0X01;//守时器形式挑选16bit
  • TH0=0X4C;
  • TL0=0X00;//TH0,TL0初始值
  • TR0=1;//舱位守时器
  • }
  • void timer0_intrrupt () interrupt 1//守时器0中止服务程序
  • {
  • TH0=0X4C;
  • TL0=0X00;
  • i++;
  • if(i==20)//守时次数到达20,那么总守时为1秒
  • {
  • i=0;
  • LED1=~LED1;
  • LED0=1;
  • }
  • }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/263508.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部