89C52单片机实现外部中断与定时器中断嵌套
程序员文章站
2022-04-01 15:33:14
...
这个实验的内容是:通过外部中断控制流水灯的流向,通过定时器来确定流水灯的流动速度,采用多个源文件和多个头文件编写C语言程序(即一个源文件对应一个头文件),并在proteus中在仿真。
关于多个源文件和多个头文件的编写规则请参考这篇博客:多个.c文件和.h文件时的相互调用
proteus图:
具体实现方式请看下面的程序:
#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
上一篇: idea远程调试 spark
下一篇: LeetCode(数据库)- 判断三角形