当前位置:文档之家› 单片机 中断系统详细教程

单片机 中断系统详细教程


中断服务函数分析
定时器0的中断服务函数 0xFFFF 0x2B
void time0ISR(void) interrupt 1 { tnOsTimeTick(); }
中断入口处汇编代码 0x000B 0x000E 0x000F 0x0010 0x0011 0x0012 …… LJMP time0ISR NOP NOP NOP NOP NOP …… time0ISR: 0x015D PUSH 0x20 …… 中断响应
外部中断0
0 1 1
同优先级 无 或更高优 中断处理 先级中断 处理中 中
外部中断1
0 1 1 1
1
0
0
1
0
1
0
0
1
0
0
由软件清0
中断响应
中断得到响应的条件
中断响应与返回过程
主程序 中断程序
堆栈空间
执行PUSH 执行POP 指令出栈 指令入栈
ISR()
PSW R0~R7 DPH DPL B ACC PCH PCL
中断嵌套处理机制:
高优先级中断抢先处理,处理完后 继续处理被抢占的低优先级中断
中断源
低优先级 高优先级
主 程 序
UART中 断服务
低优先级中 断被抢占
INT0 T0 INT1 中断请 求有效 UART T1
中断嵌套
T0中断 服务
继续处理被 抢占的中断


中断概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
C语言代码 char GcA = 2; // 地址为0x5A char GcB = 1; // 地址为0x5B main () { while (1) { GcA = GcA + GcB; if (GcA == GcB) { GcA = 1; } } } void ISR() interrupt 1 { GcA = 1; }
工作和状态寄存器 指针寄存器DPTR 累加器A、B 中断返回地址
执行RETI出栈 CPU自动处理入栈
中断响应过程
C51编程中由 编译器处理出 入栈的操作
中断函数的定义
void ISRname(void) interrupt n [ using m ] 函数类型 ISRname ——无参数,无返回值 ——中断服务函数名称,由用户定义
中断相关寄存器
1
0
0
1
0
1
0
0
1
0
0
相应位写1使能
相应位写1置为高优先级


中断概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
中断向量
中断向量——
CPU响应中断时跳转到一个特定的地址开始 执行中断服务程序,这个地址就是中断向量
0xFFFF
......
5个中断源均有 独立的中断向量
中断标志的产生
若配置为下降沿触发
P3.2

0xFFFE 0xFFFF 0x0000
P3.2引脚出现下降沿时IE0被置1 定时器0计数溢出是TF0被置1 若配置为低电平触发
1
P3.3
1
0xFFFE 0xFFFF 0x0000
P3.3引脚出现下降沿时IE1被置1 定时器1计数溢出是TF0被置1
接收完一个字符RI被置1 发送完一个字符TI被置1
此时发 生中断
对应的汇编代码 C:0x0109 C:0x010B C:0x010D C:0x010F C:0x0112 C:0x0015 …… MOV A, 0x5B ADD A, 0x5A MOV 0x5A, A CJNE A,0x5B,C:0x0109 MOV 0x5B,#0x01 SJMP C:0x0109
紧急处理
回忆会议进度
中断响应
现场保护 保存返回地址 和状态信息
中断服务
现场恢复 恢复暂停 前的环境
中断相关基础知识
调用程序与响应中断服务函数
中断请求 中断请求 子函数2 子函数3
主函数 程序段1
假象: CPU同时执 行多任务
子函数1
主函数 程序段3
……
中断服务 函数
中断服务 函数
事实: CPU不能同时执 行1条以上的指令
本章将学习的部件
定时器0 看门狗定时器
本章内容简介
2 . 1 中断系统
CPU事件响应机制
2 . 2 定时/计数器
2 . 3 看门狗 2 . 4 I2C总线及其驱动程序 2 . 5 串行口及其驱动程序
外设功能部件
2.1 中断系统


中断相关概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
此时发 生中断
对应的汇编代码 MOV A, 0x5B ADD A, 0x5A MOV 0x5A, A MOV A, 0x5A CJNE A,0x5B,C:0x0109 MOV 0x5B,#0x05 SJMP C:0x0109
1 GcA = 3 2
GcB = 1 5
变量值
原子操作
原 子 —— 在化学里面指的是不可分割, 在计算机里面指的是不可中断
中断编号 n 中断源
interrupt n —— n是中断编号,指示中断向量 [ using m ] —— 可选部分,用于选择工作寄存器组
定时器0的中断服务函数
void time0ISR(void) interrupt 1 { tnOsTimeTick(); }
0 1 2 3 4
INT0
T0
INT1 T1 UART
原子操作 —— 不可被中断的操作
对应的汇编指令 data char flags = 0; void main(void) { …… flags |= 0x80; …… } xdata char flags = 0; void main(void) { …… flags |= 0x80; …… } MOV DPTR, #0x0000 MOVX A, @DPTR ORL A, 0x80 MOVX @DPTR, A 中断可以发 生在访问变 量的过程中
本章导读
下一阶段将要学习“模电”和“数电”, 重在分析电路原理、器件内部结构和应用设计理论
现阶段重在学习使用基本数字器件
E2PROM存储器
温度传感器
TTL-RS232电平转换器
……
本章中用到
P89V51RB2功能框图
上一章的数码管和键盘程序只用到P0~P2 I/O 口 高性能80C51 CPU
16KB程序Flash 1KB数据RAM
有保护地使用全局资源(如全局变量) 不调用不可重入函数 以原子型的方式使用硬件
不可重入函数
temp int temp; void fun(int *x, *y) { if (*x < *y) { temp = *x; // 交换*x和*y的值 *x = *y; *y = temp; } }
void some_isr(void) interupt 2 { int c = 4, d = 5; fun(&c,&d); ………… } void main(void) { int a = 1, b = 2; fun(&a,&b); …… }
对应的汇编指令
ORL 0x5B, 0x80
堆栈溢出
发生函数调用、分配局部变量和响应中断时
——将会使用堆栈空间
要使用堆栈的空间
>
可用的堆栈空间
——发生堆栈溢出
堆栈指针超 出堆栈空间
发生堆栈溢出的情况
0xFF SP 0xC0 0xBF
堆栈空间
0x7F
......
0x01 0x00
数据存储器
可重入性
一般来说具有如下特性的函数满足可重入性
PC跳转方式
调用子函数 响应中断 服务函数
不同点
相同点
都是暂停当前 程序转去执行 其他的程序


中断概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
80C51中断结构示意图
中断仲裁
中断编号 中断源
0 1 2 3 4
INT0 T0 INT1 T1 UART
假设中断优先级如下: 中断源 INT0、INT1高优先级 低优先级 、UART 为低优先级; IT0、T1为高优先级 INT0 T0 INT1 T1 UART 中断请 求有效
判断不 正确
A= 0 1 3
1 GcA = 2 3
GcB = 1
变量值
volatile的作用
C语言代码 volatile char GcA = 2; C:0x0109 char GcB = 1; C:0x010B main () C:0x010D { C:0x010F while (1) { C:0x0111 GcA = GcA + GcB; C:0x0114 if (GcA == GcB) { C:0x0017 GcB = 5; …… } 判断 } 正确 } A= 0 1 3 void ISR() interrupt 1 { GcA = 1; } volatile的作用: 每次使用变量时都重新读取变量 的值而不是使用寄存器的备份值
UART T1 INT1 T0 INT0 复位后PC指向的地址 0x2B 0x23 0x1B 0x13 0x0B 0x03 0x00 8字节空间
程序存储器
中断向量表
中断编号
中断源
中断标志
中断向量
中断使能
中断优先级
仲裁顺序
掉电唤醒


中断概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
相关主题