串口,通信方式的一种。串口的数据发送接受单位为字节,一个字节即为8位二进制数。对一个字节进行发送时,为一位一位的发送,先低位后高位。例如十进制的9,对其发送时,首先将其转化为二进制0000 1001。然后按照从低位到高位的发送顺序为1001 0000。当我们在示波器或是在Protues仿真中可以看到单片机的I/O口波形为
第一位为0(起始位),最后一位1(结束位)。总共有十位。
当单片机进行数据发送时,I/O口会发出上述的波形(中间的八位高低电平代表数据),每发送一个数据会有一个上述的波形在I/O口中出现。
当单片机进行数据接收时,I/O口也会有一个上述的波形出现,单片机对该波形进行读取,就可以读到数据。但问题来了,单片机在读取的时候,每间隔多长时间来进行一次读取呢?这个时间不能大于或者小于波形中高低电平的时间,负责就会错乱。
所以接收和发送方,在开始通信之前,就必须约定好,波形中高低电平的持续时间。这个持续时间就是串口通信中的重要概念之一————————波特率。
波特率就是单片机发送二进制数据位的速率,发送一位二进制的持续时间就是1/波特率。
利用单片机I/O口模拟串口通信,可以更加深入的理解其原理。上述的数据波形图,不一定要用单片机来产生,用波形发生器等等都可以,在读取数据的时候,用肉眼也可以,只要你知道高低电平代表的意思就好。
上述就是串口通信的基本原理,下来再结合51芯片手册,理解各种寄存器即可。
51单片机中,有两个SBUF寄存器,这两个寄存器共用一个地址,这两个寄存器一个是只读(也叫接收寄存器),一个是只写(发送寄存器)。当51单片机的I/O口,一旦检测有下降沿时,就会启动接收模块(发送方先发送0这个起始位)。经过模块之后,执行
DAT=SBUF; //
这个语句,就会读出接收到的数据。 对于模块的具体运作方式,看芯片手册上面有非常详细的介绍。