找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3124|回复: 13
打印 上一主题 下一主题
收起左侧

串中通信波特率计算

[复制链接]
跳转到指定楼层
楼主
ID:64817 发表于 2014-9-27 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
void main()   
{     
TMOD=TMOD&0X0F; // 保持TMOD低四位不变。
TMOD=TMOD|0X20; // 设定定时器T1的工作模式为2。
SM0=0; SM1=1;  //串口通讯TI的工作模式,为1,
TH1=0Xf3 ; //256-(1/32*12000000/12)/2400; //设定波特率为2400时,定时器T1的初值。
TL1=TH1; //
TR1=1;  // 定时器打开控股。
REN=1;  //允许串口接收位。
if(RI==1) //接收中断请求标示,必须软件清0;
{ RI=0;
   P2=SBUF; //接收值放在SBUF中, SBUF中的数据赋予P2;
}
}
求助为什么TH1=0Xf3 ;时通信正常。
TH1=256-(1/32*12000000/12)/2400;时通 时就不正常呀,256-(1/32*12000000/12)/2400;的值计算出也为0XF3呀。
求高手详细解答。不要说半句,
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:19715 发表于 2014-9-27 18:02 | 只看该作者
256-(1/32*12000000/12)/2400
这个表达式计算出来的值不是0XF3,
而是0

评分

参与人数 1威望 +10 黑币 +10 收起 理由
xiaojuan + 10 + 10 赞一个!

查看全部评分

回复

使用道具 举报

板凳
ID:19715 发表于 2014-9-27 18:14 | 只看该作者
应该是:256-12000000/12/2400/32
回复

使用道具 举报

地板
ID:64817 发表于 2014-9-27 19:51 | 只看该作者
明白 发表于 2014-9-27 18:02
256-(1/32*12000000/12)/2400
这个表达式计算出来的值不是0XF3,
而是0

我又计算了一边差不多呀,有小数差不多F2呀,,
回复

使用道具 举报

5#
ID:64817 发表于 2014-9-27 19:58 | 只看该作者
明白 发表于 2014-9-27 18:14
应该是:256-12000000/12/2400/32

计算一下了。波特率=2的SMOD次方/32*fosc/12/(256-X)..波特率为2400=2的SMOD次方/32*fosc/12/(256-X)
反过来不就是X=256—(1/32*12000000/12)/2400吗,2的SMOD次方,SMOD为0。2的0次方,为1吗。
回复

使用道具 举报

6#
ID:64817 发表于 2014-9-27 20:06 | 只看该作者
明白 发表于 2014-9-27 18:02
256-(1/32*12000000/12)/2400
这个表达式计算出来的值不是0XF3,
而是0

高手老师,详细说明一下,计算原则呀,是不是计算的优先级出错了呀,,我个人是先算括号内的运算再/2400得出的值为13.02。 256-13=243  十六制数为F3呀,,,高手老师,详细说明一下,C程序计算原则呀是我写的优先级出错了呀
回复

使用道具 举报

7#
ID:64817 发表于 2014-9-27 20:07 | 只看该作者
abeimao 发表于 2014-9-27 19:51
我又计算了一边差不多呀,有小数差不多F2呀,,

高手老师,详细说明一下,计算原则呀,是不是计算的优先级出错了呀,,我个人是先算括号内的运算再/2400得出的值为13.02。 256-13=243  十六制数为F3呀,,,高手老师,详细说明一下,C程序计算原则呀是我写的优先级出错了呀
回复

使用道具 举报

8#
ID:64817 发表于 2014-9-27 20:10 | 只看该作者
明白 发表于 2014-9-27 18:14
应该是:256-12000000/12/2400/32

256-(1/32*12000000/12)/2400,,,计算一下吗
回复

使用道具 举报

9#
ID:19715 发表于 2014-9-27 20:33 | 只看该作者
1/32已经是0了,
回复

使用道具 举报

10#
ID:19715 发表于 2014-9-27 20:35 | 只看该作者
做乘除,保持每一步不要<1,<1就是0
回复

使用道具 举报

11#
ID:64817 发表于 2014-9-28 10:04 | 只看该作者
明白 发表于 2014-9-27 20:35
做乘除,保持每一步不要

十分感谢,现在明白了,还是俺C基础不好。。谢谢了
回复

使用道具 举报

12#
ID:19715 发表于 2014-9-28 13:07 | 只看该作者
本帖最后由 明白 于 2014-9-28 13:20 编辑

指令的操作,寄存器的运算,比如(1/3)*3 = 0,这样无可厚非。
但是作为宏定义一个常数, (1/32*12000000/12)/2400怎么是0,
就不应该了,这是编译器的缺陷。
这些都是基于寄存器的运算操作,
其实编译器有办法可以避免这样情况的发生:
  TH1=256-(1.0/32*12000000/12)/2400;
或者:
   TH1=256-(1/32.0*12000000/12)/2400;
都可以
回复

使用道具 举报

13#
ID:51090 发表于 2014-9-28 13:16 | 只看该作者
楼主到这里去下个 mcu波特率计算软件http://www.51hei.com/mcudown/    很方便的
回复

使用道具 举报

14#
ID:19715 发表于 2014-9-28 13:38 | 只看该作者
这样也可以:
  #define fosc 12000000L      
  #define BAUD 9600      //波特率在这里设置
TH1 = TL1 = -(fosc/12/32/BAUD);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表