一、串口介绍
串口本质可以使两个设备实现互相通信,串口的使用可以使单片机连接更多的外设,扩展了单片机的应用,单片机内部带有UART(通用异步收发器),使他可以向别的设备发送、接受信息。
下面三个图是USB转串口、陀螺仪、蓝牙模块,串口的使用给单片机带来更加的可玩性。
二、硬件电路
下面的TXD(transmission exchange date)为发送端,RXD(transmission exchange date)为接收端。发送端和接收端需要交叉连接,上面的VCC为电源,当设备2独立供电时就不需要接电源线。GND为接地线,该位电势为0。注意:设备电平标准不一样需要加电平转换芯片,不然会烧。
三、电平标准
TTL(Transistor-Transistor logic 晶体管-晶体管 逻辑)电平是51单片机所用电平标准。
RS232通常为电脑所用电平标准。上面都是对于GND的压差。
RS485电平是由两根线的压差构成,所以为差分信号。TTL和RS232的传输信号只能达到10几米,而RS485的传输信号能达到1000多米。
下面的是九针接口,他除了TXD、RXD,还有DTR、DSR、RTS等来数据流控制(来调整发送和接收的速率问题)。例如上课老师讲的太快了,我们听不懂,就让老师讲慢点,以确保我们能接收到老师所讲的知识。
四、常见通信接口比较
全双工:通信双方可以同时接发数据。半双工:通信双方只能在不同时刻接发数据,像打乒乓球,只能一方发球,不能同时发球。单工:只能我打你,而你不能打我。
异步:双方约定的接发速率不同
同步:双方靠一根时钟线来约定通信速率,例如你和朋友分别约好并定了闹钟,5点打球,7点吃饭,这样信息就不会有误差。
总线:相当于带多个班的班主任,你我班可以交流。
五、51单片机的UART和串口参数及时序图
51单片机的UART有四种模式,今天我们主要使用模式1。
波特率:发送和接收数据的速率;检验位:检验传输的数据是否正确,有奇偶校验。
我们所讲的模式一没有校验位,因为模式一为8位UART。
六、单片机串口模式图、中断及有关寄存器
七、写程序环节
由上面的串口模式图知道,我们需要将波特率、中断TI、RI配置好即可,SBUF是串口缓冲区,只用读写就行。因为我们第一个程序用不到中断,所以关于中断寄存器的我们在第二个程序在继续配置。
首先我们来配置SCON寄存器,有下面解释知道当SM0为1时为帧错误,但我们使用模式1,不需要帧错误,当SM0不为1时就和SM1组合选择串口的工作方式。所以当我们用方式1应该配置SM0为0,
SM1为1。SM2是用来控制方式2或3的多机通信,我们用方式1用不到,所以将SM2配置为0。
REN为接收使能,我们第一个程序用不到接收所以将他置0。
剩下的TB8、RB8用于方式2或3,用不到置0。
RI和TI是当SBUF接收或发送数据完成后,硬件会将他们置1,后面数据传输完成需要软件置0。
从下面可以看到PCON中有SMOD和SMOD0,当我们需要将波特率加倍时就需要将SMOD置为1(就是设置的波特率不变,置0计算时需要将波特率再除以2)。SMOD0为帧错位,我们方式1用不上,所以不需配置。将SMOD置1,后四位不变,即PCON |= 0x80。
接下来我们需要配置定时器,我们配置波特率时需要用到定时器1,因为我们用8位自动重装,其他位学过上节定时器就知道怎么配置了,所以定时器1可以配置为0010。
接下来就是配置波特率,关于波特率的计算会在后面说。我们可以使用STC-ISP来配置波特率,这里我们配置的波特率为4800,我的单片机晶振为11.0592MHZ,UART要配置串口1,(有些高级单片机有更高级的串口),UART选择8位数据,波特率发生器选8位自动重载,定时器时钟选择12分频,波特率倍数记得打钩。
接下来就是按照下表配置定时器1的寄存器,因为与定时器0无关,关于定时器0的都可以置为0。我们先按STC-ISP中TH1和TL1给的值赋值。还需要打开定时器1,所以要将TR1置1。
因为不需要用定时器1的中断源,所以把ET1置0。这样关于程序一的寄存器配置部分就完成了。
程序一串口向电脑发送数据的代码如下
接下来我们写关于程序二的代码,电脑向串口发送数据控制LED灯
刚刚我们写程序一时只写了定时器的功能,接下来我们来配置中断ES开关。还有记得将SCON的REN置1,因为程序一没使用接收使能。
下面程序二的代码就写好了
七、波特率的计算和数据显示模式
1、波特率的计算
因为我的晶振不好计算TH1和TL1的值,所以晶振我按12计算。晶振为12MHZ,TH1=0xF3, 下面SMOD置1,置0就需除以32了。这样就计算出波特率。晶振为12有少许误差。
2、数据显示模式
HEX模式是显示数据的原始形式,串口上一般显示16进制。
文本模式就是输入16进制通过ASCII码表所对应的字符
下面我发送的16进制的42,以文本模式接收就是字符B;发送字符B,以HEX接收就是42。