-
C51编程13-中断篇(外部中断)
2021-02-26 12:32:37CPU在执行的过程中,一般来说都是在执行主程序(main函数里面的代码)。... MCS-51 单片机中,有两个外部中断(INT0与INT1),中断有两种方式低电平触发与负跳变(下降沿)触发。 下面通过讲IN...CPU在执行的过程中,一般来说都是在执行主程序(main函数里面的代码)。如果希望处理其他的功能,可以通过查询的方式进行,判断是否需要处理或者通过中断的方式,进入中断服务函数程序里面执行。
前者是在主程序中判断条件是否成立,如果成立则执行其他功能,否则不执行;后者是CPU在执行过程中,判断是否有中断标志位,响应中断进入中断服务函数,执行相关功能。
MCS-51 单片机中,有两个外部中断(INT0与INT1),中断有两种方式低电平触发与负跳变(下降沿)触发。
下面通过讲INT0说明外部中断,INT1同理。
原理图:
P0连接8个LED,INT0引脚连接一个按钮连接到地。
在中断系统中,INT0设计的寄存器中有IE、IP、TCON,在C51规定特殊寄存器的地址为8的倍数均可以位寻址。IE寄存器地址为:0xA8;IP寄存器地址为0xB8;TCON寄存器地址为0x88;因此它们可以被位寻址。
以下是它们的位定义。
/* TCON */ sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0; /* IE */ sbit EA = IE^7; sbit ET2 = IE^5; //8052 only sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; /* IP */ sbit PT2 = IP^5; sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0;
如果需要使用外部中断,需要满足以下条件
1)中断中允许设置(置1)EA = 1;
2)中断源允许设置(置1)Ex0 = 1;
3)中断触发方式设置(置1或置0) IT0 =1 或者 IT0 = 0;
4) 中断服务函数
代码实现
#include "reg52.h" #include "stdio.h" void main(){ IT0 = 1; EA = 1; EX0 = 1; while(1){}; } void irq0(void) interrupt 0 { P0=~P0; }
注:由于IT0 =1;设置中断触发方式为负跳变(下降沿),CPU相应中断后清除中断标志位。而由于IT0 =0;设置中断触发方式为低电平触发,CPU相应中断后不会清除中断标志位。
在上面的中断服务功能中表现,按一下LED灯亮,再按一次LED灯灭;
如果将IT0设置为0,则按下时LED会闪烁。因为中断标志位没有清除,不断进入中断服务函数。
如果需要设置外部中断1,负跳变触发。只需要改上面代码的三条语句即可。
IT0 = 1; ----> IT1 = 1; EX0 = 1; ----> EX1 = 1; void irq0(void) interrupt 0 --> 修改终端号,将0 修改为2; void irq0(void) interrupt 2 ---->函数名irq0,可根据需要修改或不改
---------------------------------------------------------
如果觉得文章还不错,那就扫码关注吧!
-
中断系统
2021-01-19 21:49:11(2)中断知识:对于51单片机来说,有5个中断源,分别是外部中断0、定时器/计数器中断0、外部中断1、定时器/计数器中断1、串行中断。中断优先级也是按照这个顺序来的。 (3)中断原理:要实现触发一个中断,要满足...(1)中断概念:CPU正在执行一个事件,然后响应中断源的请求,进而去执行另外一件事,执行完毕后,返回继续原来的事件,这是一个完整的中断系统。
(2)中断知识:对于51单片机来说,有5个中断源,分别是外部中断0、定时器/计数器中断0、外部中断1、定时器/计数器中断1、串行中断。中断优先级也是按照这个顺序来的。
(3)中断原理:要实现触发一个中断,要满足条件。
1、中断允许寄存器IE中的中断允许位要允许。
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断0允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU中断允许(总允许)位。
2、设置中断触发方式
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位。
3、打开总中断开关
4、中断号要对应
(4)源代码:K3按键控制8个LED灯的熄灭和点亮
#include<reg51.h> #define LED P2 sbit K3=P3^3; typedef unsigned char u8; typedef unsigned int u16; void delay(u16 i)//延时函数 { while(i--); } void Init0Init()//配置中断 { EX0=1;//中断允许位 IT0=1;//下降沿触发 EA=1; } void main() { Init0Init (); while(1); } void Init0() interrupt 0//中断响应 { delay(1000); if(K3==0) { LED=~LED; } }
-
STC89C52的中断
2021-01-31 16:40:57中断分为四个步骤:中断请求->中断响应->中断处理->中断返回 ...这两个外部中断源标识和它们的触发方式控制位由特殊功能寄存器TCON的低4位控制。 内部中断源(3个) T0-定时器/计数器0中断,中断分为四个步骤:中断请求->中断响应->中断处理->中断返回
数据输入输出传送方式:
1.无条件传送 (led)
2.查询传送方式(温度传感器,ADC采样转换)
3.中断传送方式(IRQ)
4.直接储存器存取方式(DMA)5个中断源
外部中断源(2个)
INT0-由P3.2端口引入,低电平或下降沿引起。
INT1-由P3.3端口引入,低电平或下降沿引起。
这两个外部中断源标识和它们的触发方式控制位由特殊功能寄存器TCON的低4位控制。
内部中断源(3个)
T0-定时器/计数器0中断,由T0回零溢出引起。
T1-定时器/计数器0中断,由T1回零溢出引起。
TI/RI-串口IO中断,串行端口完成一帧字符发送或接收后引起。
这3个内部中断源的控制位分别锁存在特殊功能寄存器TCON和SCON中。
1.允许中断
中断允许寄存器IE和XICON(特殊功能寄存器sfr)
EA可位寻址2.配置中断方式
3.编写中断处理函数
中断优先级:外部中断0(入口号0)>T0溢出中断(入口号1)>外部中断1(入口号2)>T1溢出中断(入口号3)>串行口中断(入口号4)
void int1() interrupt 2 关键字interrupt 和入口号
{}
#include <reg52.h> sbit key=P3^3; sbit led=P1^0; void main() { IT1=0; EX1=1; EA=1; while(1) {} } void int1() interrupt 2 { led=~led; }
定时器相关
两个16位定时器/计数器:定时器0(T0为P3.4)和定时器1(T1为P3.5)
这里说的16位是指定时/计数器内部分别有16位的计数寄存器。
当工作在定时模式时,每经过一个机器周期内部的16位计数寄存器的值就会加1,当这个寄存器装满溢出时,我们可以计算出工作在定时模式时的最高单次定时时间为65535*1.085us=时间(单位us)
当工作在计数器模式时,T0(P3.4引脚),T1(P3.5引脚)每来一个脉冲计数寄存器加1。使用步骤
启动定时器/计数器(通过TCON控制器)
设置定时器/计数器工作模式(通过TMOD控制器)
查询定时器/计数器是否溢出(读TCON内TF位)
TMOD 地址:89H 复位值:00H 不可位寻址
#include <reg52.h> sbit time0=P3^4; sbit led=P1^0; int i=0; void main() { EA=1; ET0=1; TR0=1; TMOD=0x01; TH0=(65535-46082)/256; TL0=(65535-46082)%256; while(1) { // if(TF0==1) // { // TF0=0; // TH0=(65535-46082)/256; // TL0=(65535-46082)%256; // i++; // if(i==20) // { // i=0; // led=~led; // } // } } } void timer0() interrupt 1 { TH0=0x4b; TL0=0xfd; i++; if(i==20) { i=0; led=~led; } }
串口中断
串行通信又可分为异步通信和同步通信
异步通信指发送和接收设备使用各自的时钟 ,以字符(构成的帧)为单位进行传输的,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传输的,即字符之间不一定有位间隔的整数倍的关系,但同一字符内的各位之间的距离均为位间隔的整数倍
起始位 +数据 +终止位
同步时钟根据时钟发数据串行通信中常见的错误校验
奇偶检验
代码和校验
循环冗余校验传输速率
比特率是每秒传输二进制代码的位数,单位是位/秒(bps)
如9600bps,每个字节8位( 不带起始位和终止位的),9600/8=1200个字节,波特率位9600时,每秒钟传输1200字节串行接口的结构
串行口工作之前需要对相关寄存器进行配置,设定其工作模式
1.设置T1的工作方式(编程TMOD的寄存器);
2.计算T1的初始值,装载TH1,TL1;
3.启动T1(编程TCON中的TR1位);
4.确定串行口控制(编程SCON寄存器);
5.如需串行口在中断方式工作时,要进行中断设置编程IE寄存器。与串口通信相关的寄存器
(附图)
IE寄存器:EA ES
SCON寄存器:
其中SM0和SM1决定了不同的工作方式。
波特率计算方式
#include <reg52.h> sbit led=P1^0; int num=0; void main() { EA=1; //串口初始化 ES=1; SM0=0;SM1=1; //串口工作方式1,8位uart波特率可变 REN=1; //串口允许接收 //设置定时器产生的波特率 TR1=1; TMOD=0x20; // TH1=0xfd; TL1=0xfd; while(1) { } } void uart() interrupt 4 { if(RI) { num=SBUF; SBUF=num; led=~led; RI=0; } }
-
嵌入式学习笔记5-中断系统
2020-10-19 22:57:15外部中断0是所有中断里面优先级最高的->INT0 单片机优先级 P3.2-P3.7都是和中断有关的I/O口 INT0外部中断0>TO定时计数器0>INT1>T1 中断响应条件 1. 2. 3. 中断请求 中断使能->全局中断=0 外部中断=...理论基础
EX0口导通为1 中断嵌套 外部中断0是所有中断里面优先级最高的->INT0 单片机优先级 P3.2-P3.7都是和中断有关的I/O口 INT0外部中断0>TO定时计数器0>INT1>T1
中断涉及的几个环节
①中断源 (前面提到的甲方) ②中断申请 (甲方发出信号提出申请) ③开放中断 (乙方同意传送) ④保护现场 (安排好当前的工作) ⑤中断服务 (响应乙方的要求) ⑥恢复现场 (完事后,回去……) ⑦中断返回 (继续做打断前的工作)
中断响应条件
1.中断源有中断请求; 2.此中断源的中断允许位为1; 3.CPU开中断(即EA=1)。
以上三条同时满足时,CPU才有可能响应中断。
一次中断过程的完整步骤
中断请求 中断使能->全局中断=0 外部中断=0、 中断响应 中断处理 中断返回
中断优先级的三条原则:
1.CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。 2.正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。 3.正在进行的低优先级中断服务,能被高优先级中断请求所中断。
EA :全局中断使能位(总允许位)。
=0:全局中断禁止; =1:全局中断允许。
中断函数的书写
void functionName()interrupt n { ... }//interrupt表示成中断服务函数,n是中断号,中断号是编译器识别不同中断的唯一编号
中断函数与普通函数的区别
不需要声明 不能传参、 不能直接调用中断函数,它是由硬件触发的
实践部分
下降沿触发
独立按键部分默认先输入0X0F就是高电平,那么按下他就会实现高电平到低电平的下降沿从而触发中断
低电平触发
当按下独立按键的时候电平高转低,不松手的时候一直处于低电平,那么中断函数内的P2就会一直翻转, 而由于反转速度过快,人眼无法识别,所以呈现的是全亮状态。
外部中断
INT0 INT1
/********************************************************************************* *实验名 :外部中断实验(低电平触发) *实验效果 :按住学习板上第三排任意按键 LED灯8位全亮 松开按键后 随机上4个或下4个灯亮 * *********************************************************************************/ #include<reg52.h> //按下独立按键的时候电平高转低,不松手的时候一直处于低电平,那么中断函数内的P2就会一直翻转, 而由于反转速度过快,人眼无法识别,所以呈现的是全亮状态。 void main() { P1=0X0F;//0000 1111 前四个灯灭 后四个灯亮 P3=0X0F;//独立按键部分默认先输入0X0F就是高电平,那么按下他就会实现高电平到低电平的下降沿从而触发中断 EA=1;//全局中断打开 EX0=1;//INT0中断开启 IT0=0;//低电平触发 while(1) { ; } } void ISR_KEY()interrupt 0 //中断服务函数 { P1=~P1; }
/********************************************************************************* *实验名 :外部中断实验(下降沿触发) *实验效果 :按下学习板上第三排任意按键,LED灯前后四位状态调换 * *********************************************************************************/ #include<reg52.h> //按一次就跳变,也就是说开始前四个灯不亮后四个亮,按下之后就反过来 void main() { P1=0X0F;//0000 1111 前四个灯灭 后四个灯亮 P3=0X0F; EA=1;//全局中断打开 EX0=1;//INT0中断允许 IT0=1;//触发方式为下降沿触发 while(1) { ; } } void ISR_KEY()interrupt 0 { P1=~P1; }
EX0(IE.0),外部中断0允许位; ET0(IE.1),定时/计数器T0中断允许位; EX1(IE.2),外部中断0允许位; ET1(IE.3),定时/计数器T1中断允许位; ES(IE.4),串行口中断允许位; EA (IE.7), CPU中断允许(总允许)位。
-
单片机中断总结
2016-06-26 11:09:12中断响应条件 1.中断源有中断请求(T0,T1) 2.T0,T1中断的中断允许位为1 3.CPU开中断 (EA=1) 以上的三个条件同时满足...EX0(IE.0),外部中断0允许位; ET0(IE.1),定时/计数器T0中断允许位; EX1(IE.2),外部 -
关于可屏蔽中断与不可屏蔽中断。
2014-05-07 19:10:38可屏蔽中断和不可屏蔽中断都属于外部中断,是由外部中断源引起的;但它们也有区别:可屏蔽中断是通过CPU的INTR引脚引入,当中断标志IF=1时允许中断,当IF=0时禁止中断,不可屏蔽中断是由NMI引脚引入,不受IF标志的... -
单片机中使用的标记变量法的架构怎么改进_单片机课程形考作业指导3
2021-02-11 20:57:55第五章中断系统第六章定时器及应用一、判断下列说法的正误,并说明原因:1、中断允许寄存器IE的最高位(EA)为1是89C51系统响应中断的重要条件。...√5、89C51单片机中,外部中断源的优先级比内部中断源... -
基于AT89S52 单片的频率计
2010-01-04 08:47:37晶振两边的电容:晶振的标称值在测试时有一个“负载电容”的条件,在工 作时满足这个条件,振荡频率才与标称值一致。一般来讲,有低负载电容(串 联谐振晶体),高负载电容(并联谐振晶体)之分。在电路上的特征为:... -
都是想要的考试题 速度下载
2010-05-24 10:11:059. 8086/8088在当前指令执行完且IF=1的情况下可以响应一个外部INTR中断请求。( ) 10. 8086被复位后,寄存器Flag、IP、CS的内容分别是0000 、0001 、FFFFH。 ( ) 四、汇编程序(共20分) 1. 试分析下面的程序段完成... -
微机课后题目答案 答案
2011-04-20 10:33:43答:80386把中断分为外部中断和内部中断两大类,外部中断经NMI和INTR引线输入请求信号。内部中断也叫内部异常中断,分为陷阱中断、内部故障异常中断、异常终止中断。 32.80386在保护方式下中断描述符表与8086的中断... -
你必须知道的495个C语言问题
2015-10-16 14:14:285.19 如何访问位于机器地址0处的中断向量?如果我将指针值设为0,编译器可能会自动将它转换为非零的空指针内部表示。 5.20运行时的“nullpointerassignment”错误是什么意思?应该怎样捕捉它? 第6章 数组和指针 ... -
《你必须知道的495个C语言问题》
2010-03-20 16:41:183.18 需要根据条件把一个复杂的表达式赋给两个变量中的一个。可以用下面这样的代码吗?((condition) ? a : b)= complicated_expression; 41 3.19 我有些代码包含这样的表达式。a ? b=c : d 有些编译器可以接受... -
你必须知道的495个C语言问题(高清版)
2010-03-31 16:24:095.19 如何访问位于机器地址0处的中断向量?如果我将指针值设为0,编译器可能会自动将它转换为非零的空指针内部表示。 62 5.20 运行时的“null pointer assignment”错误是什么意思?应该怎样捕捉它? 62 第6章... -
单片机原理及接口技术真题
2013-04-19 11:33:3413、MCS-51的中断允许寄存器内容为8AH,CPU可以响应的中断请求是( )。 A、T1 B、T0,T1 C、T1,串行接口 D、T0 14、指令AJMP的跳转范围是( )。 A、64KB B、2KB C、256B D、128B 15、下列指令中正确的是( )... -
新编MCS-51单片机应用设计(清晰最新版)
2010-12-07 14:44:504.6 外部中断的响应时间 4.7 外部中断的触发方式选择 4.7.1 电平触发方式 4.7.2跳沿触发方式 4.8 中断·清求的撤消 4.9 中断服务程序的设计 4.10 多外部中断源系统设计 4.10.1 定时器/计数器作为外部中断源的使用... -
单片机期末考试题目及答案详解
2009-06-23 10:30:30中断查询确认后,在下列各种单片机运行情况中,能立即进行响应的是 A.当前指令是ORL A,Rn指令 B.当前正在执行RETI指令 C.当前指令是MUL指令,且正处于取指令机器周期 D.当前正在进行1优先级中断处理 下列... -
8086/8088汇编语言程序设计教程
2008-10-22 22:52:545.3.4 外部中断 5.3.5 内部中断 5.3.6 中断优先级和中断嵌套 5.3.7 中断处理程序的设计 5.4 基本输入输出系统BIOS 5.4.1 基本输入输出系统BIOS概述 5.4.2 键盘输入 5.4.3 显示输出 5.4.4 打印输出 5.5 软中断处理... -
计算机组成原理测试题
2011-08-05 22:53:2310.外部设备提出中断请示的条件是 。 A.一个CPU周期结束 B. 外设工作完成和系统允许 C. CPU开放中断系统 D. 总线空闲 11.在3种集中式总线控制中,_______方式响应时间最快,_______方式对电路故障最敏感。 A.链式... -
c语言编写单片机技巧
2009-04-19 12:15:17STANDBY电流测试:测量IC处于HALT模式时即每一个接点(PAD)在1态0态或Z态保持不变时的漏电流是否符合最低之规格。 耗电测试:整颗IC的静态耗电与动态耗电。 输入电压测试:测量每个输入接脚... -
软件工程教程
2012-07-06 23:10:29删除操作一旦执行,立即被监听器捕获到,进而在执行 删除操作前执行自定义的函数体,即判断实体有无undeletable标签,有则中断删除操作,无则正常删除。 用例图 关系 关联关系 ;依赖关系 ;泛化关系;关系的... -
《计算机操作系统》期末复习指导
2009-12-30 10:57:55三个基本状态是等待、执行和就绪,在一定的条件下,进程的状态将发生转换。 (2)进程调度算法 主要有先来先服务(FCFS)、时间片轮转法、多级反馈轮转法、优先数法。 (3)进程控制块(PCB)是进程... -
51单片机C语言编程基础及实例
2011-04-19 21:50:45代码 #include //该头文档中有单片机内部资源的符号化定义,其中包含 P2 和 P3 该头文档中有单片机内部资源的符号化定义, 该头文档中有单片机内部资源的符号化定义 void main( void ) { P3 = 0xff; While( 1 ) { /... -
STM32F10xxx参考手册
2012-10-17 11:38:408.4.5 外部中断配置寄存器3(AFIO_EXTICR3) 127 8.4.6 外部中断配置寄存器4(AFIO_EXTICR4) 128 8.5 GPIO 和AFIO寄存器地址映象 129 9 中断和事件 130 9.1 嵌套向量中断控制器 130 9.1.1 系统嘀嗒(SysTick)校准值... -
《手把手教你学MCS51单片机》.rar 源程序 383.31 KB
2009-08-11 23:33:46《手把手教你学MCS51单片机》源码 的配套书的目录 第1章 实验设备及器材使用介绍 1.1 单片机的发展史及特点1 1.2 单片机入门的有效途径2 ...20.5.3 外部中断INT0291 20.5.4 定时器/计数器0292 附件 -
cmd操作命令和linux命令大全收集
2012-04-24 11:58:23move 盘符路径要移动的文件名 存放移动文件的路径移动后文件名 移动文件,用参数/y将取消确认移动目录存在相同文件的提示就直接覆盖 fc one.txt two.txt > 3st.txt 对比二个文件并把不同之处输出到3st.txt文件中... -
易语言程序免安装版下载
2011-04-07 09:28:50修改外部数据库在4.12版中导致的不兼容问题,并增加了对MS SQL Server数据库中image和text字段类型的说明。 7. 修改扩展界面支持库一,禁止透明标签在父窗口刷新时自动刷新,以解决其导致窗口刷新缓冲的问题。 8....
-
CSS文本样式
-
投标方法论
-
rabbitmq-server-3.6.8-1.el7.noarch.rpm
-
linux学习之用户与用户组(6)
-
提高程序员的核心竞争能力!2021年阿里,美团实战面经分享,助你吊打面试官!
-
STC15W204S单片机+TPA3110D2 D类音频功率放大器ALTIUM设计硬件原理图+PCB+封装库+BOM表文件.zip
-
关于Github登录不上去解决办法(win10、ubuntu各个版本)
-
FFmpeg4.3系列之16:WebRTC之小白入门与视频聊天的实战
-
2021-03-04
-
H5区块链理财学习版源码.zip
-
linux学习之压缩与打包(5)
-
Android 使用OPENCV实现图像实时对比
-
MySQL 触发器
-
cc2530模块底板电路图
-
面试笔记
-
MMM 集群部署实现 MySQL 高可用和读写分离
-
linux学习之磁盘管理(4)
-
MySQL 事务和锁
-
C语言零基础入门(详细讲解)
-
墨门博客写作日记