Keil C51对C语言的关键词扩展之十四: interrupt

原创 2013年12月01日 21:21:47

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

中断号       描述    地址             
0 外部中断0  0003h
1 定时/计数器0  000Bh
2 外部中断1  0013h
3 定时计数器1  001Bh
4 串口  0023h
5 定时计数器2(8052)   002Bh

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

 中断号      入口地址     
0 0003h
1 000Bh
2 0013h
3 001Bh
4 0023h
5 002Bh
6 0033h
7 003Bh
8 0043h
9 004Bh
10 0053h
11 005Bh
12 0063h
13 006Bh
14 0073h
15 007Bh
 
 中断号     入口地址    
16 0083h
17 008Bh
18 0093h
19 009Bh
20 00A3h
21 00ABh
22 00B3h
23 00BBh
24 00C3h
25 00CBh
26 00D3h
27 00DBh
28 00E3h
29 00EBh
30 00F3h
31 00FBh
函数声明时使用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,具体可用的中断号须要结合用户所用的具体芯片手册;




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

interrupt 和 using 在C51中断中的使用

interrupt 和 using 在C51中断中的使用 8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源...

只有一个 ZooKeeper 服务器的例子

-- Start 1. 创建配置文件 -- 更多参见:ZooKeeper 精萃 -- 声 明:转载请注明出处 -- Last Edited on 2014-09-04 -- Written by...

keil -- 函数指针和再入函数

概述 函数指针是C语言中几个难点之一。由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服。主要由于函数变量的传递。 典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈...
  • hnjzwsl
  • hnjzwsl
  • 2012年12月12日 11:33
  • 793

Keil C51对C语言的关键词扩展之十八:using

在8051系列单片机中,内部ram的前32个字节被分为4组,每组8个寄存器。每组的8个寄存器名字都为R0-R7。通过设置PSW寄存器的两个位,可以选择使用4组寄存器中的哪一组。 寄存器组在处理中断或...

C语言关键词C/C++ Keywords

cppreference.com -> C/C++ Keywords C/C++ Keywords asm 插入一个汇编指令. auto 声明一个本地变量. ...

KEIL C51环境下,汇编与C语言交叉编译的问题

1. 关于如何在C语言中嵌入汇编命令: 转载自:http://www.keil.com/support/docs/2308.htm C51: GETTING INLINE ASSEMBLY T...

如何利用keil C实现单片机中断功能(interrupt,using关键字的用法)

C语言在8051单片机上的扩展(interrupt、using关键字的用法)直接访问寄存器和端口 定义sfr P0 0x80 sfr P1 0x81 sfr ADCON; 0xDEsbit EA  0...
  • qp_12
  • qp_12
  • 2017年01月22日 00:11
  • 791

关于如何利用Keil C实现51单片机中断功能(interrupt、using关键字的用法)

转载自:http://blog.csdn.net/leizi_chn/article/details/7244377 C语言在8051单片机上的扩展(interrupt、using关...
  • qhyka
  • qhyka
  • 2013年10月10日 13:43
  • 903

C51对C的扩展专题

  • 2011年12月23日 09:11
  • 2.08MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Keil C51对C语言的关键词扩展之十四: interrupt
举报原因:
原因补充:

(最多只允许输入30个字)