在Keil上写了段C程序,搞清楚中断的实现。记下笔记:
1.8051的五个中断源
编号 | 中断源 | 入口地址 |
0 | /INT0 | 0x0003 |
1 | TIMER0 | 0x000b |
2 | /INT1 | 0x0013 |
3 | TIMER1 | 0x001b |
4 | UART | 0x0023 |
默认优先级按编号已排好序。(0最高,4最低)
2.中断函数写法
|
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时为低准位触发。
|
P2连上一排8个灯,可以看到一个被点亮的灯在移动,没有中断时右移,有中断时左移。
转自:http://blog.chinaunix.net/uid-20629402-id-1608165.html