第二章单片机的核心
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、单片机核心之Timer
1.1
单片机的Timer
AT89S51单片机有两个Timer——Timer 0 和Timer 1。当Timer工作于定时功能下时, 模拟开关打到T位置上,Timer计数电路计 算的是单位时间脉冲。单位时间脉冲的周 期与单片机的机器周期相等,如果晶振的 频率是12MHz,则1个机器周期=1µs,于 是单位时间脉冲的周期为1µs。也就是说 ,晶振频率=12MHz,Timer计数电路每过 1µs计数值增加1。所以,在定时结束时 Timer计数电路的计数值乘以1µs就能知道 流逝了多少时间,从而起到定时的功能。 图一
Timer寄存器里保存的是计数值,当Timer启动后每过一个机器周期(定时模式) 或输入一个外部事件脉冲(计数模式),计数值会自动增加1。通过计数值我 们可知道Timer启动之后流逝了多少时间(定时模式)或收到多少个外部事件 脉冲。 AT89S51单片机有两个Timer,它们有各自的Timer寄存器,且每个Timer寄存 器由高位字节寄存器THx和低位字节寄存器TLx组成。即Timer 0寄存器由TH0 和TL0组成,Timer 1寄存器由TH1和TL1组成。这4个寄存器位于特殊功能寄 存器的8AH~8DH上。
2.6 串行通信中断
ຫໍສະໝຸດ Baidu
单片机串行通信:当设置好串行口控制寄存器SCON的 相关位和利用Timer 1产生一定的波特率后,单片机即可通 过串行口接收或发送数据。发送使用指令“MOV SBUF, A” 将累加器A的数据装入缓冲区SBUF后自动发送,我们通过 检测SCON中的TI位来判断数据是否发送完成。接收则使用 指令“MOV A, SBUF”将接收缓冲区中的数据载入累加器 A中,并通过检测SCON中的RI位判断接收的完成情况。单 片机串行口发送和接收过程存在一个与Timer应用中相似的 问题,就是单片机在判断SCON的TI位或RI位时只能“一心 一意”地进行而无法再进行其他操作。而串行通信中断的出 现较好地解决了系统中既需要单片机响应串行通信的操作, 也同时兼顾其他操作。 关于串行中断我们会在后面的章节中做具体的练习。
1.5 定时器的使用步骤
①-设置Timer的工作模式。
②-往Timer寄存器(TL0和TH0)载入计数
初始值。 ③-启动Timer。 ④-检测Timer溢出标志(TF0)。 ⑤-关闭Timer。 ⑥-清0溢出标志(TF0)。 ⑦-重新装载计数初始值。
1.6计数器的设置
如果图中模拟开关打到C位置上,进入 Timer计数电路的则是外部事件脉冲。这样 Timer计数电路的计数值就是外部事件脉冲的 个数,这也就是单片机Timer的计数功能。
1.2. Timer模式控制寄存器TMOD
TMOD是“timer mode”的缩写,用于设 置Timer的工作模式。TMOD在特殊功能寄存 器的地址89H上,如下图所示。
2.1 中断服务的指挥——中断向量表
AT89S51单片机有5个中断源:外部中断0
(/INT0 )、外部中断1( /INT1)、Timer 0 中断(TF0)、Timer 1中断(TF1)、串行 通信中断(RI/TI)。当中断使能后,任何一 个中断发生时单片机都会到下表所示的对应 地址上去执行中断服务子程序。
1.3 Timer控制寄存器TCON
TCON是“timer control”的缩写,用于控制Timer的启动或 停止,并指示Timer是否溢出。TCON在特殊功能寄存器的 地址88H上。TCON的高4位的名称及功能描述:
TCON寄存器中,TFx是溢出标志位,当 Timer寄存器计数达最大值之后再增加1时产 生溢出,TFx位被硬件置1。于是可通过指令 “JBC TFx, rel”或“JB TFx, rel”来判断 TFx位是否为1,从而判断定时/计数是否完成。 另外,TCON寄存器的TRx位控制Timer启动 或关闭。
AT89S51单片机有两个Timer——Timer 0 和Timer 1。当Timer工作于定时功能下时, 模拟开关打到T位置上,Timer计数电路计算 的是单位时间脉冲。单位时间脉冲的周期与 单片机的机器周期相等,如果晶振的频率是 12MHz,则1个机器周期=1µs,于是单位时 间脉冲的周期为1µs。也就是说,晶振频率 =12MHz,Timer计数电路每过1µs计数值增 加1。所以,在定时结束时Timer计数电路的 计数值乘以1µs就能知道流逝了多少时间,从 而起到定时的功能。
2.5Timer 0中断和Timer 1中断
Timer是单片机中一个很有用的功能结构,Timer可设置 作为定时器或计数器。在使用Timer时,先向Timer寄存器 中装载一个计数初始值,通过指令“SETB TRx”来启动 Timer,并用类似“JNB TFx, $”的指令来不断检测 Timer溢出标志位TFx来判断计数是否完成。在Timer计数期 间,单片机除了循环执行指令“JNB TFx, $”对标志位 TFx进行判断之外一般不做其他操作。如果在Timer计数的 同时我们还需要单片机执行其他操作该怎么办呢?使用 Timer中断就可以解决这个实际问题。Timer中断作为 AT89S51单片机的中断源之一,会在Timer计数结束时向 CPU产生中断,这样就不需要程序中使用循环指令“JNB TFx, $”对标志位TFx进行判断了,而是让Timer到一边 自己计数,当计数完成通过中断来告诉程序计数结束。这样 一来,在Timer计数过程中,单片机就可以腾出空执行其他 指令,等Timer中断产生时再服务即可。
2.7 中断优先级
如果有两个或两个 以上的中断同时产生, 单片机该先服务方便呢? AT89S51单片机有一个 默认的中断优先级,外 部中断0的中断优先级 最高,串行通信中断优 先级最低,其他中断的 优先级依次按表中排列 依次降低。
例如,Timer 0中断和外部中 断1如果同时产生,单片机会先 去响应Timer 0中断并处理它的中 断服务子程序。完成之后再响应 外部中断1,进入相应的中断服 务子程序。
2.3 中断使能寄存器IE
单片机上电复位之后,默认所有中断都被屏蔽 (关闭),这意味着即使任何一种中断产生,单片 机也不会去响应。为了使单片机能对中断进行响应, 或者说使能中断,需要对中断使能寄存器IE进行操 作。中断使能寄存器IE是一个特殊功能寄存器,位 于特殊功能寄存器区的地址A8H上。 中断使能寄存器IE的操作: ①-IE的位7是EA,是所有中断的“总开关”。只 有EA=1时,中断才会开放,这时IE中的其他位将 使能或屏蔽某一个中断。如果EA=0,所有中断都 不会被响应(全被屏蔽)。 ②-如果EA=1时,相应的中断由IE中相应的位来 控制。控制位置1使能中断;清0则屏蔽中断
Timer作计数器时,实际上是在计算计数脉冲下 降沿的个数,或者说在计数脉冲的电平由高 跳低时Timer寄存器中的计数值增加1,假如 原来TL0=33,计数脉冲来到后每次下降沿使 TL0增加1。
单片机检测下降沿需要一定的时间。所以外部 事件发生的最高频率fe应小于晶振频率/24。 假设晶振频率=12MHz,则输入T0或T1口的 计数脉冲的最高频率fe应小于500kHz。另外, 确保脉冲在跳变之前至少被采样一次,则该 电平至少要保持一个机器周期,假设使用 12MHz的晶振,计数脉冲的电平信号在跳变 之前至少应保持1µs。
AT89S51单片机有两个Timer——Timer
0和 Timer 1,它们的工作模式由TMOD中的对应 位来分别设置。TMOD的长度为1个字节(8 位),高4位和低4位分别控制Timer 1和 Timer 0。其中由M11、M01控制Timer 1的工 作模式,M10、M00控制Timer 0的工作模式。 举个例子,我们想令Timer 0工作在定时器的 模式0下(软件启动),而Timer 1工作在计 数器的模式1下(软件启动),则设置Timer 的指令为“MOV TMOD, #01010000B”。
2.4 外部中断信号输入端/INT0和 /INT1
外部中断0和外部中断1的中断服务子程序入
口地址,即中断向量分别为0003H和0013H。 这两个外部中断分别由中断使能寄存器IE中 的EX0和EX1位来使能或屏蔽。外部的脉冲 信号或按钮开关都可以作为中断信号输入到 /INTx端使单片机产生中断。
2.2 中断的响应及处理
AT89S51单片机的中断源有5种,也就是说有5种方式使单片 机产生中断。当一个中断产生时,单片机会按以下的步骤进 行响应与处理。 ①-立即暂停当前正在执行的任何指令,并把下一条将要执 行的指令地址压入堆栈中。 ②-根据中断的类型在中断向量表中找到对应的地址。 ③-到该地址上开始执行中断服务子程序,直到遇到指令 “RETI”,中断服务子程序结束。 ④-执行完中断服务子程序后,从堆栈中弹出在中断产生时 保存的将要执行的下一条指令的地址到程序计数器PC中, 单片机开始从PC指示的地址继续执行程序。
使单片机产生外部中断的信号有两种方式,一是低 电平触发,二是下降沿触发。 当单片机上电复位后,使能外部中断时就默认以低 电平方式触发。 在低电平触发模式下,外部中断信号输入端/INT0和 /INT1出现低电平就会触发外部中断0或外部中断1。 外部中断产生时,单片机会立即停止正在执行的指 令,并根据中断向量表中的中断向量转入相应的地 址执行外部中断服务子程序。在单片机进入中断服 务子程序执行并在中断结束指令“RETI”之前,这 个低电平必须撤走,否则将会使单片机执行完指令 “RETI”后因 /INT0或/INT1仍为低电平而再次进入 中断服务子程序。
除了低电平触发外,边沿触发也是一种 常用的触发外部中断的模式。在该模式下, /INT0端或/INT1端出现下降沿即可使单片机 产生中断。与低电平触发不同,下降沿触发 方式不是单片机默认的中断触发方式,所以 需要指令来设置单片机工作在该模式下。方 法是通过Timer控制寄存器TCON中的IT0位 和IT1位来分别控制/INT0和/INT1触发方式。 见下图:
二、单片机核心之中断
中断的比喻: 任何一件事情的发生都会中断小林看电 视的进程而去响应和处理事件。例如,邮递 员上门送信,小林必须去开门签收信件,当 事件处理完后,小林回去接着看电视。这里, 小林比喻的就是单片机,而5个可能发生的事 件为单片机的5个中断源——外部中断0、外 部中断1、Timer 0中断、Timer 1中断、串行 通信中断。
在Timer模式控制寄存器TMOD的C/Tx#位 用于设置Timer用作定时器或计数器,当 C/Tx#=1时,对应的Timer用作计数器。 Timer 0和Timer 1可以被配置成两个独立的 计数器,分别对输入单片机T0端(14管脚) 和T1端(15管脚)的脉冲进行计数。Timer 作计数器使用时,Timer寄存器THx和TLx的 计数值记录的是输入单片机的脉冲的个数。
一个潜在的问题:每一个中断服务子程 序的存放空间都非常有限,例如,外部中断0 的中断向量为0003H,而Timer 0中断向量地 址为000BH,可见外部中断0的中断服务子程 序只有000BH-0003H=8个字节的空间来存放, 这8个字节的空间实在也放不了几条指令。解 决这个问题:可以把指令“ORG”与跳转指 令“JMP”结合来实现中断服务子程序的跳 转,从而在另一个更为广阔的的空间中来放 置中断服务子程序。 。
1.4 Timer用作定时/计数器小结
AT89S51单片机中提供了2个通用的16位 Timer, 分别为Timer 0和Timer 1,它们可以被独立配置成 定时或计数器并工作于不同模式下。 注意:AT89S52还提供一个Timer2。 当作为定时器时,Timer将在设定好的时间下工作 并在计时完成后产生溢出。当作为计数器时, Timer将计算输入T0或T1管脚的脉冲个数,当计数 达到预设的值时Timer同样可以产生溢出。
1.1
单片机的Timer
AT89S51单片机有两个Timer——Timer 0 和Timer 1。当Timer工作于定时功能下时, 模拟开关打到T位置上,Timer计数电路计 算的是单位时间脉冲。单位时间脉冲的周 期与单片机的机器周期相等,如果晶振的 频率是12MHz,则1个机器周期=1µs,于 是单位时间脉冲的周期为1µs。也就是说 ,晶振频率=12MHz,Timer计数电路每过 1µs计数值增加1。所以,在定时结束时 Timer计数电路的计数值乘以1µs就能知道 流逝了多少时间,从而起到定时的功能。 图一
Timer寄存器里保存的是计数值,当Timer启动后每过一个机器周期(定时模式) 或输入一个外部事件脉冲(计数模式),计数值会自动增加1。通过计数值我 们可知道Timer启动之后流逝了多少时间(定时模式)或收到多少个外部事件 脉冲。 AT89S51单片机有两个Timer,它们有各自的Timer寄存器,且每个Timer寄存 器由高位字节寄存器THx和低位字节寄存器TLx组成。即Timer 0寄存器由TH0 和TL0组成,Timer 1寄存器由TH1和TL1组成。这4个寄存器位于特殊功能寄 存器的8AH~8DH上。
2.6 串行通信中断
ຫໍສະໝຸດ Baidu
单片机串行通信:当设置好串行口控制寄存器SCON的 相关位和利用Timer 1产生一定的波特率后,单片机即可通 过串行口接收或发送数据。发送使用指令“MOV SBUF, A” 将累加器A的数据装入缓冲区SBUF后自动发送,我们通过 检测SCON中的TI位来判断数据是否发送完成。接收则使用 指令“MOV A, SBUF”将接收缓冲区中的数据载入累加器 A中,并通过检测SCON中的RI位判断接收的完成情况。单 片机串行口发送和接收过程存在一个与Timer应用中相似的 问题,就是单片机在判断SCON的TI位或RI位时只能“一心 一意”地进行而无法再进行其他操作。而串行通信中断的出 现较好地解决了系统中既需要单片机响应串行通信的操作, 也同时兼顾其他操作。 关于串行中断我们会在后面的章节中做具体的练习。
1.5 定时器的使用步骤
①-设置Timer的工作模式。
②-往Timer寄存器(TL0和TH0)载入计数
初始值。 ③-启动Timer。 ④-检测Timer溢出标志(TF0)。 ⑤-关闭Timer。 ⑥-清0溢出标志(TF0)。 ⑦-重新装载计数初始值。
1.6计数器的设置
如果图中模拟开关打到C位置上,进入 Timer计数电路的则是外部事件脉冲。这样 Timer计数电路的计数值就是外部事件脉冲的 个数,这也就是单片机Timer的计数功能。
1.2. Timer模式控制寄存器TMOD
TMOD是“timer mode”的缩写,用于设 置Timer的工作模式。TMOD在特殊功能寄存 器的地址89H上,如下图所示。
2.1 中断服务的指挥——中断向量表
AT89S51单片机有5个中断源:外部中断0
(/INT0 )、外部中断1( /INT1)、Timer 0 中断(TF0)、Timer 1中断(TF1)、串行 通信中断(RI/TI)。当中断使能后,任何一 个中断发生时单片机都会到下表所示的对应 地址上去执行中断服务子程序。
1.3 Timer控制寄存器TCON
TCON是“timer control”的缩写,用于控制Timer的启动或 停止,并指示Timer是否溢出。TCON在特殊功能寄存器的 地址88H上。TCON的高4位的名称及功能描述:
TCON寄存器中,TFx是溢出标志位,当 Timer寄存器计数达最大值之后再增加1时产 生溢出,TFx位被硬件置1。于是可通过指令 “JBC TFx, rel”或“JB TFx, rel”来判断 TFx位是否为1,从而判断定时/计数是否完成。 另外,TCON寄存器的TRx位控制Timer启动 或关闭。
AT89S51单片机有两个Timer——Timer 0 和Timer 1。当Timer工作于定时功能下时, 模拟开关打到T位置上,Timer计数电路计算 的是单位时间脉冲。单位时间脉冲的周期与 单片机的机器周期相等,如果晶振的频率是 12MHz,则1个机器周期=1µs,于是单位时 间脉冲的周期为1µs。也就是说,晶振频率 =12MHz,Timer计数电路每过1µs计数值增 加1。所以,在定时结束时Timer计数电路的 计数值乘以1µs就能知道流逝了多少时间,从 而起到定时的功能。
2.5Timer 0中断和Timer 1中断
Timer是单片机中一个很有用的功能结构,Timer可设置 作为定时器或计数器。在使用Timer时,先向Timer寄存器 中装载一个计数初始值,通过指令“SETB TRx”来启动 Timer,并用类似“JNB TFx, $”的指令来不断检测 Timer溢出标志位TFx来判断计数是否完成。在Timer计数期 间,单片机除了循环执行指令“JNB TFx, $”对标志位 TFx进行判断之外一般不做其他操作。如果在Timer计数的 同时我们还需要单片机执行其他操作该怎么办呢?使用 Timer中断就可以解决这个实际问题。Timer中断作为 AT89S51单片机的中断源之一,会在Timer计数结束时向 CPU产生中断,这样就不需要程序中使用循环指令“JNB TFx, $”对标志位TFx进行判断了,而是让Timer到一边 自己计数,当计数完成通过中断来告诉程序计数结束。这样 一来,在Timer计数过程中,单片机就可以腾出空执行其他 指令,等Timer中断产生时再服务即可。
2.7 中断优先级
如果有两个或两个 以上的中断同时产生, 单片机该先服务方便呢? AT89S51单片机有一个 默认的中断优先级,外 部中断0的中断优先级 最高,串行通信中断优 先级最低,其他中断的 优先级依次按表中排列 依次降低。
例如,Timer 0中断和外部中 断1如果同时产生,单片机会先 去响应Timer 0中断并处理它的中 断服务子程序。完成之后再响应 外部中断1,进入相应的中断服 务子程序。
2.3 中断使能寄存器IE
单片机上电复位之后,默认所有中断都被屏蔽 (关闭),这意味着即使任何一种中断产生,单片 机也不会去响应。为了使单片机能对中断进行响应, 或者说使能中断,需要对中断使能寄存器IE进行操 作。中断使能寄存器IE是一个特殊功能寄存器,位 于特殊功能寄存器区的地址A8H上。 中断使能寄存器IE的操作: ①-IE的位7是EA,是所有中断的“总开关”。只 有EA=1时,中断才会开放,这时IE中的其他位将 使能或屏蔽某一个中断。如果EA=0,所有中断都 不会被响应(全被屏蔽)。 ②-如果EA=1时,相应的中断由IE中相应的位来 控制。控制位置1使能中断;清0则屏蔽中断
Timer作计数器时,实际上是在计算计数脉冲下 降沿的个数,或者说在计数脉冲的电平由高 跳低时Timer寄存器中的计数值增加1,假如 原来TL0=33,计数脉冲来到后每次下降沿使 TL0增加1。
单片机检测下降沿需要一定的时间。所以外部 事件发生的最高频率fe应小于晶振频率/24。 假设晶振频率=12MHz,则输入T0或T1口的 计数脉冲的最高频率fe应小于500kHz。另外, 确保脉冲在跳变之前至少被采样一次,则该 电平至少要保持一个机器周期,假设使用 12MHz的晶振,计数脉冲的电平信号在跳变 之前至少应保持1µs。
AT89S51单片机有两个Timer——Timer
0和 Timer 1,它们的工作模式由TMOD中的对应 位来分别设置。TMOD的长度为1个字节(8 位),高4位和低4位分别控制Timer 1和 Timer 0。其中由M11、M01控制Timer 1的工 作模式,M10、M00控制Timer 0的工作模式。 举个例子,我们想令Timer 0工作在定时器的 模式0下(软件启动),而Timer 1工作在计 数器的模式1下(软件启动),则设置Timer 的指令为“MOV TMOD, #01010000B”。
2.4 外部中断信号输入端/INT0和 /INT1
外部中断0和外部中断1的中断服务子程序入
口地址,即中断向量分别为0003H和0013H。 这两个外部中断分别由中断使能寄存器IE中 的EX0和EX1位来使能或屏蔽。外部的脉冲 信号或按钮开关都可以作为中断信号输入到 /INTx端使单片机产生中断。
2.2 中断的响应及处理
AT89S51单片机的中断源有5种,也就是说有5种方式使单片 机产生中断。当一个中断产生时,单片机会按以下的步骤进 行响应与处理。 ①-立即暂停当前正在执行的任何指令,并把下一条将要执 行的指令地址压入堆栈中。 ②-根据中断的类型在中断向量表中找到对应的地址。 ③-到该地址上开始执行中断服务子程序,直到遇到指令 “RETI”,中断服务子程序结束。 ④-执行完中断服务子程序后,从堆栈中弹出在中断产生时 保存的将要执行的下一条指令的地址到程序计数器PC中, 单片机开始从PC指示的地址继续执行程序。
使单片机产生外部中断的信号有两种方式,一是低 电平触发,二是下降沿触发。 当单片机上电复位后,使能外部中断时就默认以低 电平方式触发。 在低电平触发模式下,外部中断信号输入端/INT0和 /INT1出现低电平就会触发外部中断0或外部中断1。 外部中断产生时,单片机会立即停止正在执行的指 令,并根据中断向量表中的中断向量转入相应的地 址执行外部中断服务子程序。在单片机进入中断服 务子程序执行并在中断结束指令“RETI”之前,这 个低电平必须撤走,否则将会使单片机执行完指令 “RETI”后因 /INT0或/INT1仍为低电平而再次进入 中断服务子程序。
除了低电平触发外,边沿触发也是一种 常用的触发外部中断的模式。在该模式下, /INT0端或/INT1端出现下降沿即可使单片机 产生中断。与低电平触发不同,下降沿触发 方式不是单片机默认的中断触发方式,所以 需要指令来设置单片机工作在该模式下。方 法是通过Timer控制寄存器TCON中的IT0位 和IT1位来分别控制/INT0和/INT1触发方式。 见下图:
二、单片机核心之中断
中断的比喻: 任何一件事情的发生都会中断小林看电 视的进程而去响应和处理事件。例如,邮递 员上门送信,小林必须去开门签收信件,当 事件处理完后,小林回去接着看电视。这里, 小林比喻的就是单片机,而5个可能发生的事 件为单片机的5个中断源——外部中断0、外 部中断1、Timer 0中断、Timer 1中断、串行 通信中断。
在Timer模式控制寄存器TMOD的C/Tx#位 用于设置Timer用作定时器或计数器,当 C/Tx#=1时,对应的Timer用作计数器。 Timer 0和Timer 1可以被配置成两个独立的 计数器,分别对输入单片机T0端(14管脚) 和T1端(15管脚)的脉冲进行计数。Timer 作计数器使用时,Timer寄存器THx和TLx的 计数值记录的是输入单片机的脉冲的个数。
一个潜在的问题:每一个中断服务子程 序的存放空间都非常有限,例如,外部中断0 的中断向量为0003H,而Timer 0中断向量地 址为000BH,可见外部中断0的中断服务子程 序只有000BH-0003H=8个字节的空间来存放, 这8个字节的空间实在也放不了几条指令。解 决这个问题:可以把指令“ORG”与跳转指 令“JMP”结合来实现中断服务子程序的跳 转,从而在另一个更为广阔的的空间中来放 置中断服务子程序。 。
1.4 Timer用作定时/计数器小结
AT89S51单片机中提供了2个通用的16位 Timer, 分别为Timer 0和Timer 1,它们可以被独立配置成 定时或计数器并工作于不同模式下。 注意:AT89S52还提供一个Timer2。 当作为定时器时,Timer将在设定好的时间下工作 并在计时完成后产生溢出。当作为计数器时, Timer将计算输入T0或T1管脚的脉冲个数,当计数 达到预设的值时Timer同样可以产生溢出。