本节接着承接上一节,在我们使用异步通信时,需保证计算机与单片机的波特率的相同,这样才能防止数据传输时出错,本节就是围绕这个问题展开的。
依然是这张图,注意看TH1和TL1,熟悉定时器的肯定认识它俩,但是在串口中它俩的身份就有所转变了。在串口中被称为波特率发生器。
虽然在串口中它换了一个名字,但功能却丝毫未改。如果此时我们想将单片机的波特率调成9600,那么本质上就是每1/9600s接收或发送一个数据(一个2进制位),那这时候,我们就可以考虑给T1设置初值。然后在每次定时时间到的时候溢出,就实现了波特率发生器的功能。
注意:这里的定时器之能使用T1,且工作方式只能是方式二、串口默认的波特率发生器为T1,所以不能用T0。而方式二具有自动清溢出的功能,实现了多个数据的发送。值得一提的是:在编程时,我们不用打T1的中断标志位,也不用考虑如何清除溢出标志位,这些串口自己便会完成。
上图便是我们的初值计算公式。256是定时器的自带参数(就不解释了),9600是波特率。
fosc是时钟周期(其实就是晶振频率),一个时钟周期又等于12个机器周期。所以要除以12(这一步可以理解为单位换算,因为定时器针对的是机器周期)结合第一张图,细心的小伙伴肯定可以发现为什么要除以32。
下面我们就来计算一波,如果我们的晶振频率为11.0592,那么答案就是TH1=TL1=253。
如果换用12,那么答案就是TH1=TL1=252.745,就不是整数了。
结合上图以及我所举的例子,不难看出对于大部分波特率,11.0592都可以得到整数,比较精确,所以这也是为什么会有11.0592这个奇怪数字的原因。
首先何我们的定时器一样,得对串口进行初始化。
1、设置串口SCON
2、设置TMOD
3、设置波特率
4、开中断
5、启动波特率发生器? ??具体代码可见下图。
注:TR1=1就是启动波特率发生器。完整的后半部分见下图
后半部分的程序在上一节已说明。这里就不解释了,不知道的可以看看上一节。
本节与上一节息息相关,只不过怕写的太长,导致读者没有耐心看完。所以拆成2节。
本节重点:知道如何使用串口,启动串口。
本节难点:如何计算TH1何TL1的初值,以及清楚相关细节。