1、在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS51 串行口编程可约定四种工作方式。其中,方式 0 和方式 2 的波特率是固定的,而方式 1 和方式 3 的波特率是可变的,由定时器 T1 的溢出率决定。串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源不同,所以,各种方式的波特率计算公式也不同。 一、方式 0 的波特率方式 0 时,移位时钟脉冲由 S6(即第 6 个状态周期,第 12 个节拍) 给出,即每个机器周期产生一个移位时钟,发送或接收一位数据。所以,波特率为振荡频率的十二分之一,并不受 PCON 寄存器中 SMOD 的影响,即:方式 0 的波
2、特率fosc 12三、方式 l 和方式 3 的波特率 方式 1 和方式 3 的移位时钟脉冲由定时器 T1 的溢出率决定,故波特宰由定时器 T1 的溢出率与 SMOD 值同时决定,即:方式 1 和方式 3 的波特率2SMOD/32T1 溢出率其中,溢出率取决于计数速率和定时器的预置值。计数速率与 TMOD 寄存器中 CT 的状态有关。当 CT0 时,计数速率fosc 2;当 CT1 时,计数速率取决于外部输入时钟频率。当定时器 Tl 作波特率发生器使用时,通常选用可自动装入初值模式(工作方式 2),在工作方式 2 中,TLl 作为计数用,而自动装入的初值放在 THl 中,设计数初值为 x,则每过
3、“256 一 x”个机器周期,定时器 T1 就会产生一次溢出。为了避免因溢出而引起中断,此时应禁止 T1 中断。这时,溢出周期为:系统晶振频率选为 110592MHZ 就是为了使初值为整数,从而产生精确的波特率。如果串行通信选用很低的波特率,可将定时器 Tl 置于工作方式 0 或工作方式 1,但在这种情况下,T1 溢出时,需用中断服务程序重装初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的办法加以调整。表 62 列出了各种常用的波特率及其初值。51 单片机串口通信及波特率设置 2010-05-21 14:131653 人阅读评论(0)收藏举报MCS-51 单片机具有一个
4、全双工的串行通信接口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。1. 数据缓冲寄存器 SBUFSBUF 是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU 写 SBUF 就是修改发送寄存器;读 SBUF 就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU 未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时 CPU是主动的,不会产生重叠问题。2. 状态控制寄存器 SCONSCON 是一
5、个逐位定义的 8 位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON 即可以字节寻址也可以位寻址,字节地址 98H,地址位为 98H9FH。它的各个位定义如下:MSB LSB SM0 SM1 SM2 REN TB8 RB8 TI RISM0 和 SM1 是串口的工作方式选择位,2 个选择位对应 4 种工作方式,如下表,其中 Fosc 是振荡器的频率。SM0 SM1 工作方式 功能 波特率0 0 0 8 位同步移位寄存器 Fosc/120 1 1 10 位 UART 可变1 0 2 11 位 UART Fosc/64 或 Fosc/321 1 3 11 位 UART 可变
6、SM2 在工作方式 2 和 3 中是多机通信的使能位。在工作方式 0 中,SM2 必须为 0。在工作方式1 中,若 SM2=1 且没有接收到有效的停止位,则接收中断标志位 RI 不会被激活。在工作方式 2 和 3中若 SM2=1 且接收到的第 9 位数据(RB8)为 0,则接收中断标志 RB8 不会被激活,若接收到的第9 位数据(RB8)为 1,则 RI 置位。此功能可用于多处理机通信。REN 为允许串行接收位,由软件置位或清除。置位时允许串行接收,清除时禁止串行接收。TB8 是工作方式 2 和 3 要发送的第 9 位数据。在许多通信协议中该位是奇偶位,可以按需要由软件置位或清除。在多处理机通
7、信中,该位用于表示是地址帧还是数据帧。RB8 是工作方式 2 和 3 中接收到的第 9 位数据(例如是奇偶位或者地址 /数据标识位),在工作方式 1 中若 SM2=0,则 RB8 是已接收的停止位。在工作方式 0 中 RB8 不使用。TI 为发送中断标志位,由硬件置位,软件清除。工作方式 0 中在发送第 8 位末尾由硬件置位;在其他工作方式时,在发送停止位开始时由硬件置位。TI=1 时,申请中断。CPU 响应中断后,发送下一帧数据。在任何工作方式中都必须由软件清除 TI。RI 为接收中断标志位,由硬件置位,软件清除。工作方式 0 中在接收第 8 位末尾由硬件置位;在其他工作方式时,在接收停止位
8、的中间由硬件置位。RI=1 时,申请中断,要求 CPU 取走数据。但在工作方式 1 中, SM2=1 且未接收到有效的停止位时,不会对 RI 置位。在任何工作方式中都必须由软件清除 RI。系统复位时,SCON 的所有位都被清除。控制寄存器 PCON 也是一个逐位定义的 8 位寄存器,目前仅仅有几位有定义,如下所示:MSB LSB SMOD GF1 GF0 PD IDL 仅最高位 SMOD 与串口的控制有关,其他位与掉电方式有关。PCON 的地址为 87H 只能按字节寻址,SMOD 是串行通信波特率系数控制位,当串口工作在工作方式 1、2 时,若使用 T1 作为波特率发生器其 SMOD=1 则波
9、特率加倍(见下面详述)。GF1 和 GF0 用于一般的用途,对于 AT89 系列为通用的标志位, PD 为电源下降位,对于 AT89系列,PD 为 1 进入掉电状态, IDL 为 IDLE 模式位,对于 AT89 系列,IDL 为 1 进入空闲工作方式,在 PD 和 IDL 同时为 1 时,PD 优先。(1) 工作方式 0SM0=0 且 SM1=0 时,串口选择工作方式 0,实质这是一种同步移位寄存器模式。其数据传输的波特率固定为 Fosc/12,数据由 RXD 引脚输入或输出,同步时钟由 TXD 引脚输出。接收/ 发送的是 8 位数据,传输是低位在前,帧格式如下:D0 D1 D2 D3 D4
10、 D5 D6 D7 .(2)工作方式 1当 SM0=0 且 SM1=1 时,串口选择工作方式 1,其数据传输的波特率由定时/计数器 T1、T2 的溢出速率决定,可通过程序设定。当 T2CON 寄存器中的 RCLK 和 TCLK 置位时,用 T2 作为发送和接收波特率发生器,而 RCLK=TCLK=0 时,用 T1 作为波特率发生器,两者还可以交叉使用,即发送和接收采用不同的波特率。数据由 TXD 引脚发送,由 RXD 引脚接收。发送或接收一帧的数据为 10 位,即 1 位起始位(0)、8 位数据位(低位在先)和 1 位停止位(1)。真格式如下:起始位 0 D0D1D2D3D4D5D6D7停止位
11、 1类似于工作方式 0,当执行任一条 SBUF 指令时,就启动串行数据的发送。在执行写入 SBUF 的指令时,也将“1”写入发送移位寄存器的第 9 位,并通知发送控制器有发送请求。实际上,发送过程始于内部的 16 分频计数器下次满度翻转(全“1”变全“0”)后的那几个机器周期的开始。所以,每位的发送过程与 16 分频计数器同步,而不是与“写 SBUF”同步。此方式的工作过程包括发送和接收两部分。当执行任一条写 SBUF 指令时,就启动串行数据的发送。在执行写入 SBUF 的指令时,也将“1”写入发送移位寄存器的第 9 位,并使发送控制器开始发送。在这期间,内部的定时保证写入 SBUF 与激活发
12、送之间有一个完整的机器周期。当发送脉冲有效后,移位寄存器的内容由 RXD 引脚串行移位输出,移位脉冲由 TXD 引脚输出。在发送有效的每个机器周期,发送移位寄存器右移一位,就在其左边补“0 ”。当数据的最高位移到移位寄存器的输出时,原写入第 9 位的“1”正好移到最高位的左边一位,由此向左的所有位都为“0”,这标志着发送控制器要进行最后依次移位,并撤消发送有效,同时使发送中断标志 TI 置位。当 REN=1 且接收中断标志 RI 位清除时,即启动一个接收过程。在下一个机器周期,接收控制器将“11111110”写入接收移位寄存器,并在下一周期内激发接收有效,同时由 TXD 引脚输出移位脉冲。在移
13、位脉冲的控制下,接收移位寄存器的内容每一个机器周期左移一位,同时由 RXD 引脚接收一位输入信号。每当接收移位寄存器左移一位,原写入的“11111110” 也左移一位。当最右边的 “0”移到最左边时,标志着接收控制器要进行最后一次移位。在最后移位即将结束时,接收移位寄存器的内容送入到接收数据缓冲寄存器 SBUF,然后在启动接收的第 10 个机器周期时,清除接收信号,将 RI 置位。如果在第一个时钟周期中接收到的不是起始位(“0” ),就复位接收电路,继续检测 RXD 引脚上1 到 0 的跳变。如果接收到的是起始位,就将其移入接收移位寄存器,然后接收该帧的其他位。接收到的位从右边移入,原来写入的
14、 1 从左边移出,当起始位移到最左边时,接收控制器将控制进行最后一次移位,把接收到的第 9 为数据送到接收数据缓冲器 SBUF 和 RB8,同时置位 RI。在进行最后一次移位时,能将数据送入到接收数据缓冲器 SBUF 和 RB8 而且置位 RI 的条件如下: RI=0,即上一真数据接收完成时,发出的中断请求已经被响应,SBUF 中的上一帧数据已经被取走。 SM2=0 或接收到的停止位为 1。这两个条件有一个不满足接收到的数据就有可能丢失,并且无法修复;如两者都满足则数据装入SBUF,停止位装入 RB8 且置位 RI。开始发送后的一个位周期,发送信号有效,开始将起始位送 TXD 引脚。一位时间后
15、,数据信号有效。发送移位寄存器将数据由低位到高位顺序输出至 TXD 引脚。一位时间后第一个移位脉冲出现,将最低数据位从右边移出,同时从左边补上“0” 。当数据的最高位移到移位寄存器的输出端时,先前写入第 9 位的“1” 正好移到最高位的左边一位,而它的左区全部为“0”。在第 10 个位周期(16 分频计数器回 0 时),发送控制器要进行最后一次清除发送信号,同时使发送中断标志 TI 置位。当 REN=1 且接收中断标志 RI 位清除后,若在 RXD 引脚上检测到一个由 “1”到“0”的跳变,立即启动一次接收的过程。同时复位 16 分频计数器,使输入位的边沿与时钟对齐,并将 1FFH(9 个“1
16、” )写入接收移位寄存器。接收控制器继续以波特率的 16 倍的速率继续对 RXD 引脚进行检测,对每一位时间的第 7、8、9 个计数状态的采样值用多数表决法,当 2 次或 2 次以上的采样值相同时,采样值被接受。(1) 工作方式 2 和 3当 SM0=1 且 SM1=0 时,串口选择工作方式 2,当 SM0=1 且 SM1=1 时,串口选择工作方式3。数据由 TXD 引脚发送由 RXD 引脚接收。发送和接收的一帧信息为 11 位,即 1 位起始位(0),9 位数位(低位在前,第 9 位数据位是可编程位)1 位停止位(1 )。发送时,可编程位(TB8)可赋 0 或 1,接收时可编程位进入 SCO
17、N 中的RB8。帧的格式如下: 起始位 0 D0D1D2D3D4D5D6D7可编程位 D8 停止位 18051 单片机波特率计算公式(配套 C 语言例程) 8051 单片机使用定时器 1 工作在方式 2 的情况下作为串口波特率发生器,其波特率=(2 smod /32)(定时器 T1 溢出率),其中 smod 是 PCON,表示是否波特率加倍,Fsoc 是系统的晶振大小。波特率公式中:T1 溢出率= 溢出周期 的倒数;溢出周期=(256-TH1)12/Fosc;最终公式:波特率:Baud=(2 smod Fsoc)/(32 12(256-TH1)我们一般不太关注波特率的计算,而是关心选用的传输速
18、度(波特率)去反算定时器 1(自动重装模式)的初值(TH1),所以将上面的公式导一下,得到 TH1 的公式:TH1=256-(Fsoc2smod)/(1232Baud)下面针对串口发送程序,水寒写下例程,供大家参考。(我使用的是 STC12C5A40S2 调试,原则上在 STC89C5x、AT89C5x 等 8051 核心的单片机上都能够成功,由于程序比较简单,我没有试,但应该没有问题的)cpp view plaincopyprint?1. #include “Reg52.H“ 2. /* 3. 请提前计算一下所选晶振能达到的最高速度,波特率不能超过最高速度 4. (1) 波特率加倍(SMOD
19、=1): Max_Baud = FOSC/12/16 5. (2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32 6. 例如:22.1184MHz 晶振,波特率加倍时,最大波特率=22118400/12/16=115200 7. */ 8. #define FOSC 22118400 /振荡频率 9. #define BAUD 9600 /波特率 10. #define SMOD 1 /是否波特率加倍 11. #if SMOD 12. #define TC_VAL (256-FOSC/16/12/BAUD) 13. #else 14. #define TC_VAL
20、(256-FOSC/32/12/BAUD) 15. #endif 16.17. typedef unsigned char uint8; 18. typedef unsigned int uint16; 19.20. code const char str1 = “Ther string is transmitted from 80C51!rn“; 21. code const char str2 = “Author: xqlu(at)rn“; 22.23. /*函数声明*/ 24. void InitUART(void); 25. void SendOneByte(uint8); 26. v
21、oid SendrStr(const uint8 *ptr); 27.28. /*主函数*/ 29. void main(void) 30. 31. uint8 i=0; 32. InitUART(); 33.34. while(str2i!=0) 35. 36. SendOneByte(str2i+); 37. 38.39. SendrStr(str1); 40.41. while(1); 42. 43.44. /*中断服务函数*/ 45. void UART_ISR(void) interrupt 4 46. 47. uint8 RX_Data; 48. /只响应“接收”中断,“发送”中断
22、来了就直接抹掉 49. if(RI) 50. 51. RI = 0; /串口中断标志不能自己清除,需要手动清除 52. RX_Data=SBUF; 53. SendOneByte(RX_Data); 54. 55. else 56. TI = 0; /串口发中断是发送完缓冲区数据之后产生 57. 58.59. /*串口初始化函数*/ 60. void InitUART(void) 61. 62. TMOD = 0x20; 63. SCON = 0x50; 64. TH1 = TC_VAL; 65. TL1 = TH1; 66. PCON = 0x80; /发送速率加倍 67. ES = 1;
23、68. EA = 1; 69. TR1 = 1; 70. 71. /*串口发送字符函数*/ 72. void SendOneByte(uint8 c) 73. 74. ES = 0; /禁止发送中断 75. SBUF = c; 76. while(!TI); 77. TI = 0; 78. ES = 1; 79. 80. /*串口发送字符串函数*/ 81. void SendrStr(const uint8 *ptr) 82. 83. do 84. 85. SendOneByte(*ptr); 86. while(*ptr+!=0); 87. 波特率的研究通常情况下,8051 系列单片机外接晶
24、振频率一般是 12MHz、24MHz 、48MHz 如图 7-6-1,为什么会这样选取呢?从前面的章节已经介绍 8051 系列单片机的每 12 个时钟周期为一个指令周期,当 8051系列单片机外接 12MHz 晶振时,指令周期=12/12MHz=1us;若外接 24MHz 晶振时,指令周期=12/24MHz=0.5us;若外接 48MHz 晶振时,指令周期 =12/48MHz=0.25us。8051 系列单片机外接能够被除尽的晶振,在使用单片机内部的定时器/计数器资源时作定时器使用时能够得到精确定时应用;当使用汇编语言编程时,可以清楚知道当前每一行代码执行的时间。8051 系列单片机外接能够被
25、除尽的晶振即 12MHz、24MHz、48MHz 这些晶振时,波特率的精确性就得不到保证。假若现在单片机外接的晶振为 12MHz 时,以 T/C2 作波特率发生器,根据波特率公式:波特率=Fosc/2x16x(65536-t) 9600=12MHz/2x16x(65536-t)t=65496.9375“65496.9375”不是一个整数值,是一个带有小数点的数值。对于常用的 8 位、9 位、11 位一帧的数据接收与传输,最大的允许误差分别是 6.25%、5.56%、4.5% 。虽然波特率允许误差,但是这样通信时便会产生积累误差,进而影响数据的正确性。唯一的解决办法就是更改单片机外接的晶振频率,
26、更改为常用于产生精确波特率的晶振如 11.0592MHz、22.1184MHz。假若现在单片机外接的晶振为 11.0592MHz 时,以 T/C2 作波特率发生器,根据波特率公式:波特率=Fosc/2x16x(65536-t) 9600=11.0592MHz/2x16x(65536-t)t=65500=0xFFDC虽然使用 11.0592MHz、22.1184MHz 的晶振能够产生精确的波特率,但是用于系统精确的定时服务不是十分的理想。例如单片机外接 11.0592MHz 晶振时,指令周期=12/11.0592MHz1.085us,是一个无限循环的小数。当单片机外接 22.1184MHz 晶振
27、时,指令周期=12/22.1184MHz0.5425us,也是一个无限循环的小数。串口工作在方式 1 时分别采用 T/C1 和 T/C2 产生常用波特率初值表如下。初值 初值波特率 (11.0592MHz)TH1、TL1(SMOD=0)TH1、TL1(SMOD=1)波特率(12MHz)TH1、TL1(SMOD=0)TH1、TL1(SMOD=1)1200 0xE7 0xD0 1200 0xE5 0xCB2400 0xF3 0xE7 2400 0xF2 0xE54800 0xF9 0xF3 4800 0xF9 0xF29600 0xFC 0xF9 9600 0xFC 0xF914400 0xFD
28、0xFB 14400 0xFD 0xFB19200 0xFE 0xFC 19200 0xFE 0xFC初值 初值波特率(11.0592MHz)RCAL2H RCAL2L波特率(12MHz)RCAL2H RCAL2L1200 0xFE 0xE0 1200 0xFE 0xC82400 0xFF 0x70 2400 0xFF 0x644800 0xFF 0xD8 4800 0xFF 0xB29600 0xFF 0xDC 9600 0xFF 0xD914400 0xFF 0xE8 14400 0xFF 0xE619200 0xFF 0xEE 19200 0xFF 0xEDMCS-51 单片机串行口工作
29、方式与波特率计算举例1)方式 0 方式 0 是外接串行移位寄存器方式。工作时,数据从 RXD 串行地输入/ 输出,TXD 输出移位脉冲,使外部的移位寄存器移位。波特率固定为 fosc/12(即,TXD 每机器周期输出一个同位脉冲时,RXD 接收或发送一位数据)。每当发送或接收完一个字节,硬件置 TI=1 或 RI=11)方式 0 方式 0 是外接串行移位寄存器方式。工作时,数据从 RXD 串行地输入/输出,TXD 输出移位脉冲,使外部的移位寄存器移位。波特率固定为 fosc/12(即,TXD 每机器周期输出一个同位脉冲时,RXD 接收或发送一位数据)。每当发送或接收完一个字节,硬件置 TI=1
30、 或 RI=1,申请中断,但必须用软件清除中断标志。 实际应用在串行 I/O 口与并行 I/O 口之间的转换。 2)方式 1 方式 1 是点对点的通信方式。8 位异步串行通信口,TXD 为发送端,RXD 为 接收端。一帧为 10 位,1 位起始位、8 位数据位(先低后高)、1 位停止位。波特率由 T1 或 T2的溢出率确定。 在发送或接收到一帧数据后,硬件置 TI=1 或 RI=1,向 CPU 申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。 (1)发送:CPU 执行一条写 SBUF 指令,启动了串行口发送,同时将 1 写入 输出移位寄存器的第 9 位。发送起始位后,在每个
31、移位脉冲的作用下,输出移位寄存器右移一位,左边移入 0,在数据最高位移到输出位时,原写入的第 9 位 1 的左边全是 0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND 和 DATA 无效,发送停止位,一帧结束,置 TI=1。 (2)接收:REN=1 后,允许接收。接收器以所选波特率的 16 倍速率采样 RXD 端电平,当检测到一个负跳变时,启动接收器,同时把 1FFH 写入输入移位寄存器(9 位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间 16 等分采样 RXD,以其中7、8 、9 三次采样中至少 2 次相同的值为接收值。接收位从移位寄存器右边进入,1
32、左移出,当最左边是起始位 0 时,说明已接收 8 位数据,再作最后一次移位,接收停止位。此后: A、若 RI=0、SM2=0,则 8 位数据装入 SBUF,停止位入 RB8,置 RI=1。 B、 若 RI=0、 SM2=1,则只有停止位为 1 时,才有上述结果。 C、若 RI=0、SM2=1,且停止位为 0,则所接数据丢失。 D、若 RI=1,则所接收数据丢失。 无论出现那种情况,检测器都重新检测 RXD 的负跳变,以便接收下一帧。 3)方式 2、方式 3 方式 2 和方式 3 是 9 位异步串行通信,一般用在多机通信系统中或奇偶校验的通信过程。在通讯中,TB8 和 RB8 位作为数据的第 9
33、 位,位 SM2 也起作用。方式 2 与方式 3 的区别只是波特率的设置方式不同。 (1)发送 向 SBUF 写入一个数据就启动串口发送,同时将 TB8 写入输出移位寄存器第 9 位。开始时,SEND和 DATA 都是低电平,把起始位输出到 TXD。DATA 为高,第一次移位时,将1移入输出移位寄存器的第 9 位,以后每次移位,左边移入0 ,当 TB8 移到输出位时,其左边是一个 1和全0。检测到此条件,再进行最后一次移位,/SEND=1 ,DATA=0 ,输出停止位,置 TI=1。 (2)接收 置 REN=1,与方式 1 类似,接收器以波特率的 16 倍速率采样 RXD 端。在 起始位 0
34、移到输入寄存器的最左边时,进行最后一次移位。在 RI=0,SM2=0 或接收到的第 9 位=1时,收到的一字节数据装入 SBUF,第 9 位进入 RB8,置 RI=1;然后又开始检测 RXD 端负跳变。 3、 多机通信 在这里,多机系统是指一主多从 。51 系列单片机中,利用第 9 位 TB8/RB8 来区分地址与数据信息,用位 SM2 确定接收方是否对地址或数据帧敏感。其原则是: 1)发送方用第 9 位 TB8=1 标志地址帧,TB8=0 标志数据帧。 2)接收方若设置 SM2=1,则只能接收到地址信息,若设 SM2=0,则不管是地址还是数据帧,都能接收到。 利用方式 2、3 的特点,在点对
35、点的通讯中,在发送方可以用第 9 位 TB8 作为奇偶校验位。在接收方,SM2 位必须清 0。 4、波特率 1)方式 0 的波特率=fosc/12 2)方式 2 的波特率=2smod*fosc/64 3)方式 1、3 的波特率由 T1 或 T2 的溢出率和 SMOD 位确定: (1)用 T1:波特率=2smod*T1 定时器的溢出率/32,T1 为方式 2 T1 定时器溢出率=1/(12/fosc)*(256-X) 例:已知 fosc=6MHz,SMOD=0,设置波特率为 2400,求 T1 的计数初值 X。 波特率=1/ (12/fosc)*(256-X)/32=fosc/12*32(256
36、-X) (256-X)=fosc/2400/384=6M/2400/384 ;256-X=6.5104 X=250=FAH 只能近似计算。 若 fosc=11.0592MHz, 则 256-X=11.0592M/2400/384=4068/384=12 X=F4H;可精确算出,对其它常用的标准波特率也是能正确算出。所以这个晶振频率是最常用的。 如果 SMOD=1,则同样的 X 初值得出的波特率加倍。 (3)用 T2: 在 52 型单片机中,串口方式 1、3 的波特率发生器选择由 TCLK、RCLK 位 确定是 T1 还是 T2。若 TCLK=1,则发送器波特率来自 T2,否则来自 T1。若 RCLK=1,则接收器波特率来自 T2,否则来自 T1。 由 T2 产生的波特率与 SMOD 无关。T2 定时的最小单元 =2/fosc。T2 的溢出脉冲 16 分频后作为串口的发送或接收脉冲。 波特率=(1/(2/fosc)(65536-X )/16=fosc/(32(65536-X) 例:已知 fosc=11.0592MHz,求波特率 =2400 时的 X 2400=11059200/(32(65536-X) 65536-X=144 X=65392=FF70H 计数器初值寄存器:RCAP2H=0FFH,RCAP2L=70H。