一.外部中断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年年末

 


作者:​​柒月​