单片机 中断函数 (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 中断服务函数的概念中断服务函数是指用来处理中断事件的函数。

  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()
相关文档
最新文档