单片机 中断系统详细教程
中断服务函数分析
定时器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的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断