首页 > 编程知识 正文

串口波特率计算公式(波特率初值的计算)

时间:2023-05-03 05:07:36 阅读:121734 作者:243

1 .概要为了在此前的GSM模块学习过程中与单片机连接时,充分考虑波特率之间的对应关系,在以下程序中设置了计时器1的工作模式,采用了2:8自动过载。 部分51单片机采用11.0592MHZ的晶振频率,部分采用12MHZ的晶振频率,为了提高程序的可移植性,这里采用#ifdef条件编译语句,在我们设定的晶振频率下设定不同的数值

2 .波特率计算原理串行通信要求收发双方对收发的数据速率作出一定的约定。 我们用软件编程51串行端口可以约定4种工作方式。 其中,方式0和方式2的波特率是固定的,但方式1和方式3的波特率是可变的,由计时器T1的溢出率决定。 串行端口的四种工作方式支持三种波特率。 由于输者的移位时钟来源不同,各方式的波特率计算公式也不同。 在方案0的情况中,该偏移时钟由56个(即,第六状态周期、第十二个差拍)给出,即用于每个机械周期产生偏移时钟并且发送和接收1位数据。 因此,波特率是振荡频率的1/12,不受PCON寄存器中的SMOD的影响。

由于方式1和方式3的波特率方式1和方式3的移位时钟脉冲由计时器T1的溢出率决定,所以波特仪同时决定计时器T1的溢出率和SMOD值。 也就是说,在方式1和方式3的波特率=2SMOD/32T1溢出率中,溢出率取决于计数速率和计时器的预设值。 计数速率取决于TMOD寄存器的C/T状态。 当C/T=0时,计数速率=fosc/2; 当C/T=1时,计数速率取决于外部输入时钟频率。

3 .代码void SerialInti ()//初始化程序(必须使用才能发送和接收) {TMOD=0x20; //计时器1操作模式2:8位自动过载计时器#ifdef FOSC_12M //这里根据晶振大小设置不同的值以初始化串行端口TH1=0xf3; //输入初始值,波特率2400TL1=0xf3; #elseTH1=0xfd; //输入初始值,波特率9600TL1=0xfd; #endif //end of SOC_12M 4.问题总结1.如何根据晶振大小设置不同的初值?

在通过计时器串行学习的过程中,发现波特率的计算公式为(2SMOD/32 ) * ) OSC_freq(Hz )/) 256-th1 ) 12 ) ) )。

2400=20/32*(12*106/12 ) 256-初始值) )由此,可以计算THI=TL1=0xf3。 我们采用的波特率为2400时,误差小的同时也可以保证一定的速度)当然波特率为1200时误差也是一样,但速度明显下降)。 同样,我们在采用11.0592MHZ石英晶体振动时可以用同样的方法得到TH1=TL1=0xfd;2.如何根据波特率对应的初值大小计算误差?

实践表明,波特率相对误差在4.5%以下时,不影响数据的准确接收,一般要求误差在2.5%以下,以保证传输的可靠性。

如果将计时器Tl用作波特率发生器,则通常选择能够自动加载的初始值模式(操作模式2 )。 在操作模式2中,如果使用TLl作为计数,并且将自动加载的初始值设为THl,并且设设计数目的初始值为x,则在每“256 ) 1至x”个周期中计时器T1发生溢出。 为了避免溢出导致的中断,在这种情况下禁止T1中断。 在这种情况下,溢出周期如下:

根据计算公式,可以看出:

这表明,当晶体频率为12MHZ,波特率为2400,初始值为0xf3时,产生的误差为0.16%,在误差允许范围的2.5%以内,满足我们的传输要求。

同样,在石英振动为11.0592MHZ的情况下,选择9600bps,根据计算式得到的初始值的大小为0x FD (十六进制)

上面的计算显示,使用12M晶体时计算的TH1不是整数,TH1的值只能是整数。 这样会有一定的误差,无法生成正确的9600波特率。 当然,一定的误差在使用中可以接受,即使使用11.0592M的晶体振荡器,晶体本身存在的误差也会导致波特率产生误差,但晶体本身的误差对波特率的影响小得可以忽略。3.GSM模块为什么能在2400的波特率下正常与单片机进行通信?

在此,我们建议您在学习新模块(GSM模块的属性问题)时,首先了解他的官方数据手册。 阅读数据手册,了解GSM模块的通信速度支持1200-115200bps。 因此,GSM模块在2400bps下也能正常工作。 图:

另外,请注意,在设置不同操作模式的波特率后,串行调试助手必须与相应的波特率相匹配。 否则,在数据接收过程中容易发生乱码和通信不成功。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。