STC51六中中断配置点亮一个LED

一.外部中断0、1(分别點亮一個LED)

 



/*******************************************************************************

*  标题:                  计数器中断实验                                       *





#include <reg52.h>

#include<intrins.h>

sbit led1 = P0^0;

sbit led2 = P0^1;





void main(void)

{  



// IT0=0;       //低电平触发

   IT0=1;       //下降沿触发

   EX0=1;





   

// IT1=0;       //低电平触发

   IT1=1;       //下降沿触发

   EX1=1;

   EA=1;





   while(1);

 }

/********************************************************

* INT0中断函数                                          *

********************************************************/

void  counter0(void) interrupt 0  using 1

{

  

   EX0=0;  

   led1=~led1;

   EX0=1;

}

/********************************************************

* INT1中断函数                                          *

********************************************************/

void  counter1(void) interrupt 2 using 2

{

   

   EX1=0;

   led2=~led2;

   EX1=1;

}

/********************************************************/

 

 

二.定时器计算器中断 0 (1S,LED灯闪烁)

 

#include <reg52.h>

#include <intrins.h>



typedef unsigned char uchar;

typedef unsigned char uint;



uint num1,num2;

sbit led1=P2^2;



void system_Ini()

{

     TMOD = 0x00; //选择模式0  13位计数 最大计数8192

  

   // TH0=0x1C;   //12.000M  预装初值

    //TL0=0x18;    

     TH0 = (8192 - 1000)/32;

     TL0 = (8192 - 1000)%32    ;

     IE = 0x8A;   //中断    

     TR0  = 1;    //开启T0定时器





}

void main()

{

    system_Ini();

    while(1);    

}





void T0zd(void) interrupt 1      //3定时器1的中断号  1定时器0的中断号 0外部中断1 2外部中断2  4串口中断

{

     //TH0 = 0xFc;    //12.000

     //TL0 = 0x18;



    TH0 = (8192 - 1000)/32    ;

    TL0 = (8192 - 1000)%32;

    num1++;

    if(num1>100)

    {

        num1=0;

        num2++;

        if(num2>10)

        {num2=0;P2=~P2;}    

    }     

}

 

 

三.定时器计算器中断 1(1S,LED灯闪烁)

 



 



#include <reg52.h>

#include <intrins.h>



typedef unsigned char uchar;

typedef unsigned char uint;



uint USE_C;



void  main()

{

    TMOD=0x10;   //定时/计数器1工作于方式1

    TH0=0x4C;     //定时器初始值

    TL0=0x00;    //50ms定时常数

    //THO=(65536-45872)/256;   11.0592MHZ

    //TLO=(65536-45872)%256;

    EA=1;        //开总中断

    ET1=1;       //允许定时/计数器1 中断

    TR1=1;       //启动定时/计数器1 中断

 

    while(1);

} 





/*********************************************************

  中断服务函数

**********************************************************/

void Time1(void) interrupt 3 // using 0

{

   TH1=0x4c;               //50ms定时

   TL1=0x00;

   if (++USE_C == 20)      //每隔1秒发声

   { P2=~P2;

     USE_C = 0;

   }



   

}

 

四.定时器计算器中断 2(1S,LED灯闪烁)

 

 



#include <reg52.h>

#include <intrins.h>



typedef unsigned char uchar;

typedef unsigned int uint;



uint num;



void main()             // 该中断计数循环3686(晶振11.0592MHZ)次是一秒4000次(12MHZ)

{

    TMOD=0x02;

    TH0=6;

    TL0=6;         //当低八位记满溢出 TF0标指位为 1 反应给    CPU 申请中断 同时TH0 中数组                       //自动装入(复制)TL0中

    EA=1;

    ET0=1;

    TR0=1;

    while(1)

    {

      if(num==4000)    //     若为11.0592 num=3686

      { P2=~P2;

        num=0;

      }

    }

}

void T0_time() interrupt 1 using 2

    {

        num++;

    }





    

 

 

五.定时器计算器中断 3(1S,0.5s,LED灯闪烁)

 

#include <reg52.h>

#include <intrins.h>



typedef unsigned char uchar;

typedef unsigned int uint;

sbit led1=P2^1;

sbit led2=P2^2;

uint num1,num2;



void main()

{



    TMOD=0X03;

    TH0=6;

    TL0=6;

    EA=1;

    ET0=1;

    ET1=1;

    TR0=1;

    TR1=1;

     while(1)

    {

        if(num1>=4000)//3686 11.0592 

        {

            num1=0;

            led1=~led1;

        }

        if(num2>=2000)//1843 11.0592 

        {

            num2=0;

            led2=~led2;

        }            

    }    

}

void TLO_time() interrupt 1     //低八位用定时器计数器中断0的中断源

{

    TL0=6;

    num1++;

}

void TH0_time() interrupt 3    //高八位用定时器计数器中断1的中断源

{

    TH0=6;

    num2++;

}    

 

 

六.定时器计数器中断 0 (计数器中断)

/*******************************************************************************

*  标题:                  计数器中断实验                                       *

*                                                                               *

*                                                                               *

*  实验说明:用单片机产生的脉冲波,作为T0外部事件的脉冲输入,对于HC6800EM3的型 *

*            号,可以自带的脉冲发生器作为T0外部事件的脉冲输入                    *

*  连接方法:参开图片或视频                                                       *

********************************************************************************

*                                                                                   *

* 请学员认真消化本例程,掌握定时器/计数器中断使用                              *

********************************************************************************/



#include <reg52.h>

#include<intrins.h>

sbit LED = P0^0;

sbit Pulse = P1^0;





void Timer0() interrupt 1

{

   TH0 = 0Xa0;  //给计数器装初值

   TL0 = 0X00;

   

   LED = ~LED;    //LED灯取反







}



void main()

{

  P0 = 0XFF;                  

  TMOD = 0X05;    //选用计数模式和 选用模式1

  TH0 = 0Xa0;   //给计数器装初值

  TL0 = 0x00;

  EA = 1;         //开发所有中断

  ET0 = 1;       //开启定时器T0中断

  TR0 = 1;         //启动T0定时器

  

  while(1)  

  { 

    Pulse = 0 ;     

      _nop_();   //空指令函数 用于产生方波

    _nop_();

    _nop_();

    _nop_();

    Pulse = 1 ;

    _nop_();

    _nop_();

    _nop_();

    _nop_();



  

  }



}

 

写于2012年年末

 

 

 

 

 

 

 


 

你可能感兴趣的:(配置)