一、外部中断0电平触发
程序实例1:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
P1=0x55; //P1口初始值
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=0; //电平触发
while(1)
{
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
void ISR_Key(void) interrupt 0 using 1
{
P1=~P1; //进入中断程序执行程序,
//此时可以通过 EA=0指令暂时关掉中断
}
二、外部中断1电平触发
程序实例2:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^0; //定义LED端口
void DelayUs2x(unsigned char t);//us级延时函数声明
void DelayMs(unsigned char t); //ms级延时
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
LED=0; //LED灯点亮
EA=1; //全局中断开
EX1=1; //外部中断0开
IT1=0; //琁T1=0表示电平触发
while(1)
{
//在此添加其他程序
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
void ISR_INT1(void) interrupt 2
{
if(!INT1)
{
DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
if(!INT1)
while(!INT1);//等待按键释放
{
LED=!LED;
}
}
}
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
三、外部中断0下降沿触发
程序实例3:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
P1=0x55; //P1口初始值
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=1; //边沿触发
while(1)
{
//在此添加其他程序
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
void ISR_Key(void) interrupt 0 using 1
{
P1=~P1; //s3按下触发一次,P1取反一次
}
四、外部中断1下降沿触发
程序实例4:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^0; //定义LED端口
void DelayUs2x(unsigned char t);//us级延时函数声明
void DelayMs(unsigned char t); //ms级延时
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
LED=0; //LED灯点亮
EA=1; //全局中断开
EX1=1; //外部中断1开
IT1=1; //IT1=1表示边沿触发
while(1)
{
//在此添加其他程序
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
void ISR_INT1(void) interrupt 2
{
if(!INT1)
{
DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
if(!INT1)
{
LED=!LED;
}
}
}
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
五、T0外部计数输入
程序实例5:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^2; //定义LED端口
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01 | 0x04; //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响
TH0=0xFF; //给定初值
TL0=245; //从245计数到255
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
Init_Timer0();
while(1);
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
TH0=0xFF; //重新给定初值
TL0=245;
LED=~LED; //指示灯反相,可以看到闪烁
}
六、T1外部计数输入
程序实例6:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^2; //定义LED端口
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x10 | 0x40; //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响
TH1=0xFF; //给定初值
TL1=245; //从245计数到255
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
Init_Timer1();
while(1);
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{
TH1=0xFF; //重新给定初值
TL1=245;
LED=~LED; //指示灯反相,可以看到闪烁
}