在Keil上写了段C程序,搞清楚中断的实现。记下笔记:
1.8051的五个中断源
编号 |
中断源 |
入口地址 |
0 |
/INT0 |
0x0003 |
1 |
TIMER0 |
0x000b |
2 |
/INT1 |
0x0013 |
3 |
TIMER1 |
0x001b |
4 |
UART |
0x0023 |
默认优先级按编号已排好序。(0最高,4最低)
2.中断函数写法
返回值 函数名 interrupt n { …… }
|
n对应中断源编号。
3.中断触发控制寄存器IE (当然,左边是高位)
EA |
-- |
ET2 |
ES |
ET1 |
EX1 |
ET0 |
EX0 |
EX0:响应外部/INT0的中断
ET0:响应TIMER0的中断
EX1、ET1:对应/INT1与TIMER1
ES:对应UART
ET2:响应TIMER2溢出或捕捉的中断(仅对8052)
EA:中断使能。EA=1时才允许中断。
4.中断优先级控制寄存器IP
-- |
-- |
PT2 |
PS |
PT1 |
PX1 |
PT0 |
PX0 |
分别对应各中断的优先级。仅分0(低)、1(高)两级,同级的中断还是看中断源编号进行优先级排序。
5.TIMER控制寄存器TCON
TF1 |
TR1 |
TF0 |
TR0 |
IE1 |
IT1 |
IE0 |
IT0 |
TF1与TF0分别是硬件去置位的,当Timer1/Counter1溢出时,TF1会被置为1,而当处理器去执行中断服务时,它又被硬件置0。(当然TF0管的就是Timer0/Counter0了)
TR1与TR0由软件置位,管的是Timer/Counter的激活。(如在程序里写TR0=1,就是说Counter0开始计数,当然如果这个Timer/Counter被设置为Counter的工作方式的话)
IE1与IE0由硬件置位,与TF1、TF0等同,只是IE1与IE0管的是外部中断。
IT1与IT0由软件置位,设为1时,对应的外部中断为负缘触发,设0时为低准位触发。
6.KeilC程序段
下面一段代码可测试中断/INT0:
/*------------------------------------------------------------- /* Filename: external_0.c /* /* Description: Test the external interrupt 0. /* /* Author: Long Hengyu /* /* Date: 10-26-2007 /* /*------------------------------------------------------------- #include <REG51.H> #include <stdio.h>
const char design[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
main() { unsigned int i,j; EA = 1; // Set CPU status: interrupt enable EX0 = 1; // Set external interrupt enable P2 = 0x80; for( ; ; ) { for(j=0; j<8 ; j++) { for(i=0; i<50000; i++); P2 = design[j]; } } }
void EX0_int(void) interrupt 0 { unsigned int i; int j; for( ; ; ) { for(j=7; j>=0 ; j--) { for(i=0; i<50000; i++); P2 = design[j]; } return; } }
|
P2连上一排8个灯,可以看到一个被点亮的灯在移动,没有中断时右移,有中断时左移。
阅读(2863) | 评论(0) | 转发(0) |