位地址 AFAEADACABAA9A8 位符号 EAESET1EX1ET0EX0 与中断相关的控制位有 6 个:EA、EX0 和 EX1、ET0 和 ET1、ES。 中断优先级控制寄存器(IP) MCS-51 的中断优先级控制只定义了两个优先级:高和低。 每个中断源的优先级由优先级寄存器(IP)设置。 IP寄存器地址为B8H,位地址为BFH~B8H。 该寄存器的内容和位地址表示如下: 位地址 BBFBDBBBBAB9B8 位符号 PSPT1PX1PT0PX0PX0 外部中断 0 优先级设置位 PT0 定时中断 0 优先级设置位 PX1 外部中断 1 优先级设置位 PT1 定时中断 1 优先级设置位PS串行中断优先级设置位为0,为低电平; 位优先级为 1,为高。 中断响应 中断响应是接受中断源提出的中断请求。 它在中断查询之后执行。 当查询到有效的中断请求时,立即执行中断响应。 中断响应的主要内容是硬件自动生成的一条长调用指令LCALL。 它的格式为LCALLaddr16,其中addr16是程序存储器中断区中对应中断的入口地址。 在MCS-51单片机中,这些入口地址已由系统设定。 例如,响应外部中断0,生成的长调用指令为:LCALL0003H。 LCALL指令生成后,立即由CPU执行。
首先将程序计数器PC的内容压入堆栈以保护断点,然后将中断入口地址加载到PC中,将程序执行重定向到相应的中断区入口地址。 但由于每个中断区只有8个单元。 通常很难安排一个完整的中断服务程序。 因此,通常在每个中断区的入口地址放置一条无条件转移指令,将程序执行重定向到其他地址存储的中断服务程序。 中断返回中断响应后,进入中断服务程序完成所需的操作。 中断服务程序的最后一条指令必须是中断返回指令RETI。 当CPU执行该指令时,它会重置响应中断时设置的优先级触发器,然后将断点地址从堆栈中弹出并发送到程序计数器PC,以便可以从程序计数器中检索。 在断点处重新执行中断的主程序。 MCS-51 MCU 的定时器/计数器 MCS-51 MCU 有两个可编程定时器/计数器,分别称为定时器/计数器0 和定时器/计数器1。 它们都是十六位加法计数结构,由两个8位计数器TH0(地址8CH)和TL0(地址8AH)和TH1(地址8DH)和TL1(地址8BH)组成。 这四个计数器都是专用寄存器。 MCS-51的每个定时器/计数器都具有定时和计数功能。 计数功能所谓计数就是对外部事件进行计数。 外部事件的发生是通过输入脉冲来表示的,因此计数功能的本质就是对外部脉冲进行计数。
定时功能 定时功能也是通过计数器计数来实现的。 不过,此时的计数脉冲来自于单片机内部,即每个机器周期产生一个计数脉冲。 也就是说,每个机器周期计数器加1。 由于一个机器周期等于12个振荡脉冲周期,因此计数频率为振荡频率的1/12。 定时器/计数器控制寄存器 与定时器/计数器应用相关的控制寄存器有: 定时器控制寄存器(TCON) TCON 寄存器参与中断控制和时序控制。 有四个时序控制位:TF0和TF1,TR0和TR1工作模式控制寄存器(TMOD)。 TMOD寄存器是一个特殊寄存器,用于设置两个定时器/计数器的工作模式。 然而,TMOD寄存器不能位寻址,其内容只能用字节传输指令设置。 定义如下: B7B6B5B4B3B2B1B0 位符号 GATEM1M0GATEM1M0 定时器/计数器 1 定时器/计数器 0。从该寄存器的位格式可以看出,其低四位定义定时器/计数器 0,高四位定义定时器/计数器 1。中断使能控制寄存器(IE) IE 寄存器中与定时器/计数器相关的位介绍如下: EA:中断使能总体控制位 ET0 和 ET1 定时器/计数中断使能控制位 ET0(ET1)=0 禁止定时器/计数器计数中断 ET0 (ET1) = 1 允许为用户提供定时/计数中断定时器/计数器:八位计数器 TH 和 TL 以及相关控制位。
这些内容只能通过软件方式使用。 MCS-51 定时器/计数器的四种工作模式 定时工作模式0 模式0 为13 位计数结构的工作模式。 其计数器由TH0的全8位和TL0的低5位组成。 当TL0的低5位计数溢出时,进位到TH0,当所有13位计数溢出时,进位到计数溢出标志TF0。 模式0时,为计数工作模式时,计数值范围为:1~8192 (213) 为定时工作模式时,定时时间的计算公式为:(213-初始计数值)晶振周期12(213-计数初始值) 机器周期的时间单位与晶振周期或机器周期(s)相同。 例:某单片机系统外部晶振频率为6MHz时,系统最小定时时间为:[213-(213-1)][1/(6106)]12=210-6=2(s ) 最大计时时间 为:(213-0)[1/(6106)]12=1638410-6=16384(s) 最小计时单位 213=16384(s) 例:假设某单片机外部晶振频率系统频率为6MHz,使用定时器1 在模式0 下,由P1.0 产生周期为500s 的等宽方波连续脉冲并输出。 以查询方式完成。 计算初始计数值,如果要产生500s的等宽方波脉冲,只需在P1.0端交替输出高低电平,周期为250s即可。 为此,计时时间应为250s。
使用6MHz晶振,根据上例计算可知,一个机器周期为2s。 模式0是13位计数结构。 假设要获取的计数初始值为X,则:(213-X)210-6=25010-6。 解决办法是:二进制数表示为11,十六进制表示时,高8位为FCH,放在TH1中,即TH1=FCH; 低5位是03H。 代入TL1,即TL1=03H。 TMOD寄存器初始化,设置定时器/计数器1为模式0,则M1M0 = 00; 实现定时功能,C/T = 0; 要实现定时器/计数器 1 的操作控制,则 GATE = 0。定时器/计数器 0 不使用,相关位设置为 0。因此 TMOD 寄存器应初始化为 00H。 定时的开始和停止由定时器控制寄存器TCON 中的TR1 位控制。 TR1=1 启动,TR1=0 停止。 编程:MOV TMOD,#00H; 设置T1为工作模式0 MOV TH1,#OFCH; 设置计数初始值 MOV TL1,#03H MOV IE,#00H; 禁用中断循环:SETB TR1; 开始计时JBC TF1、LOOP1; 查询计数溢出 AJMP LOOP LOOP1: MOV TH1, #FCH; 复位计数初始值MOV TL1,#03H CLR TF1; 将计数溢出标志清0 CPL P1.0; 输出反转AJMP LOOP; 重复周期定时工作模式1 1 是16 位计数结构的工作模式。 计数器由TH0的全8位和TL0的全8位组成。
使用计数模式时,计数值范围为:1~65536 (216) 使用计时模式时,计时时间计算公式为:(216-初始计数值)晶振周期 12 (216-初始计数值)举例:某单片机系统外部晶振频率为6MHz时,最小定时时间为:[216-(216-1)]1/610-612=210-6=2(s)最大定时时间为:(216 -0) 1/610-612=13107210-6(s) = 131072(s) 131(ms) 例:某单片机系统外部晶振频率为6MHz,定时器1用于工作模式1,生成周期为500s的恒定宽度。 连续方波脉冲并在P1.0端子输出。 ,但以中断方式完成。 计算初始计数值 TH1=FFH TL1=83H 初始化TMOD寄存器 TMOD=10H 编程主程序:MOV TMOD,#10H; 定时器1工作模式1 MOV TH1,#0FFH; 设置计数初始值 MOV TL1,#0A1H SETB EA ; 打开中断 SETB ET1 ; 定时器1允许中断循环:SETB TR1; 计时开始于此处:SJMP; 等待中断中断服务程序:MOV TH1,#0FFH; 复位计数初始值 MOV TL1,#0A1H CPL P1.0; 输出负 RETI; 中断返回定时工作模式2。工作模式2为自动重装工作模式。 该工作模式下,16位计数器分为两部分,即TL用作计数器,TH用作预置寄存器。 初始化时,初始计数值分别加载到TL和TH中。 当计数溢出时,计数器TL由预设寄存器TH以硬件方式自动重新加载,而不是像前两种工作方式那样使用软件方式。 将软件加载更改为硬件加载。