《单片机第四章定时器串行口及中断系统电子教案》由会员分享,可在线阅读,更多相关《单片机第四章定时器串行口及中断系统电子教案(116页珍藏版)》请在金锄头文库上搜索。
1、单片机第四章定时器串行单片机第四章定时器串行口及中断系统口及中断系统 定时定时/计数器计数器(Timer/Counter)是单片机的一个重要组成部分,在实际的应用中,通过定时或计数可以实现很多重要的功能。 单片机应用系统中,经常需要和其它计算机进行数据通信。MCS-51片内设立了一个可编程的全双工串行通信接全双工串行通信接口口,可作为通用异步接收/发送器UART,也可作为同步移位寄存器。 中断中断是指CPU正在处理某任务的过程中,由于计算机系统内、外的某种原因,发生的某一事件请求CPU及时处理,于是CPU暂时中止当前的工作,自动转去处理所发生的事件。处理完该事件后,再返回到原来被中止的断点处继
2、续工作,这样的过程称为中断。4.1 MCS-51单片机的中断系统单片机的中断系统4.1.1 中断的概念中断的概念4.1.1.1 中断系统的基本概念中断系统的基本概念 中断是指CPU正在处理某任务的过程中, 由于计算机系统内、外的某种原因,发生的某一事件请求CPU及时处理,于是CPU暂时中止当前的工作,自动转去处理所发生的事件。处理完该事件后,再返回到原来被中止的断点处继续工作,这样的过程称为中断中断。 当CPU正在处理一个中断请求的时候,外部又发生了一个优先级比它高的中断事件,请求CPU及时处理。于是,CPU暂时中断当前的中断服务工作,转而处理所发生的事件。处理完毕,再回到原来被中断的地方,继
3、续原来的中断处理工作。这样的过程,称为中断嵌套中断嵌套,这样的中断系统称为多级中断系统。MCS-51具有2个中断优先级,可以实现2级中断嵌套。与中断相关的名词介绍如下:(1)中断系统:)中断系统:实现中断功能的硬件系统和软件系统统称为中断系统(2)中断源:)中断源:产生中断的请求源称为中断源。(3)中断请求:)中断请求:中断源向CPU提出的处理请求,称为中断请求或中断申请。(4)中断响应过程:)中断响应过程:CPU暂时中止自身的事物,转去处理事件的过程,称为CPU的中断响应过程。(5)中断服务:)中断服务:对事件的整个处理过程,称为中断服务(或中断处理)。(6)中断返回:)中断返回:中断处理完
4、毕,在返回到原来被中止的地方,称为中断返回。4.1.2.2中断系统的优势中断系统的优势 中断系统是计算机的重要组成部分,中断的使用消除了CPU在查询方式中的等待现象,大大提高了CPU的工作效率,改善了计算机的性能,具体表现在以下几个方面:(1)有效地解决了快速CPU与慢速外设之间的通信矛盾,可使CPU与多个外设并行工作,大大提高了工作效率。(2) 在实时控制系统中,外设对CPU的服务请求是随机的。中断系统可以及时处理控制系统中许多随机产生的数据与信息,使系统具备实时处理的能力,提高了控制系统的性能。(3) 系统工作时会出现一些如电源断电之类的突发故障,中断系统可以使故障发生时自动运行处理程序,
5、系统具备了处理故障的能力,提高了系统自身的可靠性。4.1.2 MCS-51中断系统的结构及中断控制中断系统的结构及中断控制4.1.2.1 MCS-51中断系统结构中断系统结构MCS-51中断系统的结构如图所示:MCS-51的中断系统有5个中断源(MCS-52有 6个),2个优先级。5个中断源分别为:(1)2个外部中断请求:外部中断0 ()、外部中断1(),分别由从P3.2、 P3.2引脚引入,低电平有效、脉冲下降沿有效可选。(2)2个片内定时器/计数器溢出中断请求:定时器/计数器0溢出中断(T0)、定时器/计数器1溢出中断(T1),分别在定时器T0、T1溢出时发出中断申请。(3)串行中断(TX
6、D/RXD),一次串行发送/接收完成后,发出中断申请。5个中断均可由软件设定为允许中断或禁止中断。4.1.2.2 MCS-51中断控制中断控制1、 中断允许控制中断允许控制CPU对中断系统所有中断,以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。IE字节地址A8H,位地址为AFHA8H,IE位结构如下表所示:位地址位地址AFHAFHACHACHABHABHAAHAAHA9HA9HA8HA8H位名称位名称EAEAESESET1ET1EX1EX1ET0ET0EX0EX0各位的含义如下: EX0(IE.0)外部中断0允许位。EX0=0,禁止外部中断0中断;EX0=1允许外部中断0中断。 ET
7、0(IE.1)定时/计数器T0中断允许位。ET0=0,禁止T0中断;ET0=1,允许T0中断。 EX1(IE.2)外部中断1允许位。EX1=0,禁止外部中断1中断;EX1=1,允许外部中断1中断。 ET1(IE.3)定时/计数器T1中断允许位。ET1=0,禁止T1中断;ET1=1,允许T1中断。 ES(IE.4)串行口中断允许位。ES=0,禁止串行口中断;ES=1允许串行口中断。 EA (IE.7)CPU中断允许(总允许)位。EA=0,屏蔽所有的中断请求;EA=1,开放中断。 通过EA可以使中断允许形成两级控制,即各中断源首先受EA位的控制其次受各中断源各自的中断允许控制位控制(IE低5位)。
8、2、中断优先级控制、中断优先级控制 MCS-51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄中断优先级寄存器存器IP中的相应位的状态来规定的,相应位置“1”,为高优先级。相应位置“0”,为低优先级。中断优先级控制寄存器IP的字节地址B8H,位地址BFHB8H,。IP位结构如下表所示:位地址位地址BCHBCHBBHBBHBAHBAHB9HB9HB8HB8H位名称位名称PSPSPT1PT1PX1PX1PT0PT0PX0PX0各位的含义如下: PX0(IP.0):):外部中断0优先级控制位. PT0(IP.1):):定时/计数器T0优先级控制位. PX1
9、(IP.2):):外部中断1优先级控制位. PT1(IP.3):):定时/计数器T1优先级控制位. PS(IP.4):):串行口优先级控制位.对同时发生多个中断申请时CPU按以下原则处理: 不同优先级的中断同时申请先高后低 相同优先级的中断同时申请事先规定 正处理低优先级中断又接到高级别中断停低转高 正处理高优先级中断又接到低级别中断高不理低 同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如下表所示: 中断源中断源优先先级外部中断0()高定时/计数器(T0)外部中断1()定时/计数器(T1)串行口低3 3、 中断
10、标志与方式控制寄存器中断标志与方式控制寄存器MCS-51单片机的5个中断源的中断请求信号分别锁存在特殊功能寄存器TCON和SCON中。1)TCONTCON为定时/计数器控制寄存器,字节地址为88H,其中的中断源请求标志位如下表所示:位地址位地址8FH8FH8DH8DH8BH8BH8AH8AH89H89H88H88H位名称位名称TF1TF1TF0TF0IE1IE1IT1IT1IE0IE0IT0IT0各位的含义如下: 定时器定时器/计数器计数器T1的溢出中断请求标志位(的溢出中断请求标志位(TF1):):当启动T1计数后,如果T1计数器产生溢出,会由硬件使TF1置1,向CPU发中断请求。如果CPU
11、响应中断请求,会自动由硬件将TF1清零。 定时器定时器/计数器计数器T0的溢出中断请求标志位(的溢出中断请求标志位(TF0):):含义与TF1相同。 外部中断外部中断1的中断请求标志(的中断请求标志(IE1):):如果检测到外部中断引脚P3.3上存在有效的中断请求信号,就由硬件将IE1置1。如果CPU响应该中断请求,则自动由硬件将IE1清零。 外部中断外部中断0的中断请求标志位(的中断请求标志位(IE0):):其含义与IE1类同。 外部中断外部中断1的中断触发方式控制位(的中断触发方式控制位(IT1):):IT1为1时,外部中断1为边沿触发方式,若CPU检测到外部中断1的引脚P3.3有由高到低
12、的跳变,就使IE1置1,请求中断。IT1为0时,外部中断1为电平触发方式,若CPU检测到外部中断1的引脚P3.3为低电平,则使IE1置1,请求中断;如果P3.3为高电平,则使IE1置0。 外部中断外部中断0的中断触发方式控制位(的中断触发方式控制位(IT0):):其含义与IT1类同。2、SCON两个串行口发送接收中断标志占用了SCON寄存器中的2位(TI和RI)。SCON是串行口控制寄存器,字节地址为98H。SCON寄存器的位格式如下表所示:位位地地址址9999H H9898H H位位名名称称RIRITITI各位的含义如下: 串行口内部串行口内部发送发送中断请求标志位(中断请求标志位(TI):
13、):当串行口发送完一个字符后,由内部硬件使发送中断标志TI置位。产生中断请求标志,CPU响应中断时,并不复位TI,TI必须由用户在中断服务程序中用软件清0(如:CLR TI )。 串行口内部串行口内部接收接收中断请求标志位(中断请求标志位(RI):):当串行口接收到一个字符后,由内部硬件使接收中断请求标志位RI置位。产生中断请求标志,同样CPU响应中断时,并不复位RI,RI必须由用户在中断服务程序中用软件清0(如:CLR RI ) 。4.1.2.3 MCS-51中断响应及中断处理过程中断响应及中断处理过程CPU响应中断的条件包括:(1) 中断源有请求,CPU开中断(即IE的EA=1,中断允许寄
14、存器IE相应位置1)。满足这个条件后,单片机CPU在每个机器周期对所有中断源进行检测,并可在任1个周期的S6期间,找到所有有效的中断请求,对其按优先级排队。(2) 无同级或高级中断正在处理。(3) 现行指令执行到最后1个机器周期且已结束。(4) 若现行指令为访问IE、IP的指令或RETI(中断返回指令),则要求该指令和紧随其后的另一条指令也已执行完毕。1、 MCS-51中断矢量表中断矢量表中断矢量指示中断源的入口地址,CPU一旦响应中断,中断服务程序便从中断矢量地址开始执行。MCS51中断系统的各个中断的中断矢量地址如下 中断源中断源中断矢量地址中断矢量地址外部中断0()0003H定时器T0中
15、断000BH外部中断1()0013H定时器T1中断001BH串行口中断0023H2、 MCS-51中断响应的过程中断响应的过程 如果满足中断响应的条件,单片机CPU便在紧接着中断申请的下1个机器周期的S1期间响应中断,否则,将丢弃中断查询的结果。1)CPU响应中断的操作步骤:响应中断的操作步骤:(1)将程序计数器PC的内容(断点地址)压入堆栈。(2)将相应的中断矢量地址(或中断入口地址)装入程序计数器PC,转入相应的中断服务程序,进行中断处理。(3)中断服务程序结束位置,执行一条RETI指令,将堆栈中的断点地址恢复到PC程序计数器中,使程序恢复到断点发生处继续执行。2)中断撤销)中断撤销 在中
16、断服务程序结束之前应撤销中断请求,否则返回后将再一次引起中断。 对于某些中断,中断响应后,计算机将自动清除有关的中断标志位。如:定时器溢出标志TF0,TF1,以及边沿触发方式下的外部中断标志IE0、IE1; 而有些中断标志位不会自动清除,由用户在中断服务程序中软件清除,如:串行口的发送和接收标志TI和RI。 对于电平触发方式下的外部中断标志IE0和IE1,根据INT0和INT1的电平变化,CPU无法直接干预,必须由外部设置硬件清除。3)现场保护)现场保护 MCS-51单片机响应中断后,只保护断点而不保护现场。 所谓的现场,是指如:累加器A、程序状态字PSW、工作寄存器Rn等寄存器在发生中断时的
17、值。 当在中断服务程序中需要使用这些寄存器时,应该在使用之前先将所需要使用的寄存器的内容压栈,在结束中断服务程序之前再将这些寄存器的内容恢复出来,这也就是现场保护。 现场保护时要注意入栈和出站的顺序,要保证一一对应,“对称”使用。否则容易造成现场破坏,甚至使程序发生“紊乱”。4)中断响应时间)中断响应时间MCS-51单片机响应时序如下图所示:最短响应时间:若M1周期的S5P2前某中断生效,在S5P2期间其中断请求被锁存到相应的标志位中去;M2恰逢指令的最后一个机器周期,且该指令不是RETI或访问IE、IP的指令。于是,M3和M4便可以执行硬件LCALL指令,M5周期将进入了中断服务程序。因此,
18、 MCS-51的中断响应时间(从标志置1到进入相应的中断服务),至少要3个完整的机器周期。最长响应时间:若中断查询时,正在执行RETI或者访问IE或IP指令的第1个机器周期,这样查询到中断需要2个机器周期。根据前面分析,我们知道,这种情况下的中断申请,需要在执行完指令后的一条指令时才能响应中断,如果这条指令是乘除指令,则需要4个机器周期,另外,响应中断时,还需要执行2个机器周期的断点保护,因此, MCS-51的中断响应时间(从标志置1到进入相应的中断服务),最长要用2+4+2=8个完整的机器周期。 5)中断服务程序)中断服务程序 由于两个中断源的入口矢量地址之间仅仅相隔8个单元,很难容纳下一个
19、中断服务子程序。所以,首先需要在中断入口地址单元处放一条无条件转移指令,使程序跳转到存储器的某个空间去,在这个空间中放置功能完善的中断服务程序。 由于51在响应中断时,只是自动保存了断点,所以系统的状态寄存器PSW、工作寄存器,SFR寄存器的保护和恢复必须由用户自己在中断服务子程序中安排。另外,在保护现场和恢复现场之前应当关闭中断,以保证在保护和恢复现场的时候CPU不去响应新的中断请求,从而使得现场数据的正确性不受到影响。当然,为了使系统在执行某个中断服务子程序的时候能够响应更高级的中断,应当在保护现场和恢复现场之后打开中断。【例【例4.1】若规定外部中断1为边沿触发方式,高优先级,在中断服务
20、程序中将寄存器B的内容进行半字节交换,B的初值设为21H。试编写主程序与中断服务程序。ORG 0000H LJMP MAIN ORG 0013H ;中断矢量 LJMP INTS ORG 0030HMAIN:SETB EA ;总中断允许“开” SETB EX1 ;外部中断1允许“开” SETB PX1 ;设置为高优先级 SETB IT1 ;边沿触发方式 MOV B,#21H ;给 B 寄存器赋初值HERE:SJMP HERE ;原地等待中断申请INTS: MOV A,B ;自B寄存器中取数 SWAP A ;半字节交换 MOV B,A ;存回B RETI ;中断返回 思考思考: :此例中中断服务程
21、序是否可以直接安排在中断服务入口此例中中断服务程序是否可以直接安排在中断服务入口? ?【例【例4.2】电路结构如下图所示,要求每次按动按键,使外接发光二极管LED改变一次亮灭状态,输入按键信号,P1.0输出改变LED状态,对于外部中断,可以有两种方式:边沿触发方式和电平触发方式。这里分两种情况分别介绍。(1)边沿触发方式:)边沿触发方式:每次按键K1按下,产生的一次跳变,引起一次外部中断0请求,在外部中断0服务程序中,将P1.0的输出状态反转,为了避免开关抖动引起的多次中断可以考虑利用软件延时或者硬件去抖动法。ORG 0000H ;复位入口 AJMP MAINORG 0003H ;中断入口AJ
22、MP PINT0ORG 0100H ;主程序MAIN:MOV SP,#40H ;设栈底SETB EA ;开总允许开关SETB EX0 ;开INT0中断SETB IT0 ;负跳变触发中断H: SJMP H ;等待(执行其它任务)ORG 0200H ;中断服务程序PINT0:CPL P1.0 ;改变LEDLCALL Delay10ms;软件延时去开关抖动 RETI ;返回主程序(2) 电平触发:电平触发: 为了避免一次按键引起多次中断响应,应该在每次按键按下引起的中断服务程序中执行完P1.0的电平反转后先不退出中断服务程序,而是利用软件等待按键释放,按键释放后才结束中断服务程序。ORG 0000H
23、 ;复位入口AJMP MAINORG0003H ;中断入口AJMP PINT0ORG0100H ;主程序MAIN: MOV SP,#40H ;设栈底SETB EA ;开总允许开关SETB EX0 ;开INT0中断CLR IT0 ;低电平触发中断H: SJMP H ;等待(执行其它任务)ORG 0200H ;中断服务程序PINT0:CPL P1.0 ;改变LEDWAIT: JNB P3.2,WAIT;等按键释放RETI ;返回主程序4.2 MCS-51单片机片内定时器单片机片内定时器/计数器计数器4.2.1 定时器定时器/计数器的结构及基本原理计数器的结构及基本原理4.2.1.1 定时器定时器/
24、计数器的结构及其工作原理计数器的结构及其工作原理MCS-51单片机的定时/计数器的结构如下图所示。 MCS-51单片机内部有两个16位的可编程定时/计数器,称为定时器定时器0 0(T0)和定时器定时器1 1(T1)。定时器0由两个8位专用寄存器TH0(作T0的高8位)和TL0(作T0的低8位)组成,定时器1由两个8位专用寄存器TH1和TL1组成。 定时/计数器本质上是加本质上是加1 1计数器计数器,加1计数器的初值可以由程序设定,设置的初值不同,定时的时间或计数值就不同。可以通过软件设置定时/计数器为定时工作方式定时工作方式和计数工作方式计数工作方式。 当定时/计数器设置为定时工作方式定时工作
25、方式时,加1计数器对对内部机器周期计数内部机器周期计数,每个机器周期计数器加1,直至计满溢出,发出定时器溢出中断请求信号。这时,定时器的计数频率是片内振荡器频率的十二分之一,计数值N乘以机器周期Tcy就是定时时间t。 当定时/计数器设置为计数工作方式计数工作方式时,加1计数器对对来自输入引脚来自输入引脚T0T0(P3.4P3.4)和)和T1T1(P3.5P3.5)的外部脉冲信号计)的外部脉冲信号计数数,在每个机器周期的S5P2期间采样外部脉冲,若前一个机器周期采样到高电平,后一个机器周期采样到低电平,则将触发计数器加1,更新的计数值将在下一个机器周期的S3P1期间装入计数器。因此,单片机检测一
26、个从高电平到低电平的下降沿需要2个机器周期,要使下降沿能被检测到,就得保证被采样高、低电平分别至少维持一个机器周期的时间,即外部输入信号的频率不超过晶振频率的外部输入信号的频率不超过晶振频率的1/241/24。如:当晶振频率为12MHz时,最高计数频率不超过0.5MHz,即计数脉冲的周期要大于2微秒。4.2.1.2 定时定时/计数器的工作方式寄存器和控制寄存器计数器的工作方式寄存器和控制寄存器 MCS-51单片机的可编程定时/计数器,除了具有计数寄存器THx和TLx以外,还有两个寄存器TMOD和TCON用来控制其工作模式或者反映其工作状态。1.1.工作方式寄存器工作方式寄存器TMODTMOD
27、TMOD为定时/计数器T0、T1的工作方式控制寄存器,字节地址89H,只能按字节对它寻址只能按字节对它寻址。TMOD的位结构如下表所示:位位D7D6D5D4D3D2D1D0TMODGATEM1M0GATEM1M0GATE C/ T M1 M0 GATEM1C/ TM0定时器定时器T1 定时器定时器T0TMOD(89H) D7 D6 D5 D4 D3 D2 D1 D0工作模式寄存器工作模式寄存器TMOD的位定义的位定义 TMOD各位定义及具体的意义各位定义及具体的意义GATE:门控位,决定定时器/计数器的启动开关信号(图中的K2)是否受外部中断请求信号的影响。 GATE=0,只要用软件使TR0(
28、或TR1)置1就可以启动定时器,而不管INT0(或INT1)的电平是高还是低。 GATE=1,只有INT0(或INT1)引脚为高电平且由软件使TR0(或TR1)置1时,才能启动定时器工作。 门控位对定时计数器启动开关信号的控制作用如下图所示:C/T C/T :定时或计数功能选择位 当C/TC/T=1时为计数方式;当C/TC/T=0时为定时方式。M1、M0:定时器/计数器工作方式选择位,其值与工作方式对应关系如下表所示。 系统复位时,寄存器TMOD的所有位被清零。 M1M1M0M0工作方式工作方式功功 能能 说 明明00方式013位计数器01方式116位计数器10方式2自动重装8位计数器11方式
29、3定时器T0分成两个8位计数器,T1停止工作2. 2. 控制寄存器控制寄存器TCONTCON TCON是定时/计数器T0、T1的控制寄存器,字节地址88H,可以位寻址可以位寻址,TMOD的位结构如下表所示:各位的含义如下:TF1:定时器1溢出标志位。当定时器1计满数产生溢出时,由硬件自动置TF1为1,(在允许中断的情况下)向CPU发出中断请求信号。如果CPU响应中断则转向中断服务程序,硬件自动将该位清零。在中断屏蔽时,CPU不响应中断无法用硬件将该位清零,可以用软件对其清零。位8FH8EH8DH8CH8BH8AH89H88HTCONTF1TF1TR1TR1TF0TF0TR0TR0IE1IT1
30、IE0IT0TR1:定时器1运行控制位。使用软件编程将TR1置1或清0可以控制定时/计数器的启动与关闭。但是当GATE1,需要同时满足 为高电平的条件,将TR1置1才会启动定时器1。TF0:定时器0溢出标志位。其功能及操作情况同TF1。TR0:定时器0运行控制位。其功能及操作情况同TR1。 TCON中的低4位IT0、IE0、IT1、IE1与中断有关,已经在上一节介绍过。 在系统复位时,寄存器TCON的所有位被清零。4.2.2 定时器定时器/计数器的四种工作方式计数器的四种工作方式 MCS-51单片机的定时器/计数器有4种工作方式,分别由TMOD寄存器中的M1、M0两位的二进制编码所决定,这里对
31、这4种工作方式进行具体介绍。4.2.2.1 方式方式0及其用法及其用法 当M1 M0=00时,定时器/计数器设定为工作方式0,这时为1313位位的定时/计数器。其逻辑结构如下图所示。 在方式0下,T0和T1工作在13位的定时/计数器方式,计数器的这13位由THx的8位作高8位和TLx的低5位作低5位组成。当TLx(x=0或1)的低5位计数溢出时就向高8位THx进位,THx溢出时,置位TCON中的TFx标志,向CPU发出中断请求,当单片机进入中断服务程序时,由内部硬件自动清除该标志。 当 =0时(定时方式),多路开关与片内振荡器的12分频输出相连,工作在定时工作方式。其定时时间为:(213定时器
32、初值)机器周期 根据上面的公式可以在已知定时时间的情况下求出所要设定的定时器初值。 当 =时(计数方式),多路开关与T0(P3.4)或T1(P3.5)相连,外部计数脉冲由引脚输入,工作在计数工作方式。当检测到外部信号电平发生从到跳变时,计数器加1。 设x为计数器初值,则外部脉冲计数值为 N=213x=8192x, x=8191时为最小计数值1,x=0时为最大计数值8192,即计数范围为18192。 【例例4.3】定时器T0工作在方式0下最大的计数周期是多少?利用定时器T0的方式0产生定时脉冲,要求每隔5ms产生宽度为2个机器周期的正脉冲,由P1.0输出此定时序列脉冲信号(设时钟频率为12MHZ
33、)。解:解:由于时钟频率为12MHZ,所以,机器周期为1s。T0工作在方式0下最大的计数周期是:tmax=(8192-T0初值) 机器周期=(8192-0) 1s=8.192ms为了产生周期为5ms的定时周期,先计算出定时器T0初值。因为:t=(8192-T0初值) 机器周期所以,当t=5ms时,则:(8192-T0初值) 1s=5ms解得:T0初值=3192=0 1100 0111 1000B, 其中将高8位 0110 0011B=63H 赋给TH0, 低5位 1 1000B=18H 赋给TL0。 参考程序如下:方法一:采用查询工作方式,编程如下:ORG 0000HAJMP MAINORG
34、0100HMAIN: CLR P1.0MOV TMOD , #00H ;设定T0的工作方式MOV TH0 , #63H ;给定时器T0送初值MOV TL0 , #18HSETB TR0 ;启动T0工作LOOP: JNB TF0 , $ ;$为当前指令指针地址CLR TF0SETB P1.0 ;产生2个机器周期的正脉冲NOPCLR P1.0MOV TH0 , #63H ;重装载TH0和TL0MOV TL0 , #18HSJMP LOOPEND方法二:采用中断工作方式,编程如下:ORG 0000HAJMP MAINORG 000BHAJMP T0INTORG 0100HMAIN: CLR P1.0
35、MOV TH0 , #63H ;给定时器T0送初值MOV TL0 , #18HMOV IE , #82H;开放T0中断与中断总开关SETB TR0;启动T0SJMP $ORG 0300H ;中断服务程序T0INT: SETB P1.0;产生2个机器周期的正脉冲NOPCLR P1.0MOV TH0 , #63H ;重装载TH0和TL0MOV TL0 , #18HRETI 4.2.2.2 方式方式1及其用法及其用法 当M1M0=01时,定时器/计数器设定为工作方式1,这时由THx作为高8位、TLx作为低8位,组成了16位定时器/计数器。方式1除了计数位数与方式0不同外,其它均与工作方式0相同。方式
36、1逻辑结构如图所示在定时模式下定时时间为:(216定时器初值)机器周期计数模式请读者结合方式0,自己分析,这里不再重复。【例例4.4】定时器T0工作在方式1下最大的计数周期是多少?用定时器T0的方式1产生50HZ的方波,由P1.0输出此方波(设时钟频率为12MHZ)。解:解:由于时钟频率为12MHZ,所以,机器周期为1s。T0工作在方式1下最大的计数周期是:tmax=(216-T0初值)机器周期=(65536-0) 1s=65.536ms由于50HZ的方波周期为20ms,可以用定时器产生10ms的定时,每隔10ms改变一次P1.0的电平,即可得到50HZ的方波。此时,应使定时器T0工作在方式1
37、。工作在方式1时的T0初值,根据下式计算:t=(65536-T0初值) 机器周期=10ms解得:T0初值=55536= 11011000 11110000B=D8F0H,其中将高8位D8H赋给TH0,低8位F0H赋给TL0。采用中断工作方式,编程如下:ORG 0000HAJMP MAINORG 000BHAJMP T0INTORG 0100HMAIN: MOV TMOD , #01HMOV TH0 , #0D8HMOV TL0 , #0F0HMOV IE , #82H ;开放T0中断与中断总开关SETB TR0SJMP $ORG 0300H ;中断服务程序T0INT: CPL P1.0MOV
38、TH0 , #0D8HMOV TL0 , #0F0HRETI4.2.2.3 方式方式2及其用法及其用法 当M1M0=10时,定时器/计数器设定为工作方式2。其逻辑结构如图所示。 定时/计数器工作方式2具有自动重装载功能自动重装载功能。工作方式0和工作方式1的最大缺点就是计数溢出后,计数器为0,因而在循环定时或循环计数应用时就存在需反复用软件向THx和TLx预置计数初值的问题,给程序设计带来不便,同时也会影响计时精度,工作方式2就针对这个问题而设置的。 在工作方式2中,16位计数器分为两部分,即以TLx作为8位计数器进行计数,以THx保存8位初值并保持不变,作为预置寄存器,初始化时把相同的计数初
39、值分别加载至TLx和THx中,当计数溢出时,不需再像方式0和方式1那样需要由软件重新赋值,而是由硬件自动将预置寄存器THx的8位计数初值重新加载给TLx,继续计数,不断循环。 除能自动加载计数初值之外,方式2的其他控制方法同方式0类似。 方式2的定时时间为:(28定时器初值)机器周期计数模式请读者结合方式0,自己分析,这里不再重复。 【例【例4.5】定时器T1工作在方式2下最大的计数周期是多少?用定时器T1的方式2从P1.0 脚输出频率=1KHz方波(设时钟频率为6MHZ)。分析:fosc= 6MHz ,1机器周期 =2s 1KHz方波周期 =1ms, 半个方波周期=500s (28定时器初值
40、)机器周期=定时时间 (256X) 2s= 500s 计算初值:X=6 T1工作在方式1下最大的计数周期(晶振频率为6MHZ)是:tmax=(28-T0初值)机器周期=(256-0) 2s=512s采用中断工作方式,编程如下:ORG 0000HAJMP MAINORG 001BH ;T1的中断矢量CPL P1.0 ;中断服务:P1.0取反RETI ORG 0030H ;中断返回MAIN: MOV TMOD,#20H ;选T1方式2MOV TH1, #6 ;赋重装值MOV TL1, #6 ;赋初值SETB ET1 ;开T1中断SETB EA ;开总中断SETB TR1 ;启动T1HERE: AJ
41、MP HERE ;原地等待中断END【例【例4.6】 利用T0的工作方式2扩展一个外部中断源。解:将T0设置为计数器方式,按方式2工作,TH0、TL0的初值均为0FFH,T0允许中断,CPU开放中断。这样每来一个脉冲,都将产生一次计数中断,类似于外部中断。在定时计数器中断服务程序中编写该外部中断的服务内容即可。参考程序如下: ORG 0000HAJMP MAINORG 000BHAJMP T0INTORG 0100HMAIN: MOV TMOD,#06H ;置T0为计数器方式2 MOV TL0,#0FFH ;置计数初值 MOV TH0,#0FFH SETB TR0 ;启动T0工作 SETB E
42、A ;CPU开中断 SETB ET0 ;允许T0中断T0INT: ;编写该中断的服务程序RETI 4.2.2.4 方式方式3及其用法及其用法当M1M0=11时,定时器/计数器设定为工作方式3。其逻辑结构如图所示。 工作方式工作方式3 3只适用于定时器只适用于定时器T0T0。当T0工作在方式3时,TH0和TL0被拆成2个独立的8位计数器。这时,TL0既可作为定时器,也可作为计数器使用,它占用定时器T0所使用的控制位,除了它的位数为8位外,其功能和操作与方式0或1完全相同。TH0只能作定时器用,并且占据了定时器T1的控制位TR1和中断标志位TF1,TH0计数溢出置位TF1,且TH0的启动和关闭仅受
43、TR1的控制。 定时器定时器T1T1无工作模式无工作模式3 3,当将定时器T0设定为方式3时,定时计数器T1仍可设置为方式0、1或2。但由于TR1、TF1己被定时器TH0占用,中断源已被定时器T0占用,所以当其计数器计满溢出时,不能产生中断。在这种情况下,定时计数器1一般用作串行口波特率发生器,其计数溢出将直接传送给串行口控制数据的传输。这种情况下,定时/计数器T1只要设置好工作方式(设置好工作模式,工作初值),然后用控制位C/T切换其为定时或计数功能就可以使T1运行,若想停止它的运行,只要把它的工作方式设置为方式3即可,因为定时器T1没有方式3,将它设置为方式3就使它的工作停止。【例【例4.
44、7】设晶振频率为12MHz,定时计数器T0工作于方式3,TL0和TH0作为两个独立的8位定时器,要求TL0 使P1.0产生200s的方波,TH0使P1.1产生400s的方波。分析:fosc = 12MHz ,1机器周期 = 1s 若选择工作方式3计算初值:TL0初值= 256100/1=156=9CHTH0初值= 256200/1=56=38HORG 0000HAJMP MAINORG 000BH ;T0中断服务程序CPL P1.0;P1.0取反MOV TL0 , #9CH; 重新装入计数初值RETIORG 001BH ;T1中断服务程序CPL P1.1 ; P1.1取反MOV TH0 , #
45、38H; 重新装入计数初值RETIORG 0100H ;主程序MAIN: MOV TMOD , #03H ;T0工作于方式3MOV TH0 , #38H ;置计数初值MOV TL0 , #9CHSETB ET0 ;允许T0中断(用于TL0)SETB ET1 ;允许T1中断(用于TH0)SETB EA ;CPU开中断SETB TR0 ; 启动TL0SETB TR1 :启动TH0SJMP $ ;等待中断4.3 MCS-51单片机片内串行口单片机片内串行口4.3.1串行通信的基本知识串行通信的基本知识计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换 。4
46、.3.1.1并行通信与串行通信并行通信与串行通信根据通信数据比特的传送方式,可以分为两大类:并行通信与串行通信。 1、并行通信、并行通信 并行通信通常是将数据字节的各位用多条数据线同时进行传送。如图所示:优点:优点:控制简单,传输速度快;缺点:缺点:传输线较多,成本高,容易引入干扰。 并行通信多用于短距离通信。并行通信多用于短距离通信。2、串行通信、串行通信 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。如图所示:优点:优点:传输线少,成本低,且可以利用电话网等现成的设备;缺点:缺点:数据的传送控制复杂。 在多微机系统以及现代测控系统中信息的交换多采用串在多微机系统以及现代测
47、控系统中信息的交换多采用串行通信方式。行通信方式。4.3.1.2 同步通信与异步通信同步通信与异步通信 根据通信双方之间的数据同步方式,串行通信可以分为两大类:同步通信同步通信与异步通信异步通信。 1、异步通信、异步通信 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟频率尽可能一致。 异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间是异步的字符之间是异步的(字符之间不一定有“位间隔”的整数倍的关系),但同一字符内的各位是同步同一字符内的各
48、位是同步的的(各位之间的距离均为“位间隔”的整数倍)。异步通信的数据格式:优点:优点:收发双方时钟不必严格一致,实现容易,设备开销较小;缺点:缺点:每帧需23个附加位,帧间有间隔,传输效率低。2、同步通信、同步通信 同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,既保持位同步关系,也保持字符同步关系既保持位同步关系,也保持字符同步关系。 发送方对接收方的同步可以通过两种方法实现: 外同步外同步 自同步自同步外同步法:外同步法: 发送方除了发送数据信号以外,还要发送一路同步脉冲信号
49、。接收方根据这一同步脉冲信号可以准时接收发送方所发送的数据信号。 缺点:缺点:传送一路信号需要两条信号线,传送成本较高; 优点:优点:实现简单。自同步法:自同步法: 发送方将要发送数据信号与同步脉冲信号合成在一起进行传送。接收方收到这样一路合成信号之后,提取出其中的同步信号,然后根据这一同步脉冲信号可以准时接收发送方所发送的数据信号。 优点:优点:传送一路信号只需要一条信号线,成本低; 缺点:缺点:实现比较复杂。 4.3.1.3 单工通信与双工通信单工通信与双工通信 根据通信双发数据的传送方向,串行通信又可以分为单工通信、半双工通信与全双工通信。1、单工通信、单工通信单工是指数据传输仅能沿一个
50、方向,不能实现反向传输。2、半双工通信、半双工通信半双工是指数据传输可以沿两个方向,但需要分时进行。3、全双工通信、全双工通信全双工是指数据可以同时进行双向传输。4.3.1.4 串行通信的错误校验串行通信的错误校验 串行通信信号传送的过程中,容易受到各种干扰信号的干扰,而产生错误。如下图所示: 为了检查并纠正这些错误,通信的双方应该采取一些校验措施。单片机串行通信中常用的几种校验措施有:1、奇偶校验、奇偶校验 在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验:奇校验:数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验:偶校验:数据中“1”的个数与校验位“1”的个数之和应为偶
51、数。 接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。2、代码和校验、代码和校验 代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。 3、循环冗余(、循环冗余(CRC)校验)校验 循环冗余码(Cycle Redundancy Check ,简称CRC)是最常用的一种差错校验码,其特征是:信息字段和校验字段的长度可以任意指定。 CRC码又称为多项式码。这是因为任
52、何一个由二进制数位串组成的代码都可以和一个只含有0和1两个系数的多项式建立一一对应的关系。例如,代码1011011对应的多项式为x6+x4+x3+x+1,而多项式x5+x4+x2+x对应的代码为110110。 k位要发送的信息位可对应于一个(k-1)次多项式K(x),r位冗余位对应于一个(r-1)次多项式R(x)。由k位信息位后面加上r位冗余位组成的n=k+r位码字则对应于一个(n-1)次多项式T(x)=xrK(x)+R(x) 。 根据代数理论,多项式T(x)存在且仅存在一个r次多项式G(x),使得:T(x) =xrK(x)+R(x) = A(x)G(x) 其中G(x)=g0x0+g1x1+g
53、2x2+gr-1xr-1+grxr 称为生成多项式,对应的二进制代码称为生成码。 数据通信中利用这一原理,在发送方通过指定的G(x)产生CRC校验码,接收方利用相同的多项式G(x)验证收到的信息的正确性。【例例4.8】信息字段代码为1011001,对应多项式为m(x)= x6+x4+x3+1,假设生成多项式为g(x)= x4+x3+1,则对应的g(x)的代码为11001,x4m(x)= x10+x8+x7+x4对应的代码记为10110010000,采用多项式除法:得到余数1010 ,即校验字段为1010,因此,形成的传输码为: 1011001 1010信息码 校验码 接收端在收到发送方发送过来
54、的信息后,用同样的生成码进行校验,即用接收到的信息码除以生成码,如果能够除尽,则正确,否则出错。 这种校验方法纠错能力强,常用于对磁盘信息的传输,存储区的完整性校验,安全性要求较高的通信系统中等。 4.2.2 MCS-51单片机串行口的结构及其工作原理单片机串行口的结构及其工作原理4.2.2.1 MCS-51单片机内部串行口结构单片机内部串行口结构 MCS-51有一个可编程的全双工串行通信接口,可作为通用异步接收/发送器UART,也可作为同步移位寄存器。它的帧格式有8位、10位和11位,可以设置为固定波特率和可变波特率,给使用者带来很大的灵活性。其内部结构如下图所示: MCS-51单片机的串行
55、口主要由2个物理上独立的串行数据缓冲器SBUFSBUF(发送缓冲器和接收缓冲器,它们占用同一地址99H)、移位寄存器和控制器等组成。除此之外,还有2个SFR寄存器SCONSCON和PCONPCON,用于串行口的初始化编程。发送:发送:执行写命令MOV SBUFMOV SBUF,A A指令,便启动发送过程,通过移位寄存器一位一位从TxD引脚发送数据,完成后使发送中断标志TI置“1”,如果允许中断则将引起串行口中断过程。接收:接收:当RI=0时,置“1”允许接收位REN时,启动接收过程,数据从引脚RxD一位一位移位到移位寄存器,当接收完毕后,将从移位寄存器保存到接收缓冲器SBUF,会使接收中断标志
56、RI=1,如果允许中断,则将引起中断过程。执行读命令MOV AMOV A,SBUFSBUF时,可从接收SBUF取出信息并由内部总线送CPU。 4.2.2.2 MCS-51单片机内部串行口的控制单片机内部串行口的控制1、串行口控制寄存器、串行口控制寄存器SCON SCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志,该寄存器的字节地址为98H,可位寻址,其位结构如下表所示:SM0、SM1工作方式选择位工作方式选择位 串行口工作方式控制位SM0、SM1,用于选择串行口的四种工作方式之一,如下表所示(Fosc是晶振频):SM0 SM1工作方式说明波特率0 0方式0
57、同步移位寄存器 Fosc/120 1方式110位异步收发由定时器控制1 0 方式211位异步收发Fosc/32或fosc/641 1方式311位异步收发由定时器控制SM2多机通信控制位多机通信控制位 主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB80时不激活RI,收到的信息丢弃;RB81时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。 在方式0时,SM2必须是0。
58、在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。允许串行接收位允许串行接收位REN 由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。TB8 在方式2或方式3中是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位奇偶校验位,或在多机通信中,作为地址帧地址帧/ /数据帧的标志位数据帧的标志位。在方式0和方式1中,该位未用。RB8 在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。TI 发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发
59、送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清必须用软件将其清0 0,取消此中断申请。,取消此中断申请。RI 接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程必须在中断服务程序中,用软件将其清序中,用软件将其清0 0,取消此中断申请,取消此中断申请 2、串行口控制寄存器、串行口控制寄存器PCON PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,该寄存器中只有一位SMOD与串行口工作有关,该寄存器的字节地址为97H,其位结构如下
60、表所示: SMOD(PCON.7)波特率倍增位。 在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。4.2.3 MCS-51单片机串行口的四种工作方式单片机串行口的四种工作方式4.2.3.1 方式方式0 方式0时,串行口为同步移位寄存器的输入输出方式。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。主要用于扩展并行输入或输出口。1、方式、方式0输出输出用串行口工作方式0扩展的并行输出电路如下图所示:74LS164:串行输入并行输
61、出的移位寄存器。 在单片机系统,有时并行口的I/O资源不够,而串行口又没有其他的作用,那么我们可以用74LS164来扩展并行I/O口,节约单片机资源。 当一个数据写入SBUF后,串行数据将由RxD逐位移出;TxD输出移位时钟,频率=fosc1/12;时序如下图所示:注意注意:每送出8位数据 TI就自动置1,再次发送前需要用软件清零 TI。 2、方式、方式0输入输入用串行口工作方式0扩展的并行输入电路如下图所示:74L165是并行输入,串行输出移位寄存器。80C51单片机内部的串行口在方式0工作状态下,使用移位寄存器芯片可以扩展一个或多个8位并行I/O口。 串行数据由RxD逐位移入SBUF中,串
62、行数据将由RxD逐位移入;TxD输出移位时钟,频率=fosc1/12;时序如下图所示: 4.2.3.2 方式方式1 方式1是10位数据的异步通信口,其中1位起始位,8位数据位,1位停止位。其位结构如下图所示:1、方式、方式1输出输出 串行口以方式1发送数据时,数据位由TXD端输出,发送一帧信息为10位,其中1位起始位,8位数据位(先低位后高位),1位停止位。 CPU执行1条写入发送缓冲器的指令后,就会启动发送器发送,发送完数据后,置中断标志TI为1。时序如下图所示:2、方式、方式1输入输入 用软件置REN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负
63、跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。时序如下图所示:4.2.3.3 方式方式2和方式和方式3 方式2和方式3时为11位数据的异步通信口,其中起始位1位,数据9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位。方式2的波特率固定为晶振频率的1/64或1/32,方式
64、3的波特率由定时器T1的溢出率决定。其位结构如下图所示:1、方式、方式2和和3输出输出 发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出。 当发送完1帧数据时置TI=1,向CPU请求中断。在发送下1帧数据之前,必须将TI清0。时序如下图所示:2、方式、方式2和和3输入输入 接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1
65、,向CPU请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。时序如下图所示:4.2.3.4 四种工作方式下的波特率发生器四种工作方式下的波特率发生器1、方式、方式0波特率由振荡器的频率(fosc)确定:波特率为fosc/12。2、方式、方式2波特率由振荡器的频率(fosc)和SMOD位所确定:3、方式、方式1和和3 方式1和3时的波特率由定时器T1和T2的溢出率和SMOD(PCON7)所确定。 4.2.4 多机通讯多机通讯 在集散式分布系统中,往往由多个计算机构成,它们之间往往需要数据通信,这就是多机通信。由单片机构成的多机通信系统中常采用总线型主从式结构。所谓主
66、从式,即在数个单片机中,有一个是主机,其余的是从机,从机要服从主机的调度、支配。MCS-51单片机的串行口工作方式2和方式3支持这种主从式的多机通信结构。这种系统的硬件连接结构如图所示: 当串行口工作于方式2和方式3时,有9位数据,其中第9位(TB8和RB8)数据用于区分前8位信息是数据还是地址(为1时表示的是地址,为0时表示的是数据)。多机通信的过程为: (1)所有从机的SM2位置1,处于接收地址帧状态。 (2)主机在发送数据之前先发送一地址帧,其中8位是地址,第9位为1。 (3)当从机的SM2=1时,从机收到地址帧后,都将接收的数据(即:地址)装入SBUF,并置RI=1,产生中断。在中断服
67、务子程序中便可以与本机的地址比较。对于地址相符的从机,使自己的SM2位置0(这时,该从机就可以接收主机随后发来的数据帧),并把本站地址发回主机作为应答;对于地址不符的从机,仍保持SM2=1(这时,这些从机对主机随后发来的数据帧将不予理睬)。 (4)主机收到从机应答地址后,确认地址是否相符,如果地址不符,发复位信号(数据帧中TB8=1);如果地址相符,则清TB8,开始发送数据。 (5)从机收到复位命令后回到监听地址状态(SM2=1)。否则开始接收数据和命令。 (6)主机发送数据结束后,要发送一帧校验和,并置第9位(TB8)为1,作为从机数据传送结束的标志。 (7)从机接收数据时先判断数据接收标志
68、(RB8),若RB8=1,表示数据传送结束,并比较此帧校验和,若正确则回送正确信号00H,并使该从机复位(即重新等待地址帧);若校验和出错,则发送0FFH,请求主机重发数据。若接收帧的RB8=0,则存数据到缓冲区,并准备接收下帧信息。4.2.5 串行口的编程实例串行口的编程实例【例【例4.7】用 8031 串行口外接 74LS165 移位寄存器扩展8位输入口, 输入数据由 8 个开关提供, 另有一个开关K提供联络信号。电路示意如图 所示。当开关K合上时, 表示要求输入数据。 根据输入的8位开关量, 处理不同的程序。 根据题意编写的程序如下:START: JB P1.0, $ ;开关K未合上,等
69、待SETB P1.1 ;165并行输入数据CLR P1.1 ;开始串行移位MOV SCON,#10H;串行口模式0并启动接收JNB RI, $ ;查询RICLR RI ;查询结束,清RIMOV A,SBUF ;输入数据 ;根据处理不同任务SJMP START ; 准备下一次接收。 【例【例4.8】 利用串行口进行双机通信。设1号机是发送方,2号机是接收方,如下图所示:二者之间的通信约定(协议)如下所述:(1)当1号机发送时,先发送一个“E1”联络信号,2号机收到后回答一个“E2”应答信号,表示同意接收。(2)当1号机收到应答信号“E2”后,开始发送数据,每发送一个数据字节都要计算“校验和”,假
70、定数据块长度为16个字节,起始地址为40H,一个数据块发送完毕后立即发送“校验和”。(3)2号机接收数据并转存到数据缓冲区,起始地址也为40H,每接收到一个数据字节便计算一次“校验和”,当收到一个数据块后,再接收1号机发来的“校验和”,并将它与2号机求出的校验和进行比较。若两者相等,说明接收正确,2号机回答00H;若两者不相等,说明接收不正确,2号机回答0FFH,请求重发。(4)1号机接到00H后结束发送。若收到的答复非零,则重新发送数据一次。(5)双方约定采用串行口方式1进行通信,一帧信息为10位,其中有1个起始位、8个数据位和一个停止位;波特率为2400波特,T1工作在定时器方式2,振荡频
71、率选用11.0592MHZ。解:根据题意计算可得TH1=TL1=0F4H,PCON寄存器的SMOD位为0。1号机处理流程如下图所示: 2号机处理流程如下图所示: 发送程序清单如下: ASTART:CLR EA MOV TMOD,#20H;定时器1置为方式2 MOV TH1,#0F4H ;装载定时器初值,波特率2400 MOV TL1,#0F4H MOV PCON,#00H SETB TR1 ;启动定时器 MOV SCON,#50H ;设定串口方式1,且准备接收应答信号 ALOOP1:MOV SBUF,#0E1H ;发联络信号 JNB TI,$ ;等待一帧发送完毕 CLR TI ;允许再发送 J
72、NB RI,$ ;等待2号机的应答信号 CLR RI ;允许再接收 MOV A,SBUF ;2号机应答后,读至A XRL A,#0E2H ;判断2号机是否准备完毕 JNZ ALOOP ;2号机未准备好,继续联络 ALOOP2:MOV R0,#40H ;2号机准备好,设定数据块地址指针初值 MOV R7,#10H ;设定数据块长度初值 MOV R6,#00H ;清校验和单元ALOOP3:MOV SBUF,R0 ;发送一个数据字节 MOV A,R6 ADD A,R0 ;求校验和 MOV R6,A ;保存校验和 INC R0 JNB TI,$ CLR TI DJNZ R7,ALOOP3 ;整个数据块
73、是否发送完毕 MOV SBUF,R6 ;发送校验和 JNB TI,$ CLR TI JNB RI,$ ;等待2号机的应答信号 CLR RI MOV A,SBUF ;2号机应答,读至A JNZ ALOOP2 ;2号机应答“错误”,转重新发送 RET ;2号机应答“正确”,返回接收程序清单如下: BSTART: CLR EA MOV TMOD,#20H MOV TH1,#0F4H MOV TL1,#0F4H MOV PCON,#00H SETB TR1 MOV SCON,#50H;设定串口方式1,且准备接收 BLOOP1:JNB RI,$ ;等待1号机的联络信号 CLR RI MOV A,SBUF
74、 ;收到1号机信号 XRL A,#0E1H ;判是否为1号机联络信号 JNZ BLOOP1 ;不是1号机联络信号,再等待 MOV SBUF,#0E2H ;是1号机联络信号,发应答信号 JNB TI,$ CLR TI MOV R0,#40H ;设定数据块地址指针初值 MOV R7,#10H;设定数据块长度初值 MOV R6,#00H ;清校验和单元BLOOP2:JNB RI,$ CLR RI MOV A,SBUF MOV R0,A ;接收数据转储 INC R0 ADD A,R6 ;求校验和 MOV R6,A DJNZ R7,BLOOP2 ;判数据块是否接收完毕 JNB RI,$ ;完毕,接收1号
75、机发来的校验和 CLR RI MOV A,SBUF XRL A,R6 ;比较校验和 JZ END1 ;校验和相等,跳至发正确标志 MOV SBUF,#0FFH ;校验和不相等,发错误标志 JNB TI,$ ;转重新接收 CLR TI END1: MOV SBUF,#00H RET【例【例4.9】如图所示的多机通信系统中有如下约定: (1)系统中最多允许接有255台从机,它们的地址分别为00HFEH。(2)地址FFH是对所有从机都起作用的一条控制命令:命令各从机恢复SM2=1的状态。(3)主机发送的控制命令代码为: 00H要求从机接收数据块01H要求从机发送数据块 其它非法命令(4)数据块长度、
76、16个字节(5)从机状态字格式为:其中:若ERR=1,从机接收到非法命令 若TRDY=1,从机发送准备就绪 若RRDY=1,从机接收准备就绪主机在接收或发送完一个数据块后可返回主程序,完成其它任务。从机部分以串行口中断服务程序的方式给出。若从机未作好接收或发送数据的准备,就从中断程序中返回,在主程序中作好准备。系统采用T1作为波特率发生器,主机和从机中对定时器初始化的程序从略。主机和从机的程序流程见后。主机的程序流程从机的程序流程 主机串行通信子程序入口参数:(R0)主机发送的数据块首址(R1)主机接收的数据块首址(R2)被寻址从机地址(R3)主机命令(R4)数据块长度程序代码为:MSIO:
77、MOV SCON,#0D8H ;设串行口模式3,允许接收,TB8置1MSIO1:MOV A,R2 ;发送地址帧 MOV SBUF,A JNB RI,$ ;等待从机应答 CLR RI MOV A,SBUF XRL A,R2 ;判应答地址是否相符 JZ MSIO3MSIO2:MOV SBUF,#0FFH ;重新联络 SETB TB8 SJMP MSIO1 MSIO3:CLR TB8 ;地址符合,准备送命令 MOV SBUF,R3 ;送命令 JNB RI,$ ;等待从机应答 CLR RI MOV A,SBUF JNB ACC7,MSI04 ;判命令是否出错 SJMP MSIO2 ;若从机接收命令出错
78、,重新联络MSIO4:CJNE R3,#00,MSIO5;不是要求从机接收数据,则跳转 JNB ACC0,MSIO2 ;从机接收数据准备就绪否? LPTX:MOV SBUF,R0 ;主机发送数据块 JNB TI,$ ;等待发送完一帧 CLR TI INC R0 DJNZ R4,LPTX RETMSIO5:JNB ACC.1,MSIO2 ;从机发送数据准备就绪否?LPRX:JNB RI,$ ;主机接收数据块CLR RI MOV A,SBUFMOV R1,AINC R1DJNZ R4,LPRXRET若主机向10号从机发送数据块,数据块放置在内部RAM区的40H4FH单元中,则调用上述子程序MSIO
79、的方法是:MOV R2,#0AHMOV R3,#0 MOV R4,#10HMOV R0,#40HLCALL MSIO 从机串行通信子程序从机的串行通信采用中断控制起动方式。在串行通信起动后,仍采用查询方式来接收或发送数据块。从机的程序中还包括定时器1和串行口的初始化以及开中断程序。程序中用F0作发送准备就绪标志,PSW.1作接收准备就绪标志。背景程序的其它有关部分见后MOV SP,#1FH ;设置堆栈指针MOV SCON,#0F0H;置串行口方式3,SM2=1,允许接收MOV 08H,#40H ;接收缓冲区起址送1区R0MOV 09H,#50H ;发送缓冲区起址送1区R1MOV 0AH,#10
80、H ;发送或接收字节数送1区R2ORG 0023HAJMP SSIO ;串行口中断服务程序入口SSIO: CLR RIPUSH A ;保护现场PUSH PSW SETB RS0 ;选1区工作寄存器ClR RS1MOV A,SBUF XRL A,#SLAVE ;SLAVE为本从机地址JZ SSIO1RETURN:POP PSW ;不是呼叫本从机,恢复现场后返回POP A RETI SSIO1: CLR SM2 ;地址符合,与主机继续通信 MOV SBUF,#SLAVE ;从机地址送回主机 JNB RI,$ ;等待接收1帧完 CLR RI JNB RB8,SSIO2 ;是命令帧,跳SSIO2 SE
81、TB SM2 ;是复位,置SM2=1后返回 SJMP RETURNSSIO2: MOV A,SBUF ;分折命令 CJNE A,#02H, SSSS: JC SSIO3 MOV SBUF,#80H ;非法命令,置ERR位为1 SJMP RETURNSSIO3: JZCMD0CMD1: JBF0,SSIO4 MOV SBUF,#00H ;未准备好,返回 SJMP RETURNSSIO4: MOV SBUF,#02H ;TRDY=1,发送准备就绪 CLR F0SLP1: MOV SBUF,R0 ;发送数据块JNB TI,$CLR TIINC R0 ;发送循环DJNZ R2, SLP1SETB SM2 ;发送完,置SM2=1后返回SJMP RETURNCMD0: JBPSW.1,SSIO5MOV SBUF,#00H;未准备好,返回SJMP RETURNSSIO5: MOV SBUF,#01H ;RRDY=1,接收准备就绪CLR PSW1 SLP2: JNB RI,$ ;接收数据块CLR RIMOV R1,SBUFINC R1 ;接收循环DJNZ R2,SLP2 SETB SM2 ;接收完,置SM2=1后返回SJMP RETURN结束结束