51单片机和PC串口异步通信

单片机和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.如果使用中断查询的话,编写中断服务函数

 

上面这些大概就是串口通信的基本知识了。有了这些知识,就可以编写程序来实践了。

posted on 2012-08-22 00:20  奥特曼  阅读(604)  评论(0编辑  收藏  举报

导航