木有寸557

 

单片机 中断

  中断是为使单片机具有对外或内部随机发生的事件实时处理的能力而设置的,中断功能的存在,很大程度上提高了单片机处理外部或者内部事件的能力。

  51单片机有5个中断源,即有5种情况发生会使单片机处理中断程序。

  中断的解释:CPU处理在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前工作(中断响应),转去处理事件B(中断服务);待CPU将事件B处理完后,再回到原来事件A被中断的地方继续处理A(中断返回),这一过程称为中断。

 

    52单片机共有6个中断源。

    INT0--外部中断0,由P3.2端口线引入,低电平或下降沿引起。のgh

    INT1--外部中断1,由P3.3端口线引入,第电平或下降沿引起。

    T0  --定时器/计数器0中断,由T0计数器计满回零引起。

    T1  --定时器/计数器1中断,由T1计数器计满回零引起。

    T2 -- 定时器/计数器2中断,由T2计数器计满回零引起。

    TI/RI -- 串行口中断,串行端口完成一帧字符发送/接收后引起。

    T2是52单片机特有的。 以上中断源默认中断级别 为   INT0      T0      INT1     T1      TI/RI      T2

  单片机在使用中断功能时,通常需要设置两个与中断有关的寄存器

     (1)中断允许寄存器 IE : 用来设定中断源的打开和关闭, IE在特殊功能寄存器中,字节为A8H,位地址分别是 A8H ~ AFH。该寄存器课进行位寻址,即可对该寄存器的每一位分别进行操作。EA为全局中断允许位。

 

  (2)中断优先级寄存器IP :中断优先级寄存器在特殊功能寄存器中,字节地址为B8H。IP用来设定各个中断源属于两级中断中的哪一级。该寄存器可进行位寻址。单片机复位时IP全部被清0.

在51单片机系列中,高优先级中断能够打断低优先级中断以形成中断嵌套,同优先级之间或者低级对高级中断不能形成中断。若几个同级中断同时向CPU请求中断响应,在没有设置中断优先级的情况下按照默认中断级别响应中断。

 

  定时器中断

    定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时器/计数器的功能方式寄存器; TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

    (1)TMOD: 在特殊功能寄存器中,字节地址为89H,不能进行位寻址。单片机复位时TMOD全部清零。

高4位用于T1,低4位用于T0。

GATE --门控制位。   GATE=0,定时器/计数器启动与停止仅受TCON寄存器中TRX( X=0,1 )来控制。

           GATE=1,定时器/计数器启动与停止由TCON寄存器中TRX( X=0,1 )和外部中断引脚( INT0或INT1 )上的电平状态来共同控制。

C/T  -- 定时器模式和计数器模式选择位。  C/T=1 为计数器模式, C/T=0 为定时器模式。

M1M0--工作方式选择位。

 

    (2)TCON:在特殊功能寄存器中,字节地址为88H,可进行位寻址。TCON寄存器用来控制定时器的启、停,标志定时器溢出和中断情况。单片机复位时TCON全部清零。其中TF1、TR1、TF0、TR0用于定时器/计数器;IE1、IT1、IE0和IT0用于外部中断。。

TF1 ---定时器1溢出标志位。

    当定时器1计满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。如果使用定时器的中断,那么该位完全不用人为去操作,但是如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0。

TR1---定时器1运行控制位。

    由软件清0关闭定时器1。当GATE=1,且INIT1为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器1。

  

  每个定时器都有4种工作方式,可通过设置TMOD寄存器中的M0M1位来进行工作方式选择。这里通过定时器0方式1来叙述定时器的初值问题。方式1 的计数位数是16 位,对于T0来说,由TL0寄存器作为低8位、TH0寄存器作为高8位,组成16位加1计数器。定时器一旦启动,它便在原来的初值上开始加1计数,若在程序开始时,我们没有设置TL0、TH0,那么他们的默认值都是0。假设时钟频率为12MHZ,12个时钟周期为一个机器周期,那么此时机器周期为1us,计满TH0和TL0就需要  2的6次方减一  个数,再来一个脉冲计数器就溢出,随机向CPU申请中断,如果我们要定50ms的话,那么就需要先给TH0和TL0装一个初值。50ms需要计数50000个数,TH0和TL0中应该装入的总数是 65536-50000=15536。15536对256求模:15536/256=60,装入TH0,把15536对256求余装入TL0中。

 

中断函数的格式

    void 函数名()interrupt 中断号

    {

      中断服务程序内容

    }

一下为TX-1C板上第一个二极管以1s时间闪烁

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^1;
uchar num;
void main()
{
      TMOD=0x01;
      TH0=(65536-46080)/256;
      TL0=(65536-46080)%256;
      EA=1;
      ET0=1;
      TR0=1;
      while(1);
}
void T0_time() interrupt 1
{
      TH0=(65536-46080)/256;
      TL0=(65536-46080)%256;
      num++;
      if( num==20 )
      {
        num=0;
        led1=~led1;
      }

}

posted on 2012-04-01 17:29  小猪_你快跑  阅读(873)  评论(0编辑  收藏  举报

导航