欣欣学习网,老工程师带你学习单片机技术,欢迎来坐坐。
首  页 | 学习NIOSII | 学习C51 | 学习CPLD | 51+CPLD实验板 | | | MY-RTOS

 实验板首页
 安装QuartusII软件
 安装USB-Blaster驱动
 安装CH340C驱动
 安装Keil uVision软件
 运行Hello World例程
 新建Keil uVision工程
 在Flash中运行程序
 恢复CPLD中的出厂逻辑
 安装调试代理程序
 硬件架构分析
 实现LCD驱动接口
 实现数码管驱动接口
 实现4x2键盘接口
 使用ADC采集拟量
 使用EEPROM保存数据
 使用UART通信
 红外遥控信号解码
 用作USB转232/485
 相关软件与文档


使用UART通信


异步通信口(UART)在单片机技术领域是最常见的通信口。因其结构简单、稳定可靠以及极高的性价比而得到广泛的应用。

UART是以单线方式进行数据传输的,只有数据线而没有时钟线。通信双方各自以本地时钟对数据线的采样时间点进行标定,是异步行为,故而被称为异步通信。

图(1)

如图(1)所示的网络属于最简单异步通信网络。两个通信主体,一方负责发送,另一方负责接收,属于典型的单工通信。当然,如果通信双方可以随时变换角色、改变数据的传输方向,分时进行数据收发,便可以实现半双工通信。

图(2)

在点到点的通信中,通常是有两条数线,分别负责不同方向的数据传输。这时,两个方向的数据传输可以同时进行,是全双工通信。

图(3)

UART通信是以字数据帧作为基本传输单位的。一个字数据帧由若干个传输位组成,包括1个起始位、若干个数据位、1个可选的校验位、若干个停止位。每个传输位在数据线上停留的时长是固定的,由通信双方约定好的波特率(Buadate)决定。比如,所说的9600BPS的波特率,就是数据线上1秒钟传递9600个传输位,每个传输位在数据线上出现的时长固定为104.166uS。

当数据线上没有字数据帧传输时,数据线处于空闲状态,此时数据线的逻辑电平是高电平。

图(4)

每个字数据帧总是以起始位开始,以停止位结束。起始位只有1个,是低电平传输位。一般来说,接收方会在1个传输位的时长里对数据线等间隔的采样若干次。一旦发发现先前空闲的数据线有下降沿跳变的行为,便认有新的字数据帧开始传输了,并以此下降沿为起点计量之后各个传输位的采样位置。

跟在起始位之后传输的是数据位。数据位可以是若干个,依据通信双方的约定而定,通常是8个,因为这样每个字数据帧刚好传输1个字节的数据。数据位的传递次序依照LSB在前的原则,即低位在前,高位在后。

校验位是可选的传输位,也就是可有可无,依照通信双方的约定而定。在有校验位的通信中,校验位又分奇校验(odd)和偶校验(even)两种情况。奇校验就是数据位和校验位中总的"1"的个数是单数,也可以认为是所数据位连同校验位的"异或"运算结果是"1"。接收方会按照这一规则进行验算,如果验算的结果不是"1",则认为数据传输有误。偶校验则是所有数据位连同校验位中"1"的个数是偶数,或各个数据位连同校验位的"异或"值为"0"。同样,接收方也会根据约定好的验算方式进行验算,以判定数据的正确性。

字数据帧中最后传输的是停止位。停止位的电平为高电平,接收方根据停止位的出现,来确认数据线回到了空闲状态。根据通信双方约定,停止位可以是1个位、两个位或者是1.5个位。所谓1.5个位就是指停止位的高电平出现时长不少于1.5个位时长。如果停止位出现的时长少于约定的时长,接收方可以认定字数据帧传输有误。

在89C52中集成了1个全双工的异步通信口。该接口有多种工作模式,支持8个数据位、9个数据位的异步通信,支持多机通信。和异步通口相关的寄存器有5个:SCON、PCOM、IE、IP、SBUF。

寄存器SCON:地址 98H,复位值 00000000B

D7D6D5D4D3D2D1D0
SM0SM1SM2RENTB8RB8TIRI
RWRWRWRWRWRWRWRW

SM0/SM1:

异步通的工作方式选择位。

SM0SM1方式功能波特率
000移位寄存器方式Fosc/12
0118位UART方式T1溢出率/16 或 T1溢出率/32
0129位UART方式Fosc/64 或 Fosc/32
1139位UART方式T1溢出率/16 或 T1溢出率/32

注:方式1、方式2、方式3下的波特率和PCON寄存器中的SMOD位有关,见PCON寄存器。

SM2:

在方式2和方式3中,用作多机通信使能位。在方式2和方式3中,若SM2=1,则只有接收到的第9位为1时才置RI位为"1"。在方式1中,SM2是停止位检测使能位,只有检测到有效的停止位才置RI位为"1"。在方式0中,SM2必需为"0"。

REN:

允许接收位。由软件置位或清除。当REN=1时允许接收,REN=0jf禁止接收。

TB8:

在方式2和方式3中的第9位发送数据位。

RB8:

在方式2和方式3中的第9位接收数据位。

TI:

发送完成标志。发送完成后由硬置"1"。该位由软件清"0"。如果异步通信口中断被使能,TI位的置位会触发中断。

RI:

接收完成标志。当接收到有效数据时,该位由硬件置"1"。该位由软件清"0"。如果异步通信口中断被使能,RI位的置位会触发中断。

寄存器PCON:地址 87H,复位值 0xxx0000B

D7D6D5D4D3D2D1D0
SMOD---GF1GF0PDIDL
RW---RWRWRWRW

SMOD:

波特率加倍控制位。置"1"时,异步通信口在方式1、方式2、方式3下,波特率加倍。

其他:

与异步通信口无关。

寄存器IE:地址 A8H,复位值 0x000000B

D7D6D5D4D3D2D1D0
EA-ET2ESET1EX1ET0EX0
RW-RWRWRWRWRWRW

EA:

全局中断使能位。当EA=0时,禁止所有中断;当EA=1时,各中断源由各自的中断控制位控制。

ET2:

定时器2中断控制位。ET2=0时,禁止定时器2中断;ET2=1时允许定时器2中断。

ES:

异步通信口中断控制位。ES=0时,禁止异步通信口中断;ES=1时,允许异步通信口中断。

ET1:

定时器1的中断控制位。当ET1=0时,禁止定时器1中断;当ET1=1时,允许定时器1中断。

EX1:

INT1中断控制位。当EX1=0时,禁止INT1中断;当EX1=1时,允许INT1中断。

ET0:

定时器0中断控制位。当ET0=0时,禁止定时器0中断;当ET0=1时,允许定时器0中断。

EX0:

INT0中断控制位。当EX0=0时,禁止INT0中断;当EX0=1时,允许INT0中断。

寄存器IP:地址 B8H,复位值 xx000000B

D7D6D5D4D3D2D1D0
--PT2PSPT1PX1PT0PX0
--RWRWRWRWRWRW

PT2:

定时器2中断优先级控制位。PT2=0时,定时器2中断为低优先级中断;PT2=1时定时器2中断为高优先级中断。

PS:

异步通信口中断优先级控制位。PS=0时,异步通信口中断为低优先级中断;PS=1时,异步通信口中断为高优先级中断。

PT1:

定时器1的中断优先级控制位。当PT1=0时,定时器1中断为低优级中断;当PT1=1时,定时器1中断为高优先级中断。

PX1:

INT1中断优先级控制位。当PX1=0时,INT1中断为低优先级中断;当PX1=1时,INT1中断为高优先级中断。

PT0:

定时器0中断优先级控制位。当PT0=0时,定时器0中断为低优先级中断;当PT0=1时,定时器0中断为高优先级中断。

PX0:

INT0中断优先级控制位。当PX0=0时,INT0中断为低优先级中断;当PX0=1时,INT0中断为高优先级中断。

寄存器SBUF:地址 99H,复位值 xxxxxxxxB

D7D6D5D4D3D2D1D0
DATA
RW

DATA: 读出时是接收数据,写入时是发送数据。写该寄存器自动触发硬件发送操作。

89C52的P3.0端口兼作异步通信口的接收信号(RXD)管脚,P3.1则兼作异步通信口的发送信号(TXD)管脚。

在实验板上,89C52的RXD和TXD管脚并没有直接与任何的通信口互连,而是连接到了EPM7128S,再由EPM7128S来分配这两路信号连接到哪个通信口上。异步通信口是89C52最重要的通信接口,这就注定这个接口是多用途的。由EMP7128S来管理这个通信口的最终用途,提高了整个系统的灵活性。使用者可以通过修改EPM7128S中的逻辑电路,选择由哪个对外接口接收或发送数据,或者与EPM7128S的内部逻辑电路通信。

在EPM7128S的出厂逻辑设计中,给使用者提供了3种选择:

1. 连接到由CH341C芯片,再由CH340转成USB信号与上位机通信。

2. 连接到学习板的232接口,通过232接口对外通信。当然,借助USB转232电缆也可以与上位通信。

3. 连接到学习板的485接口,通过485接口对外通信。

图(5)

在EPM7128S中实现的系统控制寄存器的两个控制位,ComSEL0和ComSEL1,共同决定了由哪个接口连接89C52的异步通信口(UART)。

系统控制寄存器由1个74377逻辑单元构成。该寄存器的D0位是ComSEL0,D1位是ComSEL1。片选信号CS1用来选择该寄存器,所以它的地址是0x8020。

图(6)

以下就以使用232接口为例,示例如何使用89C52的异步通信口。

异步通信口初始化示例代码如下:

TMOD |= 0x20;              // 设置T1定时器,用来产生所要的波特率
                           // T1工作在定时器模式,时钟来自Fosc的12分频
                           // 选择让T1工作在方式2,由TH1自动重装TL1 
TH1 = 0xfd;                // 设置TH1为0xfd,每次装载到TL1后,
                           // TL1在这个值的基础上,每个时钟加1计数
                           // 0xfd->0xfe->0xff->0x00
                           // 每3个时钟周期T1就会溢出1次
                           // 所以,T1的溢出频率为Fosc/12/3 = 
                           // 22.1184Mhz/12/3 = 614.4KHz
TR1 = 1;                   // TR1 = 1,使能T1计数
SCON = 0x5a;               // SM0 = 0, SM1 = 1, SM2 = 0, REN = 1
                           // TB8 = 1, RB8 = 0, TI = 1, RI = 0
                           // 异步通信口的工作方式设为方式1
                           // 8位异步通信,波特率由T1溢出设定
                           // REN = 1,允许接收。
                           // SM2 = 0,不检测停止位
                           // TI = 1,预设该位为1,表示接口中没有数据正在发送
                           // ,可写入新数据
                           // RI = 0,预设该位为0,表示接口中没有数据被接收到
                           // 这里没有设置SMOD,使用其复位后的缺省值:0
                           // 因为SMOD为0,所以波特率为T1溢出频率的1/32
                           // Buadrate = 614.4KHz/32 = 19200BPS
  
XBYTE[0x8020] = 0x01;      // 向EPM7128S中的系统控制寄存器写0x01
                           // ComSEL0 = 1,ComSEL1 = 0
                           // 选择232接口为异步通信口的连接对象
          

一个简单的收发示例代码如下:

while (1)
{
  if(RI != 0)                                   // 查寻有没有数据收到
  {
    RI = 0;                                     // 将标志清除
    RxBuf[RxBufBtmPtr] = SBUF;                  // 将收到的数据写入缓冲区尾
    RxBufBtmPtr = (RxBufBtmPtr+1)&0x1f;         // 向前调整缓冲区尾指针
  }
  
  if((TI != 0)&&(RxBufTopPtr != RxBufBtmPtr))   // 检查缓冲区内有没有数据
  {                                             // 并且接口是不是空闲
    TI = 0;                                     // 若缓冲区有数据,接口空闲
    SBUF = RxBuf[RxBufTopPtr];                  // 从缓冲区头读出数据,发送
    RxBufTopPtr = (RxBufTopPtr+1)&0x1f;         // 向前调整缓冲区头指针
  }    
}
          

这个程序比较简单,只是把接收到的数据再转发回去。由于只是简单的转发操作,所以使用查寻处理即可。

可以用USB转232电缆连接学习板的DB9接口和电脑的USB接口,然后使用串口调试助手向学习板以19200BP的波特率发送数据并验证接收的数据。

串口调试助手可点击 这里 下载。

完整的范例程序可点击 这里 下载,范例程序的使用方法可参见:Hello World 程序




管理员信箱: stonewayqi@hotmail.com

欣 欣 学 习 网

粤ICP备2023138008号