精华内容
下载资源
问答
  • c语言中的中断函数注意事项单片机_C语言函数_中断函数(中断服务程序)在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在...

    c语言中的中断函数注意事项

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

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

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

    (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开始从这里一条一条的执行程序指令。

    n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3

    中断号中断源

    0 外部中断0

    1 定时器0

    2 外部中断1

    3 定时器1中断

    4 串行口中断

    这5个中断源的中断入口地址为:(在上一篇文章中讲到的ROM前43个存储单元就是他们,这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不

    展开全文
  • PAGE / NUMPAGES 单片机_C语言函数_中断函数中断服务程序 ? 在开始写中断函数之前我们来一起回顾一下单片机的中断系统 ? 中断的意思学习过微机原理与接口技术的同学没学过单片机也应该知道我们在这里就不讲了首先来...
  • CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的...
  • 学 习单 片 翅 叫 翔 ‘两咐翩。到堆 , 工 寄 不正确 的结果 如果定义 中断函数时没编译器支持在 ...

    学 习单 片 翅 叫 翔 ‘两咐翩

    到堆 , 工 寄 不正确 的结果 如果定义 中断函数时没

    编译器支持在 语言源程序 器组保护 栈 中 指定的 作 存器

    ,

    直 编 写 内容不会改变 , 函数返 回之前将被保护 有使用 选项 则 由编译器选择一

    中 接 单片机 的中断服务

    。 工 器组从 个寄存器组作绝对寄存器组访 问

    函数程序 以前我们学 习用汇编语言编 的 作寄存 堆栈 中恢复

    写 中断服务程序时 , 会对堆栈出栈 的保 使用关键字 以

    展开全文
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。  中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。  (1)...

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

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

         (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开始从这里一条一条的执行程序指令。

    n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3

    中断号 中断源
    0        外部中断0
    1        定时器0
    2        外部中断1
    3        定时器1中断
    4        串行口中断

     

    这5个中断源的中断入口地址为:(在上一篇文章中讲到的ROM前43个存储单元就是他们,这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不是中断处理的程序,而是存放着中断处理程序的真正地址)

    INT0:0003H    0

    T0:   000BH    1

    INT1:0013H    2

    T1:   001BH    3

    串口: 0023H    4

    中断向量(中断入口地址)= 中断号x8 +3

     

          前面m意思很清楚,不同的m值表示这个函数是针对不同的中断源,比如m为1是表示它是定时器0的中断函数,

    如void time0() interrupt 1{}

     

          那么后面的using n 又是什么意思呢?在正在执行一个特定任务时,有更紧急的事情需要CPU来处理,涉及到中断优先权。高优先权中断低优先权正在处理的程序,所以最好给每个优先程序分配不同的寄存器组。

          CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的程序在0组)。

          为了更好的了解这里意思,你可以看看工作寄存器组的作用是什么。

     

    下面的注意事项转自网络上其他朋友的文章(整理下,重复的去掉了,写的非常好):

    (1)中断函数不能进行参数传递
    (2)中断函数没有返回值
    (3)在任何情况下都不能直接调用中断函数

    (4)中断函数使用浮点运算要保存浮点寄存器的状态。 
    (5)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同,被调函数最好设置为可重入的。 
    (6)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈。如中断函数加using n修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。
    (7)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。
    (8)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。

    (9)在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。一般来说中断服务程序应该做最少量的工作,这样做有很多好处。首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的。其次它可使中断服务程序的结构简单,不容易出错。中断程序中放入的东西越多,他们之间越容易起冲突。简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中。中断服务程序的设计对系统的成败有至关重要的作用,要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的ISR.

     

     
    展开全文
  • c语言定义函数和声明函数 C语言中用户定义函数的类型 (Type of User-defined Functions in C) There can be 4 different types of user-defined functions, they are: 可以有4种不同类型的用户定义函数,它们是: ...

    c语言定义函数和声明函数

    There can be 4 different types of user-defined functions, they are:

    可以有4种不同类型的用户定义函数,它们是:

    1. Function with no arguments and no return value

      没有参数也没有返回值的函数

    2. Function with no arguments and a return value

      没有参数和返回值的函数

    3. Function with arguments and no return value

      有参数且无返回值的函数

    4. Function with arguments and a return value

      带参数和返回值的函数

    Below, we will discuss about all these types, along with program examples.

    下面,我们将讨论所有这些类型以及程序示例。

    没有参数也没有返回值的函数 (Function with no arguments and no return value)

    Such functions can either be used to display information or they are completely dependent on user inputs.

    这些功能可以用于显示信息,也可以完全取决于用户输入。

    Below is an example of a function, which takes 2 numbers as input from user, and display which is the greater number.

    下面是一个函数示例,该函数以2个数字作为用户输入,并显示较大的数字。

    #include<stdio.h>
    
    void greatNum();       // function declaration
    
    int main()
    {
        greatNum();        // function call
        return 0;
    }
    
    void greatNum()        // function definition
    {
        int i, j;
        printf("Enter 2 numbers that you want to compare...");
        scanf("%d%d", &i, &j);
        if(i > j) {
            printf("The greater number is: %d", i);
        }
        else {
            printf("The greater number is: %d", j);
        }
    }

    没有参数和返回值的函数 (Function with no arguments and a return value)

    We have modified the above example to make the function greatNum() return the number which is greater amongst the 2 input numbers.

    我们修改了上面的示例,以使函数greatNum()返回2个输入数字中较大的数字。

    #include<stdio.h>
    
    int greatNum();       // function declaration
    
    int main()
    {
        int result;
        result = greatNum();        // function call
        printf("The greater number is: %d", result);
        return 0;
    }
    
    int greatNum()        // function definition
    {
        int i, j, greaterNum;
        printf("Enter 2 numbers that you want to compare...");
        scanf("%d%d", &i, &j);
        if(i > j) {
            greaterNum = i;
        }
        else {
            greaterNum = j;
        }
        // returning the result
        return greaterNum;
    }

    有参数且无返回值的函数 (Function with arguments and no return value)

    We are using the same function as example again and again, to demonstrate that to solve a problem there can be many different ways.

    我们一次又一次地使用与示例相同的功能,以说明解决问题的方法有很多种。

    This time, we have modified the above example to make the function greatNum() take two int values as arguments, but it will not be returning anything.

    这次,我们修改了上面的示例,以使函数greatNum()接受两个int值作为参数,但不会返回任何内容。

    #include<stdio.h>
    
    void greatNum(int a, int b);       // function declaration
    
    int main()
    {
        int i, j;
        printf("Enter 2 numbers that you want to compare...");
        scanf("%d%d", &i, &j);
        greatNum(i, j);        // function call
        return 0;
    }
    
    void greatNum(int x, int y)        // function definition
    {
        if(x > y) {
            printf("The greater number is: %d", x);
        }
        else {
            printf("The greater number is: %d", y);
        }
    }

    带参数和返回值的函数 (Function with arguments and a return value)

    This is the best type, as this makes the function completely independent of inputs and outputs, and only the logic is defined inside the function body.

    这是最好的类型,因为这使函数完全独立于输入和输出,并且仅在函数体内定义了逻辑。

    #include<stdio.h>
    
    int greatNum(int a, int b);       // function declaration
    
    int main()
    {
        int i, j, result;
        printf("Enter 2 numbers that you want to compare...");
        scanf("%d%d", &i, &j);
        result = greatNum(i, j); // function call
        printf("The greater number is: %d", result);
        return 0;
    }
    
    int greatNum(int x, int y)        // function definition
    {
        if(x > y) {
            return x;
        }
        else {
            return y;
        }
    }

    功能嵌套 (Nesting of Functions)

    C language also allows nesting of functions i.e to use/call one function inside another function's body. We must be careful while using nested functions, because it may lead to infinite nesting.

    C语言还允许嵌套函数,即在另一个函数体内使用/调用一个函数。 使用嵌套函数时必须小心,因为它可能导致无限嵌套。

    function1()
    {
        // function1 body here
        
        function2();
        
        // function1 body here
    }

    If function2() also has a call for function1() inside it, then in that case, it will lead to an infinite nesting. They will keep calling each other and the program will never terminate.

    如果function2()中也有对function1()的调用,则在这种情况下,它将导致无限嵌套。 他们将继续互相调用,程序将永远不会终止。

    Not able to understand? Lets consider that inside the main() function, function1() is called and its execution starts, then inside function1(), we have a call for function2(), so the control of program will go to the function2(). But as function2() also has a call to function1() in its body, it will call function1(), which will again call function2(), and this will go on for infinite times, until you forcefully exit from program execution.

    听不懂? 让我们考虑一下在main()函数内部,调用了function1()并开始执行,然后在function1()内部,我们对function2()进行了调用,因此程序的控制权将移交给function2()。 但是由于function2()在其主体中也有对function1()的调用,它将调用function1(),后者将再次调用function2(),这将持续无数次,直到您强制退出程序执行为止。

    什么是递归? (What is Recursion?)

    Recursion is a special way of nesting functions, where a function calls itself inside it. We must have certain conditions in the function to break out of the recursion, otherwise recursion will occur infinite times.

    递归是嵌套函数的一种特殊方式,其中函数在其中调用自身。 函数必须具有一定的条件才能中断递归,否则递归将无限次发生。

    function1()
    {   
        // function1 body
        function1();
        // function1 body
    }

    示例:使用递归的阶乘 (Example: Factorial of a number using Recursion)

    #include<stdio.h>
    
    int factorial(int x);       //declaring the function
    
    void main()
    {
        int a, b;
        
        printf("Enter a number...");
        scanf("%d", &a);
        b = factorial(a);       //calling the function named factorial
        printf("%d", b);
    }
    
    int factorial(int x) //defining the function
    {
        int r = 1;
        if(x == 1) 
            return 1;
        else 
            r = x*factorial(x-1);       //recursion, since the function calls itself
        
        return r;
    }

    Similarly, there are many more applications of recursion in C language. Go to the programs section, to find out more programs using recursion.

    同样,在C语言中还有许多递归应用。 进入程序部分,使用递归查找更多程序。

    翻译自: https://www.studytonight.com/c/type-of-functions-and-recursion.php

    c语言定义函数和声明函数

    展开全文
  • C语言常用函数

    2011-11-24 10:04:22
    函数1。absread()读磁盘绝对扇区函数 原形:int absread(int drive...功能:从drive指定的驱动器磁盘上,sectnum指定的逻辑扇区号开始读取(通过DOS中断0x25读取)num个(最多64K个)扇区的内容,储存于buf所指的缓冲区中。
  • C语言中断设计实现

    2012-05-16 22:39:35
    本文主要探讨了如何利用C语言实现中断程序的设计
  • c语言_函数指针的调用方法 函数指针就是指向函数的指针。 程序运行结果:
  • C语言中断 #include void init(void)//声明中断初始化 { EA=1;//中断总开关 EX0=1;//开中断0开关中断1为EX1=1 IT1=1;//采用边沿触发下降沿有效IT1=0为低电平触发中断 } main) { init;调用中断初始化函数 == ===主...
  • linux c语言 select函数用法

    千次阅读 2014-06-11 08:42:20
    linux c语言 select函数用法 表头文件 #i nclude #i nclude #i nclude 定义函数 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,...
  • C语言函数调用与中断处理

    千次阅读 2018-08-16 19:50:05
    C语言函数调用就好比,你在一个村庄,这个村庄共有100户人家,你就是CPU,100户人家就是100个函数。 你去串门,就是去执行一个函数,你每次只能串一户人家,进户出户就好比进栈出栈,你平时的任务就是不断的去王五...
  • 为了满足在C语言源程序中直接编写中断服务程序的需要,C51编译器对函数的定义进行了扩展,增加了一个扩展关键词interrupt。他是函数定义式的一个选项,加上这个选项即可以将一个函数定义成中断服务函数。定义中断...
  • C语言assert函数完全攻略

    千次阅读 2018-10-14 00:30:17
    断言assert函数C语言assert函数完全攻略 对于断言,相信大家都不陌生,大多数编程语言也都有断言这一特性。简单地讲,断言就是对某种假设条件进行检查。在 C 语言中,断言被定义为宏的形式(assert(expression))...
  • C语言鼠标操作方法及源码 鼠标函数中断 鼠标函数源代码
  • 定义如下:语法: interrupt void 函数名()或者interrupt[中断向量]void 函数名()参数:中断函数没有参数。中断函数需要指定中断向量。返回:中断函数一般是void,没有返回。说明:interrupt关键字声明了在处理器...
  • 6.1.3中断函数的结构形式;6.2 外部中断源的C51编程;6.2.1外部中断源初始化;例6-2外部中断0示例;例6-3 中断嵌套示例;6.3 定时器/计数器基本知识;6.3.1定时器/计数器的结构与控制;TCON:TFTR;6.3.2工作方式
  • C语言函数调用流程

    2019-12-27 21:51:47
    调用函数所用信息 函数的返回地址 函数的参数 临时变量 保存的上下文:包括在函数调用前后需要保持不变的寄存器 //函数从左到右,还是从右向左压栈 int fun(int a,int b ) { int t_a = a; int t_b = b; return ...
  • C语言getchar函数

    万次阅读 2012-05-23 17:48:35
    用getchar()它是从“流”中间去读取,所以第一个getchar()接受的是刚刚中断的流队列中即将出列的第一个字符(不限于回车符,上面举过例子了),如果流队列不为空,执行getchar()就继续放水,直到把回车符也放空为止...
  • C语言中断原理简介

    2012-09-27 15:45:31
    系统级C语言程序设计(中断原理简介)  摘要:本文主要介绍C语言中断服务程序的编写、安装和使用。由于硬中断服务程序的编写涉及到硬件端口读写操作,使得用户直接和硬件打交道,在程序设计过程中要用到的数据...
  • C语言main函数、return、exit函数

    千次阅读 2018-07-25 12:16:03
    main函数 说到return,有必要提及主函数的定义。很多人甚至市面上的一些书籍,都使用了void main( )这一形式 ,其实这是错误的。 C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的...
  • C语言goto 函数的用法

    千次阅读 2019-03-15 00:10:10
    goto (无条件转换语句)函数可以出现在程序的任意一条语句之前,它的一般形式; goto 标号 ; 标号 : 语句 //计算求和 #include&lt;stdio.h&gt; main() { int sum=0,i=1,x; printf("请你输入第一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,547
精华内容 21,418
关键字:

c语言中断函数格式

c语言 订阅