精华内容
下载资源
问答
  • 中断系统的基本使用中断系统的基本概念五个中断源及其基本结构中断的处理函数中断相关的4个寄存器一个例题注意事项 中断系统的基本概念 五个中断源及其基本结构 51单片机一共有五个中断源 按优先级从上到下 中断...

    中断系统的基本概念

    在这里插入图片描述
    在这里插入图片描述

    五个中断源及其基本结构

    51单片机一共有五个中断源
    按优先级从上到下
    在这里插入图片描述
    中断系统的结构 中断向量就是中断号,就是下图最左边的标号(在写中断服务函数的时候有用)
    在这里插入图片描述

    中断的处理函数

    一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数
    中断服务函数的结构
    在这里插入图片描述

    中断相关的4个寄存器

    写程序的时候会用到

    分为两个控制寄存器和两个中断请求标志

    在这里插入图片描述
    在这里插入图片描述

    一个例题

    在这里插入图片描述
    代码如下:
    方式一:

    #include <reg52,h>
    sbit L1=P0^0;
    sbit L2=P0^7;
    //中断系统的基本使用 
    void Delay(unsigned int t)//延时函数
    {
    	while(t--);
    }
    void SelectHC573()//
    {
    	P2=(P2&0x1f)|0x80;
    }
    
    void Working()
    {
    	SelectHC573();
    	L1=0;
    	Delay(60000);
    	L1=1;
    	Delay(60000);
    }
    
    //***********************
     
    void Init_INT0()//中断初始化函数 
    {
    	IT0=1;//外部中断0的触发方式
    	EX0=1;//中断使能打开 
    	EA=1;//总中断开关打开 
    }
    
    void ServiceINT0() interrupt 0//中断服务函数  这里面是中断后应该执行的代码
    {
    	L8=0;
    	Delay(60000);
    	Delay(60000);
    	Delay(60000);
    	Delay(60000);
    	Delay(60000);
    	Delay(60000);
    	L8=1;
    }
    void  main()//
    {
    	void Init_INT0()
    	while(1){
    		Working();
    	}
    }
    

    方式二:

    #include <reg52,h>
    sbit L1=P0^0;
    sbit L2=P0^7;
    //中断系统的基本使用 把中断服务函数之中的行为放在函数外面 用一个变量来标识有没有发生中断 
    void Delay(unsigned int t)
    {
    	while(t--);
    }
    void SelectHC573()
    {
    	P2=(P2&0x1f)|0x80;
    }
    
    void Working()
    {
    	SelectHC573();
    	L1=0;
    	Delay(60000);
    	L1=1;
    	Delay(60000);
    }
    
    //***********************
     
    void Init_INT0()//中断初始化函数 
    {
    	IT0=1;//外部中断0的触发方式
    	EX0=1;//中断使能打开 
    	EA=1;//总中断开关打开 
    }
    
    unsigned char stat_int=0;//判断有没有发生中断响应 
    void ServiceINT0() interrupt 0//中断服务函数 
    {
       stat_int=1;
    }
    
    void LEDINT()//中断产生的时候去执行 
    {
    	if(stat_int=1)
    	{
    	L8=0;
    	Delay(60000);
    	Delay(60000);
    	Delay(60000);
    	Delay(60000);
    	Delay(60000);
    	Delay(60000);
    	L8=1;
        }
        stat_int=0;
    }
    //********************************* 
    void  main()
    {
    	void Init_INT0()
    	while(1){
    		Working();//在LEDINT函数之前发生 
    		LEDINT();
    	}
    }
    

    注意事项

    方法一中,当满足中断条件后,中断服务函数会自动调用,不需要写在主函数里
    方法二中,是把中断服务函数之中的行为放在函数外面 用一个变量来标识有没有发生中断
    最后,最好不要将要执行的代码放在中断服务函数中(我也不知为什么,视频里讲的,我也没百度到,以后会讲清楚,如果有大佬知道,麻烦评论一下)

    展开全文
  • DSP28335笔记 ———— 中断系统外部中断 我用的开发板是“硬汉DSP28335开发板”,文中对于硬件的描述可以说是没有,而且我还没有附上电路图希望在看的朋友不要喷我。 然后,我个人感觉普中的DSP28335开发手册...

    DSP28335笔记 ———— 中断系统 之 外部中断

    我用的开发板是“硬汉DSP28335开发板”,文中对于硬件的描述可以说是没有,而且我还没有附上电路图希望在看的朋友不要喷我。

    然后,我个人感觉普中的DSP28335开发手册比较容易看懂,他里面把寄存器功能都列了出来还做好了翻译,比自己翻原版的手册方便的多。

    一、DSP中断系统

    DSP28335中断系统分为三级中断,分别为:外设中断PIE中断CPU中断。具体的中断过程网上其他大牛已经解释的超级详细了,我就不半瓶子晃荡了,这里简要记录下我对中断过程的个人理解。
    (文字不够图片来凑,我就直接上框图。)
    在这里插入图片描述
    在这里插入图片描述
    一般来讲中断的顺序应该是,外设中断 —> PIE中断 —> CPU中断。我个人是反顺序来记忆学习的。从上面的框图可以看出CPU中断有INT1to14和NMI个中断通道,对于初学者的我们暂时只需要知道被PIE控制的12条通道既可。

    然后再看下图:
    在这里插入图片描述
    CPU级中断的12条中断通道,每条通道被PIE复用分成了8份,一共生成了96条中断通道,每条通道也都可以单独使能控制。

    每级的中断过程大致都是先产生中断标志IFR,当IER使能则进入对应的中断程序,对于CPU级和PIE级中断后都不需要软件清除标志位,但是PIE需要手动将PIEACKx对应位写1清零,否则中断将无法进入CPU。
    在这里插入图片描述
    然后,需要了解的是,PIE块将芯片的外设中断已经与PIE的12*8=96条通道做好了对应,具体对应关系参考上表。今天我试验的是外部中断XINT1。

    二、外部中断

    到了这里就进入了外设中断的部分,但是外部中断与其他外设中断又有一些不同,它需要设置XINTn外部中断通道挂接对应在某引脚,从最上面的两个框图可以看出来,还不需要清除外设中断标志位。

    • 外部中断1(XINT1)到外部中断2(XINT2)可以挂接GPIO0到GPIO31
    • 外部中断3(XINT3)到外部中断7(XINT7)可以挂接GPIO32到GPIO63

    按照常识,每完成中断动作后应该清楚中断标志位,CPU级和PIE级会自动清除,但是需要对PIEACK寄存器进行软件写1清零;

    外设级的标志位则需要软件手动清零,可是外部中断不需要,我猜测可能是因为外部输入的有效信号直接输入到PIE块,这点希望有知道的大神帮我解惑一下,谢谢。

    三、外部中断代码试验

    我的开发板上只有一个3*3的按键矩阵,这里为了简便只使用其中一个按键,通过按键改变数码管的显示。

    因为是通过中断实现数码管的改变,所以主函数中的内容就只有相关初始化的动作。

    void main()
    {
        InitSysCtrl();//系统时钟初始化
        SEG_Init();//数码管相关初始化
        EXTI_Init();//外部中断相关初始化
        while(1)
        {}
    }
    

    这里我们重点是外部中断,我们直接贴出**EXTI_Init()**的代码实现,对于其他的不做过多描述。

    在此之前要明确配置内容为:外部中断1 挂接到 引脚14、有效信号下降沿进入中断。

    我将代码编写啰嗦的分成八个步骤:

    void EXTI_Init(void)
    {
        // 步骤 1. 清除所有中断,初始化中断向量表:
        // 禁止CPU全局中断
        DINT;
    
        // 禁止CPU中断和清除所有CPU中断标志
           IER = 0x0000;
           IFR = 0x0000;
    
        // 初始化PIE控制寄存器到他们的默认状态.
        // 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
        // 这个函数放在DSP280x_PieCtrl.c源文件里
           InitPieCtrl();
    
        //初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
        // 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
        // 这个函数放在了DSP280x_PieVect.c源文件里面.
           InitPieVectTable();
    
    //步骤 2. 打开GPIO时钟,配置GPIO14引脚为输入,GPIO50引脚为输入低电平
        EALLOW;//关闭写保护
        SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
    
        GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;
        GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1;
        GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0;
        GpioDataRegs.GPBCLEAR.bit.GPIO50 = 1;
    
        GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO14 = 0;
        GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0;
        EDIS;//打开写保护
    
    //步骤 3. 设置IO口与中断线 挂接关系
        EALLOW;//关闭写保护
        GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 14;//XINT1 对应 GPIO14脚(具体挂接要满足外部中断框图中的对应情况)
        EDIS;//打开写保护
    
    //步骤 4. 指定中断向量表中断服务函数地址
        EALLOW;//关闭写保护
        PieVectTable.XINT1 = &EXTI_IRQ;
        EDIS;//打开写保护
    
    //步骤 5. 使能外设对应 PIE 中断通道
        PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//使能PIE 1 组 4通道 (这里需要查询PIE的中断矢量表 来确定使能的位)
    
    //步骤 6. 设置外部中断触发方式 并 外设中断使能
        XIntruptRegs.XINT1CR.bit.POLARITY = 0;//下降沿触发有效
        XIntruptRegs.XINT1CR.bit.ENABLE = 1;//使能外部中断
    
    //步骤 7. 使能CPU级中断及全局中断
        IER |= M_INT1;//使能INT1中断通道 (对应的变量值在 DSP2833x_Device.h中已进行宏定义。要用|或符号赋值,防止改变其他位)
        EINT;//打开全局中断
    
        ERTM;//当使用仿真器调试时 开启DEBUG中断
    }
    
    //步骤 8. 编写中断函数,在中断函数结束前写1清零PIEACK对应位
    interrupt void EXTI_IRQ(void)
    {
        static char i = 0;
        i++;
        if(i>9) i=0;
        Seg_SetNum(i);//设置数码管显示
        while(GpioDataRegs.GPADAT.bit.GPIO14 == 0);//等待
        PieCtrlRegs.PIEACK.bit.ACK1 = 1;//写1清零PIEACK对应位
    }
    

    今天大概就是这样了,希望各路大神批评指正,(¦3[▓▓] 晚安!!!

    展开全文
  • 中断优先级寄存器IPPS——串行口中断优先级控制位PT1——定时器/计数器1中断优先级控制位PX1——外部中断1中断优先级控制位PT0——定时器/计数器0中断优先级控制位PX0——外部中断0中断优先级控制

    要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断、定时器中断、中断嵌套等的讲解,还有代码实战。快一万字,写得不容易,还请大家点赞支持一下,后续持续更新

    (一)寄存器

    要想学习中断那么首先就要了解寄存器,在这里我们学习一下什么是寄存器,寄存器怎么用。

    1.什么是寄存器

    寄存器是特殊的RAM,特殊功能寄存器是控制单片机硬件的开关(例如IE)或者是指示单片机状态的信号(例如PSW),通过特殊寄存器你就可以方便的控制整个MCU,并且知道当前的MCU的工作状态。

    2.寄存器怎么用

    AT89S51单片机中的特殊功能寄存器(SFR)的单元地址映射在片内RAM区的80H~FFH区域中,它共有26个,离散地分布在该区域中。用到哪个寄存器就相应配置哪个寄存器即可。寄存器太多就不一一写出来了,用到再去找就好。

    (二)中断

    单片机的中断是由单片机片内的中断系统来实现的。当中断请求源(简称中断源)发出中断请求时,如果中断请求被允许的话,单片机暂时中止当前正在执行的主程序,转到中断服务程序处理中断服务请求,处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。

    1.中断允许寄存器IE

    在这里插入图片描述

    EX0

    外部中断0允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。当EX0=1( SETB EX0 )时,同时单片机P3.2引脚上出现中断信号时,单片机中断主程序的执行而“飞”往中断服务子程序,执行完后通过中断返回指令RET 动返回主程序。当EX0=0( CLR EX0)时,即使单片机P3.2引脚上出现中断信程序也不会从主程序“飞” 出去执行,因为此时单片机的CPU相当于被“堵上了耳朵”,根本接收不到P3.2引脚上的中断信号,但是这并不表示这个信号不存在。如果单片机的CPU有空查一下TCON中的IE0位,若为1就说明有中断信号出现过。

    ET0

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

    EX1

    外部中断1允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。当EX1=1( SETB EX1)时,并且外部P3.3引脚上出现中断信号时,单片机CPU会中断主程序而去执行相应的中断服务子程序;当EX1=0( CLR EX1)时使外部P3.3引脚上即使出现中断信号,单片机的CPU也不能中断主程序转而去行中断服务子程序。
    因此,可以这样认为,EX0和EX1是决定CPU能否感觉到外部引脚P3.2P3.3上的中断信号的控制位。

    ET1

    T1溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。

    ES

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

    EA

    中断总允许位。EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。总允许EA好比一个总开关。EA就相当于每家水管的总闸,如果总闸不开,各个龙头即使开了也不会有水;反过来,如果总闸开了而各个分闸没开也不会有水,所当我们想让P3.2和P3.3引脚上的信号能够中断主程序则必须将EA位设置为0(CLR EA)。

    使用方法

    (1)整体赋值:IE=0x81;(开启全局中断,打开外部中断0 )。
    (2)单独赋值:EA=1;EX0=1;(开启全局中断,打开外部中断0 )。

    2.中断优先级寄存器IP

    在这里插入图片描述

    PS——串行口中断优先级控制位

    PS=1,串行口中断定义为高优先级中断。
    PS=0,串行口中断定义为低优先级中断。

    PT1——定时器/计数器1中断优先级控制位

    PT1=1,定时器/计数器1中断定义为高优先级中断。
    PT1=0,定时器/计数器1中断定义为低优先级中断。

    PX1——外部中断1中断优先级控制位

    PX1=1,外部中断1定义为高优先级中断。
    PX1=0,外部中断1定义为低优先级中断。

    PT0——定时器/计数器0中断优先级控制位

    PT0=1,定时器/计数器0中断定义为高优先级中断。
    PT0=0,定时器/计数器0中断定义为低优先级中断。

    PX0——外部中断0中断优先级控制位

    PX0=1,外部中断0定义为高优先级中断。
    PX0=0,外部中断0定义为低优先级中断。

    中断优先级(高到低)

    外部中断0
    T0溢出中断
    外部中断1
    T1溢出中断
    串行口中断
    T2溢出中断(52)

    3.TCON寄存器

    在这里插入图片描述

    TF1:片内定时器/计数器T1的溢出中断请求标志位。

    当启动T1计数后,定时器/计数器T1从初值开始加1计数,当计数溢出时,由硬件自动为TF1置“1”,向CPU申请中断。CPU响应TF1中断时,TF1标志位由硬件自动清零,TF1也可由软件清零。

    TF0:片内定时器/计数器T0的溢出中断请求标志位。

    功能与TF1相同。

    IE1:外部中断请求1的中断请求标志位。

    IE1=0,无中断请求。
    IE1=1,外部中断1有中断请求。当CPU响应该中断,转向中断服务程序时,由硬件清“0”IE1。

    IE0: 外部中断请求0的中断请求标志位。

    IE0=0,无中断请求。
    IE0=1,外部中断0有中断请求。当CPU响应该中断,转向中断服务程序时,由硬件清“0”IE0。

    IT1:选择外部中断请求1为负跳变触发方式还是电平触发方式。

    IT1=0,为电平触发方式,外部中断请求输入信号为低电平有效,并把IE置“1”。转向中断服务程序时,则由硬件自动把IE1清零。
    IT1=1,为负跳变触发方式,外部中断请求输入信号电平为从高到低的负跳变有效,,并把IE置“1”。转向中断服务程序时,则由硬件自动把IE1清零。

    IT0:选择外部中断请求0为负跳变触发还是电平触发方式。

    与IT1相似。

    4.SCON寄存器

    在这里插入图片描述

    TI:串行口发送中断请求标志位。

    当CPU将1字节的数据写入串行口的发送缓冲器SBUF时,就启动一帧串行数据的发送,每发送完一帧串行数据后,硬件把TI中断请求标志位自动置“1”。CPU响应串行口发送中断时,并不能清除TI标志位,TI标志位必须在中断服务程序中用指令对其清零。

    RI:串行口接收中断请求标志位。

    在串行口接收完一个串行数据帧,硬件自动使RI中断请求标志位置“1”。CPU在响应串行口接收中断时,RI标志位并不清零,必须在中断服务程序中用指令对RI清零。

    (三)外部中断

    51单片机的外部中断int0对应的引脚为p3.2,外部中断int1对应的引脚为p3.3。

    1.外部中断0,按下开关K3,数码管0变1

    寄存器配置:

        EA=1;//总中断允许
    	EX0=1;//允许外部中断0
    	IT0=0;//选择外部中断0为电平触发方式
    

    完整代码:

    #include<reg51.h>
    #define uchar unsigned char
    sbit key = P3^2;
    
    void delay(unsigned int i)//延时函数
    {
    	unsigned int j;
    	for(;i>0;i--)
    		for(j=0;j<333;j++){}
    }
    
    void main()//主函数
    {
    	EA=1;//总中断允许
    	EX0=1;//允许外部中断0
    	IT0=0;//选择外部中断0为电平触发方式
    	
    	while(1)//循环
    	{P0=0x3f;}//P0.0口的Led亮
    }
    void key_scan() interrupt 0 //外部中断0的中断服务函数
    {
    	if(key==0)//判断是否有按键按下
    	{
    		delay(10);//延时去抖
    		if(key==0)
    		{
    			P2=0xfe;
    			P0=0x06;
    			while(!key);//等待按键松开
    			P2=0xff;
    			P0=0x3f;
    		}
    
    	}
    }
    
    

    2.外部中断1,按下开关K4,数码管0变1

    寄存器配置:

        EA=1;//总中断允许
    	EX1=1;//允许外部中断0
    	IT1=0;//选择外部中断0为电平触发方式
    

    完整代码:

    #include<reg51.h>
    #define uchar unsigned char
    sbit key = P3^3;
    
    void delay(unsigned int i)//延时函数
    {
    	unsigned int j;
    	for(;i>0;i--)
    		for(j=0;j<333;j++){}
    }
    
    void main()//主函数
    {
    	EA=1;//总中断允许
    	EX1=1;//允许外部中断0
    	IT1=0;//选择外部中断0为电平触发方式
    	
    	while(1)//循环
    	{P0=0x3f;}//P0.0口的Led亮
    }
    void key_scan() interrupt 1 //外部中断1的中断服务函数
    {
    	if(key==0)//判断是否有按键按下
    	{
    		delay(10);//延时去抖
    		if(key==0)
    		{
    			P2=0xfe;
    			P0=0x06;
    			while(!key);//等待按键松开
    			P2=0xff;
    			P0=0x3f;
    		}
    
    	}
    }
    
    

    3.外部中断扩展

    寄存器配置:

        IT0 = 1;//跳沿触发
        IT1 = 1;//跳沿触发
        PX1 = 1;//中断1高于中断0
        IE = 0x85;/*由低到高:EX1(第3位)=1,EX0 (第0位)= 1,EA (第八位)= 1 IE = 10000101*/
    

    完整代码:

    #include<reg52.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    uint i;
    void delay(uint xms);
    void Int();
    void Interrupt0(); 
    void Interrupt1(); 
    
    void main()
    {
        Int();
        P2 = 0xfe;
    while(1)
    {
        for (i = 0;i < 7;i++)
        {
            P2 = _crol_(P2, 1);//先左移
            delay(600);
        }
    
        for (i = 0;i < 7;i++)
        {
            P2 = _cror_(P2, 1);//再右移
            delay(600);
    
        }
    
    }
    
    
    }
    
    void Int()
    {
        IT0 = 1;//跳沿触发
        IT1 = 1;//跳沿触发
        PX1 = 1;//中断1高于中断0
        IE = 0x85;/*由低到高:EX1(第3位)=1,EX0 (第0位)= 1,EA (第八位)= 1 IE = 10000101*/
    }
    
    void delay(uint xms)//AT89C5211.0592MHz
    {
        uint x, y;
        for (x = xms;x > 0;x--)
            for (y = 110;y > 0;y--);
    }
    
    void Interrupt1() interrupt 0
    {
        while (1)
        {
            P2 = 0x0f;
            delay(600);
            P2 = 0xf0;
            delay(600);
        }
    }
    void Interrupt2() interrupt 2/*外部中断1的标号是2!*/
    {
        while (1)
        {
            P2 = 0xcc;//(11001100)
            delay(600);
            P2 = 0x33;
            delay(600);
        }
    
    
    }
    
    

    (四)定时器中断

    1.定时器0

    寄存器配置:

      TMOD = 0x01;
      TH0 = (65536 - 45872) / 256; // 设置定时器0为工作方式1(M1M0为01)
      TL0 = (65536 - 45872) % 256; // 装初值11.0592M晶振定时50ms数位45872
      EA = 1; // 开总中断
      ET0 = 1; // 开定时器0中断
      TR0 = 1; // 启动定时器0
    

    完整代码:

    #include<reg51.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit led1 = P2^0;
    uchar num = 0;
    
    void main()
    {
      TMOD = 0x01;
      TH0 = (65536 - 45872) / 256; // 设置定时器0为工作方式1(M1M0为01)
      TL0 = (65536 - 45872) % 256; // 装初值11.0592M晶振定时50ms数位45872
      EA = 1; // 开总中断
      ET0 = 1; // 开定时器0中断
      TR0 = 1; // 启动定时器0
      while(1)
      {
        ;
      }
    }
    
    void T0_time() interrupt 1
    {
      TH0 = (65536 - 45872) / 256;
      TL0 = (65536 - 45872) % 256;
      num++;
      if (num == 20)
      {
        num = 0;
        led1 = ~led1;
      }
    }
    
    

    2.定时器1

    寄存器配置:

      TMOD = 0x01;
      TH0 = (65536 - 45872) / 256; // 设置定时器1为工作方式1(M1M0为01)
      TL0 = (65536 - 45872) % 256; // 装初值11.0592M晶振定时50ms数位45872
      EA = 1; // 开总中断
      ET1 = 1; // 开定时器1中断
      TR1 = 1; // 启动定时器1
    

    完整代码:

    #include<reg51.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit led1 = P2^0;
    uchar num = 0;
    
    void main()
    {
      TMOD = 0x01;
      TH0 = (65536 - 45872) / 256; // 设置定时器1为工作方式1(M1M0为01)
      TL0 = (65536 - 45872) % 256; // 装初值11.0592M晶振定时50ms数位45872
      EA = 1; // 开总中断
      ET1 = 1; // 开定时器1中断
      TR1 = 1; // 启动定时器1
      while(1)
      {
        ;
      }
    }
    
    void T1_time() interrupt 3
    {
      TH0 = (65536 - 45872) / 256;
      TL0 = (65536 - 45872) % 256;
      num++;
      if (num == 20)
      {
        num = 0;
        led1 = ~led1;
      }
    }
    
    

    3.定时器计数控制数码管0到60

    寄存器配置:

        TMOD=0x11;//写在一起
    	//定时器0
    	//TMOD=0x01;
    	TH0=(65536-45872)/256;
    	TL0=(65536-45872)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    	
    	//定时器1
    	//TMOD=0x10;
    	TH1=(65536-45872)/256;
    	TL1=(65536-45872)%256;
    	EA=1;
    	ET1=1;
    	TR1=1;
    

    完整代码:

    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    uchar code table[]={
                        0x3f,0x06,0x5b,0x4f,
                        0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,
                        0x39,0x5e,0x79,0x71
                       };//共阴极数码管编码
    uchar num0,num1;
    uint ge ,shi;
    sbit LSA=P2^2;//74HC138译码器端口
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    void  display_time(uint ,uint);
    void delay_ms(uint);
    
    void main()
    {
    	TMOD=0x11;//写在一起
    	//定时器0
    	//TMOD=0x01;
    	TH0=(65536-45872)/256;
    	TL0=(65536-45872)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    	
    	//定时器1
    	//TMOD=0x10;
    	TH1=(65536-45872)/256;
    	TL1=(65536-45872)%256;
    	EA=1;
    	ET1=1;
    	TR1=1;
    	while(1)
    	{	
    		display_time(ge ,shi);//时间一直显示中
    	}
    }
    
    void T0_time()interrupt 1 //数码管处理 T0定时器
    {
    	TH0=(65536-45872)/256;//每50ms产生一次中断
    	TL0=(65536-45872)%256;//所以每20次中断,个位+1
    	num0++;
    	if(num0==20)
    	{
    		num0=0;
    		ge++;
    		if(ge==10)
    		{
    			shi++; //时间进位
    			ge=0;
    		}
    		if(shi==6)
    		shi=0; //时间归零
    	}
    }
    
    void  display_time(uint ge ,uint shi)
    {
    	LSA=0;LSB=1;LSC=1;
    	P0=table[ge];//送入个位数字
    	delay_ms(5);
    
    	LSA=1;LSB=1;LSC=1;
    	P0=table[shi];//送入十位数字
    	delay_ms(5);
    }
    void delay_ms(uint ms)
    {
    	uint i,j;
    	for(i=ms;i>0;i--)
    	for(j=110;j>0;j--);
    }
    
    

    4.定时器做的时钟

    寄存器配置:

        TMOD=0x01;
    	TH0=(65536-45872)/256;
    	TL0=(65536-45872)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    

    完整代码:

    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    uchar code table[]={
                        0x3f,0x06,0x5b,0x4f,
                        0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,
                        0x39,0x5e,0x79,0x71
                       };//共阴极数码管编码
    uchar num;
    uint hour_ge,hour_shi,minute_ge, minute_shi,second_ge,second_shi;
    sbit LSA=P2^2;//74HC138译码器端口
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    void  display_time(uint,uint,uint,uint,uint,uint);
    void delay_ms(uint);
    void main()
    {
    	TMOD=0x01;
    	TH0=(65536-45872)/256;
    	TL0=(65536-45872)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    	while(1)
    	{	
    		display_time(hour_shi,hour_ge,minute_shi,minute_ge,second_shi,second_ge);
    		//时间一直显示中
    	}
    }
    
    void T0_time()interrupt 1 //数码管处理 T0定时器
    {
    	TH0=(65536-45872)/256;//每50ms产生一次中断
    	TL0=(65536-45872)%256;//所以每20次中断,个位+1
    	num++;
    	if(num==20)
    	{
    		num=0;
    		second_ge++;//秒+1
    	}
    	if(second_ge==10)
    	{
    		second_ge=0;
    		second_shi++;
    		if(second_shi==6)
    		{
    			second_shi=0;
    			minute_ge++;
    			if(minute_ge==10)
    			{
    				minute_ge=0;
    				minute_shi++;
    				if(minute_shi==6)
    				{
    					minute_shi=0;
    					hour_ge++;
    					if(hour_ge==10)
    					{
    						hour_ge=0;
    						hour_shi++;
    						if(hour_shi==2&&hour_ge==4)
    						{
    							hour_shi=0;
    							hour_ge=0;
    						}
    
    					}	
    				}	
    			}
    		}
    	}
    	
    }
    
    
    
    void display_time(uint hour_shi,uint hour_ge,uint minute_shi,uint minute_ge,uint second_shi,uint second_ge)
    {
    	LSA=0;LSB=0;LSC=0;//第六个数码管送入second_ge
    	P0=table[second_ge];
    	delay_ms(1);
    
    	
    	LSA=1;LSB=0;LSC=0;//第五个数码管送入second_shi
    	P0=table[second_shi];
    	delay_ms(1);
    
    	LSA=1;LSB=1;LSC=0;//第四个数码管送入minute_ge 
    	P0=table[minute_ge];		    
    	delay_ms(1);
    
    	LSA=0;LSB=0;LSC=1;//第三个数码管送入minute_shi 
    	P0=table[minute_shi];
    	delay_ms(1);
    
    	LSA=0;LSB=1;LSC=1;//第二个数码管送入hour_ge
    	P0=table[hour_ge];
    	delay_ms(1);
    	
      	LSA=1;LSB=1;LSC=1;//第一个数码管送入hour_shi
    	P0=table[hour_shi];
    	delay_ms(1);
    
    }
    
    void delay_ms(uint ms)
    {
    	uint i,j;
    	for(i=ms;i>0;i--)
    	for(j=110;j>0;j--);
    }
    
    

    (五)中断嵌套

    1.外部中断嵌套K3,K4

    寄存器配置:

        IT0 = 1;
        IT1 = 1;
        PX0 = 1;
        IE = 0x85;/*由低到高:EX1(第3位)=1,EX0 (第0位)= 1,EA (第八位)= 1 IE = 10000101*/
    

    完整代码:

    #include<reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit LED1 = P2 ^ 0;
    sbit LED2 = P2 ^ 1;
    
    void Int();
    void Interrupt1(); 
    void Interrupt2(); 
    
    void main()
    {
        Int();
        while (1);
    
    }
    
    void Int()
    {
        IT0 = 1;
        IT1 = 1;
        PX0 = 1;
        IE = 0x85;/*由低到高:EX1(第3位)=1,EX0 (第0位)= 1,EA (第八位)= 1 IE = 10000101*/
    }
    
    void Interrupt1() interrupt 0
    {
        LED1 = ~LED1;
    
    
    }
    void Interrupt2() interrupt 2/*外部中断1的标号是2!*/
    {
        LED2 = ~LED2;
    
    }
    

    看到最后相信你也应该收获到很多,一起进步吧!

    展开全文
  • 51单片机 外部中断1触发蜂鸣器+Proteus仿真 相关篇《51单片机 外部中断0触发蜂鸣器+Proteus仿真》 Proteus仿真 为了体现仿真观看效果,在蜂鸣器旁边并了一组led,触发的时候,导通NPN三极管。 自己添加蜂鸣器...

    51单片机 外部中断1触发蜂鸣器+Proteus仿真


    为了体现仿真观看效果,在蜂鸣器旁边并了一组led,触发的时候,导通NPN三极管。

    • 自己添加蜂鸣器注意选择有源蜂鸣器,设置修改蜂鸣器属性,将电压改为5V驱动。

    在这里插入图片描述

    实例代码

    /**************************************************************************************
    实验现象:下载程序后,操作K4按键使buzzer状态取反
    
    		   1,单片机-->buzzer&交通灯模块
    		   		P20-->D1
    		   2,单片机-->独立按键模块
    		   		P33-->K4	
    	
    注意事项:																				
    
      
    *************************************
    展开全文
  • 按键 K1 用于触发外部中断 0 main.c /** * Interrupt Registers Definition */ sfr IE = 0xA8; /* Interrupt Enable Register */ /** * Interrupt Registers Bits Definition */ /** IE */ #define GLOBAL_IE_...
  • 按键 K1 用于触发外部中断 1 main.c /** * Interrupt Registers Definition */ sfr IE = 0xA8; /* Interrupt Enable Register */ /** * Interrupt Registers Bits Definition */ /** IE */ #define GLOBAL_IE_...
  • 文章目录STC8H 外部中断 2 结构图下降沿触发外部中断 2工程结构原理图源代码STC-ISP 下载选项模块化工程结构源文件参考 STC8H 外部中断 2 结构图 下降沿触发外部中断 2 工程结构 原理图 源代码 main.c 文件: sfr...
  • 外部中断0(INT0)和外部中断1(INT1)均有两种触发方式:上升沿或下降沿均可触发方式和仅下降沿触发方式。 因为引脚的状态有0和1,0代表低电平,1代表高电平。从高电平变为低电平,这种电平突然下降的地方叫做下降...
  • 中断的相关概念2.CC2530中断系统3.CC2530中断处理函数编写方法4.CC2530外部中断5.案例:外部中断输入控制LED灯 1.中断的相关概念 内核与外设之间的主要交互方式:轮询、中断 轮询的方式貌似公平,但实际工作效率...
  • 中断中断源、中断向量、中断优先级、中断服务函数等。 ARMCortexM3支持256个中断,包括16个内核中断和240个外设中断,拥有256个中断优先级别。 STM32中断通道可能会由多个中断源共用,某个中断服务函数入口处需要...
  • 外部中断EXIT是STM32芯片实时处理外部事件的一种机制,由于中断请求来自GPIO端口的引脚,所以称为外部中断 三、外部中断的程序设计思路 传统STM32外部中断设计步骤: 基于STM32CubeMX的外部中断设计步骤: 中断...
  • 6.STC15W408AS单片机外部中断

    千次阅读 2021-07-15 09:29:24
    STC15W408AS单片机有4个外部中断,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)。 外部中断0(INT0)和外部中断1(INT1)触发有两种触发方式,上升沿或下降沿均可触发方式 和仅...
  • ESP32外部中断

    2021-11-21 17:43:22
    文章目录前言一、外部中断概念二、配置外部中断1.编写中断服务函数2.配置中断总结 前言 提示:以下是本篇文章正文内容 一、外部中断概念 外部中断是单片机实时地处理外部事件的一种内部机制 当外部事件发生后,...
  • 每按一下按键(外部 0 中断 P3.2),8 个 LED 从下向上流水 1 次。 电路图: 代码: #include<reg51.h> #include<intrins.h> void delay(unsigned int m) { unsigned int i; for(;m>0;m--) { ...
  • 中断系统

    2021-01-14 19:23:10
    51单片机有5个中断源,分别是外部中断0,定时/计数器T0中断,外部中断1,定时/计数器T1中断,串行口中断,对应地址如下表: 中断源 中断矢量地址 外部中断0 0003H 定时/计数器T0中断 000BH 外部中断1 ...
  • STM32外部中断

    2021-05-22 21:58:11
    当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去 STM32的每个IO口都可以作为外部中断输入 STM32的中断控制器...
  • 外部中断执行流程

    2021-10-22 18:45:44
    1、设备向中断请求芯片发出中断请求 2、中断请求芯片根据优先级排序选择响应优先级较高的中断 3、根据响应的中断引脚在其内部存储器取与引脚对应位置的中断号并提交给CPU 4、保存断点,CPU根据中断号在RAM中的中断向...
  • 3:中断系统 将外部中断0和外部中断1均配置为下降沿触发,但外部中断1的优先级最高,外部中断0的优先级最低。 EXTI.c #include #include "intrins.h" #include "stdint.h" #include "EXTI.h" //定义LED管脚 sbit D1 ...
  • 由于ARM给NVIC预留了非常多的功能,但是对于使用M4内核设计芯片的公司可能就不需要这么多功能,于是就需要在NVIC上进行裁剪。ST公司的STM32F407芯片内部中断数量就是NVIC裁剪后的结果。 STM32F407芯片支持82个可屏蔽...
  • 四、CC2530的外部中断 五、实训案例:外部中断输入控制LED灯 一、中断相关的基础概念 内核与外设之间的主要交互方式有两种:轮询和中断。轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件;中断...
  • 外部中断 以下是假期对51单片机课程内容做的一些小结 中断的基本概念 中断: CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,转而为该外设服务(或者是处理...
  • byproteus还有很多问题,这篇只是笔记ORG0000HAJMPMAINORG0003HAJMPINTTERRUPT0ORG0013HAJMPINTTERRUPT...初始化外部中断SETB EASETB EX0SETB EX1CLRIT0CLR IT1LOOP:LCALLFIND ;流水灯方式1MOVP0,R3LCALLDELAYCJNE...
  • 51单片机外部中断0实例详解

    千次阅读 2021-05-22 03:49:54
    151单片机的中断源51单片机共有5个中断源,分别为:外部中断0定时器0中断外部中断1定时器1中断串口中断每一个中断都对应一个中断向量,中断向量表如下所示:2什么是中断事件当中断发生时单片机将正在执行的程序暂时...
  • 外部中断系统设计
  • 原标题:STC89C52单片机外部中断0实验/////////////////////////////////////////////////////////////////////////实现功能: 设置,然后通过点亮与P1口第一个引脚相连的D1来显示系统进入了外部中断0实验板型号:BS...
  • IP 中断优先级控制寄存器 这个我们一般不改,用缺省值, 外部中断0 > 计数/定时器中断0 > 外部中断1 > 计数/定时器中断1 > 串行通信中断 为什么是这样的排序呢?因为在单片机的ROM他们的入口地址也是按照这个顺序...
  • 这一节注意四个知识点:第一个:如何利用外部中断实现模拟串口数据的收发。第二个:在退出外部中断函数时,必须通过软件把外部中断标志位IE0清零,否则在接收到的数据包最后面会多收到一个无效的字节0xFF。第三个:...
  • 外部中断源2个 1.INT0 — 由P3.2端口控制引入,低水平或者下降沿引起。(下降沿就是给5V后给0V形成下降电压) 2.INT1 —由P3.3端口控制引入,低水平或者下降沿引起。 (这两个中断源标志与中断方式由特殊功能寄存器...
  • 51单片机学习——8.1外部中断0和1

    千次阅读 2021-02-13 08:49:54
    外部中断1:(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。 编程原理(外部中断0) 首先我们对中断允许控制寄存器...
  • 找了介绍ARM的外部中断处理过程的很多资料,但是大部分文章介绍的都不太清楚,现在自己总结如下:我认为,ARM外部中断处理过程应该从静态核动态两个方面来解释:静态方面,需要系统做如下准备工作:1.初始化各中断...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 194,183
精华内容 77,673
关键字:

中断系统外部中断1如何进行