在微型计算机数字系统里,数据传输可分为并行传输与串行传输两种,并行式传输一次传输多个位(通常是8位)。因此,连接两个系统之间的传输线必须有多条,当然一次传输多个位,传输的速度比较快,但是传输用到的线数也多,线路费用相对会高,线路噪声,阻抗匹配等问题也多,所以并行式传输不适合长距离通讯。
串行式传输每次传输一个位,数据传输的速度表面上不怎么快,但连接两个系统之间,只要两条传输线即可,适合长距离的通信。实际上,目前串行端口传输速率已比并行端口输出传输速率快。
实际中考虑使用并行式传输还是串行式传输要根据数据量与环境而定。若要将8051系统的数据传至另一8051系统,则可以使用串行式数据传输。
最典型的串行式数据传输接口是RS232C,例如个人计算机的COM1、COM2接口就是属于RS232接口。
在串行式数据传输里有单工及双工之分
单工就是一条线只能有一种用途,例如输出线就只能将数据传出,输入线就只能将数据传入。
而双工就是一条线有两种用途,可传入数据也可传出数据。
若系统上只有一条线,且在同一时刻中不是进行传入数据就传出数据,则称之为“半双工”。
若在系统上有两条传输线,这两条传输线可同时进行数据输入与传出,则称之为“全双工”。
认识8051串行口
通常以每秒传输多少位(bit per second,简称bit/s)表示串行式数据传输的速率,又称为比特率(baud rate)。
通常,微控制器里的数据处理属于并行式处理。对8051而言,一次处理一个字节,也就是8个位,不管怎样,串行式数据与并行式数据之间的转换是无法避免的。
在8051里,若要把8位的并行数据传出去,只要把数据放入并行寄存器(SBUF)即可,8051就会帮我们把这些数据一个位一个位送出去。
接收串行数据也是一样,8051会把外面传入的数据,一个位一个位放入SBUF,当SBUF存满后,产生中断,即为并行数据,再将SBUF里的8位数据移做他用。
不论是接收还是发送,很明显SBUF扮演了关键性的角色,在8051中接收用的SBUF与传送用的SBUF虽然都叫做SBUF,但是它们分别是两个不同的8位寄存器。
8051串行工作模式
8051提供一个全双工的万用异步串行端口(Universal Asynchronous Receiver-Transmitter,简称UART),这个串行端口有4种工作模式(mode),使用不同工作模式其比特率各有不同,说明如下:
mode 0:
mode0工作模式是一固定比特率的位移式数据传输,其比特率为8051系统时钟脉冲的1/12,即OSC/12。若在时钟脉冲为12MHz,则其比特率为1M bit/s。
在此模式下,不管是接收还是发送,CPU的RxD引脚(P3.0)连接串行数据线,TxD引脚(P3.1)连接位移脉冲线。执行数据接收时,由TxD引脚送出位移脉冲,而由RxD引脚收下串行数据,如下图:
执行数据传送时,也是依据TxD引脚所送出的位移脉冲,由RxD引脚发送串行数据:
mode 1:
mode 1工作模式是以可变的比特率进行串行数据的传输,其比特率可由Timer 1来控制(若是8052还可以使用Timer 2控制比特率)。在此模式下,8051的RxD引脚连接数据源的TxD引脚,8051的TxD引脚连接目的地的RxD引脚。
在mode 1下,每个数据是由10位组成,包括起始位(start bit)、8个位的数据以及停止位(stop bit),其中第一个位就是低电平的起始位,紧接着是8位数据的bit0(LSB),bit7(MSB)之后是高电平的停止位,如下图:
mode 2:
mode 2工作模式是以OSC/32或OSC/64的比特率进行串行数据的传输,而其线路的连接,也是8051的RxD引脚连接数据源的TxD引脚,8051的TxD引脚连接目的地的RxD引脚。在mode 2下,每笔数据是由11位组成,包括起始位(start bit)、8个位的数据、奇偶位(parity bit)以及停止位(stop bit),其中第一个位就是低电平的起始位,紧接着是8位数据的bit0(即LSB),而bit7之后的是奇偶位,最后则是高电平的停止位:
当进行数据传出时,第9个位TB8(即SCON寄存器的TB8)为奇偶位,可取自程序状态字组寄存器PSW中的P位,以达到奇偶校验的目的。当收到数据时,第9个位将直接移入SCON寄存器中RB8,而不必管停止位。
mode3:
mode3工作模式是以可变的比特率进行串行数据的传输,其比特率可由Timer 1来控制(若是8052则还可使用Timer 2控制比特率)。除此之外,mode 3与 mode 2几乎完全一样。
认识SCON串行口控制寄存器
串行端口控制寄存器(serial port control register,简称SCON)是一个8位、可位寻址的寄存器,如上图其功能是设定与控制串行端口。下面是SCON各位的说明:
SM0和SM1
这两个位的功能是设定串行端口的模式:
SM2
本位为多重处理器通信启用位:
mode 0时,Sm2=0;
mode 1时,若SM2=1,且收到有效的停止位,则RI=1(产生RI中断),否则RI=0;
mode 2或 mode 3时,若SM2=1,且收到的第9位为1,则RI=1(产生RI中断),若第9位为1,则RI=0。
REN
本位为串行接收启用位,说明:
REN=1,开始接收;
REN=0,停止接收;
TB8
mode 2或mode 3传送数据时,本位为第9传送位,可用软件来设置或清除。
RB8
mode 2或mode 3接收数据时,本位为第9个接收位;
mode 1时,若SM2=0,则本位为停止位;
mode 0时,本位无作用。
TI
本位为中断标识位,当中断结束时,本位并不会恢复为0,必须由软件清除。
mode 1、mode 2或mode 3时,若完成传送停止位,则本位自动设定为1,并产生TI中断。
mode 0时,若完成传送第8位,则本位自动设定为1,并产生TI中断。
RI
本位为接收中断标志位,当中断结束时,本位并不会恢复为0,必须由软件置0。
mode 1、mode2或mode 3时,若完成接收到停止位,则本位自动设定为1,并产生RI中断。
mode 0时,若完成接收第8位,则本位自动设定为1,并产生RI中断。
比特率设定
8051串行口的比特率设定方式有如下几种:
一
在mode 0下,比特率固定为OSC/12,不需要进行设定!完全是依照系统的时钟脉冲而定,不是软件所能改变的。
二
在mode 2下,其比特率可为OSC/32或OSC/64,即:
其中SMOD为PCON寄存器中的bit 7:
若将SMOD设定为0,则设定采用的比特率OSC/64;
若将SMOD设定为1,则设定采用的比特率OSC/32。
以12MHz的系统为例:
三
在mode 1或mode3下,比特率可由Timer 1(8052则还可以选择Timer 2)的溢出脉冲控制,以Timer 1采用具有自动加载功能的mode 2为例,产生的比特率为:
如在11.0592MHz的系统下,若要产生19.2Kbit/s的比特率,且SMOD=1,则:
得出TH1= 253 = 0xfd;
下表使用Timer 1时常用的比特率设定:
8051串口应用
把8051的串行工作模式设定为mode 1,REN=1;SCON寄存器为0101 000;
在OSC=11.0952MHz下,把比特率设定为9600bit/s,根据前文所述,mode 1比特率设定由Timer 1控制,表格中也给出了TH1的值,所以SMOD=0,TH1 = 0xfd。
void uart_init(){//初始化
TMOD = 0x20; // 定时器1,模式2(8位自动装载)
TR1=1;//启用Timer 1
TH1 = 0xfd; // 在Timer 1,mode 2, 11.0952MHz下,设定9600比特率
SCON = 0x50; //uart mode1,接收使能
}
unsigned char rData;
void uart_read() // 接收
{
// 等到收到字节
while(RI==0);
rData = SBUF; //把接收到的字节放到rData
RI=0; //清除RI以接收下一个字节
}
void uart_send(unsigned char sData){//发送
SBUF=sData;
while(TI == 0);
TI=0;
}