第4章 中断、定时计数器与串行口_第1页
第4章 中断、定时计数器与串行口_第2页
第4章 中断、定时计数器与串行口_第3页
第4章 中断、定时计数器与串行口_第4页
第4章 中断、定时计数器与串行口_第5页
已阅读5页,还剩141页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章中断、定时/计数器与串行口教学提示:51子系列单片机应用广泛的一个重要原因是它在一个芯片里集成了应用系统所需的大部分(或所有)硬件功能,本章叙述的是完成这些硬件功能的内部标准功能单元,构成了51子系列单片机的核心体系结构。教学要求:本章让学生掌握内部标准功能单元中断系统、定时/计数器和串行通信接口的逻辑结构、功能和应用设计方法。4.1MCS-51的中断系统

4.2MCS-51的定时/计数器

4.3MCS-51的串行接口

4.5

本章小结内容提要4.1.1中断系统的概念中断系统的概念和基本结构

中断发生:CPU正在处理某一程序时,发生了另一突发事件请求CPU迅速去处理;

中断响应:

CPU暂时停止当前的工作,转到需要处理的中断源的服务程序的入口,一般在入口处执行一跳转指令转去处理中断事件(中断服务);

中断返回:待CPU将中断事件处理完毕后,再回到原来程序被中断的地方继续处理执行程序,这一处理过程称为中断返回。

4.1中断中断系统的概念和基本结构

中断过程示意图为什么要用中断?

当CPU与外设交换信息时,由于外设的速度比较慢,若用查询的方式,则CPU就要浪费很多时间去等待外设。这样就存在一个快速的CPU与慢速的外设之间的矛盾。为了解决这个问题,就发展了中断的概念。

中断的优点

分时操作

有了中断功能,就可以使CPU和外设同时工作。提高了CPU的利用率。

实时处理

实时控制时,需要现场的各种参数、信息,可在任何时间发出中断申请,CPU就可以马上响应加以处理。

故障处理

计算机在运行过程中,往往会出现事先预料不到的情况,或出现一些故障。中断源

引起中断的原因,或能发出中断申请的来源,称为中断源。通常中断源有以下几种:

外部输入、输出设备

故障源

控制对象定时/计数脉冲,当定时/计数器溢出时产生中断请求。

对于每种中断事件,要求其能够发出中断请求信号,而且要符合CPU响应中断的条件,即要明确属于哪种中断源。中断源是系统规定的可引起中断的部件或来源。中断系统的功能实现中断及返回能实现优先权排队高级中断源能中断低级的中断处理

MCS-51单片机的中断系统提供5个中断申请源外部中断0和外部中断1;定时/计数器(T0)和(T1)的溢出中断;串行接口的接收和发送中断。

这5个中断源可分为两个优先级,可实现两级中断服务程序嵌套。4.1.2MCS-51单片机的中断系统MCS-51单片机的中断系统结构示意图4.1.3中断系统的控制与实现MCS-51单片机的中断系统可以提供5个中断申请源,它们的控制与实现由片内4个SFR来完成。定时/计数器的控制寄存器(TCON)和串行接口控制寄存器(SCON)的相应位规定中断类型和触发方式;中断允许寄存器(IE)控制CPU是否响应中断请求;中断优先级寄存器(IP)安排各中断源的优先级,同一优先级内各中断同时提出中断请求时,由内部的查询逻辑按规定的自然优先级确定其响应次序。MCS-51的中断源外部中断0:来自P3.2引脚上的外部中断请求;外部中断1:来自P3.3引脚上的外部中断请求;T0:片内定时/计数器0溢出(TF0)中断请求;T1:片内定时/计数器1溢出(TF1)中断请求;串行接口:片内串行接口完成一帧数据的发送或接收后,产生中断请求TI或RI。和中断有关的特殊功能寄存器

定时/计数器控制寄存器TCON(88H)

TCON:它锁存2个定时/计数器的溢出中断标志及外部中断(

)和(

)的中断标志,与中断有关的各位定义如下:位D7D6D5D4D3D2D1D0字节地址TCONTF1TR1TF0TR0IE1IT1IE0IT088H位地址8FH8EH8DH8CH8BH8AH89H88HIT0:外部中断0触发方式控制位。

当IT0=0,外部中断0选择为电平触发方式(低电平有效)当IT0=1外部中断0选择为边沿触发方式(下降沿有效)。

IE0:外部中断0中断请求标志位。

IE0=1时,表示向CPU请求中断。IT1:外部中断1触发方式控制位。IE1:外部中断1中断请求标志位。TF0:定时/计数器T0溢出中断请求标志位。

在T0启动后就开始由初值加“1”计数,直至最高位产生溢出由硬件置位(TF0),向CPU请求中断。CPU响应中断时,TF0由硬件自动清“0”。TF1:定时/计数器T1溢出中断请求标志位。串行接口控制寄存器(98H)

SCON是串行接口控制寄存器,与中断有关的是它的低位TI和RI。位D7D6D5D4D3D2D1D0字节地址SCONTIRI98H位地址9FH9EH9DH9CH9BH9AH99H98HRI:串行接口接收中断标志位。

当允许串行接口接收数据时,每接收完一个串行帧,由硬件置位RI,向CPU请求中断。CPU响应中断时,不能自动清除RI,RI必须由软件清除。TI:串行接口发送中断标志位。

当CPU将一个发送数据写入串行接口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位(TI),向CPU请求中断。同样,TI必须由软件清除。

中断允许寄存器IE(A8H)CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器(IE)控制的。IE的状态可通过程序由软件设定;某位设定为“1”,相应的中断源中断允许;某位设定为“0”,相应的中断源中断屏蔽;CPU复位时,IE各位清“0”,禁止所有中断。IE各位的定义如下:

EX0:外部中断(0)中断允许位;

ET0:定时/计数器T0中断允许位;

EX1:外部中断(1)中断允许位;

ET1:定时/计数器(T1)中断允许位;

ES:串行接口中断允许位;

EA:CPU中断总允许位。位D7D6D5D4D3D2D1D0字节地址IEEAESET1EX1ET0EX0A8H位地址AFHAEHADHACHABHAAHA9HA8H中断优先级寄存器IP(B8H)MCS-51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器(IP)中的相应位的状态来规定的。某位设定为“1”,则相应的中断源为高优先级中断;某位设定为“0”,则相应的中断源为低优先级中断。单片机复位时,IP各位清“0”,各中断源同为低优先级中断。

PX0:外部中断0中断优先级设定位;

PT0:定时/计数器T0中断优先级设定位;

PX1:外部中断1中断优先级设定位;

PT1:定时/计数器T1中断优先级设定位;

PS:串行接口中断优先级设定位。位D7D6D5D4D3D2D1D0字节地址IPPSPT1PX1PT0PX0B8H位地址BFHBEHBDHBCHBBHBAHB9HB8H

IP寄存器各位的定义如下

同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如下表所示。中断源中断标志中断服务程序入口优先级顺序外部中断0IE00003H高定时/计数器0(T0)TF0000BH↓外部中断1IE10013H↓定时/计数器1(T1)TF1001BH↓串行口RI或TI0023H低MCS-51单片机的中断优先级控制原则不同级的中断源同时申请中断时,先响应高级后响应低级。同级的中断源同时申请中断时,按事先规定执行。即MCS-51单片机中规定的同级中断优先顺序。处理低级中断又收到高级中断请求时,停止低级转去先执行高级。处理高级中断又收到低级中断请求时,不响应它,等待做完高级处理后再处理低级中断。4.1.4中断响应的条件、过程和时间

中断处理过程分为4个阶段:中断请求→中断响应→中断服务→中断返回。中断响应条件CPU在每个机器周期的S5P2时刻对各个中断源的中断标志进行采样。这些采样值在下一个机器周期内按优先级和内部顺序被依次查询。如果某个中断标志在上一个机器周期的S5P2被置成了“1”,那么它将于现在的查询周期中及时被发现。接着CPU便执行一条由中断系统提供的硬件LCALL指令,转向被称作中断向量的特定入口地址,进入相应的中断服务程序。中断响应必须满足下列条件:无同级或高级中断正在服务;现行指令执行到最后1个机器周期且已结束;若现行指令为RETI或需访问特殊功能寄存器IE或IP的指令时,执行完该指令且紧随其后的另1条指令也已执行完。

单片机便在紧接的下一个机器周期的S1期间响应中断,否则,将丢弃中断查询的结果!中断响应过程将相应的优先级状态触发器置“1”(以阻断后来的同级或低级的中断请求);执行一条硬件LCALL指令,把程序计数器(PC)的内容压入堆栈保存,再将相应的中断服务程序的入口地址送入PC;进入中断服务程序后,CPU自动清除中断请求标志TF0、TF1、IE0、IE1,但不能清除TI和RI。中断响应过程执行中断服务程序在主程序中事先进行中断初始化;

在中断服务程序入口地址单元放一条长转移指令LJMP,这样中断服务程序能灵活地安排64KB程序存储器的任何地方;

在中断服务程序中,首先用软件保护现场,在中断服务之后、中断返回前恢复现场,以防止中断返回后,丢失原寄存器的内容。中断返回

中断服务程序的最后一条指令必须是中断返回指令RETI。RETI指令能使CPU结束中断服务程序的执行,返回到曾经被中断过的程序处,继续执行主程序。RETI指令的具体功能是:将中断响应时压入堆栈保存的断点地址从栈顶弹出送回PC,CPU从原来中断的地方继续执行程序;将相应中断优先级状态触发器清“0”,通知中断系统,中断服务程序已执行完毕。中断处理过程(汇总中断响应→中断服务→中断返回)(1)CPU在每个机器周期的S5P2时刻对各个中断源的中断标志进行采样。(2)这些采样值在下一个机器周期内按优先级和内部顺序被依次查询。如果某个中断标志在上一个机器周期的S5P2被置成了1,那么它将于现在的查询周期中及时被发现。(3)将相应的优先级状态触发器置“1”(以阻断后来的同级或低级的中断请求);(4)执行一条硬件LCALL指令,把程序计数器(PC)的内容压入堆栈保存,再将相应中断服务程序的入口地址送入PC;

(5)进入中断服务程序后,CPU自动清除中断请求标志TF0、

TF1、IE0、IE1,但不能清除TI和RI。中断响应过程(6)在主程序中事先进行中断初始化,在中断服务程序入口地址单元放一条长转移指令LJMP,这样中断服务程序能灵活地安排64KB程序存储器的任何地方。(7)在中断服务程序中,首先用软件保护现场,在中断服务之后、中断返回前恢复现场,以防止中断返回后,丢失原寄存器的内容。(8)当执行到RET1时,中断服务程序结束。(9)将中断响应时压入堆栈保存的断点地址从栈顶弹出送回PC,CPU从原来中断的地方继续执行程序;(10)将相应中断优先级状态触发器清“0”,通知中断系统,中断服务程序已执行完毕。中断服务过程中断返回中断响应时间

所谓中断响应时间,是指从查询中断请求标志位到转入中断服务程序入口地址所需的机器周期数(对单一中断源而言)。

响应中断最短需要3个机器周期。若CPU查询中断请求标志的周期正好是执行1条指令的最后1个机器周期,则不需等待就可响应。响应中断执行1条长调用指令需要2个机器周期,加上查询的1个机器周期,共需要3个机器周期才开始执行中断服务程序。

中断响应的最长时间由下列情况所决定:若中断查询时正在执行RETI或者访问IE(或IP)指令的第1个机器周期,则连查询在内需要2个机器周期(以上3条指令均需2个机器周期);若紧接着要执行的指令正好是MUL或DIV指令(两者均为4周期指令),则需等该指令执行完后才能进入中断响应周期,再用2个机器周期执行1条长调用指令转入中断服务程序,这样一来总共需要8个机器周期。其他情况下的中断响应时间一般在3~8个机器周期之间。4.1.5外部中断的请求与撤除

1.外部中断

4.1.4节已经介绍了MCS-51单片机的中断系统的2个外部中断源的工作过程,它有两种触发方式,即电平触发和边沿触发。可通过将TCON寄存器中的IT0位和IT1位清0使其工作在电平触发方式,或置为1使其工作在边沿触发方式。

在电平触发方式下,单片机在每个机器周期的S5P2期间采样中断输入信号,若为低电平,则可直接触发外部中断。在这种触发方式中,中断源必须持续请求,直至中断产生为止,且要求在中断服务程序返回之前,必须撤除中断请求信号,否则机器将认为又发生了另一次中断请求。因此,电平触发方式适合于外部中断输入为低电平,且在中断服务程序中能清除该中断源的申请信号的情况。

在边沿触发方式中,单片机在采样中断输入信号时,如果连续采样到1个周期的高电平和紧接着1个周期的低电平,则中断请求标志位就被置位,并请求中断。这种方式下,CPU响应中断进入中断服务程序时,请求标志位会被CPU自动清除。所以该方式适合于以负脉冲形式输入的外部中断请求。

由于外部中断源在每个机器周期被采样1次,所以输入的高电平或低电平必须至少保持12个振荡周期,以保证能被采样到。2.中断请求的撤除

CPU响应中断请求后,在中断返回前,必须撤除请求,否则会错误地再一次引起中断过程。如前所述,对于定时器T0与T1的中断请求及边沿触发方式的外部中断0和1来说,CPU在响应中断后用硬件清除了相应的中断请求标志TF0、TF1、IE0与IE1,即自动撤除了中断请求。

对于串行口中断,CPU响应中断后没有用硬件清除中断标志位,必须由用户编制的中断外部服务程序来清除相应的中断标志,如用指令CLRTI或CLRRI来清除串行发送或串行接收中断标志。对于电平触发的外部中断,由于CPU对外部中断0和1引脚没有控制作用,因此需要外接电路来撤除中断请求信号。

下图描述了一种外部中断撤出的可行性方案。该外部中断请求信号通过D触发器加到单片机外部中断0或1引脚上。当外部中断信号使D触发器的CLK端发生正跳变时,由于D端接地,Q端输出为0,因此向单片机发出中断请求。CPU响应中断后,利用1根口线(如P1.0)作应答线。图4.3外部中断请求(电平触发方式)的撤除图

在中断服务程序中用以下两条指令来撤除中断请求:

ANLP1,#0FEH ;P1.0=0,则S=1,D触发器置位,Q=1ORLP1,#01H ;P1.0=1,则S=0,D触发器接收信号

第1条指令使P1.0为0,而P1口其他各位的状态不变。由于P1.0接至D触发器的置“1”端(S),所以D触发器的Q=1,从而撤除了中断请求信号。第2条指令又使P1.0为1,即S=0,以便能继续接收新的外部中断请求信号。4.1.6中断系统设计举例中断系统的设计过程通常由以下几个部分构成(1)中断初始化,在主程序中完成;(2)在中断入口地址处安排一跳转指令,跳转至中断服务子程序入口;(3)中断服务子程序开始保护现场,保护与主程序或其他中断系统共享的资源,如A,PSW,DPTR,

Rn等,如果没有共享资源,可以不必保护;(4)编制中断服务子程序功能主体;(5)恢复现场;【例4.1】试编写设置外部中断0和串行接口中断为高优先级,外部中断1为低优先级,并屏蔽T0和T1中断请求的初始化程序段。解:根据题目要求,只要能将中断请求优先级寄存器IP的第0、4位置“l”。其余位置“0”,将中断请求允许寄存器的第0、2、4、7位置“l”,其余位置“0”就可以了。

ORG 0000H SJMPMAIN ORG 0003H;外部中断0的入口地址

LJMP INT0INT

;跳转到外部中断0的中断服务程序

ORG 0013H;外部中断1的入口地址

LJMPINT1INT

;跳转到外部中断1的中断服务程序

ORG 0023;串口中断的入口地址

LJMP SIOINT

;跳转到串口中断的中断服务程序

ORG 0030HMAIN:…;编写主程序

MOVIP,#00010001B;设外部中断和;串行口中断;为高优先级

MOVIE,#10010101B;允许INT0、串行口中断,开CPU中断

思考:试写一段中断初始化程序,使其允许T0、T1和串口中断,且INT0为边沿触发方式,串口为高优先级中断。【例4.2】利用单片机的定时器计数来产生中断,假定单片机晶振选择12MHZ,选择使用T0每1mS产生一次中断请求,用于调用动态显示程序DISP,即显示程序在此属于中断服务程序。

解:先安排好不同程序的入口地址,在主程序中完成定时器和中断的初始化,然后打开对应中断允许位和总中断允许位,在中断服务程序中要注意保护和恢复现场。;主程序如下ORG0000HLJMPMAIN ;跳转到主程序入口ORG000BHLJMPDISP ;跳转到定时器T0中断入口地址

ORG0030HMAIN:……… ;===进行定时器初始化===MOVTMOD,#00000001B;设置T0工作在模式1MOVTH0,#0FCH;MOVTL0,#18H;设置计数初值FC18H=64536=65536-1000SETBTR0;TR0=1,启动定时器T0开始计数SETBET0;开放定时器T0中断允许位SETBEA;开放总中断允许位,等待T0计数满溢出;…略……;中断服务程序代码:DISP:

PUSHACCPUSHPSW

;保护现场;CLRTR0;因为已经响应中断请求,故停止定时器T0MOVTH0,#0FCHMOVTL0,#18H;重新赋计数初值SETBTR0;重新启动定时器T0…….;显示程序代码(略)…..POPPSWPOPACC;按先入后出次序恢复现场;RETI;中断服务程序结束,返回断点,必须用RETI指令;【例4.3】如下图所示,按S接至外部中断,按一次键LED点亮,蜂鸣器发声,再按一次键LED灭,蜂鸣器关闭,循环往复。图按键控制声光电路——实现程序——

ORG 0000H LED BIT P0.0 BUZZERBIT P2.7 LJMP MAIN ;跳转至主程序

ORG 0003H LJMP INT1_INT ;跳转至中断服务程序

…… ORG 0100H

MAIN:SETB IT1 ;外中断采用下降沿触发

SETB EX1 ;允许中断

SETB EA ;开总中断

SETB F0 ;按键切换标志,F0=1,LED灭; ;F0=0,LED亮

……INT1_INT:CPLF0 ;不需保护现

MOV C,F0 MOV LED,C ;控制LED输出

MOV BUZZER,C ;控制蜂鸣器输出

RETI ;中断返回

另:请考虑用查询方式实现该功能,如何编程?二者有何差异?中断总结

51单片机共有5个中断源,由4个SFR(TCON、SCON、IE和IP)进行管理和控制。初始化时,需要对5个内容进行设置:

1)中断服务程序入口地址的设定;2)某一中断源中断请求的允许和禁止;3)对于外部中断请求,还需进行触发方式的设定;4)各中断优先级别的设定;5)CPU开中断与关中断。4.2MCS-51的定时/计数器

在工业检测、控制中,许多场合都要用到计数或定时功能。例如,对某个外部事件进行计数、定时巡回检测物理参数、按一定的时间间隔进行现场控制等。单片机片内集成有两个16位可编程的定时/计数器:T0和T1,通过对它们的特殊功能寄存器(SFR)的编程,可以用作定时或计数器,此外,T1还可以用作为串行口的波特率发生器。

4.2.1定时/计数器的基本结构1.定时/计数器的结构基本部件是两个16位寄存器T0和T1,每个分成两个8位寄存器(例:T0由高8位TH0和低8位TL0组成)TMOD:定时/计数器的工作方式寄存器,由它确定定时/计数器的工作方式和功能;TCON:定时/计数器的控制寄存器,用于控制T0、T1的启动和停止以及设置溢出标志。

定时/计数器的结构框图2.定时/计数器的工作原理定时/计数器T0和T1的实质是加“1”计数器,即每输入一个脉冲,计数器加“1”,当加到计数器全为“1”时,再输入一个脉冲,就使计数器回零,且计数器的溢出使TCON中的标志位TF0或TF1置“1”,向CPU发出中断请求(定时/计数器中断允许时)。区别:作定时器时脉冲来自于内部时钟振荡器,作计数器时脉冲来自于外部引脚。1)定时器模式此时输入脉冲是由内部时钟振荡器的输出经12分频后送来的。如果晶振频率为12MHz,则一个机器周期是1us,定时器每接收一个输入脉冲的时间为1us。要定一段时间,只需计算一下脉冲个数即可。2)计数器模式此时输入脉冲是由外部引脚P3.4(T0)或P3.5(T1)输入到计数器的。在每个机器周期的S5P2期间采样T0、T1引脚电平。当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计数器加“1”。由于检测一个从“1”到“0”的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期,否则会出现漏计数现象,所以最高计数频率为晶振频率的1/24。当晶振频率为12MHz时,最高计数频率不超500kHz,即计数脉冲的周期要大于2us。4.2.2定时/计数器的控制与实现

MCS-51单片机定时/计数器的控制与实现由两个特殊功能寄存器TMOD、TCON完成。1.工作方式寄存器TMOD(89H)用于设置定时/计数器的工作方式,低4位用于T0,高4位用于T1。其格式如下

位D7D6D5D4D3D2D1D0字节地址TMODGATEC/M1M0GATE

C/M1M089H(1)GATE:门控位。GATE=0时,当软件使TCON中的TR0或TR1设置为“1”,则启动定时/计数器工作;GATA=1时,软件使TR0或TR1设置为“1”,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。(2)C/T:定时/计数模式选择位。C/T=0为定时模式;C/T=1为计数模式。(3)M1M0:工作方式设置位。定时/计数器有4种工作方式,由M1M0进行设置,如表下表所示。

定时/计数器工作方式设置表M1M0工作方式功能说明00方式013位定时/计数器01方式116位定时/计数器10方式28位自动重装初值定时/计数器11方式3T0分成两个独立的8位定时/计数器;T1此方式停止计数2.控制寄存器TCON(88H)

TCON的低4位用于控制外部中断,TCON的高4位用于控制定时/计数器的启动和中断申请。位D7D6D5D4D3D2D1D0字节地址TCONTF1TR1TF0TR088H位地址8FH8EH8DH8CH8BH8AH89H88HTF1:定时/计数器T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为“1”。在进入中断服务程序后TF1由硬件自动清“0”;若用于查询方式,此位可作为状态位供查询,但应注意查询后由软件清“0”。(2)TR1:定时/计数器T1运行控制位。TR1置“1”时,定时/

计数器T1开始工作;TR1置“0”时,定时/计数器T1停止工作。TR1由软件置“1”或清“0”。(3)TF0

:定时/计数器T0溢出中断请求标志位,其功能与TF1类同。(4)TR0

:定时/计数器T0运行控制位,其功能与TR1类同。4.2.3定时/计数器的工作方式

MCS-51单片机定时/计数器T0有4种工作方式(方式0、1、2、3);T1有3种工作方式(方式0、1、2);T1还可作为串行通信接口的波特率发生器;若错将T1设置为方式3,则T1将停止工作;下面以定时/计数器T0为例进行介绍。1.方式0

当TMOD的M1M0为00时,定时/计数器工作于方式0,如图所示。方式0的逻辑结构方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。13位定时/计数器是为了与Intel公司早期的产品MCS-48系列兼容,该系列已过时,且计数初值装入易出错,所以在实际应用中常由16位的方式1取代。2.方式1

当M1M0为01时,定时/计数器工作于方式1,如图所示。

方式1的逻辑结构方式1的计数位数是16位,由TL0作为低8位、TH0

作为高8位,组成了16位加“1”计数器。计数个数M与计数初值N的关系为M=216-N。用于定时功能时,定时时间t的计算公式为:

t=M×机器周期=(216-N)×机器周期若晶振频率为12MHz,机器周期=1us,初值N=0~

65535范围时,则可定时范围为1~65.536ms。用于计数功能时,初值N=0~65535范围时,计数范围为1~65536。3.方式2当M1M0为10时,定时/计数器工作在方式2,其逻辑结构如图所示。方式2的逻辑结构方式2为自动重装初值的8位计数方式。TL0作为8位定时/计数器使用,TH0为8位初值寄存器,保持不变。当TL0计满溢出时,由硬件使TF0置“1”,向CPU发出中断请求,而溢出脉冲打开TL0与TH0之间的三态门,将TH0中的计数初值自动送入TL0。TL0从初值重新进行加“1”计数。周而复始,直至TR0=0才会停止。

计数个数M与计数初值N的关系为M=28-N。用于定时功能时,定时时间t的计算公式为

t=M×机器周期=(28-N)×机器周期若晶振频率为12MHz,机器周期=1,初值N=0~255范围时,则可定时范围为1~256。用于计数功能时,初值N=0~255范围时,计数范围为1~256。由于工作方式2省去了重装常数的程序,特别适合于用作波特率发生器。4.方式3当M1M0为11时,T0被设置为方式3,其逻辑结构如图所示。

T0方式3的逻辑结构

方式3时,只适用于定时/计数器T0,T0分成为两个独立的8位计数器TL0和TH0,在使用上注意以下特点:

(1)TL0:可作为定时和计数器使用,占用了T0的控制位:C/T、GATE、TR0、TF0和。

(2)TH0:只能作为定时器使用,仅借用了T1的控制位TR1、TF1。

(3)T1:只能作为定时器运行,在T0方式3时,原则上T1仍可按方式0、1、2工作,只是不能使用运行控制位TR1和溢出标志位TF1,也不能发出中断请求信号。方式设定后,T1将自动运行,如果要停止工作,只需将其设定为方式3即可。

4.2.4定时/计数器程序设计举例51单片机的定时/计数器通常工作于中断场合,可遵循以下几个方面进行应用设计:

(1)计算定时/计数器的初值;

(2)在主程序中进行初始化设计:包括定时/计数器的初始化和中断初始化,即对TH0、TL0或TH1、TL1,

TMOD、TCON、IP、IE赋值;

(3)中断服务程序设计。【例4.4】利用定时/计数器(T0)的方式1,产生一个50Hz的方波,此方波由P1.0引脚输出,晶振频率为12MHz。【解题思路】方波频率f=50Hz周期T=1/50=0.02s,如果让定时器计满0.01s,P1.0输出“0”,再计满0.01s,P1.0输出“1”,就能满足要求如图4.9所示。所以此题转化为由T0产生0.01s定时的问题。【实现方法】(1)查询方式:通过查询T0的溢出标志TF0是否为“1”。当TF=1时,定时时间已到,对P1.0取反操作。(2)中断方式:CPU正常执行主程序,一旦定时时间到,TF0=1向CPU申请中断,CPU响应了T0的中断,就执行中断程序,在中断程序里对P1.0取反操作。图4.950Hz方波示意图【解题步骤】(1)确定定时器初值N:由于晶振为12MHz,所以1个机器周期为1us。计数值

即应将D8H送入TH0中,F0H送入TL0中(2)求T0的方式控制字TMOD:

GATE=0,C/T=0,M1M0=01可取方式控制字为

TMOD=01H,即T0的方式1;

【查询方式】 ORG0000H LJMPMAIN ;跳转到主程序

ORG0100H ;主程序

MAIN:MOVTMOD,#01H ;置T0工作于方式1LOOP:MOVTH0,#0D8H ;装入计数初值

MOVTL0,#0F0H SETBTR0 ;启动定时器T0 JNBTF0,$;TF0=0,定时时间未到,等待

CLRTF0;TF0=1,定时时间到,清TF0 CPLP1.0;P1.0取反输出

SJMPLOOP

END【中断方式】

ORG0000H LJMPMAIN ;跳转到主程序

ORG000BH ;T0的中断入口地址

LJMPT0_INT ;转向中断服务程序

ORG0100HMAIN: MOVTMOD,#01H;置T0工作于方式1 MOVTH0,#0D8H;装入计数初值

MOVTL0,#0F0H SETBET0 ;T0开中断

SETBEA ;CPU开中断

SETBTR0 ;启动T0 … … ;继续执行主程序其他部分

SJMP$ ;等待中断

T0_INT:CPLP1.0 ;P1.0取反输出

MOVTH0,#0D8H;重新装入计数初值

MOVTL0,#0F0H RETI ;中断返回

END【例4.5】如下图所示,按键S接至外部中断INT1,按一次键LED闪烁点亮,闪烁频率为1Hz,蜂鸣器发声,发声频率为1kHz,再按一次键LED灭,蜂鸣器关闭,循环往复。晶振频率为6MHz。

【解题思路】

同上一题类似,本题需要产生两个方波,一个频率为f

=1Hz周期T=1s,另一个频率为f=1kHz周期T=1ms。所以此题转化为由定时器产生0.5s和500定时的问题。【实现方法】(1)500定时:将T0设置为方式2,即自动重装初值的8位计数方式,并开放T0中断,在中断程序里对P2.7取反操作。(2)0.5s定时:将T1设置为方式1,完成100ms定时,并开放T1中断,在中断程序里设置一个“软时钟”,即一个CLOCK=30H内存单元,每中断一次,CLOCK加“1”,CLOCK累计5次(即0.5s),对P0.0取反操作。【解题步骤】(1)确定定时器T0、T1的初值N0、N1:由于晶振为6MHz,所以1个机器周期为2us。所以计数值

即应将06H送入TH0和TL0中。计数值

即应将3CH送入TH0、0B0送入TL0中。

(2)求T0的方式控制字

GATE=0,C/T=0,M1M0=10;求T1的方式控制字

GATE=0,C/T=0,M1M0=01;合并方式控制字为TMOD=00010010B=12H,即T0的方式2和T1的方式1;(3)本例设有3个中断,为了提高按键响应实时性,可将外部中断INT1为高优先级,并在INT1中断服务程序中设置T0、T1相关特殊功能寄存器。【实现程序】

ORG 0000H ;**************伪指令*************************

LED BIT P0.0 BUZZERBIT P2.7 CLOCKDATA 30H LJMP MAIN ;跳转至主程序;**************中断入口地址*************************

ORG0013H LJMPINT1_INT ;跳转至中断服务程序

ORG000BH LJMPT0_INT ;跳转至T0中断服务程序

ORG001BH LJMPT1_INT ;跳转至T1中断服务程序

… … ORG0100H

;**************中断初始化*************************

MAIN: SETB IT1 ;外中断采用下降沿触发

SETB EX1 ;允许中断

SETB PX1 ;为高优先级

SETB EA ;开总中断

SETB F0 ;按键切换标志,F0=1,;LED灭;F0=0,LED亮

… … ;继续执行主程序其他部分

SJMP$ ;等待中断;**************中断服务程序*************************

INT1_INT: CPL F0 ;不需保护现场

JNB F0,OPEN_T;F0=0,开放T0、T1中断

CLR TR0 ;关闭T0时钟

CLR ET0 ;关闭T0中断

CLR TR1 ;关闭T1时钟

CLR ET1 ;关闭T1中断

RETI ;中断返回

OPEN_T:MOV TH0,#06H;装入计数初值

MOV TL0,#06H MOV TH1,#3CH MOV TL1,#0B0H SETB TR0 ;启动T0时钟

SETB ET0 ;开放T0中断

SETB TR1 ;启动T1时钟

SETB ET1 ;开放T1中断

RETI;**************T0中断服务程序*************************

T0_INT: CPL BUZZER ;不需重新装入计数初值

RETI;**************T1中断服务程序*************************

T1_INT: PUSH ACC ;保护现场

PUSH PSW CLR TR1

MOVTH1,#3CH;重新装入计数初值

MOVTL1,#0B0H SETB TR1 INC CLOCK ;软时钟加1 MOV A,CLOCK CJNE A,#5,TMPLTMPL:JC RETURN ;不到0.5s返回

CPL LED ;到0.5s闪烁变换

MOV CLOCK,#0 ;软时钟清零

RETURN:POP PSW POP ACC RETI END【例4.6】用T1方式2计数,要求每计满100次,将P1.0端取反。【解题思路】:外部计数信号由T1(P3.5)引入,每跳变一次计数器加1,由程序查询TF1。【解题步骤】(1)确定定时器初值N:

N=256-100=156=9CH(2)确定T1方式控制字:

TMOD=60H源程序如下:

MOVTMOD,#60H;设置T1为方式2计数器

MOVTH1,#9CH;赋初值

MOVTL1,#9CH;

SETBTR1;启动计数器工作

DEL:JBCTF1,REP;查询是否计数溢出

AJMPDEL;

REP:CPLP1.0;若计数溢出,则输出取反

AJMPDEL4.3串行接口

4.3.1串行通信基本知识计算机与外部设备或计算机与计算机之间的数据交换称为通信。通信分为并行通信与串行通信两种基本方式。并行通信:将数据的各位用多条数据线同时进行传送,外加地址线和通信控制线。优点是传输速率高,缺点是长距离传输成本高,可靠性差,只适用于近距离传输。串行通信:将数据分成1位1位的形式在一条传输线上逐个地传送。优点是传输线少,长距离传送时成本低,缺点是传输速率低。

(a)并行通信方式(b)串行通信方式

图并行和串行通信方式1.串行通信的种类

根据数据传输方式的不同,可将串行通信分为同步通信和异步通信。

1)同步通信同步通信是一种数据连续传输的串行通信方式,通信时发送方把需要发送的多个字节数据和校验信息连接起来,组成数据块。发送时,发送方只需在数据块前插入1~2个特殊的同步字符,然后按特定速率逐位输出(发送)数据块内的各位数据。接收方在接收到特定的同步字符后,也按相同速率接收数据块内的各位数据。

典型的同步通信格式如下:

在这种通信方式中,数据块内的各位数据之间没有间隔,传输效率高;发送、接收双方必须保持同步(使用同一时钟信号),且数据块长度越大,对同步要求就越高。同步通信设备复杂,成本高,一般只用在高速数字通信系统中。同步字符1同步字符2N个字节的连续数据校验信息1校验信息22)异步通信异步通信是以字符帧为单位进行传输。每帧数据由4部分组成:起始位(占1位)、数据位(占5~8位)、奇偶校验位(占1位,也可以没有校验位)、停止位(占1或2位)。下图中给出的是8位数据位、1位奇偶校验位和1位停止位,加上1位起始位,共11位组成一个传输帧。

异步通信字符帧格式

发送方:传送时先输出起始位“0”作为联络信号,接下来的是数据位和奇偶校验位,停止位“1”表示一个字符的结束。其中,数据的低位在前,高位在后。字符之间允许有不定长度的空闲位。接收方:传送开始后,接收设备不断检测传输线的电平状态,当收到一系列的“1”(空闲位或停止位)之后,检测到一个“0”,说明起始位出现,就开始接收所规定的数据位和奇偶校验位以及停止位。异步通信的特点:所需传输线少;设备开销较小;在单片机控制系统中得到广泛的应用。但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。2.串行通信数据传输方向

根据串行通信数据传输的方向,可将串行通信系统传输方式分为:单工方式、半双工方式和全双工方式,如图所示。数据传输方式1)单工:数据传输仅能从发送设备传输到接收设备。2)半双工:两个串行通信设备之间只有一条数据线,数据传输可以沿两个方向,但需要分时进行。3)全双工:是指两个串行通信设备之间可以同时进行接收和发送。

3种方式中,全双工方式的效率最高;半双工方式配置和编程相对灵活,传输成本较低;串行通信设备常选用半双工方式。3.波特率数据的传输速率可以用波特率表示。波特率是信号每秒变化的次数,单位是:符号/s比特率是每秒传送二进制数的位数单位是:(bit/s或kbit/s)。如每秒传送240个字符,而每个字符格式包含10位这时的波特率为10位(bit)×240个/s=2400bit/s。在异步串行通信中,接收方和发送方应使用相同的波特率,才能成功传送数据。4.3.2MCS-51单片机串行接口及其控制MCS-51单片机内部有一个全双工异步串行I/O接口。MCS-51串行接口的内部简化结构如下图所示。

MCS-51串行接口结构图P3.0是串行数据接收RXD,P3.1是串行数据发送端TXD。串行接口的结构由串行接口控制电路、发送电路和接收电路3部分组成。发送电路由发送缓冲器(SBUF)、发送控制电路组成,用于串行接口的发送。接收电路由接收缓冲器(SBUF)、接收控制电路组成,用于串行接口的接收。缓冲寄存器SBUF分为:接收缓冲器SBUF和发送缓冲器SBUF,以便CPU能以全双工的方式进行通信。它们在物理上是隔离的,但是占用同一地址(99H)。接收方式下,串行数据从RXD引脚输入,串行口内部在接收缓冲器之前接有移位寄存器,它们共同构成了串行接收的双缓冲结构,可以避免在数据接收过程中出现帧重叠错误,所谓帧重叠是在下一帧数据来时,前一帧数据还没有被读走。在发送方式,串行数据通过TXD引脚输出。

波特率发生器:主要由T1、T2及内部的一些控制开关和分频器所组成。它为串行口提供时钟信号,即TXCLK(发送时钟)和RXCLK(接收时钟),相应的控制波特率发生器的特殊功能寄存器有TMOD、TCON、T2CON、PCON、TL1、TH1、TL2、TH2等。串行口进行数据接收和发送的控制流程如图所示。2.串行口控制与实现相关功能的寄存器1)串行数据缓冲器(99H)发送缓冲器:只管发送数据,CPU写入SBUF的时候

(MOVSUBF,A)即为发送;接收缓冲器:只管接收数据,CPU读取SBUF的过程

(MOVA,SUBF)即为接收。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。所以可同时发送数据、接收数据。对于发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。接收缓冲器是双缓冲结构,以避免在接收下一帧数据之前,CPU未能及时响应接收器的中断,没有把上一帧数据读走,就会丢失前一个字节的内容。2)串行接口控制寄存器SCON(98H)

用于控制串行接口的工作状态,其格式如下:位D7D6D5D4D3D2D1D0字节地址SCONSM0SM1SM2RENTB8RB8TIRI98H位地址9FH9EH9DH9CH9BH9AH99H98H(1)SM0和SM1:用于设置串行接口的工作方式,2位可选择4种工作方式,如所示。其中,UART是通用异步接收和发送器的英文缩写,是晶振频率。串行接口的工作方式设置

SM0SM1方

式功能说明波特率000移位寄存器

/120118位UART可变1029位UART

1139位UART可变(2)REN:允许串行接收位。由软件置位或清零。REN=1时,串行接口允许接收数据;REN=0时,则禁止接收。(3)TB8:在方式2或方式3中,是发送数据的第9位。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。(4)RB8:在方式2或方式3中,是接收到数据的第9位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。(5)TI:发送中断标志位。由内部硬件使TI置“1”,向CPU发中断申请。必须用软件将其清“0”,取消此中断申请。(6)RI:接收中断标志位。由内部硬件使RI置“1”,向CPU发中断申请。必须用软件将其清“0”,取消此中断申请。(7)SM2:为多机通信控制位,主要用于方式2和方式3。通过控制SM2,可以实现多机通信。3)电源控制寄存器PCON(97H)

其中只有1位SMOD与串行接口工作有关,格式如下:(1)SMOD:波特率系数控制位。在串行接口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率加倍,否则不加倍。复位时,SMOD=0。

PCON的地址为97H,不能位寻址,需要字节传送。

位D7D6D5D4D3D2D1D0字节地址PCONSMOD97H串行接口可由SCON中的SM0、SM1设置4种工作方式。1方式0:同步移位寄存器的输入/输出方式串行接口为同步移位寄存器的输入/输出方式,而不是通信方式,可外接移位寄存器,用于扩展并行I/O接口。注意:数据都由RXD(P3.0)引脚输入或输出,TXD引脚总是用于输出同步移位脉冲。发送和接收均为8位数据,低位在先,高位在后。波特率固定为/12。4.3.3串行口的工作方式2)方式0输出方式0时输出时序如下图所示。

图方式0输出时序当执行任何一条写SBUF的指令时,就启动了串行接口的发送过程(如MOVSBUF,A)。内部的定时逻辑在SBUF写入数据之后,经过一个完整的机器周期,输出移位寄存器中输出位的内容送RXD引脚输出;移位脉冲由TXD引脚输出,它使RXD引脚输出的数据移入外部移位寄存器。当数据的最高位D7位移出后,停止发送数据和移位脉冲,就完成了1B的输出,并把中断标志(TI)置“1”。如要再发送下一字节数据,必须用软件先将TI清“0”。3)方式0输入方式0时输入时序如下图所示。当SCON中的接收允许位REN=1和RI=0时,就会启动一次串行接口接收过程。串行数据从RXD引脚输入,移位脉冲由TXD引脚输出。当接收完一帧数据后,由硬件将输入移位寄存器中的内容写入SBUF,并把中断标志(RI)置“1”。如要再接收数据,就再用软件将RI清“0”。方式0时输入时序如下图所示。

图方式0输入时序2.方式1:波特率可变的8位数据的异步通信接口。帧结构:10位UARTTXD为数据发送引脚,RXD为数据接收引脚。传送1帧数据为10位,其中,1位起始位(0),8位数据位(低位在先),1位停止位(1)。方式1的波特率由定时器(T1)的溢出率和SMOD的状态决定。…起始D0D1D2D3D4D5D6D7停止1)方式1输出:方式1的发送时序如下图所示。

方式1的发送时序执行一条写SBUF的指令就启动了发送过程。在发送移位时钟的作用下,从TXD引脚先送出起始位(0),然后是8位数据位,最后是停止位(1)。1帧10位数据发送完后,将中断标志(TI)置“1”,向CPU申请中断。如要再发送下一字节数据,必须用软件先将TI清“0”。2)方式1输入软件使REN=1和RI=0时,就启动了接收过程。接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,说明起始位有效,将其移入输入移位寄存器,并开始接收这1帧信息的其余位。接收过程中,将每个数据位宽度分成16个状态,并在中间的第7、8、9状态时对RXD采样,采样数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位为“1”)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。如要再接收数据,就再用软件将RI清“0”。图

方式1的接收时序3方式2和方式3:9位数据的异步通信接口。帧结构:11位UARTTXD为数据发送引脚,RXD为数据接收引脚。传送1帧数据为11位。其中1位起始位(0),然后是8位数据位(低位在先),第10位是SCON中的TB8或RB8,最后1位是停止位(1)。方式2的波特率固定为晶振频率的1/64或1/32,方式3波特率由定时器(T1)的溢出率和SMOD的状态决定。…起始D0D1D2D3D4D5D6D7D8停止1)方式2和方式3输出

CPU向SBUF写入数据时,就启动了发送过程。SCON中的TB8写入输出移位寄存器的第9位,8位数据装入SBUF。发送开始时,先把起始位0输出到TXD引脚,然后是9位数据位,最后是停止位(1)。1帧11位数据发送完后,将中断标志(TI)置“1”,向CPU申请中断。如要再发送下一字节数据,必须用软件先将TI清0。2)方式2和方式3输入软件使REN=1和RI=0时,就启动了接收过程。接收器就以所选频率的16倍速率开始采样RXD引脚的电平状态,当检测到RXD引脚发生负跳变时,说明起始位有效,将其移入输入移位寄存器,开始接收这1帧数据。接收时,将每个数据位宽度分成16个状态,并在中间的第7、8、9状态时对RXD采样,采样数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的第9位数据为“1”)时,接收到的数据装入接收缓冲器和RB8(接收数据的第9位),置RI=1,向CPU请求中断。如要再接收数据,就再用软件将RI清“0”。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。4.波特率的计算串行通信双方对发送或接收数据的波特率事先要约定好保持一致。MCS-51单片机的波特率设置与工作方式有关,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率和SMOD的状态决定。各种方式的波特率计算由以下公式确定:方式0的波特率=/12

方式2的波特率=(2SMOD/64)·

方式1的波特率=(2SMOD/32)·(T1溢出率)

方式3的波特率=(2SMOD/32)·(T1溢出率)当T1作为波特率发生器时,常使T1工作在自动重装初值的8位定时器方式,并禁止T1中断。这种方式可避免重新设定定时初值而产生波特率误差。TH1从初值计数到产生溢出,它每秒溢出的次数称为溢出率。

T1溢出率=1/{12×[256-(TH1)]}在单片机的应用中,相同机种单片机的波特率很容易达到一致,只要晶振频率相同,可以采用完全一致的设置参数。异机种单片机的波特率设置较难达到一致,这时的设计原则应使两个通信设备之间的波特率误差小于2.5%。常用的串行接口波特率、晶振频率以及各参数的关系如下表所示。表常用波特率、晶振频率与定时器(T1)的参数关系串口工作方式及波特率/(bit/s)fosc/MHzSMOD定时器(T1)

C/T工作方式初值方式01MHz12无关方式2375kHz121无关方式1方式362.5kHz12102FFH19.2kHz11.0592102FDH9600Hz11.0592002FDH4800Hz11.0592002FAH2400Hz11.0592002F4H1200Hz11.0592002E8H1.多机通信原理

串行口控制寄存器SCON中的SM2为多机通信接口控制位。串行口以方式2或3接收时,若SM2为1,则仅当接收到的第9位数据RB8为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论