精华内容
下载资源
问答
  • 2021-12-31 10:51:41

    在这里插入图片描述

    实例 1:用定时器T1查询方式控制单片机发出1KHz音频

    #include<reg51.h>        //  包含51单片机寄存器定义的头文件
    sbit sound=P3^7;   //将sound位定义为P3.7引脚
    void main(void)
    {
        EA=1;                  //开总中断
    	ET0=1;                 //定时器T0中断允许         
    	TMOD=0x10;            //使用定时器T1的模式1
    	TH1=(65536-921)/256;  //定时器T1的高8位赋初值
    	TL1=(65536-921)%256;  //定时器T1的高8位赋初值
    	TR1=1;                //启动定时器T1
    	TF1=0;
    	while(1)//无限循环等待查询
        {
    	   while(TF1==0);
    		 TF1=0;
    		sound=~sound;  //将P3.7引脚输出电平取反
           TH1=(65536-921)/256;  //定时器T0的高8位赋初值
    	    TL1=(65536-921)%256;  //定时器T0的高8位赋初值
    	 }
     }
    

    实例 2:将计数器T0计数的结果送P1口8位LED显示

    #include<reg51.h>        //  包含51单片机寄存器定义的头文件
    
    sbit S=P3^4;   //将S位定义为P3.4引脚
    
    void main(void)
    {
        EA=1;                  //开总中断
     	ET0=1;                 //定时器T0中断允许         
    	TMOD=0x02;            //使用定时器T0的模式2
    	TH0=256-156;  //定时器T0的高8位赋初值
    	TL0=256-156;  //定时器T0的高8位赋初值
    	TR0=1;                //启动定时器T0
    	while(1)//无限循环等待查询
        {
    	   while(TF0==0)  //如果未计满就等待
      	    {
               if(S==0)  //按键S按下接地,电平为0
    			    P1=TL0; //计数器TL0加1后送P1口显示
            } 
    	    TF0=0;  //计数器溢出后,将TF0清0
    	 }
    }
    

    实例 3:用定时器T0的中断控制1位LED闪烁

    #include<reg51.h>  //  包含51单片机寄存器定义的头文件
    
    sbit D1=P2^0;  //将D1位定义为P2.0引脚
    
    void main(void)
    {
       	EA=1;                  //开总中断
    	ET0=1;                 //定时器T0中断允许         
    	TMOD=0x01;             //使用定时器T0的模式2
    	TH0=(65536-46083)/256; //定时器T0的高8位赋初值
    	TL0=(65536-46083)%256; //定时器T0的高8位赋初值
    	TR0=1;                 //启动定时器T0
    	while(1);
    }
    
    //函数功能:定时器T0的中断服务程序
    **************************************************************/
    void Time0(void) interrupt 1 using 0   //寄存器 
     {
       	D1=~D1;  //按位取反操作,将P2.0引脚输出电平取反
      	TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值
    	TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值
     }
    
    

    实例 4:用定时器T0的中断实现长时间定时

    #include<reg51.h>  //  包含51单片机寄存器定义的头文件
    
    sbit D1=P2^0;  //将D1位定义为P2.0引脚
    unsigned char Countor; //设置全局变量,储存定时器T0中断次数
    
    void main(void)
    {
        EA=1;                  //开总中断
    	ET0=1;                 //定时器T0中断允许         
    	TMOD=0x01;             //使用定时器T0的模式2
    	TH0=(65536-46083)/256; //定时器T0的高8位赋初值
    	TL0=(65536-46083)%256; //定时器T0的高8位赋初值
    	TR0=1;                 //启动定时器T0
    	Countor=0;            //从0开始累计中断次数
    	while(1);
    }
    /**************************************************************
    函数功能:定时器T0的中断服务程序
    **************************************************************/
    void Time0(void) interrupt 1 using 0 
    {
        Countor++;   //中断次数自加1
    	if(Countor==20)  //若累计满20次,即计时满1s
    	{
    	   D1=~D1;     //按位取反操作,将P2.0引脚输出电平取反
    		Countor=0;  //将Countor清0,重新从0开始计数
    	}
      	TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值
    	TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值
    }
    

    实例 5:用定时器T1中断控制两个LED以不同周期闪烁

    #include<reg51.h>  //  包含51单片机寄存器定义的头文件
    
    sbit D1=P2^0;  //将D1位定义为P2.0引脚
    sbit D2=P2^1;  //将D2位定义为P2.1引脚
    unsigned char Countor1; //设置全局变量,储存定时器T1中断次数
    unsigned char Countor2; //设置全局变量,储存定时器T1中断次数
    
    void main(void)
    {
        EA=1;                  //开总中断
    	ET1=1;                 //定时器T1中断允许         
    	TMOD=0x10;             //使用定时器T1的模式1
    	TH1=(65536-46083)/256; //定时器T1的高8位赋初值
    	TL1=(65536-46083)%256; //定时器T1的高8位赋初值
    	TR1=1;                 //启动定时器T1
    	Countor1=0;            //从0开始累计中断次数
    	Countor2=0;            //从0开始累计中断次数 
    	while(1);
    }
    
    // 定时器1
    void Time1(void) interrupt 3 using 0 
    {
        Countor1++;   //Countor1自加1
    	Countor2++;   //Countor2自加1
    	if(Countor1==2)  //若累计满2次,即计时满100ms
    	{
    		D1=~D1;     //按位取反操作,将P2.0引脚输出电平取反
    	    Countor1=0;  //将Countor1清0,重新从0开始计数
    	}
    	if(Countor2==8)  //若累计满8次,即计时满400ms
    	{
    	   D2=~D2;     //按位取反操作,将P2.1引脚输出电平取反
    	   Countor2=0;  //将Countor1清0,重新从0开始计数
    	}		
      	TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值
    	TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值
    }
    

    实例 6:输出50个矩形脉冲

    #include<reg51.h>   //包含51单片机寄存器定义的头文件
    
    sbit u=P1^4;    //将u位定义为P1.4
    
    /*************************************************
    函数功能:延时约30ms (3*100*100=30 000μs =30m
    *************************************************/
    void delay30ms(void)
    { 
        unsigned char m,n;
     for(m=0;m<100;m++)
         for(n=0;n<100;n++);
    }
    
    void main(void)
    {
        unsigned char i;
        u=1;    //初始化输出高电平
        for(i=0;i<50;i++) //输出50个矩形脉冲
        { 
            u=1;
         delay30ms();
         u=0;
         delay30ms(); 
        }
        while(1) :
    } 
    

    实例 7:计数器T0统计外部脉冲数

    #include<reg51.h>   //包含51单片机寄存器定义的头文件
    
    void main(void)
      {
     	  TMOD=0x06;    // TMOD=0000 0110B,使用计数器T0的模式2
         EA=1;         //开总中断
    	  ET0=0;        //不使用定时器T0的中断     
    	  TR0=1;        //启动T0
    	  TH0=0;       //计数器T0高8位赋初值
    	  TL0=0;       //计数器T0低8位赋初值
    	  while(1)  //无限循环,不停地将TL0计数结果送P1口
         P1=TL0;		
    }
    
    

    实例 8:定时器T0的模式2测量正脉冲宽度

    #include<reg51.h>   //包含51单片机寄存器定义的头文件
    
    sbit ui=P3^2;  //将ui位定义为P3.0(INT0)引脚,表示输入电压
    
    void main(void)
    {
        TMOD=0x0a;   // TMOD=0000 1010B,使用定时器T0的模式2,GATE置1
        EA=1;         //开总中断
        ET0=0;        //不使用定时器T0的中断     
        TR0=1;        //启动T0
        TH0=0;        //计数器T0高8位赋初值
        TL0=0;        //计数器T0低8位赋初值
        while(1)       //无限循环,不停地将TL0计数结果送P1口
        {
            while(ui==0) : //INT0为低电平,T0不能启动
            TL0=0;       //INT0为高电平,启动T0计时,所以将TL0清0
            while(ui==1): //在INT0高电平期间,等待,计时
            P1=TL0;    //将计时结果送P1口显示		
        } 
    }
    

    实例 9:输出负脉宽为200微秒的方波

    #include<reg51.h>   //包含51单片机寄存器定义的头文件
    
    sbit u=P1^4;    //将u位定义为P1.4
    
    void main(void)
      {
       TMOD=0x02;            //TMOD=0000 0010B,使用定时器T0的模式2
       EA=1;                    //开总中断
    	ET0=1;                  //定时器T0中断允许         
    	TH0=256-200;   //定时器T0的高8位赋初值
    	TL0=256-200;  //定时器T0的高8位赋初值
    	TR0=1;                 //启动定时器T0
    	while(1) : 
    }             //无限循环,等待中断
    void Time0(void) interrupt 1 using 0 //"interrupt"声明函数为中断服务函数
    {
        u=~u;  //将P1.4引脚输出电平取反,产生方波
    }
    
    

    实例 10:测量负脉冲宽度

    #include<reg51.h>   //包含51单片机寄存器定义的头文件
    
    sbit u=P3^2;    //将u位定义为P3.2
    
    void main(void)
    {
        TMOD=0x02;  //TMOD=0000 0010B,使用定时器T0的模式2
        EA=1;   //开放总中断
        EX0=1;  //允许使用外中断
        IT0=1;  //选择负跳变来触发外中断
        ET0=1;  //允许定时器T0中断
        TH0=0;  //定时器T0赋初值0
        TL0=0;   //定时器T0赋初值0
        TR0=0;   //先关闭T0
        while(1)    ; //无限循环, 不停检测输入负脉冲宽度
    }
    
    void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
    {   
        TR0=1;   //外中断一到来,即启动T0计时
        TL0=0;  //从0开始计时
        while(u==0)  //低电平时,等待T0计时
            ;
        P1=TL0; //将结果送P1口显示
        TR0=0;  //关闭T0
    }
    

    实例 11:方式0控制流水灯循环点亮

    #include<reg51.h>   //包含51单片机寄存器定义的头文件
    #include<intrins.h> //包含函数_nop_()定义的头文件
    
    unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量
    sbit P17=P1^7;
    
    /**************************************************************
    函数功能:延时约150ms
    **************************************************************/
    void delay(void)   
    {
        unsigned char m,n;
        for(m=0;m<200;m++)
            for(n=0;n<250;n++);    
    }
    
    /**************************************************************
    函数功能:发送一个字节的数据
    **************************************************************/
    void Send(unsigned char dat)
    {
        P17=0;     //P1.7引脚输出清0信号,对74LS164清0
        _nop_();   //延时一个机器周期
        _nop_();  //延时一个机器周期,保证清0完成
        P17=1;    //结束对74LS164的清0
        SBUF=dat;  //将数据写入发送缓冲器,启动发送
        while(TI==0)  //若没有发送完毕,等待
            ;
        TI=0;   //发送完毕,TI被置“1”,需将其清0
    }
    
    /*******************************************
    函数功能:主函数
    ******************************************/	
    void main(void)
    {
        unsigned char i;
        SCON=0x00;  //SCON=0000 0000B,使串行口工作于方式0   
        while(1)  
        {
            for(i=0;i<8;i++)
            {
                Send(Tab[i]);  //发送数据
                delay();       //延时
            }
        }
    }
    
    更多相关内容
  • 本文给大家分享了外中断(80C51单片机汇编语言编程)。
  • 目录硬知识中断系统中断结构中断优先级中断处理 普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 选自《STC89C52系列单片机器件手册》 中断系统   ...

    普中51-单核-A2
    STC89C52
    Keil uVision V5.29.0.0
    PK51 Prof.Developers Kit Version:9.60.0.0


    硬知识

    选自《普中51单片机开发攻略_V1.2》、《STC89C52系列单片机器件手册》

    中断概念

           中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的, 中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学习单片机必须要掌握的。很多初学者被困在中断中,学了很久仍然不知道中断究竟是如何运作的。千万不要认为它有多难, 其实只要掌握正确的学习方法,没有哪个知识点是学不会的。
           为了能让大家更容易理解中断概念, 我们先来举一个生活事例: 你打开火, 烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完开水后,你又回去继续洗衣服。这个过程中实际上就发生了一次中断。
           对于单片机来讲,中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B, 请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应), 转去处理事件 B(中断服务);待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被 中断的地方继续处理事件 A(中断返回),这一过程称为中断。
    在这里插入图片描述
           再回来看前面讲的生活事例,与单片机中断结合分析,你的主任务是洗衣服, 水开报警这是一个中断请求,这一时刻相当于断点处,你响应中断去关火,然后将开水灌入暖水瓶中,这一动作实际上就是处理中断程序,灌完开水后再回去继续洗衣服,相当于处理完中断程序后再返回主程序继续执行主程序。这里需要注 意的是,水开是随时都有可能的,但是无论什么时候开,只要一开你将立即去处理它,处理完后再回来继续接着洗刚才那件衣服。单片机在执行程序时,中断也随时有可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。
           单片机在执行程序时其程序流程图如下:
    在这里插入图片描述
           引起 CPU 中断的根源称为中断源。中断源向 CPU 提出中断请求,CPU 暂时中断原来的事务 A,转去处理事件 B,对事件 B 处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。
           中断的开启与关闭、设置启用哪一个中断等都是由单片机内部的一些特殊功能寄存器来决定的。
           随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与慢速 I/O 设备的数据传送问题,而且还具有如下优点:

    ①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率;
    ②实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增 强;
    ③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统 可靠性提高。

    中断系统

           中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
           当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求
           当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统
           STC89C52系列单片机提供了8个中断请求源,它们分别是:外部中断0(INT0)、定时器0中断、外部中断1(INT1)、定时器1中断、串口(UART)中断、定时器2中断、外部中断2(INT2)、外部中断3(NT3)。所有的中断都具有4个中断优先级。用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断申请;每一个中断源可以用软件独立地控制为开中断或关中断状态;每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。STC89C52系列单片机的各个中断查询次序如下表所示:
    在这里插入图片描述
           通过设置新增加的特殊功能寄存器IPH中的相应位,可将中断优先级设为四级,如果只设置IP或XICON,那么中断优先级就只有两级,与传统8051单片机两级中断优先级完全兼容。
    在这里插入图片描述
    在这里插入图片描述

           中断优先级控制寄存器IP和IPH的各位都由可用户程序置“1”和清“0"。但IP寄存器可位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IPH寄存器的内容只能用字节操作指令来更新。STC89C52系列单片机复位后IP和IPH均为00H,各个中断源均为低优先级中断。

           如果使用C语言编程,中断查询次序号就是中断号,例如:
    在这里插入图片描述

    中断结构

    在这里插入图片描述
    外部中断
           外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)和外部中断3(INT3)既可低电平触发,也可下降沿触发。请求四个外部中断的标志位是位于寄存器TCON中的IE0/TCON.1、IE1/TCON.3,IE2/XICON.2和IE3/XICON.5,当外部中断服务程序被响应后,中断请求标志位IE0,IE1,IE2和IE3会自动被清0,TCON寄存器中的ITO/TCON.0,IT1/TCON.2,IT2/XICON.0和IT3/XICON.4决定了外部中断0、1、2和3是低电平触发方式还是下降沿触发方式。如果ITx = 0(x =0,1,2,3),那么系统在INTx(x = 0,1,2,3)脚探测到低电平后可产生外部中断。如果ITx = 1(x=0,1,2,3),那么系统在INTx(x= 0,1,2,3)脚探测下降沿后可产生外部中断。外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)和外部中断3(NT3)还可以用于将单片机从掉电模式唤醒
    定时器中断
           定时器0和1的中断请求标志位是TF0和TF1,当定时器寄存器THx/TLx(x= 0,1)溢出时,溢出标志位TFx(x= 0,1)会被置位,定时器中断发生。当单片机转去执行该定时器中断时,定时器的溢出标志位TFx(x=0,1)会被硬件清除。
           定时器2的中断请求标志位是TF2和EXF2,当定时器寄存器TH2/TL2溢出时,溢出标志位TF2会被置位,定时器中断发生。当单片机转去执行该定时器中断时,定时器的溢出标志位TF2会被硬件清除。当EXEN2=1且T2EX的负跳变产生捕获或重装时,EXF2置位。定时器2中断使能时,EXF2=1也将使CPU从中断向量处执行定时器2中断子程序。
    串口中断
           当串行口接收中断请求标志位RI和串行口1发送中断请求标志位TI中的任何一个被置为后,串行口中断都会产生。
    在这里插入图片描述

    中断优先级

           STC89C52系列单片机的所有的中断都具有4个中断优先级,对于这些中断请求源可编程为高优先级中断或低优先级中断,可实现两级中断服务程序嵌套。一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断,一直执行到结束,遇到返回指令RETI,返回主程序后再执行一条指令才能响应新的中断申请。以上所述可归纳为下面两条基本规则:

    1,低优先级中断可被高优先级中断所中断,反之不能。
    2,任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断

           当同时收到几个同一优先级的中断要求时,哪一个要求得到服务,取决于内部的查询次序。这相当于在每个优先级内,还同时存在另一个辅助优先级结构,STC89C52系列单片机各中断优先查询次序如下:
    在这里插入图片描述

    中断处理

    当某中断产生而且被CPU响应,主程序被中断,接下来将执行如下操作:

    1. 当前正被执行的指令全部执行完毕;
    2. PC值被压入栈;
    3. 现场保护;
    4. 阻止同级别其他中断;
    5. 将中断向量地址装载到程序计数器PC;
    6. 执行相应的中断服务程序。

           中断服务程序ISR完成和该中断相应的一些操作。ISR以RETI(中断返回)指令结束,将PC值从栈中取回,并恢复原来的中断设置,之后从主程序的断点处继续执行。
           当某中断被响应时,被装载到程序计数器PC中的数值称为中断向量,是同该中断源相对应的中断服务程序的起始地址。各中断源服务程序的入口地址(即中断向量)为:
    在这里插入图片描述
           当“转去执行中断”时,引起中断的标志位将被硬件自动清零。由于中断向量入口地址位于程序存储器的开始部分,所以主程序的第1条指令通常为跳转指令,越过中断向量区(LJMP MAIN).
           注意:不能用RET指令代替RETI指令
           RET指令虽然也能控制PC返回到原来中断的地方,但RET指令没有清零中断优先级状态触发器的功能,中断控制系统会认为中断仍在进行,其后果是与此同级或低级的中断请求将不被响应。
           若用户在中断服务程序中进行了入栈操作,则在RETI指令执行前应进行相应的出栈操作,即在中断服务程序中PUSH指令与POP指令必须成对使用,否则不能正确返回断点。

    展开全文
  • 4.2 51单片机-中断

    2021-10-28 16:49:20
    当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完完后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断,实现这种功的部件称为...

    4.2 中断

    4.2.1 中断介绍

    中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的

    当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完完后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断,实现这种功的部件称为中断系统,请示CPU中断的请求源称为中断源。

    微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别,CPU总是先响应优先级别最高的中断请求。

    当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求;如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后再回到原来低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。

    4.2.2 STC90C51RD系统中断源介绍

    STC90C51RC/RD+系列单片机提供了8个中断请源,它们分别是:外部中断0(INT0)、定时器0中断、外部中断1(INT1)、定时器1中断、定时器2中断、串口(UART)中断、外部中断2(INT2)、外部中断3(INT3)

    所有的中断都具有4个中断优先级,用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位,屏蔽所有的中断请求,也可以打开相应的中断允许位使CPU响应相应的中断申请;每一个中断源可以用软件独立地控制开中断或关中断状态;每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。

    4.2.3 中断的优先级与中断结构图

    图4-2-1 中断优先级表

    通过设置新增加的特殊功能寄存器IPH中的相应位,可将中断优先级设为四级,如果设置IP或XICON,那么中断优先级就只有两级,与传统8051单片机两级中断优先级完全兼容。

    图4-2-2 中断结构图 

     

    图4-2-3 中断相关寄存器

    4.2.4 中断服务函数

    中断服务函数的名字只要符合C语言标识符的命名规则,可以随意取,需要注意的地方是: 中断服务函数没有返回值,没有形参,也不需要单独去声明,并且函数名称体的右边需要使用interrupt关键字声明,interrupt是中断特有的关键字,在interrupt关键字后面可以增加数字,这个数字是根据中断优先级编号来的(可以看4.2.3小节的中断优先级表)。

    使用C语言编程,中断查询次序号就是中断号,C51所有的中断服务函数编写如下:

    void EXTI0_IRQHandler(void) interrupt 0 //外部中断0
    {
        /*code block*/
    }
    void TIM0_IRQHandler(void) interrupt 1  //定时器0
    {
        /*code block*/
    }
    void EXTI1_IRQHandler(void) interrupt 2 //外部中断1
    {
        /*code block*/
    }
    void TIM1_IRQHandler(void) interrupt 3  //定时器1
    {
        /*code block*/
    }
    void UART_IRQHandler(void) interrupt 4  //串口
    {
        /*code block*/
    }
    void TIM2_IRQHandler(void) interrupt 5  //定时器2
    {
        /*code block*/
    }
    void EXTI2_IRQHandler(void) interrupt 6 //外部中断2
    {
        /*code block*/
    }
    void EXTI3_IRQHandler(void) interrupt 7 //外部中断3
    {
        /*code block*/
    }

    4.2.5 中断控制寄存器介绍

    51单片机CPU对中断源的开放或者屏蔽,每一个中断源是否被允许中断,是由内部的中断允许寄存器IE(地址为A8H)和XICON(地址为C0H)控制的,寄存器IE的格式如下:

    图4-2-4

    EA : CPU的总中断允许控制位, EA=1,CPU开放中断, EA=0, CPU屏蔽所有的中断申请。EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。

    ET2: 定时/计数器T2的溢出中断允许位,ET2=1,允许T2中断; ET2=0,禁止T2中断。

    ES : 串行口1中断允许位。ES=1,允许串行口1中断; ES=0,禁止串行口1中断。

    ET1: 定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断; ET1=0,禁止T1中断。

    EX1 : 外部中断1中断允许位。EX1=1,允许外部中断1中断; EX1=0,禁止外部中断1中断。

    ET0 : T0的溢出中断允许位。ET0=1,允许T0中断; ET0=0禁止T0中断。

    EX0 : 外部中断0中断允许位。 EX0=1,允许中断; EX0=0禁止中断。

    4.2.6 配置定时器0使用中断(8位模式)

    下面代码里配置51单片机的定时器0工作在8位定时器自动重装载模式,并开启了溢出中断,在自动重装载模式下,每次定时器溢出之后,会自动重装载,就省去了手动赋重装值的过程,比较方便,但是定时器的每次最大定时时间变短了,计数器到达255就会溢出。

    程序里封装了计算重装值的函数,方便调用,程序开启了溢出中断,定时器时间到达后会进入到中断服务函数,中断服务函数里使用了一个计数变量,用于记录定时器的超时次数,时间到达500毫秒时,就改变一次LED灯的状态。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    int main()
    {
        Timer0_8bit_Init(100);  //配置定时器超时的时间为100us
        LED=0x00; //关闭所有灯
        while(1)
        {
            
        }
    }
    /*
    配置定时器0工作在8位自动重装载模式
    注意,时间不能超过定时器最大时间
    255*(12/11.059200)=276us
    */
    void Timer0_8bit_Init(u16 us)
    {   
        //当前实验板上的晶振实际频率为: 11.956MHZ
        u16 val=us/(12/11.956); //得到计数的时间,只要整数部分
        TMOD&=0xF0;     //清除配置
        TMOD|=0x02;     //配置定时器0工作在8位自动重载模式
        TL0=TH0=255-val;//得到重装载值;
        EA=1;           //开启总中断
        ET0=1;          //开启定时器0溢出中断
        TR0=1;          //启动定时器0
    }
    
    /*
    定时器0的中断服务函数
    */
    u32 cnt=0;
    void TIM0_IRQHandler(void) interrupt 1
    {
        //使用了中断,就不需要手动清除标志位,硬件会自动清除
        cnt++;//记录超时次数
        if(cnt==10*500) //500ms
        {
            cnt=0;
            LED=~LED;
    }
    }

    4.2.7 配置定时器1使用中断(16位模式)

    下面代码里配置51单片机的定时器1工作在16位定时器模式。程序封装了计算重装值的函数,方便调用,程序里开启了溢出中断,在中断服务函数里使用了一个计数变量,记录定时器超时的次数,时间到达1秒钟,就是改变一次LED灯的状态。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    u16 T1_Update_data;//定时器1的初始值
    void Timer1_16bit_Init(u16 us)
    {   
        //当前实验板上的晶振实际频率为: 11.956MHZ
        u16 val=us/(12/11.956); //得到计数的时间,只要整数部分
        T1_Update_data=65535-val; //得到重装载值
        TMOD&=0x0F;            //清除配置
        TMOD|=0x10;            //配置定时器1工作在16位定时器模式
        TH1=T1_Update_data>>8; //定时器1高位重装值
        TL1=T1_Update_data;    //定时器1低位重装值
        EA=1;                   //开启总中断
        ET1=1;                  //开启定时器1溢出中断
        TR1=1;                 //启动定时器1
    }
    
    //定时器1的重装值更新函数
    void Timer1_Update(void)
    {
        TH1=T1_Update_data>>8; //定时器1高位重装值
        TL1=T1_Update_data;    //定时器1低位重装值
    }
    
    /*
    定时器1的中断服务函数
    */
    void TIM1_IRQHandler(void) interrupt 3  //定时器1
    {
        //使用了中断,就不需要手动清除标志位,硬件会自动清除
        Timer1_Update(); //更新重装载值
        //使用了中断,就需要手动清除标志位,硬件会自动清除
        cnt++;//记录超时次数
        if(cnt==1000) //1000ms
        {
            cnt=0;
            LED=~LED;
        }
    }
    int main()
    {
        Timer1_16bit_Init(1000);  //配置定时器超时的时间为1000us
        LED=0x00; //关闭所有灯
        while(1)
        {
            
        }
    }

    4.2.8 外部中断(EXTI)配置寄存器介绍

    STC90C51有4个外部中断源,分别是:外部中断0(P3.2),外部中断1(P3.3),外部中断2(P4.3),外部中断3(P4.2)。

    图4-2-5 外部中断1和0的IO口

    图4-2-6 外部中断2和3的IO口

    外部中断0和外部中断1的相关配置位在TCON寄存器里,TCON寄存器位如下表所示:

    图4-2-7 外部中断0和1的配置寄存器

    IE1外部中断1请求源(INT1/P3.3)标志。 当发生外部中断请求时 ,IE1会被CPU置1,在中断服务函数里需要将IE1清0。

    IT1外部中断1源中断源类型选位。IT1=0,INT1/P3.3引脚上的低电平信号可触发外部中断1;IT1=1,外部中断1为下降沿触发方式。

    IE0外部中断0请求源(INT0/P3.2)标志。 当发生外部中断请求时 ,IE0会被CPU置1,在中断服务函数里需要将IE0清0。

    IT0外部中断0中断源类型选择位。IT0=0,INT0/P3.2引脚上的低电平可触发外部中断0;IT0=1,外部中断0为下降沿触发方式。

    外部中断2和外部中断3的相关配置为在XICON寄存器里,XICON寄存器位如下表所示:

    图4-2-8 外部中断2和3的配置寄存器

    IE3 : 外部中断3中断请求标志位,中断条件成立后,IE3=1,可由硬件自动清零。

    IT3 : 当此位由软件置位时(IT3=1),外部中断3为下降沿触发中断;当此位由软件清零时(IT3=0),为低电平触发中断。

    IE2 : 外部中断2中断请求标志位,中断条件成立后,IE2=1,可由硬件自动清零。

    IT2 : 当此位由软件置位时(IT2=1),外部中断2为下降沿触发中断;当此位由软件清零时(IT2=0),为低电平触发中断。

    EX3 : 如被设置成1,允许外部中断3中断;如被清成0,禁止外部中断3中断。

    EX2 : 如被设置成1,允许外部中断2中断;如被清成0,禁止外部中断2中断。

    4.2.9 配置外部中断0下降沿触发示例

    下面代码配置外部中断0采用下降沿触发,在外部中断0的服务函数里改变LED灯的状态。

    外部中断0的复用IO是P3.2,在实验板上实验时,需要使用杜邦线把按键的一个引脚接在P3.2上,可以使用按键测试外部中断0的触发效果,由于实验板上的红外线遥控也是接的P3.2,为了不产生干扰,需要先将红外线遥控的跳线帽拔掉,再使用按键测试。

     图4-2-5

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    int main()
    {
        LED=0x00;
        EXTI0_Init();
        while(1)
        {
            
        }
    }
    /*
    配置外部中断0下降沿触发中断
    IO口: P3.2
    */
    void EXTI0_Init(void)
    {
       EA=1;  //开启总中断
       IT0=1; //外部中断0下降沿触发
       EX0=1; //允许外部中断0产生中断
    }
    /*
    外部中断0中断服务函数
    */
    void EXTI0_IRQHandler(void) interrupt 0
    {
        LED=~LED; //改变LED灯的状态
        IE0=0; //清除外部中断0的标志位
    }

    4.2.10 中断优先级配置

    传统8051单片机具有两个中断优先级,即高优先级和低优先级,可以实现两级中断嵌套。

    STC90C51RC/RD+系列单片机通过设置新增加的特殊功能寄存器(IPH)中的相应位,可将中断优先级设置为4个中断优先级;如果设置IP,那么中断优先级只有两级,与传统8051单片机两级中断优先级完全兼容。

    一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断。

    上所述可归纳为下面两条基本规则:

    1. 低优先级中断可被高优先级中断所中断,反之不能。

    2. 任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断

    中断优先级的配置寄存器如下表所示:

    图4-2-6

    PX3H,PX3: 外部中断3优先级控制位:

    当PX3H=0且PX3=0时,外部中断3为最低优先级中断(优先级0)

    当PX3H=0且PX3=1时,外部中断3为较低优先级中断(优先级1)

    当PX3H=1且PX3=0时,外部中断3为较高优先级中断(优先级2)

    当PX3H=1且PX3=1时,外部中断3为最高优先级中断(优先级3)

    PX2H, PX2: 外部中断2优先级控制位:

    当PX2H=0且PX2=0时,外部中断2为最低优先级中断(优先级0)

    当PX2H=0且PX2=1时,外部中断2为较低优先级中断(优先级1)

    当PX2H=1且PX2=0时,外部中断2为较高优先级中断(优先级2)

    当PX2H=1且PX2=1时,外部中断2为最高优先级中断(优先级3)

    PT2H, PT2: 定时器2中断优先级控制位:

    当PT2H=0且PT2=0时,定时器2中断为最低优先级中断(优先级0)

    当PT2H=0且PT2=1时,定时器2中断为较低优先级中断(优先级1)

    当PT2H=1且PT2=0时,定时器2中断为较高优先级中断(优先级2)

    当PT2H=1且PT2=1时,定时器2中断为最高优先级中断(优先级3)

    PSH,PS: 串口1中断优先级控制位:

    当PSH=0且PS=0时,串口1中断为最低优先级中断(优先级0)

    当PSH=0且PS=1时,串口1中断为较低优先级中断(优先级1)

    当PSH=1且PS=0时,串口1中断为较高优先级中断(优先级2)

    当PSH=1且PS=1时,串口1中断为最高优先级中断(优先级3)

    PT1H, PT1: 定时器1中断优先级控制位:

    当PT1H=0且PT1=0时,定时器1中断为最低优先级中断(优先级0)

    当PT1H=0且PT1=1时,定时器1中断为较低优先级中断(优先级1)

    当PT1H=1且PT1=0时,定时器1中断为较高优先级中断(优先级2)

    当PT1H=1且PT1=1时,定时器1中断为最高优先级中断(优先级3)

    PX1H, PX1: 外部中断1优先级控制位:

    当PX1H=0且PX1=0时,外部中断1为最低优先级中断(优先级0)

    当PX1H=0且PX1=1时,外部中断1为较低优先级中断(优先级1)

    当PX1H=1且PX1=0时,外部中断1为较高优先级中断(优先级2)

    当PX1H=1且PX1=1时,外部中断1为最高优先级中断(优先级3)

    PT0H, PT0: 定时器0中断优先级控制位:

    当PT0H=0且PT0=0时,定时器0中断为最低优先级中断(优先级0)

    当PT0H=0且PT0=1时,定时器0中断为较低优先级中断(优先级1)

    当PT0H=1且PT0=0时,定时器0中断为较高优先级中断(优先级2)

    当PT0H=1且PT0=1时,定时器0中断为最高优先级中断(优先级3)

    PX0H, PX0: 外部中断0优先级控制位:

    当PX0H=0且PX0=0时,外部中断0为最低优先级中断(优先级0)

    当PX0H=0且PX0=1时,外部中断0为较低优先级中断(优先级1)

    当PX0H=1且PX0=0时,外部中断0为较高优先级中断(优先级2)

    当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3)

    中断优先级控制寄存器IP和IPH的各位都由可用户程序置“1”和清“0” 。但IP寄存器可位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IPH寄存器的内容只能用字节操作指令来更新。

    STC90C51RC/RD+系列单片机复位后IPIPH均为00H,各个中断源均为低优先级中断

    4.2.11 配置外部中断0的优先级示例

    下面代码初始化了外部中断0和外部中断1,在外部中断0 的初始化代码里,配置外部中断0的优先级为最高,在外部中断1的中断服务函数里写了一个死循环。

    当外部中断1产生中断后,会卡死在中断服务函数里,这时可以触发外部中断0 ,测试外部中断0的中断服务函数是否可以执行(结果是可以执行的,因为外部中断0的优先级高于外部中断1的优先级,可以打断外部中断1的服务函数)。

    实验上的测试过程说明:

    外部中断0的复用IO是P3.2, 外部中断q的复用IO是P3.3,在实验板上实验时,需要使用杜邦线把按键1的引脚接在P3.2上,把按键2的引脚接在P3.3上,这样可以使用按键测试外部中断的触发效果,由于实验板上的红外线遥控接的是P3.2,为了不产生干扰,需要先将红外线遥控的跳线帽拔掉,再测试。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    int main()
    {
        LED=0x00;
        EXTI0_Init();
        EXTI1_Init();
        while(1)
        {
            
        }
    }
    /*
    配置外部中断0下降沿触发中断
    IO口: P3.2
    */
    sfr IPH=0xB7; //定义特殊功能寄存器
    void EXTI0_Init(void)
    {
       IPH|=1<<0; //配置PX0H=1 
       PX0=1;     //当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3)
       EA=1;  //开启总中断
       IT0=1; //外部中断0下降沿触发
       EX0=1; //允许外部中断0产生中断
    }
    /*
    外部中断0中断服务函数
    */
    void EXTI0_IRQHandler(void) interrupt 0
    {
        LED=~LED; //改变LED灯的状态
        IE0=0; //清除外部中断0的标志位
    }
    
    /*
    配置外部中断1下降沿触发中断
    IO口: P3.2
    */
    void EXTI1_Init(void)
    {
       EA=1;  //开启总中断
       IT1=1; //外部中断1下降沿触发
       EX1=1; //允许外部中断1产生中断
    }
    /*
    外部中断1中断服务函数
    IO口: P3.3
    */
    void EXTI1_IRQHandler(void) interrupt 2
    {
        while(1){}  //死循环
        LED=~LED; //改变LED灯的状态
    IE1=0; //清除外部中断1的标志位
    }
    展开全文
  • 51单片机定时器中断

    千次阅读 2021-10-29 17:58:42
    定时器介绍:51单片机的定时器属于单片机的内部资源,其电路连接和运转均在单片机的内部完成 定时器的作用: 1用于计时系统,可实现软件计时,或者使程序每隔一段固定的时间完成一项操作 2替代长时间delay,提高CPU...

    定时器介绍:51单片机的定时器属于单片机的内部资源,其电路连接和运转均在单片机的内部完成

    定时器的作用:

    1用于计时系统,可实现软件计时,或者使程序每隔一段固定的时间完成一项操作

    2替代长时间delay,提高CPU的运行效率和处理速度

    stc89c52定时器资源

    定时器个数:3个(T0,T1,T2),T0和T1和传统的单片机兼容,T2是此单片机增加的资源。

    定时器框图

    定时器在单片机中就像一个闹钟,根据时钟输出的信号,每隔一秒,计数单元的数值就会增加一;

    当计数单元的数值增加到设定的闹钟提醒时间时,计数单元就会向中断系统发出中断申请,产生闹铃提醒,使程序跳转到中断服务函数中执行。

    时钟                 >                            计数单元               >               中断系统

    提供计数单元的脉冲                    时钟计数                                  产生中断,执行定时任务

    stc89c52的T0和T1均有四种工作模式

    模式0:13位定时器/计数器

    模式1:16位定时器/计数器

    模式2:8位自动重装模式

    模式3;两个8位计数器

    以下是定时器0的模式图,定时器1模式图与定时器0相同

     以下是定时器2的模式图:

    注意模式2定时器运用的是8位重装模式这里的THO和TLO相等。

     中断的概念

    cpu在处理事件A时,发生了事件B请求去处理事件B,这时候中断就产生了。cpu暂时停止中断当前的工作,转去处理事件B(中断响应),当事件B处理完后,再回来处理事件A(中断返回),这一过程成为中断。

    中断等级

    51单片机中一共有5个中断源,分别是外部中断0;定时器0,外部中断1,定时器1,串口中断,中断等级从小到大分别是01234

    在运用c语言编写程序时需要调用以下中断号,进行中断

     然后需要将打开中断的开关打开,举个例子如果想运用定时器0进行中断的话。先要把ETO关上也就是将1赋给ETO然后把EA关上把1赋给EA,然后选择一个PTO这里没有固定的选法

     

    以上就是单片机中断和定时的原理内容

    此段代码是运用定时器0中断,先选定定时器的模式,然后给TLO,THO,赋初值,将TF0清零后然开TRO开始计时,将中断打开,ET0=1,EA=1,PT0=0,到这里定时器0初始化完成,接着运用定时器0中断号void Timer0_Routine() interrupt 1在中断里输入要完成的任务给TH0,TL0赋初值完成任务以后退出中断,继续执行其他任务。

    #include <REGX52.H>
    
    /**
      * @brief  定时器0初始化,1毫秒@12.000MHz
      * @param  无
      * @retval 无
      */
    void Timer0Init(void)
    {
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x01;		//设置定时器模式
    	TL0 = 0x18;		//设置定时初值
    	TH0 = 0xFC;		//设置定时初值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    	ET0=1;
    	EA=1;
    	PT0=0;
    }
    
    /*定时器中断函数模板
    void Timer0_Routine() interrupt 1
    {
    	static unsigned int T0Count;
    	TL0 = 0x18;		//设置定时初值
    	TH0 = 0xFC;		//设置定时初值
    	T0Count++;
    	if(T0Count>=1000)
    	{
    		T0Count=0;
    		
    	}
    }
    */
    

    定时器2与定时0不一样的地方就是它用的是8位重装模式所以在TH0和TL0赋值相等,然后再tmod选择上选择定时器2即可

    void main()
    {
    		TMOD|=0x02;//八位重装模块
    		TH0=220;
    	  TL0=220;
    	  TR0=1;//启动定时器0
    	  ET0=1;//允许定时器0中断
    	  EA=1;//总中断允许
    	  while(1)
    		{
    			
    		}
    }

    展开全文
  • 51单片机——中断系统结构

    千次阅读 2021-08-28 23:01:50
    本文主要介绍什么是中断中断的基本概念、中断处理过程、中断系统的结构和中断系统控制寄存器
  • 运用proteus和 keil uVision4软件。实现单片机中断实验,实现中断优先级晶体管数字显示。
  • 51单片机中断基本概念

    千次阅读 多人点赞 2020-07-31 10:11:47
    中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。 中断系统特点: ①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了...
  • 文章目录 这里还是看下这些部分的意思吧,首先是STC89C5X 系列单片机的中断源,他一共提供了 8 个中断请求源,分别是: 外部中断O(INTO) 外部中断 1(INT1) 外部中断 2(INT2) ...这里51单片机中断的控制都在
  • 中断技术概述中断系统作用:单片机能够及时地响应和处理单片机外部事件或内部事件所提出的中断请求。CPU正在执行程序时,单片机外部或内部突然紧急要去先处理某一事件,请求CPU现在马上去处理。CPU就会暂时放下手头...
  • 有关51单片机中断的形式和C语言编程格式void INT0()interrupt 0 using 1 {.... ..... } interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器...
  • 估计也困扰了许多小伙伴很久,今天以我的角度重新给大家说一下关于51单片机中断。 定义 中断的意思很简单,以一个生活中的例子来: 我在洗衣服,洗衣服可以认为是一个程序在运行中,这时候突然有人打来电话,...
  • 51单片机----中断

    千次阅读 2022-02-10 13:22:27
    51单片机有5个中断源: 2个外部中断 3个内部中断 你要是低电平触发它还是下降沿触发它。 低电平就是你这个p32收到一个0v的时候代表外面有一个中断源产生了那么我就会进入我的一个中断程序中去。 下降沿...
  • 51单片机外部中断0实例详解

    千次阅读 2021-05-22 03:49:54
    今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。151单片机的中断源51单片机共有5个中断源,分别为:外部中断0定时器0中断外部中断1定时器1中断串口中断每一个中断都对应一个中断向量,中断向...
  • 51单片机中断系统的原理和运用

    千次阅读 2020-05-02 23:31:00
    QX-MCS51开发板上使用的是DIP封装(双列直插式)有40只引脚! 40只引脚按其功能来分,有三类 一、电源和时钟引脚:Vcc、Vss;XTAL1、XTAL2 **电源引脚接入单片机工作电源** Vcc(40脚):接+5V电源; Vss ( 20脚 ) ...
  • 51单片机中断系统详解

    千次阅读 2020-11-19 21:28:30
    单片机中断系统 概念 中断发生:CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理中断响应和中断服务:CPU暂时中断当前的工作,转去处理事件B。 中断返回:将事件B处理完毕后,回到事件A被中断的地方...
  • 上讲通过讲述用单片机控制一个外部的LED闪烁实验来向读者介绍了单片机的工作原理与开发流程。这一讲将介绍单片机内部非常重要的两个资源——定时/ 计数器和中断系统。通过该讲,读者可以掌握定时器的工作原理和...
  • 51单片机入门——定时器与外部中断

    千次阅读 2022-01-04 19:32:33
    时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算方法就是 1 / 时钟源频率,一般情况下单片机的晶振都是 11.0592 MHz 的,对于这个单片机系统来时钟周期就是 1 / 11059200 秒。 机器周期:我们的单片机完成...
  • 上讲通过讲述用单片机控制一个外部的LED闪烁实验来向读者介绍了单片机的工作原理与开发流程。这一讲将介绍单片机内部非常重要的两个资源——定时/ 计数器和中断系统。通过该讲,读者可以掌握定时器的工作原理和...
  • 51单片机(十四)—— 中断功能介绍

    千次阅读 多人点赞 2020-02-19 20:31:09
    中断是单片机的一个重要功能,本文我们就对51单片机中断进行介绍。 所谓“中断”,通俗一点讲,就是单片机停止正在执行的任务,转去执行其它的急需解决的任务,当这个任务完成之后,在回到原来的任务继续执行。...
  • 这一小节写一些有关中断的知识。
  • 51单片机 外部中断

    千次阅读 2021-04-09 21:13:42
    为了降低CPU的占有率,同时实现单片机对复杂情景的处理,引入了中断。 CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,为该外设服务(或者处理紧急事件),...
  • 51单片机中断实验

    千次阅读 2019-11-07 21:48:34
    什么叫中断中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理程序;... 单片机在执行程序时其程序流程图 ...
  • MCS-51单片机中断系统

    千次阅读 2020-10-19 14:07:26
    当CPU正在执行主程序的时,外部或内部发生的某一事件(如引脚上发生电平变化,一个脉冲的发生或计数器的计数溢出等)请求CPU迅速处理,CPU暂时中断当前程序而转去执行相应的处理程序,待处理程序执行完毕后,CPU再...
  • 51单片机是指8051内核的8位单片机,因其内部结构相对简单,成本低廉,所以应用非常广泛!串口作为单片机最基本的通信接口,无论是开发调试,日常使用都是用得比较频繁的一个基本外设!但是很多教程包括官方提供的...
  • 51单片机中断系统程序实例 (STC89C52RC)51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。...
  • 51单片机系列外部中断(附源码)

    千次阅读 2021-11-14 01:01:39
    用STC89C51单片机,按键,LED灯完成外部中断实验。 程序中点亮LED流水灯,当按键按下时,外部中断触发,程序转至中断服务程序,在中断服务程序中使LED灯全亮; 按键松开时,从中断服务程序转至主程序,继续点亮流水...
  • 51单片机中断服务子程序的设计

    千次阅读 2021-05-24 01:14:09
    中断系统的运行必须与中断服务子程序配合才能正确使用。设计中断服务子程序需要首先明确以下几个问题。中断服务子程序设计的任务中断服务子程序设计的基本任务有下列4条:(1)设置中断允许控制寄存器IE,允许相应的...
  • 当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件...
  • 本文仅围绕51单片机中断的使用进行说明,并不详细说明中断的具体概念。 外部中断的使用 外部中断的使用非常简单,只要知道某个引脚被设置了某个状态就会触发某个函数。 网上看的话会出现很多晦涩的名词,但是流程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,652
精华内容 2,260
关键字:

请说一下51单片机的中断处理流程