×
单片机 > 单片机程序设计 > 详情

8051中断源

发布时间:2020-08-24 发布时间:
|
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

/*

/* 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;

    }

}

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码