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;  //手动清零发送中断标志位
    }
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值