AVR单片机(学习ing)-ATMEGA16的USART与PC机串行通信
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位数据的帧
TXB8,然后再将低8位数据写入发送数据寄存器UDR。以下程序给出发送9位数据的数据
帧例子。在汇编代码中要发送的数据存放在R17:R16 寄存器中。
void USART_Transmit( unsigned int data )
{
while ( !( UCSRA & (1
UCSRB &= ~(1
UCSRB |= (1
UDR = data;
}
AVR单片机ATMEGA16USART串行通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)