波特率发生器:UART串口通信 2024-04-20 01:10:57 0 0 目录 概述 类别: 用途: 通信方式: 解析: 两个单片机间通信简介 文字解析: 图解: 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; //手动清零发送中断标志位 }} 收藏(0)