欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

89C52单片机实现外部中断与定时器中断嵌套

程序员文章站 2022-04-01 15:33:14
...

这个实验的内容是:通过外部中断控制流水灯的流向,通过定时器来确定流水灯的流动速度,采用多个源文件和多个头文件编写C语言程序(即一个源文件对应一个头文件),并在proteus中在仿真。

关于多个源文件和多个头文件的编写规则请参考这篇博客:多个.c文件和.h文件时的相互调用

proteus图:
89C52单片机实现外部中断与定时器中断嵌套

具体实现方式请看下面的程序:

#include "main.h"

void main(){
	int1_init();  //外部中断1初始化
	timer1_init();  //定时器1初始化
	P0 = 0xfe;  //给P0赋初值,是第一个LED灯点亮
	while(1);  //等待中断
}
#ifndef __MAIN_H__
#define __MAIN_H__

	#include "int1_init.h"
	#include "timer1_init.h"

#endif
#include "int1_init.h"

void int1_init(){
 	EA = 1;  //打开总中断
	EX1 = 1;  //打开外部中断1
	IT1 = 1;  //以下降沿方式触发中断
}
#ifndef __INT1_INIT_H__
#define __INT1_INIT_H__

	#include "reg52.h"
	void int1_init(void);  //声明中断初始化函数

#endif
#include "timer1_init.h"

void timer1_init(){
  	EA = 1;
	ET1 = 1;  //定时器中断控制位
	TMOD = 0x10;  //选择定时器工作方式1
	TH1 = 0x3c;  //高四位赋初值
	TL1 = 0xb0;  //低四位赋初值
	TR1 = 1;  //开启定时器中断
}
#ifndef __TIMER1_INIT_H__
#define __TIMER1_INIT_H__

	#include "reg52.h"
	void timer1_init(void);


#endif
#include "int1_isr.h"

void int1_isr() interrupt 2 {
	//当按键按下时,flag按位取反
	flag = ~flag;//因为在其他.c文件已定义,且在该头文件中已声明,所以可以直接使用
}
#ifndef __INT1_ISR_H__
#define __INT1_ISR_H__

	extern bit flag;//声明外部变量flag,因为在其他.c文件被定义过了

#endif
#include "timer1_tsr.h"

bit flag = 1;  //bit类型变量只有0和1
static u16 i=0;  //静态变量

//只要时间一到就进入定时中断
void timer_tsr() interrupt 3 {
	//进入中断,定时器溢出,再给定时器赋初值,使定时器又开始计时,以便下一次中断
	TH1=0X3C;	 
	TL1=0XB0;
	i++;
	if(i==10){
		i=0;
		if(flag)
		P0=_crol_(P0,1);  //把P0的值左移一位
		else
		P0=_cror_(P0,1);  //把P0的值右移一位	
	}	
}
#ifndef __TIMER1_TSR_H__
#define __TIMER1_TSR_H__

	#include "reg52.h"
	#include<intrins.h>  //这个头文件声明了左移函数和右移函数
	typedef unsigned int u16;  //声明u16这个类型是unsigned int

#endif
相关标签: 单片机