C51编译器-语言扩展(5)-中断函数

发布者:hfy13567003617最新更新时间:2016-11-14 来源: eefocus关键字:C51  编译器  语言扩展  中断函数 手机看文章 扫描二维码
随时随地手机看文章
Interrupt Functions中断函数

8051及其变种提供了一定数量的硬件中中断,这些中断有:

Interrupt Number  Interrupt Description        Address

0                   EXTERNAL INT 0          0003h

1                 TIMER/COUNTER 0        000Bh

2                 EXTERNAL INT 1          0013h

3                 TIMER/COUNTER 1             001Bh

4                 SERIAL PORT                 0023h

随着生产商制出新器件,增加了更多的中断。Cx51支持多达32个中断(0-31)。使用下表的中断向量决定中断号

Interrupt Number Address       Interrupt Number Address

0             0003h      16            0083h

1             000Bh      17            008Bh

2             0013h      18            0093h

3             001Bh      19            009Bh

4             0023h      20            00A3h

5             002Bh      21            00ABh

6             0033h      22            00B3h

7             003Bh      23            00BBh

8             0043h      24            00C3h

9             004Bh      25            00CBh

10            0053h      26            00D3h

11            005Bh      27            00DBh

12            0063h      28            00E3h

13            006Bh      29            00EBh

14            0073h      30             00F3h

15            007Bh      31            00FBh

Cx51编译器提供了一种在中断时凋用C函数的方法。这样就可以用C和编写中断服务程序。程序员只需要关心中断号和选用的寄存器组。编译器自动地生成中断向量和中断服务程序的入口及出口代码。函数的interrupt属性,在声明的时候指定当前函数是一个断函数。例:

void timer0 (void) interrupt 1 using 2 {

if (++interruptcnt == 4000) { /* count to 4000 */

second++; /* second counter */

interruptcnt = 0; /* clear int counter */

}

}

函数interrupt属性的参数是一个0-31的整数。在函数的原型中不允许出现表达式和interrupt属性。Interrupt属性对函数代码产生如下影响:

(1)如果需要,在函数的高用的时候SFR,ACC,B,DPH,DPL和PSW的值都保存在堆栈中

(2)如果不用不着using关键字声明所用的寄存器组时,在中断中用到的所有的工作寄存器都保存在堆栈中,

(3)工作寄存器和特殊的寄存器都保存在堆栈中,在中断程序退出时恢复这些寄存器

(4)函数以8051指令RETI结束

中断函须遵守以下规则:

(1)中断函数没有参数。如果带有了参数,编译器将报错

(2)中断函数没有返回值,并且必须被声明为void。如果试图返回一个值编译器将报错。但是如果声明函数返回值是int类型,将会被编译器忽略

(3)编译器检查对中断函数的直接调用,并且直接拒绝这种调用。直接调用中断过程是没有意义的,因为退出中断程序时要执行RETI指令,从而影响了8051芯片的硬件中断系统。因为硬件上没有中断请求,这个返回指令的结果是不确定,并且通常是致命的。也不要通函数指针间接地调用一个中断函数。

(4)编译器为每个中断生成一个中断向量。为中断向量生的代码是跳转到中断函数的起始处。中断向量的生成可以通过在Cx51的命令行使用NOINTVECTOR控制指令禁止。在这种情况下,你必须为每个汇编模块提供中断向量。

(5)Cx51允许中断号的范围是0-31。参考8051的器件手册查看哪些中断是可用的(6)在中断服务程序中调用的函数使用的寄存器组必须与中断服务程序使用的寄存器组一致。如果NOAREGS指令没有显式地指定,编译器就会为这个函灵数生成使用绝对地址访问选定的寄存器(使用suing或使用REGISTERBANK指令)的代码。如果函数使用的寄存器组不是当前选择的,就会产生不可预料的后果

关键字:C51  编译器  语言扩展  中断函数 引用地址:C51编译器-语言扩展(5)-中断函数

上一篇:C51编译器-语言扩展(6)-重载函数
下一篇:C51编译器-语言扩展(4)-函数

推荐阅读最新更新时间:2024-03-16 15:20

模拟I2C总线软件包(C51)
/****************************************************************************** I2C.H 标准80C51模拟I2C总线程序头文件 ******************************************************************************/ #ifndef I2C_H #define I2C_H //定义I2C操作模式 #define I2C_RECV 0 /* 接收模式 */ #define I2C_SEND 1 /* 发送模式 */ #define I2C_SrRECV 2
[单片机]
51单片机之实现流水灯
在实现流水灯之前,我们有必要提一点,C51代码在写之前,要参考电路图来写。拿流水灯来说,我们来看图二,LED灯,也就是二极管,八只LED的正极通过一根总线接在+5V的电压上,再看图一,可知八只LED灯的负极接在LED、P2的8个I/O口上。根据二极管的导通条件可知,在单片机的IO口输出低电平时,才能点亮LED灯。 下面贴上代码: #include reg52.h #define uchar unsigned char #define uint unsigned int sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3;
[单片机]
51单片机之实现流水灯
C51函数积累
(1)_chkfloat_: 函数定义:unsigned char _chkfloat_ ( float val); /* number to check */ 函数功能:_chkfloat_函数检查浮点数 val 的类型。 返回值:_chkfloat_函数返回浮点数 val 的类型。 返回值 意义 0 标准浮点数 1 浮点0 2 +INF 正溢出 3 -INF 负溢出 4 NaN 非数 /*本实验测试本征库中的_chkfloat_函数: 函数定义:unsigned char _chkfloat_(float val); 返回值: Return Val
[单片机]
<font color='red'>C51</font>库<font color='red'>函数</font>积累
C51单片机串口通信
1、在使用串口之前,应对其进行初始化,步骤如下: (1)定时器1工作模式,设置TMOD寄存器 (2)装载TH1,TL1,决定波特率的值 (3)启动定时器1 (4)串口工作模式设置,SCON (5)如需中断,开总中断,开串行中断 2、如需奇偶校验: 偶校验:就是发送的8个数据位的1的个数为偶数时,TB8=0;为奇数时,TB8=1; 奇校验:与偶校验相反的TB8。 用软件产生奇偶校验位是根据51系列单片机的状态寄存器PSW的定义:当累加器ACC中为1的个数为奇数时,P=1,否则P=0。 3、程序(采用偶校验) #include reg52.h #define uchar unsigned char #define ui
[单片机]
Keil C51是如何支持双数据指针,有哪些特别的要求
在8051体系中,数据指针DPTR作为一个特殊的16位寄存器,用于寻址64 KB的XDATA或CODE空间,通常它被当作一个16位指针,指向一个常数表。双数据指针可以改善同时有两个16位指针使用时的性能。作为一种增强特性,有许多8051派生型器件支持双数据指针。以宏晶科技STC89系列的产品为例,DPTR被增强为DPTR0和DPTR1两个,仍然使用原来的地址,用另外一个SFR AUXR1的0位DPS来切换。当DPS位为0时,所有对DPTR的操作使用DPTR0;当DPS位为1时,所有对DPTR的操作使用DPTR1。这样,通过一个简单的INC AUXR1指令,就可以来回切换两个数据指针。 1 Keil C51对双数据指针的支持情况
[单片机]
Keil <font color='red'>C51</font>是如何支持双数据指针,有哪些特别的要求
C语言函数指针数组在ARM中断中的应用
一、函数指针的声明与初始化 ... int max_fun(int a, int b); /*函数指针的声明,声明了两个形参都为int类型,返回值为int类型的函数指针*/ int (*fp)(int, int); /*指针初始化*/ fp = max_fun; //fp = &max_fun 也正确 /*函数指针初始化后的调用*/ fp(a,b); //(*fp)(a,b);也正确 ... 二、函数指针的typedef typedef void (*irq_func)(int); //定义一个数组,存放中断函数指针,其参数类型为irq_func irq_func irq_array ; 三、函数
[单片机]
arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别
命名规则 交叉编译工具链的命名规则为:arch arch – 体系架构,如ARM,MIPS vendor – 工具链提供商 os – 目标操作系统 eabi – 嵌入式应用二进制接口(Embedded Application Binary Interface) 注意 没有vendor时,用none代替; 没有os支持时,也用none代替 同进没有vendor和os支持时,只用一个none代替,比如arm-none-eabi中的none表示既没有vendor也没有os支持。 根据对操作系统的支持与否,ARM GCC可分为支持和不支持操作系统,如 arm-none-eabi:这个是没有操作系统的,自然不可能
[单片机]
arm交叉<font color='red'>编译器</font>gnueabi、none-eabi、arm-eabi、gnueabihf的区别
Microchip最低功率大内存单片机系列
2008 年 4 月 16 日 ,单片机和模拟半导体供应商—— Microchip Technology Inc. (美国微芯科技公司)今天宣布推出全新的 PIC24FJ256GB1 单片机系列。该系列单片机共有 12 款器件,是全球功率最低( 100 nA 待机电流)的大内存(高达 256 KB 闪存以及 16 KB RAM ) 16 位 USB 单片机系列,也是唯一具备集成 USB 2.0 器件、嵌入式主机以及两用 On-the-Go ( OTG )功能的 16 位单片机系列,可帮助用户通过高性价比且便捷的途径在嵌入式设计中添加高级 USB 功能。此
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved