单片机 中断函数 (1)

合集下载

几种单片机的中断函数写法

几种单片机的中断函数写法

几种单片机的中断函数写法写单片机程序,中断是免不了的。

我比较喜欢用C写单片机程序,简单而且可读性高,当然程序效率没有汇编的高。

目前写过51单片机跟AVR单片机的C程序,最近在看MSP430的书。

用C写不同的单片机程序其实都是大同小异,因此能对不熟悉的单片机也能很快上手写程序。

不过中断函数的写法,各个编译器往往都会有些差别。

最早写的C程序是51单片机的,用的编译器自然是大名鼎鼎的keil c了。

Keil的功能还是非常强劲的,不仅能编译,还有软件仿真调试与硬件调试的功能。

由于条件简陋,没用过什么仿真器,一直都是靠软件仿真调试程序的。

Keil 中的中断函数一般格式如下:void 函数名() interrupt n using n{…….}其中函数名可以任意取,关键字interrupt用来指明这是一个中断服务函数,后面的n 表示中断号,关键字using加后面的n表示使用哪一组寄存器。

后然接触到AVR的单片机,该单片机开发环境一般用ICC或者是GCC。

由于ICC是商用软件,而GCC是免费的,因此我一般用GCC来写AVR的C程序。

现在版本的GCC for AVR有了一些改进,对于中断函数支持两种关键字ISR与SIGNAL,其格式如下:ISR(vect){………}与SIGNAL(vect){……..}其中的vect就是中断向量名,根据不同的型号的AVR单片机的不同的中断源都会有相对应的中断向量名,比如外部中断0对于ISR格式的中断向量名为INT0_vect,对SIGNAL则为SIG_INTERRUPT0。

最近在看TI的MSP430系列单片机的资料,看到该单片机采用C430写的中断服务函数有点像前两种的综合,其格式如下:interrupt [vect] void 函数名(void){…….}其中vect也是中断向量名,函数名可以任取。

比较这几种中断函数写法,本人更倾向于AVR的GCC的写法。

首先对于中断函数来说即不能有输入参数又没有返回值,没必要再给它加个“void 函数名(void)”的形式的函数。

单片机中断服务函数写法

单片机中断服务函数写法

单片机中断服务函数写法一、在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。

(1)中断源:中断请求信号的来源。

(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效。

(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。

期间涉及到CPU响应中断的条件,现场保护,现场恢复。

(3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。

优先级是可以编程的,而优先权是固定的。

80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。

80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制(1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。

在这里我们讲下注意的事项(1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。

(2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。

所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。

(3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。

(4)单片机复位后,TCON,SCON给位清零。

C51语言允许用户自己写中断服务子程序(中断函数)首先来了解程序的格式:void 函数名() interrupt m [using n]{}关键字interrupt m [using n] 表示这是一个中断函数m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。

51单片机中断代码

51单片机中断代码

51单片机中断代码51单片机中断代码是在使用51单片机时经常会遇到的一个概念,它可以帮助我们实现一些特定的功能。

本文将介绍51单片机中断代码的基本原理和用法。

一、简介51单片机是一种广泛使用的单片机型号,它具有低成本、易学易用等特点,因此在嵌入式系统开发中得到了广泛应用。

中断是51单片机中的一个重要功能,通过中断,我们可以在程序运行的过程中,根据外部事件的发生来立即打断当前的程序流程执行特定的代码。

二、中断的原理在详细介绍51单片机中断代码之前,我们首先需要了解中断的原理。

中断是由外部事件触发的,当外部事件发生时,中断请求会被送到单片机的中断控制器,然后中断控制器会暂停当前正在执行的程序,并执行特定的中断服务程序。

中断服务程序会在中断处理完成后,恢复之前被暂停的程序继续执行。

三、中断的使用在51单片机中,我们可以通过设置相关的中断向量和中断服务程序来实现中断的功能。

下面是一个简单的例子,展示了如何在51单片机中使用中断代码。

首先,我们需要引入头文件,头文件中包含了51单片机的寄存器定义和中断相关的宏定义。

```c#include <reg51.h>```接下来,我们需要定义中断服务程序。

中断服务程序是一个函数,具有特定的命名规则和参数。

下面是一个简单的中断服务程序的例子,该例子演示了当外部中断触发时,LED灯会闪烁。

```cvoid interrupt_INT0() interrupt 0{P1 = 0xFF; // 将P1口设置为高电平delay(500); // 延时500毫秒P1 = 0x00; // 将P1口设置为低电平delay(500); // 延时500毫秒}```在上面的中断服务程序中,`interrupt_INT0()`是中断的名称,`interrupt 0`表示该中断是外部中断0。

我们可以根据需求设置外部中断的触发条件和中断优先级。

最后,我们需要在主函数中启用中断,并设置相应的中断向量。

单片机C语言函数中断函数(中断服务程序)

单片机C语言函数中断函数(中断服务程序)

单片机_C‎语言函数_‎中断函数(中断服务程‎序)在开始写中‎断函数之前‎,我们来一起‎回顾一下,单片机的中‎断系统。

中断的意思‎(学习过微机‎原理与接口‎技术的同学‎,没学过单片‎机,也应该知道‎),我们在这里‎就不讲了,首先来回忆‎下中断系统‎涉及到哪些‎问题。

(1)中断源:中断请求信‎号的来源。

(8051有‎3个内部中‎断源T0,T1,串行口,2个外部中‎断源INT‎0,INT1(这两个低电‎平有效,上面的那个‎横杠不知道‎怎么加上去‎))(2)中断响应与‎返回:CPU采集‎到中断请求‎信号,怎样转向特‎定的中断服‎务子程序,并在执行完‎之后返回被‎中断程序继‎续执行。

期间涉及到‎C PU响应‎中断的条件‎,现场保护,现场恢复。

(3)优先级控制‎:中断优先级‎的控制就形‎成了中断嵌‎套(8051允‎许有两级的‎中断嵌套,优先权顺序‎为INT0‎,T0,INT1,T1,串行口),同一个优先‎级的中断,还存在优先‎权的高低。

优先级是可‎以编程的,而优先权是‎固定的。

80C51‎的原则是①同优先级,先响应高优‎先权②低优先级能‎被高优先级‎中断③正在进行的‎中断不能被‎同一级的中‎断请求或低‎优先级的中‎断请求中断‎。

80C51‎的中断系统‎涉及到的中‎断控制有中‎断请求,中断允许,中断优先级‎控制(1)3个内部中‎断源T0,T1,串行口,2个外部中‎断源INT‎0,INT1(2)中断控制寄‎存器:定时和外中‎断控制寄存‎器TCON‎(包括T0、T1,INT0、INT1),串行控制寄‎存器SCO‎N,中断允许寄‎存器IE,中断优先级‎寄存器IP‎具体的是什‎么,包括哪些标‎志位,在这里不讲‎了,所有书上面‎都会讲。

在这里我们‎讲下注意的‎事项(1)CPU响应‎中断后,TF0(T0中断标‎志位)和TF1由‎硬件自动清‎0。

(2)CPU响应‎中断后,在边沿触发‎方式下,IE0(外部中断I‎N T0请求‎标志位)和IE1由‎硬件自动清‎零;在电平触发‎方式下,不能自动清‎楚IE0和‎I E1。

51单片机中断函数

51单片机中断函数

51单片机中断函数单片机的中断是指当单片机在正常运行的过程中,突然接收到来自外部设备或者其他源的信号时,能够立即停止正在执行的程序,转而执行一个特定的子程序,完成接收到的信号处理。

单片机中断函数是在中断发生时执行的一段程序代码。

下面将详细介绍51单片机中断函数的原理和使用方法。

首先,需要了解51单片机的中断原理。

51单片机有5个中断源,分别是外部中断0和1(INT0和INT1),定时器/计数器0和1的中断,以及串口中断(RI/TI)。

每个中断源都有自己的中断标志位,当中断源发生时,相应的中断标志位会被设置为1在单片机的中断函数中,需要首先设置中断使能位,使能相应的中断源。

然后,需要编写中断服务子程序(ISR)的函数体,该函数用于处理中断发生时需要完成的任务。

在ISR中,需要首先清除中断标志位,以防止重复中断。

然后,根据需要进行相关的处理,例如读取外部触发的信号或者发送/接收数据等。

以下是一个简单的外部中断0的中断函数示例:```C#include <reg52.h>void ExtInt0_ISR( interrupt 0//处理中断//...//清除中断标志位EX0=0;//使能外部中断0//...EX0=1;void main//设置中断使能位EA=1;//总中断使能位EX0=1;//使能外部中断0//...while (1)//主程序代码//...}```在上述代码中,`ExtInt0_ISR`函数是外部中断0的中断服务子程序,它使用`interrupt 0`关键字来声明,表示该函数用于处理外部中断0。

在`ExtInt0_ISR`函数体中,可以编写处理中断的代码。

在`main`函数中,首先使用`EA=1`来使能总中断,然后使用`EX0=1`使能外部中断0。

在主程序中的循环中,单片机会一直运行,直到外部中断0发生。

当外部中断0发生时,单片机会立即跳转到`ExtInt0_ISR`函数执行相应的任务。

c51语言处理单片机的中断是由专门的中断函数来处理的

c51语言处理单片机的中断是由专门的中断函数来处理的

c51语言处理单片机的中断是由专门的中断函数来处理的C51语言处理单片机的中断是由专门的中断函数来处理的。

中断是一种在程序执行过程中被外部事件触发的事件,它可以打断程序的正常执行,使得程序能够及时响应外部设备的请求。

C51语言中,中断函数是由程序员自定义的函数,用来处理中断事件。

当中断事件发生时,单片机会自动跳转到对应的中断函数进行处理。

中断函数通常包括以下几个部分:1.中断向量表:中断向量表是存储中断向量地址的表格。

每个中断向量对应一个中断类型,当中断事件发生时,单片机会根据中断类型找到对应的中断向量并跳转到相应的中断函数。

在C51语言中,中断向量表是通过设置中断向量地址的方式来定义的。

2.中断优先级:C51语言支持多级中断优先级,用来确定一些中断是否可以打断另一个中断的执行。

中断优先级可以通过设置特定的寄存器来实现,具体优先级的设置需要根据实际应用场景来确定。

3.中断服务程序:中断服务程序是中断函数的核心部分,用来处理中断事件。

在中断服务程序中,通常会进行以下几个步骤:a.保存现场:在进入中断服务程序之前,需要保存当前程序的执行状态,包括各个寄存器的值、堆栈指针等。

这样可以保证在中断处理完成后,程序能够正确地返回到中断发生前的执行状态。

b.清除中断标志:在进入中断服务程序之前,需要将中断标志位清除,以防止重复触发中断。

中断标志位通常是由硬件自动设置的,在中断服务程序中需要手动清除。

c.执行中断处理逻辑:在中断服务程序中,可以编写相应的逻辑代码来处理中断事件。

这可以包括读取外部设备的数据、进行数据处理、发送数据等。

中断服务程序中的代码需要尽量简洁高效,以确保及时响应外部事件。

d.恢复现场:在中断服务程序执行完成后,需要恢复之前保存的执行状态,包括恢复各个寄存器的值、堆栈指针等。

这样可以保证程序能够正确地返回到中断发生前的执行状态。

4.中断返回指令:在中断服务程序执行完成后,需要使用特定的指令来返回到主程序的执行位置。

单片机定时器中断程序实例

单片机定时器中断程序实例

单片机定时器中断程序实例单片机定时器中断程序实例单片机的定时器中断是一种基本的硬件中断,可以用来实现许多功能,比如定时器中断可以用来实现LED灯的闪烁、数码管的显示等。

以下是一个简单的单片机定时器中断程序实例,希望对初学者有所帮助。

1. 硬件连接将单片机的P3.3引脚和一个LED灯连接在一起,即可实现LED灯的闪烁。

2. 程序框架定时器中断程序的框架一般如下所示:```c#include<reg52.h>void init();//初始化函数void timer() interrupt 1;//中断函数void main(){init();//初始化while(1);//程序不断循环}```3. 程序思路程序的基本思路如下所示:初始化定时器,开启定时器中断,然后在中断函数中控制LED的状态改变,从而实现LED的灯的闪烁。

4. 程序代码```c#include<reg52.h>sbit LED = P3^3;//定义LED灯在P3.3口void init(){TMOD = 0x01;//设置为定时器0工作模式1TH0 = 0xFC;//定时器初值TL0 = 0x67;ET0 = 1;//开定时器中断EA = 1;//开总中断TR0 = 1;//启动定时器}void timer() interrupt 1{static unsigned char cnt;//定义计数器TH0 = 0xFC;//重新赋值TL0 = 0x67;cnt++;//计数器加1if(cnt == 20){//20次中断后改变LED灯状态cnt = 0;//计数器清零LED = ~LED;//LED灯状态取反}}void main(){init();//初始化while(1);//程序不断循环}```5. 程序解释在程序中,定时器使用了工作模式1,即定时器0开始计数,当计数到设定值时触发一个中断。

在中断函数中,用一个计数器cnt来记录定时器中断的次数,当计数到20次时,cnt清零,并且改变LED灯的状态。

C51单片机中断(两篇)

C51单片机中断(两篇)

引言:C51单片机中断是单片机开发中一个非常重要的概念。

通过中断,程序能够在运行过程中及时响应外部事件,提高系统的实时性和可靠性。

本文将进一步探讨C51单片机中断的相关知识,特别是中断优先级、中断嵌套、中断服务函数等方面的内容。

概述:C51单片机中断机制是通过改变程序的执行流程来实现的。

当中断事件发生时,CPU会暂停当前的执行任务,保存现场后转去执行中断服务程序,待中断服务程序执行完毕后,再恢复到之前的执行状态。

C51单片机中断机制通过这样的方式,有效地实现了对外部事件的及时响应。

正文内容:1. 中断优先级1.1 中断优先级的概念中断优先级是指在多个中断事件同时发生时,CPU按照一定的优先级顺序处理这些中断请求。

在C51单片机中,中断优先级是通过中断控制器来实现的。

中断控制器按照预先设定的优先级进行中断请求的响应,优先级越高的中断请求将被优先处理。

1.2 中断优先级的设置在C51单片机中,中断优先级的设置是通过特殊功能寄存器(SFR)来完成的。

通过设置SFR中的相关位,可以对不同的中断请求进行优先级设置。

具体的设置方法可以参考C51单片机的相关手册和数据手册。

2. 中断嵌套2.1 中断嵌套的概念中断嵌套是指在中断服务程序执行过程中,又发生了其他的中断事件,并且这些中断事件的优先级高于当前正在执行的中断服务程序。

在C51单片机中,中断嵌套是通过中断控制器的中断请求线来实现的。

当一个中断事件发生时,如果其优先级高于当前执行的中断服务程序,CPU会立即切换到新的中断服务程序中去执行。

2.2 中断嵌套的处理方法在C51单片机中,中断嵌套的处理是通过中断服务程序的堆栈来实现的。

当发生中断嵌套时,CPU将当前的现场信息保存到堆栈中,然后切换到新的中断服务程序中执行。

当新的中断服务程序执行完毕后,CPU会从堆栈中恢复之前的现场信息,并回到原来的中断服务程序继续执行。

3. 中断服务函数3.1 中断服务函数的概念中断服务函数是指用来处理中断事件的函数。

c51单片机溢出中断程序

c51单片机溢出中断程序

c51单片机溢出中断程序C51单片机溢出中断程序引言:C51单片机是一种常用的8位单片机,具有强大的功能和广泛的应用领域。

其中,溢出中断是C51单片机中的一种重要中断方式,可以实现定时功能。

本文将详细介绍C51单片机中溢出中断的原理和实现方法。

一、溢出中断的原理溢出中断是基于计时器/计数器的工作原理实现的。

C51单片机中的计时器/计数器有一个预设的计数值,当计数器计数达到预设值时,会产生溢出,同时触发中断。

溢出中断可以用来实现定时功能,例如定时器中断、周期性任务的执行等。

二、溢出中断的实现步骤1. 初始化计时器/计数器:首先,需要对计时器/计数器进行初始化。

通过设置计时器的工作模式、计数值等参数,来满足具体的定时要求。

2. 开启中断允许:在使能中断之前,需要将中断允许位设置为1,以允许中断的产生。

这样,当计数器溢出时,才能触发中断。

3. 编写中断服务函数:中断服务函数是中断发生时自动执行的函数。

在溢出中断发生时,单片机会自动跳转到中断服务函数的入口处,并执行相应的代码。

因此,需要编写中断服务函数来处理中断产生时的任务。

4. 启动计时器/计数器:通过启动计时器/计数器,开始计时器的工作。

计时器开始计数后,当计数器达到预设值时,会触发溢出中断,执行中断服务函数。

5. 主函数中添加主要代码:在主函数中,需要添加一些主要的代码来实现所需的功能。

这些代码可以包括计时器的初始化、中断的使能、中断服务函数的编写等。

三、示例代码下面是一个简单的C语言示例代码,用来实现C51单片机中的溢出中断功能。

```c#include <reg51.h>// 定义中断服务函数void timer_interrupt() interrupt 1{// 中断服务函数的代码// 在这里写入中断发生时需要执行的任务}// 主函数void main(){// 初始化计时器/计数器// 设置计数值、工作模式等参数// 开启中断允许EA = 1;// 启动计时器/计数器// 计时器开始计数// 主循环while(1){// 主函数中的其他代码// 在这里写入主要的功能代码}}```四、总结通过溢出中断的实现,C51单片机可以实现定时功能,提高系统的稳定性和可靠性。

51单片机串行口中断服务程序

51单片机串行口中断服务程序

51单片机串行口中断服务程序单片机串行口中断服务程序是指在单片机进行串行通信时,当接收到数据时会触发中断,然后执行相应的中断服务程序。

下面是一个示例的单片机串行口中断服务程序,共计1200字以上。

#include <reg51.h> // 引入reg51.h头文件//定义串行口中断标志sbit RI_FLAG = P3^0; // 数据接收中断标志sbit TI_FLAG = P3^1; // 数据发送中断标志//定义串行口接收数据缓冲区unsigned char receiveBuffer[10];unsigned char receiveCount = 0;//定义串行口发送数据缓冲区unsigned char sendBuffer[10];unsigned char sendCount = 0;//串行口中断服务函数void serialInterrupt( interrupt 4if(RI_FLAG) // 判断是否是数据接收中断receiveBuffer[receiveCount] = SBUF; // 读取串行口接收数据receiveCount++; // 接收计数加1RI_FLAG=0;//清除中断标志位}if(TI_FLAG) // 判断是否是数据发送中断if(sendCount < 10) // 判断是否还有数据需要发送SBUF = sendBuffer[sendCount]; // 发送串行口数据sendCount++; // 发送计数加1}elsesendCount = 0; // 重置发送计数TI_FLAG=0;//清除中断标志位}}//主函数void mainES=1;//允许串行口中断TMOD=0x20;//设置定时器1为模式2,串行口使用定时器1 TH1=0xFD;//设置波特率为9600,定时器初值为0xFDTL1=0xFD;//定时器初值为0xFDSCON=0x50;//设置串行口工作在方式1,允许接收TR1=1;//启动定时器1while(1)//主程序逻辑//将数据存入发送缓冲区sendBuffer[0] = 'H';sendBuffer[1] = 'e';sendBuffer[2] = 'l';sendBuffer[3] = 'l';sendBuffer[4] = 'o';sendBuffer[5] = '\r'; // 发送回车符sendBuffer[6] = '\n'; // 发送换行符while(sendCount != 0) //等待数据发送完毕//主程序逻辑}}。

单片机中断函数

单片机中断函数

单片机中断函数一、介绍单片机中断是指在程序运行过程中,当某个事件发生时,CPU暂时停止正在执行的程序,转而去执行另一个与之相关的程序。

这种方式可以提高程序的响应速度和处理效率。

在单片机中,中断分为外部中断和内部中断两种。

二、外部中断1. 外部中断概述外部中断是指由外部设备产生的中断信号,例如按键、传感器等。

当这些设备产生信号时,会向CPU发送一个请求信号,CPU会立即停止当前执行的程序,并跳转到相应的中断服务程序进行处理。

2. 外部中断原理外部设备产生的信号经过滤波和放大后送到单片机的引脚上。

当引脚检测到高电平时,会触发外部中断,并向CPU发送一个请求信号。

CPU接收到请求信号后会立即停止当前执行的程序,并跳转到相应的中断服务程序进行处理。

3. 外部中断使用方法(1)设置引脚为输入模式,并使能对应引脚上的外部中断。

(2)编写相应的中断服务程序,在其中处理相应事件。

(3)在主函数中设置相应引脚上触发条件(例如下降沿触发、上升沿触发等)。

4. 外部中断实例以下是一个外部中断的实例,当按键按下时,LED灯会亮起:```c#include <reg52.h> //头文件sbit KEY = P3^2; //定义按键引脚sbit LED = P1^0; //定义LED引脚void KeyInterrupt() interrupt 0 //中断服务程序{if(KEY == 0) //判断按键是否按下 {LED = ~LED; //LED取反}}void main(){EX0 = 1; //使能外部中断0IT0 = 1; //设置为下降沿触发EA = 1; //总中断使能while(1){; //空循环}}```三、内部中断1. 内部中断概述内部中断是指由CPU内部产生的中断信号,例如定时器溢出、串口接收等。

当这些事件发生时,CPU会自动跳转到相应的中断服务程序进行处理。

2. 内部中断原理定时器和串口等模块在工作过程中会产生相应的标志位,当标志位被设置为1时,会向CPU发送一个请求信号。

51单片机中断函数

51单片机中断函数

51单片机中断函数(原创版)目录1.51 单片机中断函数概述2.51 单片机中断函数的分类3.51 单片机中断函数的响应过程4.51 单片机中断函数的应用实例5.总结正文一、51 单片机中断函数概述在 51 单片机中,中断函数是一种在程序运行过程中,响应外部或内部事件的机制。

通过中断函数,单片机可以在执行过程中,暂停当前任务,转去处理其他更重要的任务,待处理完毕后,再回到原任务继续执行。

这种机制可以有效提高程序的实时性和响应速度,使得单片机更加智能化和灵活。

二、51 单片机中断函数的分类51 单片机的中断函数主要分为两大类:外部中断函数和内部中断函数。

1.外部中断函数:外部中断函数是由外部设备产生的中断请求信号触发的,例如按键、传感器等。

当外部设备产生中断请求时,单片机会暂停当前任务,转去处理外部中断,待处理完毕后,再回到原任务继续执行。

2.内部中断函数:内部中断函数是由单片机内部产生的中断请求信号触发的,例如定时器中断、串行通信中断等。

当单片机内部产生中断请求时,单片机会暂停当前任务,转去处理内部中断,待处理完毕后,再回到原任务继续执行。

三、51 单片机中断函数的响应过程当外部或内部事件产生中断请求时,51 单片机会进行如下响应过程:1.中断请求信号被捕获:当外部或内部事件产生中断请求时,单片机会捕获到该信号。

2.中断响应:单片机接收到中断请求信号后,会立即停止当前任务的执行,转去处理中断请求。

3.中断处理:单片机会根据中断类型,调用相应的中断服务函数进行处理。

4.中断返回:中断服务函数处理完毕后,单片机会返回原任务继续执行。

四、51 单片机中断函数的应用实例以定时器中断为例,定时器中断是一种常见的内部中断,当定时器计数值到达设定值时,会产生中断请求。

单片机接收到中断请求后,会调用定时器中断服务函数进行处理,例如更新计时器计数值、执行特定任务等。

处理完毕后,单片机会返回原任务继续执行。

五、总结51 单片机中断函数是一种在程序运行过程中,响应外部或内部事件的机制。

单片机定时器中断程序实例

单片机定时器中断程序实例

单片机定时器中断程序实例在单片机编程中,定时器是一种非常重要的功能模块。

它可以用来产生精确的时间延迟,实现定时触发事件等功能。

而定时器中断则是利用定时器来实现中断功能的一种方式。

下面是一个单片机定时器中断程序实例,供大家参考。

首先,我们需要初始化定时器。

以51单片机为例,定时器的初始化函数如下所示:void Init_Timer0(void){TMOD |= 0x01; //设置为模式1TH0 = (65536 - 50000) / 256; //设置初值TL0 = (65536 - 50000) % 256;EA = 1; //打开总中断ET0 = 1; //打开定时器0中断TR0 = 1; //启动定时器0}其中,TMOD寄存器用于设置定时器的工作模式。

这里设置为模式1,即16位定时器模式。

TH0和TL0寄存器则是定时器的计数器。

我们需要通过初值来设置定时时间。

在这个例子中,我们设置的定时时间为50ms。

接下来,我们需要编写定时器中断服务程序。

定时器中断服务程序是由中断向量表中的相应位置调用的,用于响应定时器中断。

在这个例子中,我们将定时器中断服务程序命名为Timer0_isr,定义如下:void Timer0_isr(void) interrupt 1{TH0 = (65536 - 50000) / 256;TL0 = (65536 - 50000) % 256;//定时器中断处理代码}在定时器中断服务程序中,我们需要重新设置计数器的初值,以实现定时器的循环工作。

同时,在这个例子中,我们需要在定时器中断处理代码中实现某些功能,例如周期性的输出一个信号、更新某个计数值等等。

最后,在主程序中,我们只需要调用Init_Timer0函数即可开始定时器的工作。

当定时器中断发生时,定时器中断服务程序会被自动调用。

这样,我们就实现了一个简单的单片机定时器中断程序。

单片机中断函数常见用法

单片机中断函数常见用法

#if __VER__<200interrupt void Usart1_rxInt(void) //与电表/红外通讯接收记数#else#pragma vector=USART1RX_VECTOR__interrupt void Usart1_rxInt(void)#endif{uchar ch=RXBUF1 ;if(devState.doWriteIrDA)return;if(n645Counts==0){if(ch!=0x68)return;elsecommState.wireSta645= RXDOING645;}commCode_645[n645Counts++] = ch;if(n645Counts > 63)n645Counts = 0;rxOverTime645 = 8; //unit:16ms}#if __VER__<200interrupt void Usart1_txInt(void) //与电表通讯发送中断发送记数#else#pragma vector = USART1TX_VECTOR__interrupt void Usart1_txInt(void)#endif{TXBUF1 = commCode_645[n645Counts++];if(n645Counts < nFrame645Size)return ;if(devState.doWriteIrDA) //红外发送TxIrDAover = 0;else{commState.wireSta645 = WAITACK645 ;waitAckOverTime645 = 30; //unit:16ms}IE2 &= ~UTXIE1; //关发送中断n645Counts = 0; //发送完成,长度清零}#if __VER__<200interrupt void Usart0_rxInt(void) //与主站通讯接收记数#else#pragma vector=USCIAB0RX_VECTOR__interrupt void Usart0_rxInt(void)#endif{unsigned char c=UCA0RXBUF;BYTE* pCode = GPRS_mCode;if(devState.dolocalComm){ if(nCommCounts==0 ){if(c!=0x68)return;else commState.rxDoing=1;}commCode[nCommCounts++] = c;rxOverTime = 6; //unit:16ms //doLocalpro = 0;if(nCommCounts > COMCODELEN)nCommCounts = 0;}else{if(specialFlag.GPRSTxf==0){c=UCA0RXBUF;commState.rxDoing = 1;pCode[GPRS_Com.RTxLen++] = c;rxOverTime= 10;if(MC55_Call_process == 13||MC55_Call_process == 15)rxOverTime = 35;else if(MC55_Call_process == 14 || MC55_Call_process == 8)rxOverTime = 185;else if(MC55_Call_process == 3)rxOverTime = 65;else if(MC55_Call_process == 4)rxOverTime = 65;if(GPRS_Com.RTxLen > COMCODELEN + 64)GPRS_Com.RTxLen = 0;}}}#if __VER__<200interrupt void Usart0_txInt(void) //与主站通讯发送中断发送记数#else#pragma vector = USCIAB0TX_VECTOR__interrupt void Usart0_txInt(void)#endif{if(devState.dolocalComm){UCA0TXBUF = commCode[nCommCounts++];if( nCommCounts < nFrameSize) return ;IE2 &= ~UCA0TXIE; //关发送中断nCommCounts = 0; //发送完成,长度清零}else{UCA0TXBUF = GPRS_mCode[GPRS_Com.nPos++];if(GPRS_Com.nPos < GPRS_Com.RTxLen)return ;IE2 &= ~UCA0TXIE; //关发送中断memset(GPRS_mCode,0,GPRS_Com.RTxLen);if(devState.ConfirmSetGPRS){devState.ConfirmSetGPRS = 0;nConfirmGPRS = 3;}GPRS_Com.RTxLen = 0;specialFlag.GPRSTxf = 0;}if(devState.ReadyResetPower){devState.stop_cleardg = 1;devState.ReadyResetPower = 0;}}#if __VER__<200interrupt void WatchDog_Timer(void) //看门狗定时器中断,遥脉计数#else#pragma vector = WDT_VECTOR__interrupt void WatchDog_Timer(void)#endif{if(rxOverTime645) rxOverTime645--;if(waitAckOverTime645) waitAckOverTime645--;if(rxOverTime) rxOverTime--;/*if(P1IN&BIT0)PowerOff_Timer = 10;if(PowerOff_Timer)PowerOff_Timer--;*/if(devState.ResetMC55){if(devState.wirelessMode)MC55_Start();elseEM200_Start();}}#if __VER__<200interrupt void basic_timer(void) //基本定时器主要是产生时钟信号62.5ms #else#pragma vector=BASICTIMER_VECTOR //暂未用__interrupt void basic_timer(void)#endif{static int SysTimeCount=0;SysTimeCount++;devState.n62_5msFlag = 1;if(SysTimeCount >= 16){devState.SecondFlag = 1;SysTimeCount = 0;LEDFLASH;CalculateAddedPQ();if(TxGPRSOverTime){TxGPRSOverTime--;if(TxGPRSOverTime==0){GPRS_recallnum++;specialFlag.GPRScom_finish = 1;if(GPRS_recallnum >= 3){GPRS_recallnum = 0;WaitStateFlag = 1;InitModem();specialFlag.CalledNum++;}}}if(devState.doIrDA){doIrdapro++;if(doIrdapro >= 4)devState.doIrDAover = 1;}elsedoIrdapro = 0;}}void TimerAOut(){CCTL0&=~CCIE;TACTL&=~(MC0+MC1);CCTL0&=~CAP;P1SEL&=~BIT0;if(BD_data.Frequence >= 4500 && BD_data.Frequence <= 5500) CCR0 = (92160000L/BD_data.Frequence)>>6;elseCCR0=DEFAULTCCR0;Sam_Counter=0;TACCR1 = 100; // Trig for ADC12 sample & convertTACCTL1 = OUTMOD_3; // Set/resetTACTL |= TACLR+ MC0;//MC_1 ; // clear TAR, up modeADC12CTL0 |= ENC;}void TimerAStop(){CCTL0&=~CCIE;TACTL&=~(MC0+MC1);}#if __VER__<200interrupt void ADC(void)#else#pragma vector = ADC12_VECTOR__interrupt void ADC(void)#endif{ADC12CTL0 &= ~ENC;Ua_Data[Sam_Counter] = ADC12MEM0<<3;//将A/D值存入数组Ia_Data[Sam_Counter] = ADC12MEM1<<3;Ub_Data[Sam_Counter] = ADC12MEM2<<3;Ib_Data[Sam_Counter] = ADC12MEM3<<3;Uc_Data[Sam_Counter] = ADC12MEM4<<3;Ic_Data[Sam_Counter] = ADC12MEM5<<3;Sam_Counter++;if(Sam_Counter>=64){devState.SampleSta=SAMPLEFFT ;Sam_Counter=0;TimerAStop();}elseADC12CTL0 |= ENC;}#if __VER__<200interrupt void Port2(void)#else#pragma vector=PORT2_VECTOR__interrupt void Port2(void)#endif{if((P2IFG & BIT0)== BIT0){P2IFG &= ~BIT0;if(!devState.doIrDA){SXD_1;devState.doIrDA = 1;n645Counts = 0;SetComBTForIrDA();}}}Main(){初始化;While(1){处理;}}#if __VER__<200interrupt void USCIA0_Int(void) //与电表通讯接收/发送中断记数#else#pragma vector=USCI_A0_VECTOR //既能接收中断也能发送中断__interrupt void USCIA0_Int(void)#endif{unsigned char ch;switch(__even_in_range(UCA0IV,4)){case 0:break; // Vector 0 - no interruptcase 2: // Vector 2 - RXIFG 接收中断标志while (!(UCA0IFG&UCTXIFG)); // USCI_A3 TX buffer ready?ch=UCA0RXBUF ;if(devState.doWriteIrDA)return;if(commState.n645Counts==0){if(ch!=0x68)break;}commState.wireSta645= RXDOING645;commCode_645[commState.n645Counts++] = ch;if(commState.n645Counts > 63)commState.n645Counts = 0;rxOverTime645 = 10; //unit:16msbreak;case 4: //Vector 4 - TXIFG 发送中断标志//SpecialFlag.TxdIdleFlag=1;UCA0TXBUF = commCode_645[commState.n645Counts++];if(commState.n645Counts < commState.nFrame645Size)break;if(devState.doWriteIrDA) //红外发送TxIrDAover = 0;else{commState.wireSta645 = WAITACK645 ;waitAckOverTime645 = 20; //unit:16ms}UCA0IE &= ~UCTXIE; //关发送中断commState.n645Counts = 0; //发送完成,长度清零break;default:break;}}#if __VER__<200interrupt void USCIA1_Int(void) //与本地维护口通讯接收/发送中断记数#else#pragma vector=USCI_A1_VECTOR //既能接收中断也能发送中断__interrupt void USCIA1_Int(void)#endif{unsigned char c;switch(__even_in_range(UCA1IV,4)){case 0:break; // Vector 0 - no interruptcase 2: // Vector 2 - RXIFG 接收中断标志//while (!(UCA0IFG&UCTXIFG)); // USCI_A3 TX buffer ready?c=UCA1RXBUF;if(_1_nCommCounts==0){//if(c!=0x68)return;}_1_rxDoing=1;LocalComCode[_1_nCommCounts++] = c; //leon-10-3-18_1_rxOverTime = 6; //unit:16ms //if(_1_nCommCounts > COMCODELEN)_1_nCommCounts = 0;efrom_Com_1 = 1;break;case 4: //Vector 4 - TXIFG 发送中断标志UCA1TXBUF = LocalComCode[_1_nCommCounts++]; //leon-10-3-18if( _1_nCommCounts < commState.nFrameSize)return ;UCA1IE &= ~UCTXIE; //关发送中断efrom_Com_1 = 0;_1_nCommCounts = 0; //发送完成,长度清零if(devState.ReadyResetPower){devState.stop_cleardg = 1;devState.ReadyResetPower = 0;}break;default:break;}}#if __VER__<200interrupt void USCIA2_Int(void) //与载波模块通讯接收/发送中断记数#else#pragma vector=USCI_A2_VECTOR //既能接收中断也能发送中断__interrupt void USCIA2_Int(void)#endif{unsigned char c;// BYTE* pCode = GPRS_mCode;switch(__even_in_range(UCA2IV,4)){case 0:break; // Vector 0 - no interruptcase 2: // Vector 2 - RXIFG 接收中断标志c=UCA2RXBUF;CalCom[carrworkst.testPos++] = c;carrworkst.workstate = RXDOING645;carrworkst.rxOverTime = 30;break;case 4: //Vector 4 - TXIFG 发送中断标志UCA2TXBUF = CalCom[carrworkst.testPos++];if(carrworkst.testPos < carrworkst.Txlen)return;UCA2IE &= ~UCTXIE;carrworkst.testPos = 0;carrworkst.workstate = WAITACK645;break;default:break;}}#if __VER__<200interrupt void USCIA3_Int(void) // 串口3 与GPRS模块口通讯接收/发送中断记数#else#pragma vector=USCI_A3_VECTOR //既能接收中断也能发送中断__interrupt void USCIA3_Int(void)#endif{unsigned char c;BYTE* pCode = GPRS_mCode; // 指向指令区switch(__even_in_range(UCA3IV,4)) // UCA3IV 为几就执行case 几{case 0:break; // Vector 0 - no interrupt 无中断case 2: // Vector 2 - RXIFG 接收中断标志接收//while (!(UCA0IFG&UCTXIFG)); // USCI_A3 TX buffer ready? UCA0IFG=0 UCTXIFG=0 if(specialFlag.GPRSTxf==0){c=UCA3RXBUF; //接收到的数据全部放入缓存在放入变量C中(一个字节)_2_rxDoing = 1;pCode[GPRS_Com.RTxLen++] = c; //再放入命令区命令区长度加1_2_rxOverTime= 10;if(MC55_Call_process == 13||MC55_Call_process == 15)_2_rxOverTime = 35;if(MC55_Call_process == 15)_2_rxOverTime = 15;else if(MC55_Call_process == 14 || MC55_Call_process == 8)_2_rxOverTime = 200;else if(MC55_Call_process == 3)_2_rxOverTime = 65;else if(MC55_Call_process == 4)_2_rxOverTime = 65;if(GPRS_Com.RTxLen > COMCODELEN + 64)GPRS_Com.RTxLen = 0;}break;case 4: //Vector 4 - TXIFG 发送中断标志发送UCA3TXBUF = GPRS_mCode[GPRS_Com.nPos++]; //需要发送的数据放入缓存if(GPRS_Com.nPos < GPRS_Com.RTxLen) //发送未完成。

单片机avr中断寄存器中断c语言函数外部中断INT0,INT1,INT3介绍

单片机avr中断寄存器中断c语言函数外部中断INT0,INT1,INT3介绍

单片机avr 中断寄存器中断c语言函数外部中断INT0,INT1,INT3 介绍
简介:中断的概念,ATmega16中断向量表,avr中断寄存器SREG,MCU控制和状态寄存器MCUCSR,通用中断控制寄存器GICR, MCU控制寄存器MCUCR,ICCAVR中断函数格式介绍
中断就是暂停正在执行的程序语句,转去执行另一功能(函数)的程序语句,执行完后,立即返回原先暂停执行的语句处,继续执行。

单片机的中断系统解决了单片机运算速度快,外设(如键盘)速度慢之间的数据传输问题,提高了单片机的实时性和数据处理能力。

中断源:产生中断的地方,ATmega16具有20个中断源和一个复位中断,不同的单片机中断源的个数是不一样的。

单片机的中断源分为外部中断源和内部中断源,有三个外部中断源有INT0,INT1,INT2,当连接在单片机引脚的上
的外部电平发生变化时,将产生相应的中断。

内部中断源由单片机内部的功能单元如定时器,串行通讯产生的中断。

按是否可屏蔽可分为,非屏蔽中断,和可屏蔽中断,非屏蔽中断有系统复位(reset)中断,可屏蔽中断:屏蔽指的的是中断可由软件编程控制是否允许中断,或禁止中断,大部分都是可屏蔽中断。

中断向量:单片
机的每个中断源都有一个固定的入口地址,这个地址由单片机的硬件决定的,单片机相应中断后,自动跳转到相应的地址,这个地址就叫中断矢量。

单片机的中断

单片机的中断

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位赋初值
有关的特殊功能寄存器(SFR)有: 中断允许寄存器IE 中断优先级控制寄存器IP 中断源寄存器(TCON、SCON中的有关位) 注:均可位寻址。
中断源
8051单片机共有五个中断源,分别是外部中断、定时 中断和串行中断。 2个外部中断是: 外部中断0--INT0,由P3.2提供, 外部中断1—INT1,由P3.3提供, 外部中断有两种触发方式,即低电平方式和负边沿 方式。
interrupt表示该函数是一个中断服务函数 整数n表示该中断服务函数对应哪一个中断源
[ void] 函数名 ([void]) interrupt n [using m] { 函数体语句 }
using m 指定该中断服务程序要使用的工作寄存器组号,m 为0~3。 若缺省using项,则编译系统默认为是当前工作寄存器组。
中断的使用(编程):
1 接通中断信号通道( 开总中断EA=1; ,开 中断源中断。如ET0=1;。
3 中断做什么(写中断服务函数)。
4、中断使用(编程)例
//例:用外中断0的负跳变产生中断信号点亮LED
#include<reg51.h>
void main(void)
{
EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断

51单片机中断用法实例解析

51单片机中断用法实例解析
51单片机中断用法实例解析
今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用
法。
151单片机的中断源
51单片机共有5个中断源,分别为:
外部中断0
定时器0中断
外部中断1
定时器1中断串ຫໍສະໝຸດ 中断每一个中断都对应一个中断向量,中断向量表如下所示:
2什幺是中断事件
当中断发生时单片机将正在执行的程序暂时放下而去处理中断事件,当中
任务中。这样是不是提高了打游戏的效率呢?
3中断的硬件实现
51单片机的外部中断0引脚接一只按键,该按键通过上拉电阻接到电
源,即没有按键发生时单片机检测到的是高电平,当按键按下时单片机检测
到的是低电平。单片机的P0.0引脚以灌电流的方式接了一只LED,当按键按
下时LED灯点亮,没按键时LED灯熄灭。
4中断的软件实现
写);
0:为中断向量,该值详看第一个表格,如果是外部中断1就写2,如果
是定时器1中断就写3;
中断函数不用在主函数中调用,只要中断事件发生,单片机自己主动会调
到中断函数中。
该例子的函数如下所示:
5仿真实现
当按键发生时,LED灯点亮,如下图所示。注意对比两种图中按键的状
态。
断事件处理完毕后再接着去处理之前的事情,这样可以大大降低单片机的资
源,提高执行效率。举个例子说明一下什幺是中断:
在这个例子里,打游戏就是主任务,水烧开就是中断,吱吱叫就是中断向
量,听到吱吱响我就明白水烧开了,这时我要把打游戏这个主任务暂时放
下,转而去处理水烧开了这个中断事件,水倒完后我就又回到了游戏这个主
单片机中断函数的写法比较固定,51单片机中断函数的写法如下:
void Initd()interrupt 0

stc8系列单片机前五个中断源的中断子函数框架

stc8系列单片机前五个中断源的中断子函数框架

stc8系列单片机前五个中断源的中断子函数框架STC8系列单片机是广泛应用于嵌入式系统开发的一种单片机。

该系列单片机具有丰富的外设资源和强大的中断功能,可以通过中断实现对各类事件的处理。

接下来,我将为您详细介绍STC8系列单片机前五个中断源的中断子函数框架。

1.外部中断(INT0和INT1):外部中断是通过外部触发器(例如按钮或传感器)触发的中断。

需要在程序中使用`IE2`和`EX0/EX1`来使能和配置外部中断。

```Cvoid externalInterrupt( interrupt 0/2//在中断函数中处理外部中断的相关操作//...```在中断函数中,您可以处理外部中断所需的任何操作,比如修改变量、执行特定的代码等。

2.定时器/计数器中断(TIMER0和TIMER1):定时器/计数器中断是在定时器/计数器溢出时触发的中断。

需要在程序中使用`IE2`和`ET0/ET1`来使能和配置定时器/计数器中断。

```C//在中断函数中处理定时器/计数器中断的相关操作```在中断函数中,您可以处理定时器/计数器中断所需的任何操作,比如修改变量、执行特定的代码等。

3.串口中断(UART):串口中断是在接收到数据或完成数据发送时触发的中断。

需要在程序中使用`IE2`和`ES`来使能和配置串口中断。

```Cvoid uartInterrupt( interrupt 4//在中断函数中处理串口中断的相关操作//...```在中断函数中,您可以处理串口中断所需的任何操作,比如接收数据、发送数据、修改变量等。

4.ADC中断(ADC):ADC中断是在模数转换完成时触发的中断。

需要在程序中使用`IE2`和`ET2`来使能和配置ADC中断。

```Cvoid adcInterrupt( interrupt 7//在中断函数中处理ADC中断的相关操作```在中断函数中,您可以处理ADC中断所需的任何操作,比如读取模拟值、修改变量等。

51单片机中断函数

51单片机中断函数

51单片机中断函数在51单片机中,中断函数是一种特殊的函数,它用于响应硬件中断信号。

当某个特定的硬件事件发生时,例如按下按键、定时器溢出等,会触发相应的中断。

中断函数被设计用于在中断发生时执行特定的操作,以便及时响应和处理。

1. 中断的基本概念中断是指计算机运行过程中突然打断正常程序执行的事件。

当一个中断事件发生时,CPU会立即停下当前正在执行的指令,转而去执行与中断相关的处理程序,也就是中断函数。

完成中断处理后,CPU会返回到被中断的指令继续执行。

2. 中断函数的编写编写中断函数需要遵循一定的规则,以确保正确的执行和处理中断事件。

下面是一些编写中断函数的基本要点:•中断函数的定义,需要使用特殊的语法来声明,例如:void interrupt 中断函数名(void)•中断函数不能有参数,因为中断发生时无法传递参数•中断函数内部的代码应尽量简短,避免耗时过长,以免影响正常程序的执行•在中断函数中,可以使用一些特殊的关键字和函数来操作中断相关的寄存器和标志位,例如EA(总中断使能)和EX0(外部中断0使能)3. 中断的优先级和嵌套在51单片机中,中断可以有不同的优先级。

具有较高优先级的中断可以打断正在执行的较低优先级中断。

这种中断嵌套的机制可以确保重要的中断事件能够及时得到响应。

在编写中断函数时,需要注意不同中断的优先级设置。

一般情况下,较高优先级的中断应该尽量快速地完成处理,以便让其他中断有机会执行。

4. 中断的开关与屏蔽为了灵活控制中断的响应和屏蔽,51单片机提供了相关的寄存器和函数。

通过设置中断控制寄存器,可以开关特定中断的使能。

通过设置标志位,可以屏蔽或允许中断的触发。

在编写中断函数时,需要注意合理地使用中断开关和屏蔽功能,以避免不必要的中断触发和冲突。

5. 中断函数的调用与返回中断函数的调用是由硬件自动完成的,无需程序员主动调用。

当中断事件发生时,CPU会自动跳转到相应中断函数的入口地址执行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
TL0=0Xff;
B++;
}
Void time1()interrupt 3using 3//定义计数器1
{
TH1=0x06;
c--;
}
Sbit P1_7=P1^7;
Void main()
{
P1_7=1;//初始化
TCON=0x01; // //外部中断为低电平出触发方式
TMOD=0x27;//启动定时器1和计数器0,工作方式2
中断编号
中断源
入口地址
0
外部中断0
0003H
1
定时器/计数器0溢出
000BH
2
外部中断1
0013H
3
定时器/计数器1溢出
001BH
4
串行口中断
0023H
当正在执行一个特定任务是,可能有更紧急的事情需要CPU处理,这就涉及到终端优先级,搞优先级的中断可以中断正在处理的底有限级中断程序,因而最好给每种优先级分配不同的寄存器组。在c51中可以使用using制定的寄存器组,using后的变量为0-3的长整数,分别表示51单片机内的四个寄存器组。
中断函数的完整语法及实例如下:
返回值函数名(【参数】)【模式】【重入】interrupt n [using n]
Unsigned int interruptent;
Unsigned char second;
Void time0(void)interrupt 1 using 2
{
if(++interruptent==4000) %计数到4000
IE=0x8B;//开中断
a=0;
do{}while(a!=1);//等待外部中断
P1_7
TH0=0x06;//初值
b=0;
TR0=0;
TR1=1;
Do
{
C=0xC8;
Do{}while(c!=0);
P1_7=!P1_7;
}while(a!=3);
TR1=0;
中断函数的使用:《单片机C语言编程与实例》
中断函数通过使用interrupt关键字和中断编号0-4来实现。
使用该扩展属性的函数声明语法如下:
返回值函数名interrupt n
N对应中断源的编号
中断编号告诉编译器中断程序的入口地址,它对应者IE寄存器中的使能位,即IE寄存器中的0位对应着的外部中断0,相应的外部中断0的中断编号是0。
#include <REGX51.H>
#define uchar unsigned char
Uchar data a,b,c;
Void tnterrupt0()interrupt 2using 1//定义外部中断1
{ a++;}
Void time0()interrupt 1using 2//定义计数器0
{second++; %另一个计数器
Interruptent=0; %计数器清零
}
}
要是摸个中断源的申请得到相应,必须保证EA=1和相应的允许位为1
定义中断服务函数的一般形式为::
函数类型函数名(形式参数表)[interrupt n][using n]
Interrupt后面的n是中断号,n的取值范围为0-31,编译器从8n+3处产生中断向量。
P1_7=0;
EA=0;//关闭总中断
EX0=0;//禁止外部中断
}
{
EA=1;//开启总中断
IT0=1;//外部中断0低电平触发
EX0=1;//外部中断0
P1_7=0;
Do()while(1);
}
2222相套中断
外部中断INT1触发后,启动计数器0,计数达到10次后停止计数,启动定时器1,由定时器1控制定时,由P1.7输出周期为200ms的方波性能好,接受2次中断后关闭方波发生器,P1.7置低。
11.111111
外部中断
例题:通过P1.7口电量发光二极管,然后外部输入一脉冲串,则发光二极管亮、暗交替
#include <REGX51.H>
Sbit P1_7=P1^7;
Void tnterrupt0()interrupt 0 using 2//定义定时器0
{ P1_7=!P1^7;}
Void main()
相关文档
最新文档