波特率发生器:UART串口通信

目录

概述

类别:

用途:

通信方式:

解析:

两个单片机间通信简介

文字解析:

图解:

UART的寄存器

寄存器的配置

UART串口通信步骤


概述

类别:

UART----通用异步收发器

用途:

UART多用于板间通信

通信方式:

串行通信:一位一位的传送数据

解析:

UART通信虽然用到了TXD和RXD两根线,但是实际一次通信中,1条线就可以完成,两条线是把发送和接收分开而已。

两个单片机间通信简介

文字解析:

以二进制形式进行传输,最低位先发、高位后发。TXD先拉低电平,持续一段时间,发送一位;然后接着重复,直到全部发送完毕。

一段时间=1/波特率,波特率又称作比特率(baud)

在UART通信时,一个字节是8位。

图解:

单片机1的TXD引脚接到单片机2的RXD引脚,1发送2接收

单片机1的RXD引脚接到单片机2的TXD引脚,2发送1接收

没有通信信号发生时,通信线路保持高电平。当通信来临,拉低电平,发送数据前,先发送一位0,表示起始位,然后发送8位数据,发送顺序是由低位到高位,数据发送完毕后,再发送一位1,表示停止位。实际一共发送了10位

UART的寄存器

SCON-----串行控制寄存器的位分配(地址0x98,可位寻址

7

6

5

4

3

2

1

0

符号

SM0

SM1

SM2

REN

TB8

RB8

T1

R1

复位值

0

0

0

0

0

0

0

0

SCON-----串行控制寄存器的位描述

符号

描述

7

SM0

这两位共同决定了串口通信的模式0~模式3共4中模式。最常用的就是模式1,也就是SM0=0,SM1=1

6

SM1

5

SM2

多机通信控制位(很少用),模式1直接清0

4

REN

使能串行接收。由软件置位使能接收,软件清0则禁止接收

3

TB8

模式2和3中要发送的第9位数据(很少用)

2

RB8

模式2和3中接收到的第9位数据(很少用),模式1用来接收停止位

1

T1

发送中断标志位,当发送电路发送到停止位的中间位置时,T1由硬件置1,必须通过软件清0

0

R1

接收中断标志位,当接收电路接收到停止位的中间位置时,R1由硬件置1,必须通过软件清0

寄存器的配置

模式1:

波特率发生器

在硬件串口模块中,有一个专门的波特率发生器用来控制发送和接收数据的速度,对于STC89C52单片机来说,这个波特率发生器只能由定时器T1或定时器T2产生,而不能由定时器T0产生

由于用定时器T2,需要配置额外的寄存器,所以默认是使用定时器T1的。

模式1下的波特率发生器必须使用定时器T1的模式2(自动重装载模式),定时器的重装载值计算公式为:

TH1=TL1=256-晶振值/12/2/16/波特率

若是使用电源管理寄存器PCON,它的最高位可以把波特率提高一倍,也就是加上

PCON|=0x80,计算公式变为:

TH1=TL1=256-晶振值/12/16/波特率

UART串口通信步骤

第一步:配置串口为模式1(0x50)

第二步:配置定时器T1为模式2,即自动重装模式

第三步:根据波特率计算出TH1和TL1的初值,如果有需要可以使用PCON进行波特率设置

第四步:打开定时器控制寄存器TR1

注:在使用T1做波特率发生器时,不可再使用T1的中断

部分相关程序

/* 串口配置函数,baud-通信波特率 */void ConfigUART(unsigned int baud){ SCON = 0x50; //配置串口为模式1 TMOD &= 0x0F; //清零T1的控制位 TMOD |= 0x20; //配置T1为模式2 TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值 TL1 = TH1; //初值等于重载值 ET1 = 0; //禁止T1中断 ES = 1; //使能串口中断 TR1 = 1; //启动T1} /* UART中断服务函数 */void InterruptUART() interrupt 4{ if (RI) //接收到字节 { RI = 0; //手动清零接收中断标志位 RxdByte = SBUF; //接收到的数据保存到接收字节变量中if(RxdByte == '2'){P0 = 0x00; //用来控制LED灯}//else//{//P0 = 0xff;//}//P2 = SBUF; SBUF = RxdByte; //接收到的数据又直接发回,叫作-"echo", //用以提示用户输入的信息是否已正确接收 } if (TI) //字节发送完毕 { TI = 0; //手动清零发送中断标志位 }}

相关推荐

相关文章