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 /* /* Deion: Test the external interrupt 0. /* /* Author: Long Hengyu /* /* Date: 10-26-2007 /* /*------------------------------------------------------------- #include #include 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; } } |
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』