单片机和PC机间的通信有很多方式,下面的程序主要用到的是51单片机的异步串行通信。
一.51单片机的串行通信管脚
P3.1为单片机的TXD管脚(Transfer Data),P3.2为单片机的RXD管脚(Receive Data)。
通过TXD管脚可以将CPU要发送的数据输出,RXD管脚可以将串行数据线传来的数据读入。
二.51单片机的串行通信控制寄存器SCON,电源控制寄存器PCON
SCON:
其中,SM0,SM1控制着串行通信的工作方式。
SM0 | SM1 | 工作方式 | 说明 | 波特率 |
0 | 0 | 0 | 移位寄存器 | fosc/12 |
0 | 1 | 1 | 10位异步收发器(8位数据) | 可变 |
1 | 0 | 2 | 11位异步收发器(9位数据) | fosc/64或fosc/32 |
1 | 1 | 3 | 11位异步收发器(9位数据) | 可变 |
其中工作方式1在使用当中比较多。
SM2为多机通信控制位,SM2=1,允许多机通信,=0不允许,实现点对点通信。这里先不讨论。
TB8用于储存发送数据的第9位。在方式2和方式3中,发送数据除了起始位,数据位,停止位外,还有一位校验位,存储在TB8中。
RB8用于存储接收数据的第9位。接收到传来的代码后,数据位存储在SBUF中,而校验位就存储在RB8中。通过分析,可以判别接受的数据是否正确。
TI为发送中断请求标志。当发送数据缓冲区为空的时候,TI通过硬件置1,通知CPU数据发送完毕,需要有软件清零。
RI为接收中断请求标志。总线上的数据通过RXD引脚串行送入单片机内,通过移位寄存器将串行数据变成并行数据,送入SBUF中。若接收的SBUF已经满,通过硬件置1,通知CPU一帧数据已经接收完毕,可以进行读取。同样需要软件清零。
PCON中只有最高位SMOD与串行通信有关。
SMOD=1,波特率在原来的基础上加倍;
否则,不加倍。
三.波特率的计算
对于方式1和方式3,波特率计算公式为:(2^SMOD/32)*(T1的溢出率);
对于方式2,为fosc*(2^SMOD/64);
对于方式1,由晶振决定,为固定值。
T1也就是定时器1,做波特率发生器时,一般典型用法为工作在方式2,也就是自动装载的8位计数模式。TH,TL各8位,但只有TL部分计数,故最大计数值为255。溢出后,TH中的数自动装载到TL中。
所以,T1溢出率=fosc/{12x(256-TH1)};
所以可以列出右边为我们所要波特率的方程。同时网上也有许多波特率的计算工具,也可以拿来使用。
最后总结起来,串行通信大致要有这样几步:
1.确定定时器T1工作方式,也就是编程TMOD寄存器;
2.装载T1的初值,也就是给TH1,TL1赋值;
3.确定串行口工作方式,也就是编程SCON和PCON寄存器;
4.启动T1定时器,也就是令TR1=1;
5.如果使用中断查询的话,编写中断服务函数
上面这些大概就是串口通信的基本知识了。有了这些知识,就可以编写程序来实践了。
来源:https://www.cnblogs.com/xmfbit/archive/2012/08/22/3872203.html