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

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

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

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

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

#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  //这个头文件声明了左移函数和右移函数
	typedef unsigned int u16;  //声明u16这个类型是unsigned int

#endif

你可能感兴趣的:(单片机)