首页 > 其他分享 >07-中断系统与外部中断应用

07-中断系统与外部中断应用

时间:2023-10-05 16:45:03浏览次数:28  
标签:P0 07 中断 unsigned 外部 寄存器 函数

外部中断的基本操作与应用

关于51单片机的中断系统
一般来说,51单片机有5个中断源(忽略定时/计数器2),分2个优先级,这个5个中断源按照自然优先级从高到低依次为:
外部中断0INT0

定时/计数器0TF0

外部中断1INT1

定时/计数器1TF1

串口中断RI/TI

下面一图将充分说明51单片机的中断系统结构:

171231xqxwduha6qx6hfff.jpg.thumb

每个中断源都对应着一个固定的入口地址,也就是中断向量,它们依次是:

0 0x0003INT0
1 0x000BTF0
2 0x0013INT1
3 0x001BTF1
4 0x0023RI/TI

也就是说,不管主程序执行到什么地方,只要外部中断1产生请求,内核要响应该中断,就会到0x0013这个地址去执行代码。如果你是在使用汇编语言进行程序开发的时候,你需要记住每个中断源对应的地址;如果你使用的是C语言,你只需要记住中断源的顺序就可以了,也就是最左边的中断号

3、中断相关的寄存器
中断相关的寄存器有4个,每个寄存器都是可以位寻址的,这该编程带来了方便。 其中2个为控制寄存器:IE寄存器IP寄存器

165617a1cwsz3qkjthbn8f.png.thumb

另外2个为中断请求标志:TCON寄存器SCON寄存器

205324oahcr5z126920711.png.thumb

4、关于中断服务函数程序的编写
一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数。初始化函数就是一个普通的函数,而中断服务函数却有特殊的格式要求:
<1> 中断函数没有返回值,也不能带参数。
<2> 函数名后面要跟一个关键字interrupt,说明这是一个中断服务函数。
<3> 在关键字interrupt后面要跟上中断号,说明这个中断服务函数是为那个中断服务的。

中断服务函数的格式为:
void 函数名() interrupt 中断号
{ ----函数体---- }
我们要利用定时器0来进行间隔定时,中断程序架构我们C语言可以这样写:

165742v1q9l997b455bb5q.png.thumb

20231005144114

由上可知将J5跳帽接到2~3脚,S5按键可以操作外部中断INT0

原理图如下:

20231005162624

方法一:

#include <REGX52.H>

sbit L1 = P0^0;
sbit L8 = P0^7;

// 延时函数
void Delay_ms(unsigned int xms) {
	unsigned int i,j;
	for(i = 0; i<xms; i++) {
		for(j=0;j<299;j++);
	}
	
}
// 10us
void Delay(unsigned int t) {
	while(t--);
	while(t--);
	while(t--);
}

void _74HC138(unsigned char n) {
	switch(n) {
		case 4:P2=(P2 & 0x1f) | 0x80;
		break;
		case 5:P2=(P2 & 0x1f) | 0xa0;
		break;
		case 6:P2=(P2 & 0x1f) | 0xc0;
		break;
		case 7:P2=(P2 & 0x1f) | 0xe0;
		break;
	
	}

}
void SystemInit(void) {
	_74HC138(5);
	P0=0X00;
	_74HC138(4);
	P0 = 0XFF;
}
void Working(void) {
	_74HC138(4);
	L1 = 0;
	Delay_ms(1000); // 1us = 1000ms
	L1 = 1;
	Delay_ms(1000);

}

void Init_INT0() {
	// 源类型选择器
	// IT0 = 0; 低电平触发, IT0=1;下降沿触发
	IT0 = 1;
	// 中断使能
	EX0 = 1;
	// 打开总中断
	EA = 1;
	
}

void main(void) {
	SystemInit();
	Init_INT0();
	while(1) {
		Working();
	
	}
}


// 由于P3_2口和INT0引脚一致
void Int0_Routine(void) interrupt 0 {
	L8 = 0;
	Delay_ms(1000);
	L8 = 1;
	Delay_ms(1000);
}

方法二:

#include <REGX52.H>

sbit L1 = P0^0;
sbit L8 = P0^7;

// 延时函数
void Delay_ms(unsigned int xms) {
	unsigned int i,j;
	for(i = 0; i<xms; i++) {
		for(j=0;j<299;j++);
	}
	
}
// 10us
void Delay(unsigned int t) {
	while(t--);
	while(t--);
	while(t--);
}

void _74HC138(unsigned char n) {
	switch(n) {
		case 4:P2=(P2 & 0x1f) | 0x80;
		break;
		case 5:P2=(P2 & 0x1f) | 0xa0;
		break;
		case 6:P2=(P2 & 0x1f) | 0xc0;
		break;
		case 7:P2=(P2 & 0x1f) | 0xe0;
		break;
	
	}

}
void SystemInit(void) {
	_74HC138(5);
	P0=0X00;
	_74HC138(4);
	P0 = 0XFF;
}
void Working(void) {
	_74HC138(4);
	L1 = 0;
	Delay_ms(1000); // 1us = 1000ms
	L1 = 1;
	Delay_ms(1000);

}

void Init_INT0() {
	// 源类型选择器
	// IT0 = 0; 低电平触发, IT0=1;下降沿触发
	IT0 = 1;
	// 中断使能
	EX0 = 1;
	// 打开总中断
	EA = 1;
	
}
unsigned char stat_int = 0;
void LED_INT() {
	if(stat_int == 1) {
	L8 = 0;
	Delay_ms(1000);
	L8 = 1;
	Delay_ms(1000);
	}
	stat_int = 0;
}
void main(void) {
	SystemInit();
	Init_INT0();
	while(1) {
		Working();
		LED_INT();
	}
}






// 由于P3_2口和INT0引脚一致

void Int0_Routine(void) interrupt 0 {
	stat_int = 1;
}

标签:P0,07,中断,unsigned,外部,寄存器,函数
From: https://www.cnblogs.com/bky111/p/17743518.html

相关文章

  • 进程栈、线程栈、内存栈、中断栈
    前言虽然我也很想讲X86_64体系,无奈这样的资料的确不多,因此本文还是本着学习的态度,探究早已经过时的X86体系。本文转载自此文,该博主对栈的数据结构、栈的作用等进行了阐述,其中涉及了函数栈帧的相关知识,这部分内容我没有转载,我仅仅转载了我感兴趣的进程栈,线程栈等部分,并在其中融入......
  • 【分享】office 2007、2010、2013最终版分享 (转)
    转自宋永志博客,宋永志博客-最纯净的系统下载站(songyongzhi.com)Office2007SP3简体中文专业增强版2019.02(终结版)软件介绍:1、Office2007SP3专业增强版,集成补丁至2019年02月,集成正版序列号,安装完后自动激活。2、Office2007只有32位版本,可以兼容64位系统,请放心使用。3、......
  • JavaSE(07) - API -String字符串
    JavaSE(07)-API-String字符串p96API和API帮助文档p97String概述java.lang.String类代表字符串,java程序中的所有字符串文字(例如"abc")都是此类的对象.注意点:字符串的内容是不会发生改变的,他的对象在创建后不能被更改.p89String的构造方法代码实现和内存分析......
  • stata 18 显示r603 不能安装外部命令 主要是设置文件夹的读写权限
    1.stata18安装位置的ado文件夹中新建plus personal ......
  • 第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DM
    视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 这个是我们初学RTOS面临的最直接问题,很多时候,简单的RTOS机制明白了,API也会调用了,就是添加到RTOS后,总感觉那里不对劲,怎么使用才是正确姿势。针对这些问题,本期视频教程,我们ThreadX内核教程穿插一期实......
  • Flutter/Dart第07天:Dart基础语法详解(库、导入和关键字)
    Dart官网文档:https://dart.dev/language/libraries重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。Dart中的库(Library)Dart语言对代码的复用下了不少功夫,如前面讲到的Mixin高级特性实......
  • [官方培训]07-UE材质基础 孙丹璐 Epic 笔记
    UE材质基础什么是材质定义了场景中对象的表面属性决定光源是如何与物体表面交互反射——漫反射,镜面反射折射透射本质上应用于Mesh并控制Mesh的视觉外观固体——塑料,岩石,木板,铁块...次表面——皮肤,树叶,玉石...透明——玻璃,水基于物理-PBR(PhysicallyBasedRendering......
  • P7073 [CSP-J2020] 表达式
    Problem考察算法:后缀表达式建树,优化。题目简述读入一个后缀表达式,由\(\&,\mid,!\)三种运算和操作数构成。有\(q\)次询问,每次输入一个下标\(i\),表示要取反\(x_i\)的值。每次求表达式的值。暴力每次重新建表达式树,计算。时间复杂度:\(O(q\times|s|)\),达到了惊人的\(10......
  • P7072 [CSP-J2020] 直播获奖
    Problem考查知识点:桶优化。题目简述竞赛的获奖率为\(w\%\),即当前排名前\(w\%\)的选手的最低成绩就是即时的分数线。若当前已评出了\(p\)个选手的成绩,则当前计划获奖人数为\(\max(1,\lfloorp\timesw\%\rfloor)\),如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实......
  • P7074 [CSP-J2020] 方格取数
    Problem相关算法:\(DP\)。题意简述给你一个方格图,每次只能向上、向右、向下走。现在求:经过所有点取到的数字和的最大值。思路动态规划。对于每一列而言,如果某个点向上走了,就不可能再向下走。向下走了同理。所以我们可以把两种情况都尝试一遍,每个点而言,如果是处于向下的状态......