关闭

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

标签: Keil C51 关键词 扩展
910人阅读 评论(0) 收藏 举报
分类:

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,具体可用的中断号须要结合用户所用的具体芯片手册;




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:172453次
    • 积分:2710
    • 等级:
    • 排名:第13324名
    • 原创:97篇
    • 转载:0篇
    • 译文:0篇
    • 评论:41条
    最新评论