单片机从机的波特率自适应设置前言我们在设计单片机串行通讯程序时.docVIP

单片机从机的波特率自适应设置前言我们在设计单片机串行通讯程序时.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单片机从机的波特率自适应设置前言我们在设计单片机串行通讯程序时

单片机从机的波特率自适应设置前 言 我们在设计单片机串行通讯程序时,一般用其晶体震荡器的频率来计算具体的波特率时间常数,当晶体震荡频率变了时,其底层软件也必须跟着修改,不免有些麻烦。为此,笔者经过实践,找到一种可以两全其美的办法,就是从机帧测主机位信息并自动设置与主机同样波特率以适应主机。其一可以不考虑晶体震荡频率;其二从机可以自动适应主机的波特率,从而与主机正常通讯。 为便于说明,以AT89C52为实例,AT89C52为从机,以PC机为主机。 一、硬件原理图 说明:DB9接到PC机的串口上。晶体震荡器可以用诸如11.0592MHz,14.7456MHz,对本文的介绍没有影响等等。这里,单片机为机为,PC机为主机。 二、自动设置理论原理 AT89C52的串行口有4种工作方式,方式1、3最常用。T2的波特率发生方式类似于常数自动重装入方式。用X16代替(RCAP2H,RCAP2L),则串行口方式1、3的波特率公式为: 波特率=fosc/[32 x (65536-X16 )]..……………………..……..…(A) 由(A)可得,单片机每接收1bit需要的时间为 接受1bit的时间=[32 x (65536- X16 )]/ fosc……………………(B) 单片机AT89C52为12分频指令系统,所以其机器周期为: 机器周期= 12/fosc……………………………………….….….……(C ) 我们可以很容易得到单片机接收1bit所需要的机器周期,假定为NUM,则由(B),(C)得 NUM x 12/ fosc=[32 x (65536- X16 )]/ fosc…………………………...(D) 由(D)可得,波特率定时时间常数为: X16=NUM x 3/8……………………………….…………………….….(E) 由此,关键需要得到单片机接受1 bit的机器周期数NUM。 ??? 三、自动检测主机信息的方法 不失一般性,假定串行通讯的字符协议为1起始位,8数据位,无奇偶校验位,1停止位,如下(图2)所示, 由定时器2工作原理(图3)知道,C/T2=0,TR2=0,则其加1计数,其计数速率为fosc/12,每加1需要的时间等于12/fosc,刚好就是一个机器周期。所以,只要我们在传输数据的某位开始处启动定时器,在传输该位结束时停止计数器,然后获取该范围的计数值,就是我们上面公式(E)中的NUM。 (定时器2工作原理,图3) ??? 由图2知,如果主机(PC机)发给单片机01H(十六进制),则单片机P3.0接收数据如下波形(图4)。起始位开始时,启动定时器T2,当高电平来到时,关闭定时器T2,则计数值就等于NUM。 四、软件实现 1.流程图 这里给出获取定时常数的流程图,按主机发0x01来设计的 获取8bit数据的定时计数值(图5) 计算定时时间常数(图6) 2. 实现该方法的软件源代码 说明:本软件包括C51和汇编两部分 字符协议:1起始位,8数据位,无奇偶校验位,1停止位 ;//-----汇编部分 ;//-----文件名:Yasm.asm ;//------日期:2002.12.1 public GetBitPara proc?? segment code rseg??? proc TR2??? BIT 0CAH T2CON EQU 0C8H RCAP2H EQU ?? 0CBH RCAP2L EQU ?? 0CAH TH2??? EQU ?? 0CDH TL2??? EQU ?? 0CCH GetBitPara: ??????? CLR TR2?????? ; 停止定时器T2 ??????? MOV SCON,#00h ??????? MOV IE,#00H ??????? CLR TR2 ??????? MOV T2CON,#00h ??????? MOV TH2,#0???? ;设置定时器初始值 ??????? MOV TL2,#0 ??????? MOV RCAP2H,#0 ??????? MOV RCAP2L,#0 ??????? ??????? SETB RXD ??????? JB?? RXD,$???? ;等待起始位 ??????? SETB TR2?????? ;开启定时器T2 ??????? JNB RXD,$???? ;等待第1bit到来 ??????? CLR TR2?????? ;停止定时器T2 ??????? ??????? MOV R6,TH2??? ;返回计数值 ??????? MOV R7,TL2??? ; ??????? RET END //////////

文档评论(0)

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

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

1亿VIP精品文档

相关文档