8051/8052系列单片机标准向量表:

中断号描述地址

0外部中断00003h

1定时/计数器0000Bh

2外部中断10013h

3定时计数器1001Bh

4串口0023h

5定时计数器2(8052)002Bh

众多厂商为其51系列单片机添加了更多的中断。Keil Cx51编译器支持多达32个中断函数(中断号0-31)。下表列出了这32个中断向量入口地址:

中断号     入口地址     00003h1000Bh20013h3001Bh40023h5002Bh60033h7003Bh80043h9004Bh100053h11005Bh120063h13006Bh140073h15007Bh中断号    入口地址    160083h17008Bh180093h19009Bh2000A3h2100ABh2200B3h2300BBh2400C3h2500CBh2600D3h2700DBh2800E3h2900EBh3000F3h3100FBh

函数声明时使用interrupt关键词,该函数将被编译器视为中断服务程序,例如:

unsigned int  interruptcnt;

unsigned char second;

void timer0 (void) interrupt 1 using 2  {

if (++interruptcnt == 4000)  {

second++;

interruptcnt = 0;

}

}

interrupt 关键词后跟一个整数,表示中断号,取值范围0-31。中断号必须为常数,不允许使用操作符表达式。

interrupt关键词影响了该函数的目标代码:

1)该中断服务程序被调用时,寄存器ACC、B、DPH、DPL、PSW的内容被压入堆栈;

2)该函数声明时,如果没有使用using关键词指定寄存器组,则在其被调用时,它所使用的所有工作寄存器的内容被压入堆栈;

3)被压入堆栈的工作寄存器、特殊寄存器在该退出中断服务程序前被恢复;

4)该中断服务程序以RETI指令结束;

下面的程序介绍了interrupt关键词的用法,展示了用于进入、退出中断服务程序的汇编代码,using关键词则是为了指定该中断服务程序使用与非中断程序不同的工作寄存器组,须要注意的是,下面的中断服务程序没有使用工作寄存器,所以进入函数时切换寄存器组的代码被优化掉了:

1        extern bit alarm;

2        int alarm_count;

3

4

5        void falarm (void) interrupt 1 using 3  {

6   1      alarm_count *= 2;

7   1      alarm = 1;

8   1      }

下面是对应的汇编代码:

0000 C0E0       PUSH  ACC/* 进入中断服务程序时,ACC寄存器内容压栈 */

0002 C0D0       PUSH  PSW/* 进入中断服务程序时,PSW寄存器内容压栈 */0004 E500   R   MOV   A,alarm_count+01H

0006 25E0       ADD   A,ACC

0008 F500   R   MOV   alarm_count+01H,A

000A E500   R   MOV   A,alarm_count

000C 33         RLC   A

000D F500   R   MOV   alarm_count,A

000F D200   E   SETB   alarm

0011 D0D0       POP   PSW/* 退出中断服务程序前,恢复PSW寄存器的内容 */

0013 D0E0       POP   ACC/* 退出中断服务程序前,恢复ACC寄存器的内容 */

0015 32         RETI

作为中断服务程序的函数必须遵循的规则:

1)中断服务函数不能有参数;

2)中断服务函数返回值类型必须为void类型;

3)不能直接调用或者通过函数指针调用中断服务函数,中断服务函数只能由硬件自动调用,我们在程序中调用中断服务函数,将引起RETI指令的执行,该指令被人为执行,而其对应的硬件中断请求并不存在,这将导致单片机硬件中断系统产生不确定的致命错误;

4)Keil Cx51编译器支持中断号范围0-31,具体可用的中断号须要结合用户所用的具体芯片手册;

c语言关键字 interrupt,Keil C51对C语言的关键词扩展之十四: interrupt相关推荐

  1. keil p0 0c语言不了,Keil C51对C语言的关键词扩展之十三: sfr

    sfr用来定义特殊功能寄存器.用法如下: sfr name = address; name 为寄存器名字 address 为寄存器的地址 示例: sfr P0 = 0x80; /* P0口,地址为0x ...

  2. c语言lst文件,Keil C51 之LST文件

    Keil C51编译器在编译程序时,会生成一个扩展名为LST的列表文件,也被称为listing file. 这个文件包含了有关编译过程的丰富信息,该文件由多个段组成,其中Symbol Listing ...

  3. keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法

    前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...

  4. c51语言c100错误,KEIL C51错误的解决办法

    有时候在编好一个程序之后,编译链接时,提示说有如下错误. 错误为 ..校长基金1TEXT1.C(56): error C100: unprintable character 0xA1 skipped ...

  5. c51语言开发工具,KEIL C51 开发工具

    产业标准的Keil C编译器.宏汇编器.调试器.实时内核.单板计算机和仿真器,支持所有的8051系列微控制器,帮助你如期完成项目进度. 当启动一个新的项目,你只需从设备数据库选择使用的微控制器,μVi ...

  6. c51语言bit函数,keil C51中的本征函数库及使用说明

    本征函数(intrinsicroutines)是指编译时直接将固定代码插入当前行,而不用ACALL和LCALL 来实现(无需堆栈操作?),可大大提高函数的访问效率. 函数原型 extern void  ...

  7. keil设置c语言字体大小,Keil C51 µVision IDE 配置文件修改字体大小的方法

    最近在用keil的时候,发现默认字体实在太小了.正常来讲应该直接在config里面修改字体,不过这软件在我的win8.1上可能有问题.无法弹出配置框,直接卡死掉.所以我只能希望直接修改配置文件,来修改 ...

  8. Keil C51对C语言的关键词扩展之十五: reentrant

    reentrant声明的函数为可重入函数.可重入的函数能够被多个进程同时调用.可重入函数在执行时,另外的进程可以中断当前执行的函数,并且调用同一个函数.正常情况下,C51程序中的函数不能被递归地调用, ...

  9. c语言中的sfr16,Keil C51对C语言的关键词扩展之十六:sfr16

    sfr16定义一个16位的特殊功能寄存器: sfr16 name = address; name 16位特殊功能寄存器名称 address 16位特殊功能寄存器地址 一些8051系列产品拥有16位的特 ...

最新文章

  1. bzoj3295:[CQOI2011]动态逆序对
  2. [C++ STL] map使用详解
  3. html中after伪类原理,css伪类before跟after原理与使用(原)
  4. centos7 下通过nginx+uwsgi部署django应用
  5. Qt文档阅读笔记-QtWebApp官方解析与实例(使用QtWebApp搭建HTTP服务器)
  6. 计算机编程课程顺序_九月份可以开始提供650多种免费的在线编程和计算机科学课程
  7. leetcode —— 面试题 17.12. BiNode
  8. outlook邮箱邮件大小限制_outlook上传文件有大小限制如何解决
  9. 建好ftp服务器后怎么从客户端更改密码?
  10. CentOS7 服务器连接超时自动断开问题解决
  11. HDOJ 1257 (最长字序列问题)
  12. haosou属于搜索引擎的_搜索引擎登录工具
  13. 巧用Excel按照某一列进行整体排序
  14. cass简码大全_CASS简码与实体编码对照表
  15. list转Tree和手动过滤TreeNode
  16. MATLAB遗传算法工具箱安装包及安装方法(图解)
  17. js获取当月第一天年月日和最后一天年月日
  18. 信息检索中 (IR) 的评价指标: P@n, MAP, MRR, DCG, NDCG
  19. python 消息 推送服务器,从客户端发送字符串消息到服务器Python
  20. 中国科学院大学-模式识别与机器学习-复习、往年真题整理(含解答)【硬干货,博主本课程90+】

热门文章

  1. Python | 别人家的代码 if __name__ == '__main__' 到底什么意思?
  2. 跟我学aspectj之六 ----- 插曲
  3. 【干货】教你如何通过Netty编写一个SS代理服务器
  4. iOS 通知中心扩展制作入门
  5. 详解ACM基础算法—DFS深度优先搜索算法 HIT杨朔
  6. .net中当Thread.Sleep和Application.DoEvents都不好用时
  7. RV1109_RV1126 EVB板使用记录
  8. python语言中range函数的功能_python应用:python range函数
  9. vue 天地图 T is not defined
  10. 福禄克Fluke 1535/ Fluke 1537 2500V绝缘电阻测试仪(数字高压兆欧表)F1535 F1537