微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR单片机(学习ing)-ATMEGA16的USART与PC机串行通信

AVR单片机(学习ing)-ATMEGA16的USART与PC机串行通信

时间:11-27 来源:互联网 点击:

4)USART控制和转台寄存器C



• Bit 7 – URSEL: 寄存器选择
通过该位选择访问UCSRC 寄存器或UBRRH 寄存器。当读UCSRC 时,该位为1 ;当
写UCSRC 时, URSEL 为1。
• Bit 6 – UMSEL: USART 模式选择
通过这一位来选择同步或异步工作模式。



• Bit 5:4 – UPM1:0: 奇偶校验模式
这两位设置奇偶校验的模式并使能奇偶校验。如果使能了奇偶校验,那么在发送数据,发
送器都会自动产生并发送奇偶校验位。对每一个接收到的数据,接收器都会产生一奇偶
值,并与UPM0 所设置的值进行比较。如果不匹配,那么就将UCSRA 中的PE 置位。



• Bit 3 – USBS: 停止位选择
通过这一位可以设置停止位的位数。接收器忽略这一位的设置。

• Bit 2:1 – UCSZ1:0: 字符长度
UCSZ1:0与UCSRB寄存器的 UCSZ2结合在一起可以设置数据帧包含的数据位数(字符长
度)。



• Bit 0 – UCPOL: 时钟极性
这一位仅用于同步工作模式。使用异步模式时,将这一位清零。UCPOL 设置了输出数据
的改变和输入数据采样,以及同步时钟XCK 之间的关系。

5)USART波特率寄存器



• Bit 15 – URSEL: 寄存器选择
通过该位选择访问UCSRC 寄存器或UBRRH 寄存器。当读UBRRH 时,该位为0 ;当
写UBRRH 时, URSEL 为0。
• Bit 14:12 – 保留位
这些位是为以后的使用而保留的。为了与以后的器件兼容,写UBRRH 时将这些位清零。
• Bit 11:0 – UBRR11:0: USART 波特率寄存器
这个12 位的寄存器包含了USART 的波特率信息。其中UBRRH 包含了USART 波特率
高4 位,UBRRL 包含了低8 位。波特率的改变将造成正在进行的数据传输受到破坏。写
UBRRL 将立即更新波特率分频器。

不同晶振的波特率还是去看datasheet吧~~我看了看好多啊~~~

6、USART的初始化

进行通信之前首先要对USART 进行初始化。初始化过程通常包括波特率的设定,帧结构
的设定,以及根据需要使能接收器或发送器。对于中断驱动的USART 操作,在初始化时
首先要清零全局中断标志位( 全局中断被屏蔽)。
重新改变USART 的设置应该在没有数据传输的情况下进行。TXC 标志位可以用来检验
一个数据帧的发送是否已经完成, RXC 标志位可以用来检验接收缓冲器中是否还有数据
未读出。在每次发送数据之前( 在写发送数据寄存器UDR 前)TXC 标志位必须清零。
以下是USART 初始化程序示例。例程采用了轮询( 中断被禁用) 的异步操作,而且帧结
构是固定的。波特率作为函数参数给出。在汇编程序里波特率参数保存于寄存器r17:r16。
当写入UCSRC 寄存器时,由于UBRRH 与UCSRC 共用I/O 地址,URSEL 位(MSB) 必
须置位。

void USART_Init( unsigned int baud )
{

UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;

UCSRB = (1
UCSRC = (1}

更高级的初始化程序可将帧格式作为参数、禁止中断等等。然而许多应用程序使用固定的
波特率与控制寄存器。此时初始化代码可以直接放在主程序中,或与其它I/O 模块的初始
化代码组合到一起。

7、数据发送—USART发送器

置位UCSRB 寄存器的发送允许位TXEN 将使能USART 的数据发送。使能后TxD 引脚
的通用I/O 功能即被USART 功能所取代,成为发送器的串行输出引脚。发送数据之前要
设置好波特率、工作模式与帧结构。如果使用同步发送模式,施加于XCK 引脚上的时钟
信号即为数据发送的时钟。

1)发送5 到8 位数据位的帧

将需要发送的数据加载到发送缓存器将启动数据发送。加载过程即为CPU 对UDR 寄存
器的写操作。当移位寄存器可以发送新一帧数据时,缓冲的数据将转移到移位寄存器。当
移位寄存器处于空闲状态( 没有正在进行的数据传输),或前一帧数据的最后一个停止位
传送结束,它将加载新的数据。一旦移位寄存器加载了新的数据,就会按照设定的波特率
完成数据的发送

以下程序给出一个对UDRE 标志采用轮询方式发送数据的例子。当发送的数据少于8 位
时,写入UDR 相应位置的高几位将被忽略。当然,执行本段代码之前首先要初始化
USART。在汇编代码中要发送的数据存放于R16。

void USART_Transmit( unsigned char data )
{

while ( !( UCSRA & (1;

UDR = data;
}

2)发送9位数据的帧

如果发送9 位数据的数据帧(UCSZ = 7),应先将数据的第9 位写入寄存器UCSRB 的
TXB8,然后再将低8位数据写入发送数据寄存器UDR。以下程序给出发送9位数据的数据
帧例子。在汇编代码中要发送的数据存放在R17:R16 寄存器中。

void USART_Transmit( unsigned int data )
{

while ( !( UCSRA & (1;

UCSRB &= ~(1if ( data & 0x0100 )
UCSRB |= (1
UDR = data;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top