资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第6章 定时器/计数器和串行通信,第6章 定时器/计数器和串行通信,6.1 定时器/计数器的结构及工作原理,6.2 定时器/计数器的应用,6.3 串行口的结构及工作方式,6.4 串行口的应用,6.5 RS-232C串行通信接口,6.1 定时器/计数器的结构及工作原理,MCS-51单片机内部有两个16位的可编程的定时器计数器,称为定时器0、定时器1,分别用T0、T1表示。它们均可独立编程,具有四种工作方式 。,6.1.1 定时器/计数器的结构,6.1.1 定时器/计数器的结构,6.1.1 定时器/计数器的结构,在作定时器使用时,是对内部的机器周期进行计数。,每个机器周期包含12个振荡周期,即定时器的输入脉冲是对外部晶振进行12分频后得到的。例如,外部晶振频率为12MHz,则定时器的输入时钟脉冲频率为1MHz,即每隔1us接收到一个脉冲,计数值加1。所以,实际上是通过对机器周期的计数实现计算时间的功能。,当定时器用作为外部事件计,数时,是对引脚T0或T1上外部输入的负脉冲信号做加法计数,。,将外部输入信号接到T0(P3.4)或T1(P3.5)引脚,当检测到的电平由高跳变到低时,计数器就加1。因此,为了确保得到可靠的采样值,需要2个机器周期来识别一个从“1”到“0”的跳变,这就要求外部计数脉冲的高电平与低电平保持时间至少为一个完整的机器周期。所以最高计数频率为晶振频率的1/24。,6.1.1 定时器/计数器的结构,不管是定时还是计数,T0或T1在对内部时钟或外部事件计数时都不占用CPU时间,只有定时器计数器产生溢出时,才会向CPU发出中断请求。CPU也可重新设置定时器计数器的工作方式和计数初值,以改变定时器的操作。,设计数的最大值为M,所需的计数值为N,则初值X的计算方法如下:,计数状态: X=MN,定时状态: X=M定时时间/T,其中,T=12晶振频率,6.1.1 定时器/计数器的结构,6.1.2 工作方式和控制寄存器,1. 工作方式寄存器TMOD,寄存器TMOD是可编程的特殊功能寄存器,字节地址为89H,不可位寻址。其中低4位控制T0,高4位控制T1 。,GATE:控制方式选择位,用来控制定时器启动操作方式。,当GATE=0时,只能由软件控制TR0或TR1位来控制定时器的启停。TRi(i=0,1)位为1,定时器启动;TRi(i=0,1)为0时,定时器停止工作;,当GATE=1时,定时器的启动要由外部中断引脚和TRi(i=0,1)位共同控制。只有当外部中断引脚为高时,TRi(i=0,1)置1才能启动定时器工作,。,6.1.2 工作方式和控制寄存器,C/T:计数/定时方式选择位,当C/T=0时设置为定时器工作方式;当C/T=1时设置为计数器工作方式。,M1、M0:工作方式控制位,对应于4种工作方式。,例 要设定T1为定时器,方式2,T0为计数器,方式1,并由内部TRi控制启停。则TMOD=25H,可用下面指令赋值:,MOV TMOD, #25H,6.1.2 工作方式和控制寄存器,2. 控制寄存器TCON,TCON字节地址为88H,位地址为88H8FH。,TF1和TF0:定时器T1和定时器T0的溢出标志位。,TR1和TR0:定时器T1和定时器T0的启动控制位。,IE1和IE0:外部中断INT1和外部中断INT0的中断请求标志位。,IT1和IT0:外部中断INT1和外部中断INT0的触发方式选择位。,TCON中低4位是与外部中断有关的位,高4位为定时器控制位。对T0的启、停控制可以通过以下位操作指令完成:,SETB TR0 ;启动T0计数,CLR TR0 ;停止T0计数,6.1.3 定时器/计数器的工作方式,1. 工作方式0,TMOD中M1M000时,定时/计数器被选为工作方式0,计数器长度为13位。由TLi(i=0,1)的低5位(TL的高3位未用)和THi(i=0,1)的8位构成13位计数器(对T0、T1都适用)。,当C/T=0为定时方式时,T0对机器周期进行计数。设定时时间为t,则计数初值,例6-1设T0工作方式0,定时时间t=1ms,fosc=12MHz,计算T0的计数初值。,7192=,11100000,11000,B= E0H 18H,高8位 低5位,TH0计数初值为E0H,TL0计数初值为18H。,6.1.3 定时器/计数器的工作方式,6.1.3 定时器/计数器的工作方式,当C/T=1为计数方式时,外部计数脉冲由T0引脚输入。当外部信号电平发生由1至0的跳变时,计数器加1。,6.1.3 定时器/计数器的工作方式,2. 工作方式1,TMOD中M1M001时,定时计数器设定为工作方式1,工作方式1是16位定时计数器,其结构和工作过程几乎与方式0完全相同,唯一的区别是计数器的长度为16位。,设定时时间为t,则计数初值X为:,6.1.3 定时器/计数器的工作方式,3. 工作方式2,方式2为能自动重装初值的8位计数器。,6.1.3 定时器/计数器的工作方式,3. 工作方式2,方式2优点:省去了由软件重新赋初值的麻烦,所以它常用于定时控制或串行口的波特率发生器。,方式2缺点:定时/计数长度短。,设定时时间为t,则计数初值X为:,6.1.3 定时器/计数器的工作方式,工作方式3只适用定时器T0,而T1无此工作方式,若将T1设置为方式3,相当于TR1=0,T1停止工作。此时,T0被拆成两个独立的8位计数器TH0和TL0。,6.1.3 定时器/计数器的工作方式,其中TL0使用原来T0的一些控制位和引脚,他们是C/T、GATE、TR0、TF0和T0(P3.4)引脚及 (P3.2)引脚。此方式下的TL0作为8位计数器,其功能和方式0、方式1一样,可以实现定时和计数两种功能,只不过是一个8位的计数器;而TH0只能完成定时功能,对机器周期进行计数。它借用原定时器T1的控制位TR1和溢出标志位TF1,同时占用了T1的中断请求信号。,工作方式3为定时器T0增加了一个8位的定时器,此时的T1仍可以设置为工作方式0、1、2,用在任何不需要中断的场合。T0工作于模式3 时,T1一般用作串行口波特率发生器。,6.2 定时器/计数器的应用,1. 工作方式0的应用,例6-2设单片机晶振频率fosc=6MHz,使用定时器T1以方式0产生周期为600s的等宽方波脉冲,并由P1.7输出,以查询方式完成。,(1)计数初值。,欲产生周期为600s的等宽方波脉冲,只需在P1.7端交替输出300s的高低电平即可,应此定时时间为300s。设待求计数初值为N,则,将低5位0AH写入TL1,将高8位FBH写入TH1中。,6.2 定时器/计数器的应用,(2)工作方式寄存器TMOD初始化,因定时计数器1为工作方式0,所以应使M1M0=00。为实现定时功能应使当C/T=0,为实现定时器的软件控制启动应使GATE=0,因此控制寄存器TMOD=00H。,(3)TR1=1为启动,TR1=0为停止。,程序如下:,ORG 0000H,LJMP START,ORG 0030H,START: MOV TCON, #00H ;清TCON,MOV TMOD, #00H ;工作方式设定,MOV TH1, #0FBH ;计数初值设定,MOV TL1, #0AH,MOV IE, #00H ;关中断,SETB TR1 ;启动定时器,LOOP0: JBC TF1, LOOP1 ;查询是否溢出,SJMP LOOP0,LOOP1: MOV TH1, #0FBH ;重新设值,MOV TL1, #0AH,CPL P1.7 ;输出取反,SJMP LOOP0,END,法2:采用中断方式,ORG 0000H ,LJMP START,ORG 001BH,LJMP T1INT,ORG 0100H,START: MOV SP, #30H,MOV TCON, #00H,MOV TMOD, #00H,MOV TH1, #0FBH,MOV TL1, #0AH ,SETB TR1,SETB ET1,SETB EA,MAIN: AJMP MAIN,T1INT: MOV TH1, #0FBH,MOV TL1, #0AH,CPL P1.7,RETI,6.2 定时器/计数器的应用,2. 工作方式1的应用,例6-3设单片机晶振频率fosc=12MHz,使用定时器T0以方式1产生周期为3ms、占空比为1:2的脉冲波,并由P1.7输出,以查询方式完成。,(1)计数初值。,欲产生周期为3ms、,占空比,为,2:3,的脉冲波,可设定定时时间为1ms,在程序中加入P1.7口的状态判断,当P1.7为高电平时,需溢出两次才对端口取反。设待求计数初值为N,则,将低8位18H写入TL0,将高8位FCH写入TH0中。,6.2 定时器/计数器的应用,(2)TMOD初始化,因定时计数器T0为方式1,所以M1M0=01。为实现定时功能应使当C/T=0,为实现定时器的软件控制启动应使GATE=0,因此设定工作方式控制寄存器TMOD=01H。,(3)由TR0启动和停止定时器。TR0=1为启动,TR0=0为停止。,程序如下:,ORG 0000H,LJMP MAIN,ORG 0030H,MAIN: MOV TMOD,#01H ;T0为16位定时模式,MOV TL0, #18H ;定时器赋初值,MOV TH0, #0FCH ;定时器赋初值,6.2 定时器/计数器的应用,MOV R2, #02H ;R2赋初值,SETB TR0 ;开启定时器,LOOP: JBC TF0, CPLP ;定时时间到,转CPLP并将TF0清零,AJMP LOOP ;TF0为0则转LOOP循环等待,CPLP: MOV TL0, #18H ;定时器重装初值,MOV TH0, #0FCH ;定时器重装初值,JB P1.7,CPLP1 ;P1.7为1则转CPLP1,CPL P1.7 ;P1.7为0则取反,MOV R2, #02H ;R2重新赋值,AJMP LOOP ;转LOOP等待定时时间到,CPLP1: DJNZ R2, LOOP ;2ms未到转LOOP,CPL P1.7 ;2ms到对P1.7口取反,AJMP LOOP ;转LOOP等待定时时间到,END ;程序结束,【练习1】 已知某生产线的传送带上不断地有产品单向传送,产品之间有较大间隔。使用光电开关统计一定时间内的产品个数。假定红灯亮时停止统计,红灯灭时才在上次统计结果的基础上继续统计,试用单片机定时器/计数器T1的方式1完成该项产品的计数任务。,(1) 初始化: TMOD=11010000B=0D0H,(GATE=1, C/T=1, M0M1=01),TCON=00H,(2) T1在方式1时, 溢出产生中断, 且计数器回零, 故在中断服务程序中, 需用R0计数中断次数, 以保护累积计数结果。,(3) 启动T1计数, 开T1中断。,程序清单如下:,ORG 0000H,AJMP START ; 复位入口,ORG 001BH,AJMP T1INT ; T1中断入口,ORG 0100H,START: MOV SP, 60H ; 初始化程序,MOV TCON, 00H,MOV TMOD, 0D0H,MOV TH1, 00H,MOV TL1, 00H,MOV R0, 00H ; 清中断次数计数单元,MOV P3, 28H; 设置P3.3,P3.5第二功能,SETB TR1 ; 启动T1,SETB ET1; 开T1中断,SETB EA ; 开总中断,MAIN: ACALL DISP ; 主程序, 调显示子程序,ORG 0A00H,T1INT: INC R0 ; 中断服务子程序,RETI,DISP: ; 显示子程序,RET,6.2 定时器/计数器的应用,3. 方式2的应用,例6-4使用定时器T0以方式2产生200s定时,在P1.0口输出周期为400s的连续方波。已知晶振频率fosc=6MHz。,(1)计数初值,(2)TMOD初始化,工作方式2时,M1M0=10,实现定时功能C/T=0,GATE=0。定时器T1不用,无关位设置为0,可得TMOD=02H。,ORG 0000H,LJMP START,ORG 000BH,LJMP LOOP0,ORG 0030H,START: MOV TCON, #00H,MOV TMOD, #02H ;定时器方式2,MOV TH0, #9CH ;设置计数初值,MOV TL0, #9CH ;设置计数初值,SETB EA ;允许总中断,SETB ET0 ;T0中断允许,SETB TR0 ;启动T0,HERE: SJMP HERE ;等待中断,ORG 0500H ;中断服务子程序,LOOP0:CPL P1.0 ;P1.0取反,RETI,END,【练习2】某MCS-51应用系统对单相电度表进行用电检测和管理,电度表每运转一圈产生一个脉冲,假设电度表每转200圈为1度电,试利用T1模式2对脉冲进行计数,每计200个脉冲对用电量加1,假设用电量存放在片内RAM的50H单元。,计数初值:X=M-计数值=28-200=56D=38H,采用查询方式,编程如下:,MOV TMOD,60H ;设置T1模式2计数功能,MOV TH1,38H ;保存计数初值,MOV TL1,38H ;设置计数初值,SETB TR1 ;启动计数,LP:JBC TF1,LOOP ;查询是否计数溢出,AJMP LP,LOOP:INC 50H,AJMP LP,6.2 定时器/计数器的应用,4. 方式3的应用,例6-5 设某用户系统,已使用了两个外部中断源,并置定时器T1于方式2,作串口波特率发生器用,现要求再增加一个外部中断源,并由P1.0口输出一个5KHz的方波,fosc=12MHz。,分析:可把定时器/计数器T0置于工作方式3,利用外部引脚T0作附加的外部中断输入端,把TL0预置为0FFH,这样做当T0端出现由1至0的负跳变时,TL0溢出,申请中断,相当于边沿触发的外部中断源。在方式3下,TH0总是作8位定时器用,可以靠它来控制由P1.0输出5KHz方波。,TL0的计数初值为0FFH,TH0的计数初值计算如下:,因为P1.0输出5KHz方波,即每隔100s电平变化一次。则TH0中的初值:,X=256-10012/12=156,6.2 定时器/计数器的应用,程序如下:,ORG 0000H,LJMP START,ORG 000BH,LJMP TL0INT,ORG 001BH,LJMP TH0INT,ORG 0100H,START: MOV TL0, #0FFH ;置TL0计数初值,MOV TH0, #156 ;置TH0计数初值,MOV TL1, #data ;data是根据波特率要求设置,的常数,MOV TH1, #data,MOV TMOD, #27H ;T0方式3,TL0计数器方式,MOV TCON, #55H ;启动T0、T1,置边沿触发,MOV IE, #9FH ;开放全部中断,SJMP $,ORG 0200H ;TL0溢出中断服务程序,TL0INT: MOV TL0, #0FFH ;外部引脚T0引起中断处理程序,RETI,ORG 0300H ;TH0溢出中断服务程序,TH0INT: MOV TH0, #156,CPL P1.0,RETI,END,6.2 定时器/计数器的应用,5. 外部脉冲频率的测量,例6-6通过定时器/计数器测量外部引脚T1上的脉冲信号频率Fx,设晶振频率fosc=6MHz。,(1)设计思路,采用定时闸门计数方法测量脉冲频率,设定时器/计数器0为定时方式,提供100ms的基准闸门时间T,在10T期间,定时器/计数器T1对外部脉冲进行计数,所获得的计数值m即为被测脉号频率。,(2)定时器/计时器参数设定,设定时器/计数器0用来提供100ms的闸门时间,单片机时钟振荡频率fosc=6MHz,定时器/计数器1用来对外部脉冲计数。设定时器/计数器0采用方式1,定时器状态,由内部TR0控制启动、停;设定时器/计数器1采用方式1、计数器状态,由TR1控制启、停。因此,6.2 定时器/计数器的应用,TMOD=01010001B=51H,T0的计数初值:,频率测量子程序如下:,MSFC: MOV TMOD,#51H ;设T0、T1控制字,MOV R0, #0AH ;100ms定时的10倍扩展,MOV TL1, #00H ;T1计数器清零,MOV TH1, #00H,MOV TL0, #0B0H ;T0计数器装入计数初值,MOV TH0, #3CH ;T0计数器装入计数初值,SETB P3.5 ;置T1引脚为输入方式,JB P3.5,$ ;等待FX低电平,SETB TR0 ;启动T0计数,SETB TR1 ;启动T1计数,WAIT: JBC TF0, SECC ;查询100ms定时,定时到转SECC,SJMP WAIT ;100ms定时时间未到,等待,SECC: MOV TL0, #0B0H ;重装计数初值,MOV TH0, #3CH,DJNZ R0, WAIT ;查询1s定时时间,未到转WAIT,CLR TR1 ;1s定时到,停止T1计数,CLR TR0 ;停止T0计数,MOV 31H, TH1 ;将T1计数值送入31H,30H,MOV 30H, TL1,RET,【练习3】 照相机快门打开信号接在INT0(P3.2)引脚,使用T0并利用门控位GATE测照相机快门打开的时间。结果存放在30H和31H单元。,实质:检测外部输入正脉冲的宽度。,解:外部脉冲由INT0(P3.2)输入,其宽度为TP,如图所示。T0工作于定时方式,模式1(16位计数器)。,测试时,在INT0=0时,设置TR0=1;当INT0=1时,启动计数;当INT0=0时,停止计数。使TR0=0,读出TH0、TL0的计数值,用计数值乘以定时脉冲周期即得被检测正脉冲的宽度TP。,MOV TMOD,09H ;设T0为模式1,定时,GATE=1,MOV TL0,00H ;设置计数初值为0,MOV TH0,00H,MOV R0,30H ;地址指针送R0,JB INT0, ;等待INT0变低,SETB TR0 ;准备启动定时器0,JNB INT0, ;等待INT0变高,JB INT0, ;变高,启动计数,等待INT0再次变低,CLR TR0 ;停止计数,MOV R0,TL0 ;读取计数值,INC R0,MOV,R0,,,TH0,6. 实时时钟,例6-7设计实时时钟程序。,(1)实现时钟计时的基本方法,本例涉及到了定时器与中断的联合应用。时钟计时的最小单位是秒,但使用单片机定时器/计数器进行定时,即使按方式1工作,其最大定时时间也达不到1秒。鉴于此,可把定时器的定时时间定为100ms,这样,计数溢出10次即得到时钟计时的最小单位秒;而10次计数可用软件方法实现。,假定使用定时器T1,以工作方式1进行100ms的定时。如单片机晶振频率为6MHz,为得到100ms定时,计数初值,采用中断方式进行溢出次数的累计,计满10次即得到秒计时。从秒到分和从分到时的计时是通过累加和数值比较实现的。,这里,只给出时间计算的程序。,(2)程序流程图及程序清单,主程序流程如图6-9所示。,中断服务程序的主要功能是进行计时操作。程序开始先判断计数溢出是否满了10次,不满10次表明还没达到最小计时单位秒,中断返回;如满10次则表示已达到最小计时单位,程序继续向下运行,进行计时操作。,要求满1s则“秒位”32H单元内容加1,满60s则“分位”31H单元内容加1,满60min则“时位”30H单元内容加1,满24h则将30H,31H,32H的内容全部清0。,ORG 0000H,AJMP MAIN ;上电,转向主程序,ORG 001BH ;T1的中断入口地址,AJMP SERVE ;转向中断服务程序,ORG 0100H,MAIN: MOV TMOD,#10H ;设T1工作于方式1,MOV 20H, #0AH ;转入中断次数,CLR A,MOV 30H, A ;时单元清0,MOV 31H, A ;分单元清0,MOV 32H, A ;秒单元清0,SETB ET1 ;允许T1中断,SETB EA ;允许CPU中断,MOV TH1, #3CH ;赋计数初值,MOV TL1, #0B0H ;赋计数初值,SETB TR1 ;启动定时器T1,SJMP $ ;等待中断(可反复调用显示子程序),SERVE: PUSH PSW ;中断服务程序,PUSH ACC ;保护现场,MOV TH1, #3CH ;重新赋计数初值,MOV TL1, #0B0H,DJNZ 20H, RETUNT ;1s未到,返回,MOV 20H, #0AH ;重置中断次数,MOV A, #01H,ADD A, 32H ;,秒位加,1,DA A,MOV 32H, A ;转换为BCD码,CJNE A, #60, RETUNT;未满60s,返回,MOV 32H, #00H ;计满60s,秒位清0,MOV A, #01H,ADD A, 31H ;,分位加,1,DA A,MOV 31H, A ;,转换为,BCD,码,CJNE A, #60, RETUNT;,未计满,60min,,返回,MOV 31H, #00H ;,计满,60min,,分位清,0,MOV A, #01H,ADD A, 30H ;,时位加,1,DA A,MOV 30H, A ;,转换为,BCD,码,CJNE A, #24, RETUNT;,未计满,24h,,返回,MOV 30H, #00H ;,计满,24h,,时位清,0,RETUNT: POP ACC,POP PSW ;,恢复现场,RETI ;,中断返回,END,6.3 串行口的结构及工作方式,串行通信的概念,1并行通信与串行通信,CPU与外部设备进行数据传输时,有并行通信和串行通信两种方式。,并行通信是利用计算机的并行口,将数据的多个位同时进行传输,特点是传送速度快、效率高,并行传送的数据有多少位,就需要有多少根传输线。当传送距离较远时,位数太多就会使通信的线路成本过大,因此并行通信仅适合于短距离传输。,6.3 串行口的结构及工作方式,串行通信的概念,1并行通信与串行通信,串行通信是将数据的各个位按顺序一位一位的进行传输,特点是只要一对传输线就可以实现通信,对传输的数据较多、距离较远时,它可以大量节约系统的硬件资源。因此,在远距离的数据通信系统中,一般采用串行通信方式,其缺点是传送速度较低。,串行通信的概念,2.异步通信与同步通信,异步通信是指发送方和接收方采用独立的时钟,即双方没有一个相同的参考时钟作为基准。异步通信是按帧传送数据,它利用每一帧的起、止信号来建立发送与接收之间的同步,一个字符作为一帧,一帧数据一般由起始位(0)、数据位、奇偶校验位(可省略)和停止位(1)四部分组成。,在异步通信时,通信双方必须事先约定:,(1)字符格式。,双方要事先约定数据位的位数、奇偶校验形式等。,例如:用ASC码通信,有效数据为7位,加一个奇偶校验位、一个起始位和一个停止位共10,(2)波特率(Baud rate)。,波特率就是传送速率,即每秒传送的二进制位数。单位为bit/s或波特。,波特率与字符的传送速率之间的关系为:,波特率= 一个字符的二进制编码位数*字符数/秒.,要求发送端与接收端的波特率必须一致。,假设:数据传送率是120字符/s,每个字符格式包含十个代码位(一个起始位、一个终止位、8个数据位),波特率为:,10120=1200bit/s=1200波特,异步通信由于要在每个数据前后附加起始位、停止位,每发送一个字符约有20%的附加数据,占用了传输时间,因此降低了传送效率。,串行通信的概念,同步通信,同步通信去掉每个数据的起始位和停止位,把要发送的数据按顺序连接成一个数据块,在数据块的开头附加12个同步字符,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到通信告一段落。,同步通信要求:发送和接收双方要保持完全的同步,所以,要求发送和接收设备必须使用同一时钟。,解决办法:,(1)对于近距离通信:采用在传输线中增加一根时钟信号线来解决。,(2)对于远距离通信:通过解调器从数据流中提取同步信号,用锁相技术实现收、发频率完全相同的时钟信号。,总的来说,异步通信技术较为简单,应用范围广;同步通信传输速率高,适用于高速率、大容量的数据通信,但硬件复杂。,3单工通信与双工通信,在串行通信中,按照数据传送的方向,可分为单工(Simplex)、半双工(Half Duplex)和全双工(Full-duplex)三种方式。,串行口基本组成,MCS-51单片机串行口的结构如图所示。串行口由发送控制、接收控制、波特率输入管理和发送/接收缓冲器SBUF组成。,串行口的寄存器,1发送/接收缓冲器SBUF,SBUF属于特殊功能寄存器,其字节地址为99H,不可位寻址。SBUF只能与累加器A实现数据传送。CPU写SBUF的同时,启动数据的串行发送;接收时,就是读取SBUF的过程。,下列指令可以分别完成一次发送和接收:,MOV SBUF, A ;启动一次数据发送,MOV A, SBUF ;完成一次数据接收,SM0、SM1:工作方式选择位,由软件置位或清零。,2串行口控制寄存器SCON,SCON用于串行口的工作方式设定和数据传送控制,字节地址为98H,可位寻址,位地址为98H-9FH。,串行口的寄存器,SM2:多机通信控制位。,在方式2和3中,若SM2=1,则允许多机通信。在主从式多机通信中,SM2用于从机的接收控制。当SM2=1时:只有接收到的第9位数据(RB8)为1时(数址帧),才将接收到的前8位数据送入SBUF中,并置位RI,以产生中断申请。否则将接收到的数据丢弃,不启动接收中断标志RI(即RI=0)。若SM2=0,不属于多机通信情况,从机可接收所有信息;不论第9位数据是0还是1,都置RI=1,接收到的数据都装入到SBUF中。,串行口的寄存器,在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。,在方式0时,SM2必须是0。,REN:允许接收位。REN=1时,允许接收;REN=0时,禁止接收。REN由指令置位或清零。,TB8:在方式2和方式3时,TB8为所要发送的第9位数据。多机通信中TB8表明主机发送的是地址还是数据,TB8=0为数据,TB8=1为地址。也可用作数据的奇偶校验位。TB8由指令置位或清零。,串行口的寄存器,RB8:接收到的第9位数据。可作为奇偶校验位或地址帧/数据帧的标志。多机通信中用来存放接收到的第9位数据,表明所接收的数据的特征。方式1时,若SM2=0,则RB8是接收到的停止位。在方式0时,不使用RB8位。,TI:发送中断标志。方式0时,发送完8位数据后由硬件置位,其它方式下,发送停止位时由硬件置位,并请求中断。TI=1表示帧发送结束,意味着接收缓冲器已空,CPU可以准备发送下一帧数据。TI必须由指令清零。,串行口的寄存器,RI:接收中断标志。方式0时,接收完8位数据后由硬件置位,其它方式下,接收到停止位时由硬件置位,并请求中断。RI=1表示帧接收完成,意味着接收缓冲器已满,要求CPU取走数据。CPU响应中断后,RI必须由软件清0。,TI和RI是同一个中断源,CPU事先不知道是哪一个产生的中断请求,所以,在全双工通信时,必须通过软件查询来判别。,串行口的寄存器,3电源控制寄存器PCON,电源控制寄存器PCON直接地址为87H,不可位寻址,只有最高位SMOD(串行口波特率系数控制位)与串行口工作有关。,SMOD:串行口波特率系数控制位。在串行口工作方式1、工作方式2和工作方式3中,当SMOD=1时,串行口的波特率加倍;SMOD=0时,串行口的波特率不加倍。复位时,SMOD=0。,串行口的工作方式,1. 工作方式0,方式0为同步移位寄存器输入/输出方式,可外接移位寄存器以扩展I/O口,也可以外接同步输入输出设备。,方式0分为输出和输入两种状态。,在方式0下,不管输出还是输入,通信数据总是从RXD(P3.0)管脚输入或输出,发送和接收的是8位数据,低位在前,高位在后。,串行口的工作方式,1. 工作方式0,TXD(P3.1)管脚总是用于输出移位脉冲,每个脉冲使RXD端输入或输出一位二进制码。,在TXD端的移位脉冲实际上就是方式0的波特率,其值是固定的,为晶振频率f,OSC,的1/12,即每个机器周期移动一位数据。,方式0不属于通信,当串行口别无它用时,可以和外接的移位寄存器结合来扩展并行I/O口。,优点:不占用片外RAM地址,而且还能简化单片机系统的硬件结构。缺点:操作速度较慢。,串行口的工作方式,(1)发送操作,当执行一条MOV SBUF, A 指令时,启动发送操作,由TXD输出移位脉冲,通过RXD由低到高串行发送SBUF中的数据,波特率fosc/12,发送完8位数据后硬件自动置发送中断标志TI=1,请求中断。也可通过查询TI位来确定是否发送完一组数据。若要继续发送数据,必须用指令将TI清零。,【例】在模式0时外接一个串入/并出的移位寄存器,就可以扩展一个8位并行输出口。所用的移位寄存器应该带有输出允许控制端,这样可以避免在数据串行输入时,并行输出端出现不稳定的输出。,常用CD4094(也可用74LS164)进行串/并转换,CD4094是串行输入、8位并行输出的移位寄存器,它与单片机的连接电路如图所示。,外接移位寄存器输出,(1)先对SCON寄存器初始化,进行工作模式设置:只把00H送入SCON即可设置为模式0。,(2)数据输出可采用两种方式。中断方式:TI=1,产生中断申请,中断后才发下一组数据。查询方式:TI=0,继续查询;TI=1,结束查询,发下一组数据。,【练习4】 用8751串行口外接CD4094扩展8位并行输出口,8位输出端的各位都接一个发光二极管。要求编程实现:发光二极管从左到右以一定延迟轮流点亮,并不断循环。假设发光二极管为共阴极,则电路连接如图所示。,ORG 0200H,BFS0:MOV SCON ,#00H ;串行口模式0的初始化,CLR ES ;禁止串行中断,MOV A ,#80H ;拟先点亮最左边一位,LOOP:CLR P1.0 ;关闭并行输出,MOV SBUF ,A ;数据送SBUF,启动串行输出,JNB TI ,$ ;查询TI=0,未发送完等待,SETB P1.0 ;TI=1,发送完启动并行输出,ACALL DELAY ;调延时程序,CLR TI ;软件清TI,RR A ;右移一位,准备显示下一位,SJMP LOOP ;转移,继续发送,RET,(2)接收操作,当串行口工作在方式0时,同时满足REN=1和RI=0条件时,就会启动一次接收过程。由TXD端输出移位脉冲,数据依次由低位到高位经RXD端接收到SBUF中,一帧数据接收完成后,硬件置RI为1。若要再次接收一帧数据,要用指令将RI清零(RI=0)。,串行接口工作在方式0时,尽量用查询方式。,复位时,SCON被清零,接收前,必须先置位REN=1才允许接收数据。,查询方式发送程序如下:,MOV SBUF, A,JNB TI, $,CLR TI,查询方式接收程序如下:,JNB,RI, $,CLR,RI,MOV A, SUBF,【例】 扩展并行输入口,模式0输入时,常用移位寄存器CD4014(也可用74LS165)进行并/串转换,CD4014是8位并行输入、串行输出的移位寄存器,它与单片机的连接电路如图所示。,【练习5】 用8751串行口外接CD4014扩展8位并行输入口,输入数据由8个开关提供,另有一个开关S提供联络信号,电路连接如图6-7所示。当S=0时,要求输入数据,并转存到内部RAM 40H单元中。试编程实现。,ORG 0300H,BJS0:JB P1.0 ,LP2 ;开关K未闭合,转返回,CLR ES ;禁止串行中断,MOV SCON ,#10H ;设模式0,RI清0,启动接收,LP: SETB P1.1 ;P/S=1,并行置入开关数据,CLR P1.1 ;P/S=0,开始串行接收,LP1:JNB RI,LP1 ;查询RI,RI=0,未接收完等待,CLR RI ;接收完,清RI,准备接收下一个,MOV A ,SBUF ;读取数据送入累加器,MOV 40H ,A ;送内部RAM,LP2:RET ;接收完,子程序返回,2. 工作方式1,工作方式1为8位通用异步通信接口,一帧数据为10位,一位起始位,8位数据位,一位停止位。波特率由T1的溢出率及SMOD的状态决定。,(1)发送操作,当执行一条MOV SBUF, A 指令时,数据从TXD引脚输出,此时的发送移位脉冲即发送波特率,是由定时器T1送来的溢出信号经过16分频或32分频(取决于SMOD的值)而得到的。发送完一帧数据后硬件置TI=1并请求中断,完成一次发送过程。如果要继续发送数据,需要用指令将TI清零。,串行口的工作方式,(2)接收操作,在REN=1的条件下,串行口采样RXD端得到1至0的跳变时,就认定为接收到起始位,随后在移位脉冲的控制下,数据从RXD端输入,直到停止位到来时,把停止位送入RB8中,置位RI请求中断并通知CPU从SBUF中取走接收的数据。再次接收数据时,需用指令将RI清零。,注意:通常串行口以方式1工作时,SM2设置为“0”。,串行口的工作方式,3. 工作方式2,串行接口的工作方式2为9位异步通信接口,传送一帧数据共有11位,包括一位起始位,8位数据位,1位可编程位,一位停止位。,(1)发送操作,发送数据前,由指令设置TB8(奇偶校验或标志位),将要发送的数据由A写入SBUF中后启动发送操作。同时把TB8装入发送移位寄存器的第9位,并通知发送控制器要求进行一次发送。发送完毕后硬件自动置TI=1。,多机通信的发送时,TB8=1为地址帧,TB8=0为数据帧。,工作方式2下,SMOD=0,波特率为fosc/64;,SMOD=1,波特率为fosc/32。,(2)接收操作,当REN=1且RI=0时,启动接收操作,串行口RXD端电平采样,当采样到1至0的跳变时,就认定为接收到起始位,随后在移位脉冲的控制下,数据从RXD端输入。在方式2的接收中,接收数据真正有效的条件为:, RI=0;, SM2 =0 或接收到的第9位数据为“1”。,当两个条件都满足时,接收的前8位数据装入SBUF,第9位数据装入RB8中,并置RI=1。否则,这次接收无效,也不置位RI。再次接收数据时,需用指令将RI清零。,串行口的工作方式,4. 工作方式3,方式3与方式2唯一的差别是波特率不同。方式2的波特率是固定的,即为f,OSC,/ 32或 f,OSC,/ 64;而方式3的波特率与方式1相同。它是方式1和方式2的综合运用。,串行通信波特率设置,1. 四种工作方式下波特率计算,(1)方式0的波特率,方式0的波特率是固定的,为fosc/12,(2)方式2的波特率,方式2的波特率=2,SMOD,fosc /64,SMOD=1时波特率为fosc/32,,SMOD=0时波特率为fosc/64。,(3)方式1与方式3的波特率。,串行通信波特率设置,2. 定时器T1的溢出率计算,T1作波特率发生器使用时,通常选择计数初值自动重装的方式即方式2,工作在定时器状态。设每次重装的计数初值为X,则定时器T1溢出周期为:,定时器1作波特率输出时,为了防止溢出中断,应保持T1为中断禁止状态。,串行通信波特率设置,例6-8若fosc=11.0592MHz,波特率为2400b/s,设SMOD=0,则计数器/定时器T1的计数初值为多少?,X=256-fosc/(24003212)=F4H。,或直接查表6-10,fosc=11.0592MHz,波特率2.4K,SMOD=0,得 :X= F4H,串行口的多机通信,1. 多机通信的连接方式,串行口以方式2或方式3接收时,若SM2为1,则只有接收到的第9位数据为1时,数据才能装入接收缓冲器,并将中断标志RI置1,向CPU发出中断请求;如果接收到的第9位数据为0,则不产生中断标志(RI=0),信息将丢失。而当SM2=0时,则接收到一个字节后,不管第9位数据是1还是0,都产生中断标志(RI=1),将接收到的数据装入接收缓冲器SBUF。利用MCS-51单片机的这一特点,可实现多个处理机之间的通信。,串行口的多机通信,1. 多机通信的连接方式,总线型主从结构:只有一个是主机,其余都是从机,主机发送的信息可被各从机接收,而各从机发送的信息只有主机接收,从机与从机之间不能互相直接通信,只能经主机才能实现。,串行口的多机通信,2. 多机通信原理,主机发出的信息有两类,一类是地址,设置TB8=1,用来确定需要与主机通信的从机,另一类是数据,设置TB8=0。对从机来说,每个从机系统有一个对应的地址编码,假设从机的地址分别为00H 、01H、02H等等。当从机的SM2=1时,从机只接收主机发出的地址帧(第9位为1),对数据帧(第9位为0)不予理睬;而当SM2=0时,可以接收主机发出的所有信息。,多机通信过程如下:,(1)所有从机的SM2置位1,都处于只接收地址帧的状态。,(2)主机发送一帧地址信息,其中8位地址,第9位为1表示地址帧。,(3)所有从机接收到地址帧后,把接收到的地址与自身地址相比较,地址相符的丛机置SM2=0,准备接收主机随后发送的数据信息。地址不相符的丛机维持SM2=1。,串行口的多机通信,(4)主机发送一帧数据信息,其中8位地址,第9位为0表示数据帧。由于被寻址的从机SM2=0,可以接收主机随后发送的信息,实现主机与被寻址从机的双机通信。而未被寻址的丛机由于维持SM2=1,对随后主机发送的数据不予理睬,直至收到新的地址帧。,(5)被寻址的从机通信完毕后,置SM2=1,恢复多机通信原始状态。,串行口的多机通信,6.4 串行口的应用,1.不带校验功能的发送程序设计举例,例6-9利用MCS-51单片机的串行口UART实现一个数据块的发送。设发送数据缓冲区首地址为50H,发送数据长度(字节数)为10H,串行口设定为工作方式1,选定波特率为1200,时钟频率为11.059MHz。,设计思路:将定时器/计数器T1设定在工作方式2下作波特率发生器。当选定波特率为1200,时钟为11.029MHz时,计数器中的计数初值为0E8H(SMOD=0时)。,发送子程序清单:,TXD1: MOV TMOD, #20H ; T1作波特率发生器的初始化,MOV TL1, #0E8H,MOV TH1, #0E8H,CLR ET1 ;禁止T1中断,使用复位状态可不设定,SETB TR1 ;T1启动,MOV SCON, #40H ;串行口初始化成方式1,MOV PCON, #00H ;设SMOD=0,使用复位状态可不设定,MOV R0, #50H ;发送数据缓冲区首址入R0,MOV R7, #10H ;发送数据块长度送R7,TRS: MOV A, R0 ;发送一帧数据,MOV SBUF, A,WAIT: JBC TI, CONT ;发送等待,发送完一帧转CONT,SJMP WAIT,CONT:INC R0 ;指向下一个字节单元,DJNZ R7, TRS ;数据块发送完?未完转TRS,RET ;数据块发送完,结束,6.4 串行口的应用,2. 不带校验功能的接收程序设计举例,例6-10利用MCS-51单片机的串行口UART实现一个数据块的接收。设接收数据缓冲区的首地址为40H,接收数据长度为10H,串行口设定为工作方式2。,设计思路:利用UART实现数据块接收时,其波特率要与发送端的波特率一致,本例只编写接收程序,不考虑发送的工作方式及波特率。设定工作方式2时,波特率固定为fosc/32(SMOD=1)。,工作方式2接收数据块子程序如下:,RXD2: MOV SCON,#80H ;串行方式2设定,MOV PCON,#80H ;取波特率fosc/32,SMOD=1,MOV R0, #40H ;接收数据缓冲区首址入R0,MOV R7, #10H ;接收数据块长度入R7,RDS: SETB REN ;启动接收,WAIT: JBC RI, REND ;接收等待,接收完一帧转REND,SJMP WAIT,REND: MOV A, SBUF ;接收数据送入接收缓冲区,MOV R0,A,INC R0 ;指向下一个接收缓冲单元,DJNZ R7, RDS ;数据块接收完?未完转RDS,RET ;接收完,子程序结束,方式1的累加和校验法,此例规定通信协议和握手信号如下:,(1) 甲、乙双方均采用串行口模式1;,(2) 采用定时器T1工作在方式2做波特率发生器,波特率为2400 波特,当系统晶振为6 MHz时,计数初值为F3H,SMOD=1;,(3) 发送方是把片内RAM 50H6FH单元中的数据块从串行口输出。接收方则把接收的数据块存入片外RAM 2000H201FH单元中;,(4) 甲、乙双方使用累加和进行校验。即发送方每发送一个数据求一次“累加和”,一组数据发完后,将所求的“累加和”作为“校验和”发送给接收方。接收方每接收到一个数据也求一次“累加和”,所有数据接收完,将所求的“累加和”与接收到的“校验和”相比较,如相等,说明正确;否则,说明出错。,(5) 甲机发送数据,乙机接收数据。甲机发送时,先发送一个呼叫信号“A1”,乙机收到后回答一个“B1”的应答信号,表示同意接收。甲机只有收到应答信号“B1”后才开始发送数据。乙机接收数据,若接收正确,向甲机回发“00H”,否则回发“0FFH”,请求重发。甲机收到“00H”的回答后结束发送。否则重新发送数据。,甲机发送程序清单如下。,ORG 1000H,A1S:MOV TMOD,#20H ;设置定时器T1为方式2,MOV TL1,#0F3H ;送入波特率的初值,MOV TH1,#0F3H,SETB TR1 ;启动定时器T1,MOV SCON,#50H ;设串口方式1,允许接收,MOV PCON,#80H ;设SMOD=1,AT1:MOV SBUF,#0A1H;发呼叫信号“A1”,AS1:JBC TI,AR1 ;判是否发送完,SJMP AS1 ;未完等待,AR1:JBC RI,AR2 ;发送完,接收乙机回答,SJMP AR1,AR2:MOV A,SBUF ;读取乙机回答信号到A中,XRL A,#0B1H ;检测回答信号是否为“B1”,JNZ AT1 ;不是,转继续呼叫,AT2
展开阅读全文