Chinaunix首页 | 论坛 | 博客
  • 博客访问: 447479
  • 博文数量: 122
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-17 11:10
文章分类

全部博文(122)

文章存档

2011年(1)

2008年(86)

2007年(35)

我的朋友

分类:

2007-10-26 22:31:08

    在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) |
0

上一篇:perl饼替换文件内容的用法

下一篇:sed

给主人留下些什么吧!~~