串口波特率与定时计数器关系.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
串口波特率与定时计数器的关系 UART串口,在系统中元件之间,或系统与系统之间进行通信。然而在写过(抑或是生搬硬套)若干串口通信程序之后,却越来越迷惘于串口波特率的设定与T/C间的关系,本文就此问题加以思考并给予验证。 1. T1 作为波特率发生器 在对TMOD进行设置时,若非特殊需要非常低的波特率,一般将T1的工作模式选为方式2:此时既省去了进入T1中断,利用软件重新设置TH1和TL1的不便,又保障了数据收发的正确性(因为晶振稳定)。此时问题来了,那么T0又该设置成什么方式呢?看下表: TMOD TR1 = ? Communicate 片内资源(8051) 0x20 0 不能通信 T/C(1) 1 可以通信 0x21 0 不能通信 T/C(1) 1 可以通信 0x22 0 不能通信 T/C(1) 1 可以通信 0x23 0 可以通信 T/C(1),T(1):由T0拆分 1 可以通信 由上表可看出,当T/C0工作于方式3时,T/C1只需设置好工作方式就可自动运行,而不需要TR1 =1命令。同时也发现,由于T0的拆分,片内仍存在着一个T/C,一个T,可以说,若使用T1作为串口的波特率发生器,最好使T0工作在方式3下,即TMOD = 0X23。 正如老子所说福兮祸之所伏,此做法也存在着一定的坏处: 1. 由于T0的拆分所得的2个T均为8位,且无reload功能,功能减弱。 2. 由于TH0占用了T1的TR1与TF1,所以,在写程序时,容易搞混。 当TMOD = 0x20,0x21,0x22时,TR1 = 1,开始串口通信,此时串口中断和T/C中断是并存的,一般做法是ET1 = 0,禁止T1中断。 ? 2. T2 作为波特率发生器 随着大规模集成电路的发展,8052系列增加了一个T/C2,从此也看出了,8051单片机在用T1作为波特率发生器的同时,拆分T0,以此来充当2个T/C用,是多么的落后。 图1 T2在捕获模式下的逻辑图 图2 T2在自动重载模式下的逻辑图 图3 T2在波特率模式下的逻辑图 T2的三种模式通过上面两图可以清楚的看出其工作原理。 由于8052单片机增加了功能强大的T/C2,那么我们在串口通信时,可以选择T2作为波特率发生器。 ? 3. 波特率的计算 串口工作方式及对应的公式(formula)如下 方式0: baud rate = f/12。 方式2:baud rate = (2SMOD/64)*f 方式1或3: T1 -- baud rate = (2SMOD/32) * [f/[12*(2n-x)]] T2 -- baud rate = f/[32*[65536-(RCAP2H,RCAP2L)]] ? 常用波特率初值 12M oscillator(1%误差以内) Baud rate T1(不倍频) T1(倍频) T2 1200 E6 CC FEC8 2400 F3 E6 FF64 4800 F3 FFB2 9600 FFD9 11.0592M oscillator(无误差) Baud rate T1(不倍频) T1(倍频) T2 1200 E8 D0 FEE0 2400 F4 E8 FF70 4800 FA F4 FFB8 9600 FD FA FFDC ? 4. 程序实例 以下两例分别为T1 T2作为波特率发生器时的设置函数: //Deion: 12M oscillator,Baud rate = 1200 //Author: //Date:09-9-17 void uart_init (void) { /* 串口方式:8位UART,不启用多机通信,波特率不加倍 */ SCON = 0x50; PCON = 0; /* T1作为波特率发生器 计数源:T(内部晶振) 方式2:auto reload //gate=0: tr1 */ TMOD = 0X22; TL1 = 0xE6; TH1 = 0xE6; TR1 = 1; /* 允许serial port中断,禁止T1中断 */ IE = 0X90; } //Deion: 12M oscillator,Baud rate = 1200 //Author: //Date:09-9-17 void uart_init (void) { /* 串口方式:8位UART,不启用多机通信,波特率不加倍 */ SCON = 0x50; PCON = 0; /* T2作为波特率发生器 计数源:T(内部晶振) Baud rate mode */ TH2 = 0XFE; TL2 = 0XC8; RCAP2H = 0XFE; RCAP2L = 0XC8; T2CON = 0X34; /* 允许se

文档评论(0)

bhyq + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档