单片机_中断函数调用

合集下载

关于中断服务函数里面是否可以调用其他函数的问题

关于中断服务函数里面是否可以调用其他函数的问题

的值已经改变,从而导致程序运行不正确,反过来亦然。

另一方面,func()与TaskB有直接的调用关系,因而其局部变量b与c不会被互相覆盖,但也不能保证func的局部变量c不会与TaskA或其他任务的局部变量形成可覆盖关系。

根据上述分析我们很容易就能够判断出TaskA和TaskB这两个函数是不可重入的(当然,func也不可重入)。

那么如何让函数成为可重入函数呢?C51编译器采用了一个扩展关键字reentrant作为定义函数时的选项,需要将一个函数定义为可重入函数时,只要在函数后面加上关键字reentrant即可。

厦门城论坛z' V- \0 L/ Z2 A. G) j与非可重入函数的参数传递和局部变量的存储分配方法不同,C51编译器为可重入函数生成一个模拟栈(相对于系统堆栈或是硬件堆栈来说),通过这个模拟栈来完成参数传递和存放局部变量。

模拟栈以全局变量?C_IBP、?C_PBP和?C_XBP作为栈指针(系统堆栈栈顶指针为SP),这些变量定义在DATA地址空间,并且可在文件startup.a51中进行初始化。

根据编译时采用的存储器模式,模拟栈区可位于内部(IDATA)或外部(PDATA或XDATA)存储器中。

如表1所示:表1s. h; j5 s) j- _4 @厦门电子城厦门城电子零件单片机电子,xmecity,电子制作,DIY,电脑元件,9 A/ c6 `2 `6 M4 |注意:51系列单片机的系统堆栈(也叫硬件堆栈或常规栈)总是位于内部数据存储器中(SP为 8位寄存器,只能指向内部),而且是“向上生长”型的(从低地址向高地址),而模拟栈是“向下生长”型的。

, g! c) @% u( z) M/ r: x7 w1、可重入函数参数传递过程剖析 T0 T$ T3 J. R# e在进入剖析之前,先简单讲讲c51函数调用时参数是如何传递的。

简单来说,参数主要是通过寄存器R1~R7来传递的,如果在调用时,参数无寄存器可用或是采用了编译控制指令“NOREGPARMS”,则参数的传递将发生在固定的存储器区域,该存储器区域称为参数传递段,其地址空间取决于编译时所选择的存储器模式。

单片机中断服务函数写法

单片机中断服务函数写法

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

(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单片机运行时,某个特殊事件(如外部中断、定时器中断等)发生时,CPU自动调用的一段程序。

这段程序一般是由开发者自己编写的,用于完成特定的工作任务。

二、中断函数的定义在51单片机的开发中,需要用到中断函数时,就需要先进行中断函数的定义。

中断函数的定义包括以下几个方面:1. 定义函数名中断函数一般采用void类型,同时加上中断函数名称,以便CPU 识别该函数。

例如:void timer_ISR() {}2. 定义函数类型在编写中断函数时,需要定义其类型,以表明该函数为中断函数。

例如:void interrupt Timer() interrupt 1 {}其中,interrupt表示该函数为中断函数;Timer表示中断名称;1表示中断号,不同的中断有不同的中断号。

3. 定义中断向量因为51单片机有多个中断,每个中断都有自己的中断向量,需要在编写中断函数时定义中断向量。

例如:org 0BH针对不同的中断类型,中断向量有不同的取值位置,需要根据实际情况设定。

三、中断函数的编写方法编写中断函数时,需要注意以下几点:1. 禁止中断嵌套在编写中断函数时,必须要禁止中断嵌套。

因为中断函数执行期间若还发生新的中断,将影响程序的正常执行。

可以在中断函数的开始部分使用EA=0来禁止所有中断,而在中断函数结束时使用EA=1来允许中断。

2. 确定中断源在编写中断函数时,需要确定触发中断的中断源。

例如,寄存器TCON.0表示定时器1溢出中断,如果等于1表示中断发生。

因此,我们可以用if(TCON&0x01)来判断是否触发中断。

3. 处理中断当中断源发生时,中断函数被调用。

我们可以在中断函数中编写代码来处理中断,例如改变某个寄存器的值,或运行特定的代码等。

MCS-51单片机中断函数注意事项

MCS-51单片机中断函数注意事项

学习单片机的快速方法先介绍下单片机。

把单片机说成是电子信息类专业最重要的一门课程一点也不为过,你在街上看到的广告彩灯、烟花表演、红绿灯、自动开关门这些都可以用单片机实现。

有了单片机,你就可以写程序进单片机,控制单片机管脚输出的高低电平,从而你可以控制其他模块。

这就实现了自动控制。

我需要怎样的控制,我就写怎样的程序就可以了。

接下来介绍单片机的学习流程。

有的人学了两年才学会。

有的人一个月就学的很不错了。

告诉大家我学51单片机只用了两个星期。

普通的应用差不多都会了,可以自己设计一个国旗升降系统、温度自动控制系统之类的电路和程序。

当然想要这么短的时间内精通是不可能的。

学习单片机是有捷径可走的。

首先你得知道你要学习什么样的单片机,我建议从80C51核心学起,80C51是MCS-51系列中的一个典型品种;其它厂商以8051为基核开发出的CMOS工艺单片机产品统称为80C51系列。

当前常用的80C51系列单片机主要产品有:Intel 的80C31、80C51、87C51,80C32、80C52、87C52 ATMEL的89C51、89C52、89C2051 Philips、Dallas、华邦、STC Siemens等公司的产品。

之所以要从80C51学起,是因为目前很多公司都是用51核心的单片机。

而且51的资料很多,懂的人也比较多。

其实你学好了一种单片机,再学习其他的单片机会很轻松。

我就从C51说起,首先得准备一本单片机教材,只要是C51核心的都可以。

打开书看单片机的管脚各有什么功能,内部都有什么东西,用来干嘛。

这本书你当成小说来看个一天就可以了。

不要求你全部看懂。

知道都有些什么东西就行。

因为从我的学习过程来看,光看理论等于没学。

单片机必须是理论加实践,而且要大量实践,在实践的过程中寻找理论。

这才是最快捷的学习方法。

这好比你学习汉语,你不可能什么字都会写,遇到不懂的,查查字典就可以了。

1 / 2然后我们谈实践,花100来块钱买块单片机学习板,有做板经验的也可以自己做一块,原理图网上多得是。

stc单片机外部中断调用编码器

stc单片机外部中断调用编码器

stc单片机外部中断调用编码器
STC单片机是一种常用的微控制器,具有丰富的外设接口和功能。

外部中断和编码器是STC单片机常见的应用之一。

当STC单片机上的某个外部事件(如按键按下、传感器触发等)发生时,会触发一个中断。

这个中断可以是外部中断,也可以是定时器中断等。

在中断服务程序中,可以调用编码器的相关函数或处理程序来读取编码器的值,从而获取编码器的状态或位置信息。

具体实现上,首先需要在STC单片机的外部中断配置中,配置相应的中断源和触发方式(上升沿、下降沿或双边沿触发)。

然后在中断服务程序中,编写相应的代码来调用编码器的读取函数,获取编码器的当前值。

需要注意的是,编码器的接口和读取方式可能因不同型号的STC单片机和编码器而有所不同。

因此,在实际应用中,需要查阅相关资料或参考STC单片机的技术手册和编码器的数据手册,以了解具体的接口和读取方式。

总结来说,"STC单片机外部中断调用编码器"是指当STC单片机上的某个外部事件发生时,触发中断,并在中断服务程序中调用编码器的相关函数或处理程序来读取编码器的值,以获取编码器的状态或位置信息。

这是STC单片机应用中常见的处理方式之一,有助于实现实时、快速地处理外部事件和获取编码器的数据。

单片机函数

单片机函数

单片机函数单片机函数是一种用于编程控制的函数,主要用于单片机的内部功能和外部设备之间的交互。

当我们在单片机中编程时,可以使用已经定义好的函数来实现一些常见的功能,而不必每次都重复编写代码。

本文将介绍一些常见的单片机函数及其用法。

1.延时函数延时函数是单片机编程中最基本的函数之一、它用于在程序中添加延时,以控制程序的时间间隔。

延时函数可以通过软件实现,也可以通过硬件计数器来实现。

例如,对于某些需要精确控制时间的操作,我们可以使用硬件计数器来实现延时,而对于一些简单的延时操作,我们可以使用软件延时函数来实现。

2.输入输出函数输入输出函数用于读取输入设备或控制输出设备。

在单片机中,输入输出通常通过引脚来实现。

通过调用输入输出函数,我们可以读取或控制某个引脚的电平状态。

例如,如果我们希望读取一个传感器的数据,我们可以使用输入函数来读取传感器引脚的电平;如果我们想控制一个LED灯的亮灭,我们可以使用输出函数来控制LED引脚的电平状态。

3.中断函数中断函数是一种特殊的函数,它用于响应硬件中断。

当某个硬件事件发生时,中断函数会被自动调用,以便进行相应的处理。

例如,当一个按钮按下时,可以配置一个中断函数,以便在按钮按下时自动执行特定的操作。

中断函数通常是基于优先级的,可以设置不同的中断优先级来处理不同的中断事件。

4.串口通信函数串口通信函数是用于在单片机和外部设备之间进行串行通信的函数。

串行通信用于将数据以位的形式发送或接收,可以实现单片机与计算机、传感器、显示器等设备的数据传输。

串口通信函数通常包括初始化函数、发送函数和接收函数,通过调用这些函数,可以实现单片机与外部设备的数据交换。

5.定时器函数定时器函数是用于配置和控制单片机内部定时器模块的函数。

定时器可以用来产生特定时间间隔的中断,用于周期性地执行某个任务,例如定时发送数据、定时采集传感器数据等。

定时器函数通常包括配置函数、启动函数和停止函数,通过调用这些函数,可以实现定时器的设置和控制。

单片机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`函数执行相应的任务。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中断函数的使用:《单片机C语言编程与实例》
中断函数通过使用interrupt关键字和中断编号0-4来实现。

使用该扩展属性的函数声明语法如下:
返回值函数名interrupt n
N对应中断源的编号
中断编号告诉编译器中断程序的入口地址,它对应者IE寄存器中的使能位,即IE寄存器中的0位对应着的外部中断0,相应的外部中断0的中断编号是0。

当正在执行一个特定任务是,可能有更紧急的事情需要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
{second++; % 另一个计数器
Interruptent=0; %计数器清零
}
}
要是摸个中断源的申请得到相应,必须保证EA=1和相应的允许位为1
定义中断服务函数的一般形式为::
函数类型函数名(形式参数表)[interrupt n][using n]
Interrupt 后面的n是中断号,n的取值范围为0-31,编译器从8n+3处产生中断向量。

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()
{
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置低。

#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
{
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 IE=0x8B; //开中断
a=0;
do{}while(a!=1); //等待外部中断
P1_7=!P1_7;//取反
TL0=0xFF;//初值
TH0=0x06;//初值
b=0;
TR0=0;
TR1=1;
Do
{
C=0xC8;
Do{}while(c!=0);
P1_7=!P1_7;
}while(a!=3);
TR1=0;
P1_7=0;
EA=0;//关闭总中断
EX0=0; //禁止外部中断
}。

相关文档
最新文档