480 likes | 615 Vues
知识点:. 中断级别. 中断源. 中断响应. 中断控制. 先通过一个生活常识,启发对中断的认识: 当你正在家里上网聊天时,电话铃响了 ,你会暂时停止聊天而去接电话, 正在接电话的时候有人按门铃 ,你不得不放下电话去开门,然后继续接电话,电话接完后再回到网上继续聊天。 这里的网上聊天是 当前任务 电话铃响和门铃响都属于 中断源 先处理门铃还是电话铃是 中断级别 接电话和开门是 中断响应 对于这三件事的孰缓孰急的判断为 中断控制。. 计算机中的中断概念.
E N D
知识点: 中断级别 中断源 中断响应 中断控制
先通过一个生活常识,启发对中断的认识: 当你正在家里上网聊天时,电话铃响了,你会暂时停止聊天而去接电话,正在接电话的时候有人按门铃,你不得不放下电话去开门,然后继续接电话,电话接完后再回到网上继续聊天。 这里的网上聊天是当前任务 电话铃响和门铃响都属于中断源 先处理门铃还是电话铃是中断级别 接电话和开门是中断响应 对于这三件事的孰缓孰急的判断为中断控制。
计算机中的中断概念 • 中断是指由于某种随机事件的发生,计算机暂停现行程序的运行,转去执行另一程序,以处理发生的事件,处理完毕后又自动返回原来的程序继续运行。 • CPU现行运行的程序称为主程序。 • 处理随机事件的程序称为中断服务子程序。 返回
为什么要用中断 计算机有了中断功能后,就可以使CPU和外设同 步工作,CPU启动外设工作后,就继续执行主程序。 外设把数据准备好后,发出中断请求,请求CPU中断原程序的执行,转去执行输入/输出(中断处理),中断程序执行完后,CPU恢复执行主程序,外设也继续工作,这样,CPU就可指挥多个外设同时工作,大大提高了CPU的利用率,也提高了输入/输出速度。 在实时控制中,现场采集到的各种数据可 在任一时刻发出中断请求,要求CPU处理,若 中断是开放的,则CPU就可以马上对数据进行 处理。 若计算机在运行过程中出现了事先预料不到的情况或故障时(如掉电、存储出错、溢出等), 可以利用中断系统自行处理,而不必停机。 在CPU与外设交换信息时,若用查询的方式,则CPU会浪费较多的时间去等待外设,使CPU的工作效率较低,这就是快速的CPU和慢速的外设之间的矛盾,为了解决这个问题,引入了中断的概念,引入中断后有以下优点: 1.同步工作 2.实时处理 3.故障处理
中断源 引起中断的原因,或能发出中断申请的来源,称为中断源。 通常的中断源有以下几种 ①外部输入/输出设备,如键盘、打印机等。 ②数据通信设备,如双机或多机通信。 ③定时时钟。 ④故障源,如掉电保护请求等。 ⑤为调试程序而设置的中断源。
当CPU响应某一中断源的请求在进行中断处理时,若有优先级别更高的中断源发出中断请求,则CPU应能中断正在执行的中断服务程序,保留这个程序的断点和现场,响应高级中断,在高级中断处理完后,再继续执行被中断的中断服务程序。若当发出新的中断请求的中断源的优先级别与正在处理的中断源同级或更低时,CPU不响应这个中断请求,直到正在处理的中断服务程序执行完后,才去处理新的中断请求。 中断系统的功能 ①、当某一个中断源发出中断请求时,CPU应决定是否响应这个中断请求(当CPU正在执行更重要的工作时,可暂不响应中断)。 ②、若响应这个中断请求,CPU必须在现行的指令执行完后,保护现场和断点,然后转到需要处理的中断源的服务程序入口,执行中断服务程序。 ③、当中断处理完后再恢复现场和断点,使CPU返回去继续执行主程序。 通常,在系统中有多个中断源,有时会出现两个或两个以上的中断源同时提出中断请求的情况,这时,CPU应能找到优先级别最高的中断源,响应它的中断请求,在优先级别最高的中断源处理完后,再响应级别较低的中断源。 1.实现中断并返回 2.能实现优先权排队 3.高级中断源能中断低级中断源的中断处理
8051中断系统组成 中断源 中断标志 中断允许 中断优先级 8051中断系统结构 中断寄存器
8051的中断系统之中断源 • 外部输入中断源INT0(P3.2) 或 或 T0 T1 串行口 • 外部输入中断源INT1(P3.3) INT1 INT0 • 片内串行口发送或接收中断源 • 片内定时器T1的溢出 • 片内定时器T0的溢出 8051单片机有5个中断请求源: 单片机
8051的中断系统之中断标志 TI RI 中断源 中断标志位 IE0 INT0 TF0 T0 IE1 INT1 TF1 T1 串口 • 每一个中断源都有相应的中断标志位 • 某一个中断源申请中断,相应中断标志位置1
8051的中断系统之中断允许 TI RI 中断源 中断标志位 中断允许 IE0 INT0 EX0 TF0 ET0 T0 IE1 INT1 EX1 TF1 T1 ET1 串口 ES EA • EA——总中断允许位,EA=1开放所有中断,EA=0,禁止所有中断; • 某一个中断源还有相应的中断允许位,1允许相应中断源的中断,0禁止相应中断源的中断。
8051的中断系统之中断优先级 高 TI SI 低 自然优先级 中断源 中断标志位 中断允许 优先控制 IE0 INT0 PX0 EX0 TF0 PT0 ET0 T0 IE1 PX1 INT1 EX1 TF1 T1 PT1 ET1 串口 PS ES EA • 单片机中有两个中断优先级,即高优先级中断和低优先级中断,前者优先权高于后者(在程序中设置,相应位=1,为高优先级); • 同一优先级别的中断源按照自然优先级顺序确定优先级别(硬件形成,无法改变)。
8051的中断系统之寄存器 TF1 7 6 5 TF0 4 3 IE1 2 IT1 1 IE0 0 IT0 TCON寄存器——T0和T1控制寄存器 TCON T1溢出中断标志(TCON.7): T1启动计数后,计满溢出由硬件置位TF1=1,向CPU请求中断,此标志一直保持到CPU响应中断后,才由硬件自动清0。也可用软件查询该标志,并由软件清0。
TF1 7 6 5 TF0 4 3 IE1 2 IT1 1 IE0 0 IT0 TCON 88H • 外部中断INT1触发方式控制位(TCON.2): • IT1=0,电平触发方式 • IT1=1, 下降沿触发方式 外部中断INT1中断标志位(TCON.3) : IE1=1,外部中断1向CPU申请中断 • 注意:该寄存器可以位寻址
SCON寄存器——串行口控制寄存器 7 6 5 4 3 2 1 TI 0 RI SCON 98H • TI (SCON.1)——串行发送中断标志。 • RI (SCON.0)——串行接收中断标志。 • 注意:该寄存器可以位寻址 返回
IE寄存器——中断允许寄存器 EA 7 6 5 4 ES 3 ET1 2 EX1 1 ET0 0 EX0 IE A8H 例:允许定时器T0中断: SETB EA SETB ET0 或 MOV IE,#82H • 注意:该寄存器可以位寻址
IP寄存器——中断优先级寄存器 7 6 5 4 PS 3 PT1 2 PX1 1 PT0 0 PX0 IP B8H • 51单片机有两个中断优先级——高级和低级 • 专用寄存器IP为中断优先级寄存器,用户可用软件设定 • 相应位为1,对应的中断源被设置为高优先级,相应位为0,对应的中断源被设置为低优先级 • 系统复位时,均为低优先级 • 该寄存器可以位寻址
中断处理过程 中 应 断 响 断 返 回 中 • 中断处理过程分为三个阶段:中断响应、中断处理和中断返回。 • 中断响应 • 中断处理(又称中断服务) • 中断返回 • 中断请求的撤除
中断响应(以外部中断0为例) 应 响 断 中 中断服务子程序的入口地址 ORG 0003H AJMP ZD0 • 中断响应:在满足CPU的中断响应条件之后,CPU对中断源的中断请求予以处理。 • 中断响应过程: • 保护断点地址; ZD0 • 把程序转向中断服务程序的入口地址(通常称矢量地址)。 断点地址 • 特别注意:这些工作是硬件自动完成的!
中断入口地址(矢量地址): 使用时,通常在这些入口地址处存放一条跳转指令,使程序跳转到用户安排的中断服务程序起始地址上去! 程序存储器ROM 0023H:串行口中断入口 001BH:定时器1溢出中断入口 0013H:外部中断1入口 000BH:定时器0溢出中断入口 0003H:外部中断0入口 0000H:复位后,程序入口地址(PC=0000H)
程序存储器ROM 002AH AJMP SEIR 0023H:串行口中断入口 AJMP NT0 001BH:定时器1溢出中断入口 AJMP WINT1 0013H:外部中断1入口 AJMP NT0 000BH:定时器0溢出中断入口 AJMP WINT0 0003H:外部中断0入口 AJMP MAIN 0000H:复位后,程序的入口地址(PC=0000H)
中断响应时间 CPU不是在任何情况下都对中断请求立即响应,不同的情况对中断响应的时间也不同。 例如:外部中断请求信号的电平在每个机器周期的S5P2期间,经反相后锁存到IE0或IE1标志位,CPU在下一个机器周期才会查询到这些值,这时如果满足响应条件,CPU响应中断时,需执行一条两个机器周期的调用指令,以转到相应的中断服务程序入口。 这样,从外部中断请求有效到开始执行中断服务程序的第一条指令,至少需要3个机器周期。
如果在申请中断时,CPU正在处理最长指令(如乘、除法指令),则额外等待时间增加3个机器周期;若正在执行RETI或访问IE、IP指令,则额外等待时间又增加2个机器周期。如果在申请中断时,CPU正在处理最长指令(如乘、除法指令),则额外等待时间增加3个机器周期;若正在执行RETI或访问IE、IP指令,则额外等待时间又增加2个机器周期。 这样,若系统中只有一个中断源,则响应时间为3~8个机器周期。 如果系统中有多个中断源并且同时请求中断时,则最低级的中断的响应时间会更长。
子程序SUB RETI 思考题 主要解决快速的CPU和慢速的外设之间的矛盾,以提高CPU的工作效率。 主程序MAIN LCALL SUB 0003H、000BH、0013H、001BH、0023H 1、中断究竟要解决什么问题? 2、就你的理解,用图示方法描述主程序与中断服务程序之间的关系。 3、熟记5个中断入口地址。
中断应用举例 1、利用定时器作外部中断源。 MCS-51单片机有两个定时器/计数器,当它们选择计数工作方式时,T0或T1引脚上的负跳变将使T0或T1计数器加1计数,故若把定时器/计数器设置成计数工作方式,计数初始设定为满量程,一旦外部从计数引脚输入一个负跳变信号,计数器T0或T1加1产生溢出中断,这样,便可把外部计数输入端T0(P3.4)或T1(P3.5)扩充作为外部中断源输入。
TMOD=60H 例如:将T1设置为工作方式2(自动恢复常数)及外部计数方式,计数器THl、TLl初值设置为FFH,当计数输入端T1(P3.5)发生一次负跳变,计数器加1并产生溢出标志,向CPU申请中断,中断处理程序使累加器A内容加1,送P1口输出,然后返回主程序。
为了让T1 的输入端(P3.5)输入1个脉冲,T1发出中断请求,计数初值应设置成FFH,即TL1=FFH。 设置初值的方法是:MOV TL1,#0FFH • 由于T1的工作方式为方式2,TL1计数满后TH1的值是自动装入TL1,所以TH1也应设置成FFH,即TH1=FFH。 设置初值的方法是:MOV TH1,#0FFH • 启动T1计数的方法是SETB TRl • 允许T1中断的方法是SETB ET1 • CPU 开中断的方法是SETB EA
编程如下: ORG 0000H ;用户程序首址 AJMP MAIN ;转主程序 ORG 001BH AJMP INT ;转中断服务程序 ORG 1FF2H MAIN: MOV SP,#53H ;堆栈指针赋初值 MOV TMOD,#60H ;T1方式2,计数 MOV T L1,#0FFH ;送常数 MOV TH1,#0FFH SETB TRl ;启动T1计数 SETB ET1 ;允许T1中断 SETB EA ;CPU开中断 LOOP: SJMP LOOP ;等待 ORG 3000H INT: INC A ;T1中断处理程序 MOV P1,A RETI ;中断返回
由P1.0端输出周期性的方波信号 • 方波周期由T0的定时时间确定。 P1.0端为“1”的时间为1ms, P1.0端为“0”的时间为1ms,由此组成方波。只要T0的定时时间确定为1ms,每当定时时间到, 对P1.0求反就能实现。 • 计数初值的确定:已知晶振频率为6MHz,则机器周期=2μs,那么计数值=500 2、利用定时器T0定时,在P1.0端输出周期性的方波信号,方波周期为2ms,已知晶振频率为6MHz。
我们知道:方式0的最大计数值8192,方式1的最大计数值65536我们知道:方式0的最大计数值8192,方式1的最大计数值65536 方式2的最大计数值256,我们选择方式1。 定时初值=65536-500=65036=FE0CH 编程如下: ORG 0000H AJMP MAIN ;转主程序 ORG 000BH ;T0中断入口地址 MOV TL0,#0CH ;重赋初值 MOV TH0,#0FEH CPL P1.0 ;输出取反 RETI;中断返回 MAIN:MOV TMOD,#01H ;T0初始化 MOV TL0,#0CH ;赋初值 MOV TH0,#0FEH MOV IE,#82H ;CPU开中断,T0开中断 SETB TR0 ;启动计数 HERE:SJMP HERE
当系统无故障时,4个故障源输入端X1~X4全为低电平,显示灯全灭,当某部分出现故障,其对应的输入由低电平变为高电平,从而引起MCS-51单片机中断,中断程序的任务是判定故障源,并用对应的发光二极管LED1~LED4进行显示。当系统无故障时,4个故障源输入端X1~X4全为低电平,显示灯全灭,当某部分出现故障,其对应的输入由低电平变为高电平,从而引起MCS-51单片机中断,中断程序的任务是判定故障源,并用对应的发光二极管LED1~LED4进行显示。 1 0 0 3、多个故障显示报警
编程如下: ORG 0000H AJMP MAIN ORG 0003H AJMP SERVE ;外部中断0服务程序 MAIN: ORL P1,#0FFH ;灯全灭,准备读入 SETB IT0 ;选择边沿方式 SETB EX0 ;允许INT0中断 SETB EA ;CPU开中断 AJMP $ ;等待中断
SERVE:JNB P1.3,Ll CLR P1.4 ;若X1有故障,LEDl亮 L1: JNB P1.2,L2 CLR P1.5 ;若X2有故障, LED2亮 L2: JNB P1.1,L3 CLR P1.6 ;若X3有故障 ,LED3亮 L3: JNB P1.0 L4 CLR P1.7 ;若X4有故障, LED4亮 L4: RETI
思考题 程序清单: ORG 0000H AJMP MAIN ORG 000BH CPL P0.0 RETI MAIN:MOV SP, #70H MOV TH0,#0FBH MOV TL0,#0FBH MOV TMOD,#06H SETB TR0 SJMP $ END 作业:P114 第1、3、4、5题 1、将T0设置成计数方式,当外部每输入5个脉冲后将P0.0求反,使P0.0输出序列脉冲。请编制程序完成这一功能。
作业课 直至上节课,我们已经将单片机的内部资源全部介绍完毕,现在我们该停下来回顾一下前面所学过的内容。 为了检验同学们的学习情况,将针对每章的内容,请同学们在课堂完成如下的作业,我再根据大家的实际情况,该补什么就补什么内容,以利于下阶段的学习。 希望同学们独立完成,反应真实情况。
根据作业情况反应的情况,编程是难点,这里给同学们重点讲解几道编程题。由于时间比较短,这里没有画流程图,希望同学们在理解的基础上按照程序走向画出流程图,以利于对程序的前后呼应的观察。根据作业情况反应的情况,编程是难点,这里给同学们重点讲解几道编程题。由于时间比较短,这里没有画流程图,希望同学们在理解的基础上按照程序走向画出流程图,以利于对程序的前后呼应的观察。
1.位地址7CH与字节地址7CH有什么区别?位地址7CH具体在内存中什么位置?1.位地址7CH与字节地址7CH有什么区别?位地址7CH具体在内存中什么位置? 解:位地址7CH是指第7C位、字节地址7CH是指第7CH字节。位地址7CH的具体位置是第2F字节中的D4位
2.在MCS-51扩展系统中,片外程序存储器和片外数据存储器共处同一个地址空间,为什么不会发生总线冲突?2.在MCS-51扩展系统中,片外程序存储器和片外数据存储器共处同一个地址空间,为什么不会发生总线冲突? 解:MCS-51通过不同的信号线来选通ROM或者RAM,如果从外部ROM取指令则采用 /SPEN 选通信号,如果从外部RAM读写数据,则采用读/RD 或者写 /WR 信号来选通。因此虽然地址相同,但不会出现读写数据与读程序指令混乱的情况。 这是因为: /SPEN是程序存储器的选通信号,而 /RD、/WR是数据存储器的选通信号 读程序存储器指令: MOVC A,@A+DPTR MOVC A,@A+PC 能让 /SPEN变成有效电平,而让/RD、/WR变成无效电平 读数据存储器指令: MOVX A,@DPTR MOVX A,@R0 能让 /SPEN变成无效电平,而让/RD、/WR变成有效电平
3.设5AH单元中有一变量X,请编写计算函数式的程序,结果存入5BH单元:3.设5AH单元中有一变量X,请编写计算函数式的程序,结果存入5BH单元: X※X-1 X<10 Y= X※X+8 15≥X≥10 41 X>15 解: ORG 0100H MOV A,5AH;将变量X送A CJNE A,#10,LOOP1;若X≠10,程序转去LOOP0处执行 LOOP: MOV B,A;若X=10,X※X+8 MUL AB ADD A,#8 LOOP0: MOV 5BH,A;结果存入5BH单元 SJMP LOOP0;程序结束 LOOP1: JNC LOOP2;若X>10,程序转去LOOP2处执行 MOV B,A;若X<10,X※X-1 MUL AB DEC A SJMP LOOP0;程序转去将结果存入5BH单元 LOOP2: CJNE A,#15,LOOP3;若X>10且X ≠ 15,程序转去LOOP3处执行 SJMP LOOP;若X=15,程序转去LOOP处执行 LOOP3:JC LOOP;若X<15,程序转去LOOP处执行 MOV A,#41H;若X>15,A=41H SJMP LOOP0 END
4.设晶振频率为6MHz,试用T0作为外部计数器,试编程实现每当计到1 000个脉冲,使T1开始2ms定时,定时时间到后,T0又开始计数,这样反复循环下去。 解:分析 T0计数、方式1、初值=65536-1000=64536=FC18H T1定时、方式1、初值=65536- 2ms /2μS=64536=FC18H T0和T1停止交替工作 TMOD=15H 程序: ORG 0000H MOV TMOD,#15H;设置工作方式 MOV TL0,#18H;为T0赋初值 MOV TH0,#0FCH MOV TL1,#18H;为T1赋初值 MOV TH1,#0FCH SETB TR0;启动T0计数
L1:JNB TF0,L1;等待T0计数到 CLR TR0;停止T0计数 MOV TL0,#18H;恢复T0计数初值,为下轮作准备 MOV TH0,#0FCH CLR TF0;清除T0溢出标准 SETB TR1;启动T1定时 L2:JNB TF1,L2;等待T1定时到 CLR TR1;停止T1定时 MOV TL1,#18H;恢复T1定时初值,为下轮作准备 MOV TH1,#0FCH CLR TF1;清除T1溢出标准 SETB TR0;启动T0计数 SJMP L1;开始下一轮 END
5.利用8031串行口设计4位静态七段显示器,要求4位显示器每隔2s交替显示“0、2、 4、6”和“1、3、5、75.利用8031串行口设计4位静态七段显示器,要求4位显示器每隔2s交替显示“0、2、 4、6”和“1、3、5、7 解:分析 将T0设置为定时、方式1、定时时间50MS,对定时时间计数40次即2S串行通信方式0,间隔2S送出4个字节 程序: ORG 0000H ST1: MOV TMOD,#01H;设置T0方式1 MOV TL0,#0B0H;向T0写入定时初值 MOV TH0,#3CH SETB TR0;启动T0定时 MOV R6,#4;通过串口写入第一组4字节数据 MOV DPTR,#TAB1;写入的4字节的首地址送DPTR MOV SCON,#0;设置串口方式0
S1: CLR A;A清零 MOVX A,@A+DPTR;取被传送的数据进A INC DPTR;修改数据地址,为下字节做准备 MOV SBUF,A;将数据送入发送缓冲器 W1: JNB TI,W1;等待一个字节发送完毕 CLR TI;发送完一个字节,清除“发送缓冲器空”标志 DJNZ R6,S1;4个字节发送完否?没有,继续 MOV R0,#40;发送完,启动延时(50MSX40=2S) DS1: JNB TF0, DS1;50MS到否?没有,继续等待 MOV TL0,#0B0H;到了,恢复初值,为下一个准备 MOV TH0,#3CH CLR TF0;清除T0溢出标准 DJNZ R0,DS1;40次到否?没有,进入下一个50MS MOV R6,#4;到了,送第二组4字节显示数据 MOV DPTR,#TAB2;准备起始地址 MOV SCON,#0;串口置方式0
S2: CLR A;A清零 MOVX A,@A+DPTR ;取被传送的数据进A INC DPTR ;修改数据地址,为下字节做准备 MOV SBUF,A ;将数据送入发送缓冲器 W2: JNB TI,W2 ;等待一个字节发送完毕 CLR TI ;发送完一个字节,清除“发送缓冲器空”标志 DJNZ R6,S2 ;4个字节发送完否?没有,继续 MOV R0,#40 ;发送完,启动延时(50MSX40=2S) DS2: JNB TF0, DS1 ;50MS到否?没有,继续等待 MOV TL0,#0B0H ;到了,恢复初值,为下一个准备 MOV TH0,#3CH CLR TF0 ;清除T0溢出标准 DJNZ R0,DS2 ;40次到否?没有,进入下一个50MS AJMP ST1;进入下一个巡回 TAB1: DB 3FH、5BH、66H、7DH TAB2; DB 06H、4FH、6DH、07H END
6· 试编制程序,使定时器T0(工作方式1)定时l00ms产生一次中断,使接在P1.0的发光二极管间隔1s亮一次,亮十次后停止。 解:分析 题目没有告诉我们晶振频率为多少,如果要求T0定时100MS产生一次中断,我们可以选择晶振为6MHZ。 对T0定时100MS计数10次即1S T0方式1、初值=65536-100MS/2Us=65536-50000=15536=3CB0H 程序: ORG 0000H AJMP MAIN ORG 000BH MOV TL0,#0B0H MOV TH0,#3CH INC R7 MOV A,R7 JNZ ZD1
MOV R7,#0F6H CPL P1.0 INC R6 MOV A,R6 JNZ ZD1 CLR TR0 ZD1: RETI MAIN: MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH MOV IE,#82H SETB TR0 M1: SJMP M1 END