微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > avr单片机USART串口通讯初始化配置说明

avr单片机USART串口通讯初始化配置说明

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

*USART波特率寄存器(UBRRL和UBRRH)*

USART波特率寄存器(UBRRL和UBRRH)
bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8
URSEL – – – UBRR[11:8]
UBRR[7:0]
UCSRC寄存器与UBRRH寄存器共用相同的I/O地址。对该寄存器的访问。
URSEL: 寄存器选择
通过该位选择访问UCSRC 寄存器或UBRRH 寄存器。当读UBRRH时,该位为0;当写
UBRRH时, URSEL为0。
Bit 14:12 – 保留位
这些位是为以后的使用而保留的。为了与以后的器件兼容,写UBRRH时将这些位清零。
UBRR11:0: USART 波特率寄存器
这个12位的寄存器包含了USART的波特率信息。其中UBRRH包含了USART波特率高4
位,UBRRL包含了低8位。波特率的改变将造成正在进行的数据传输受到破坏。写UBRRL
将立即更新波特率分频器

波特率定义为每秒的位传输速度 (bps)

BAUD 波特率 ( bps)
fOSC 系统时钟频率
UBRR UBRRH 与 UBRRL 的数值 (0-4095)

异步正常模式 (U2X = 0)
FOSC FOSC
BAUD = -------------- UBRR = ------------ -1
16( UBRR+ 1) 16BAUD
异步倍速模式 (U2X = 1)
fOSC fOSC
BAUD = -------------- UBRR = ------------ -1
8(UBRR+ 1) 8BAUD
同步主机模式
fOSC fOSC
BAUD = --------------- UBRR = ------------ -1
2(UBRR+ 1) 2BAUD

程序例子:
#include
#include
#pragma interrupt_handler UDR_empty:iv_USART_UDRE
#pragma interrupt_handler RXC_END:iv_USART_DRE
#pragma interrupt_handler TXC_END:iv_USART_TX
unsigned char UASART_DATA=0;
void USART_Init( unsigned int baud,unsigned char digit,unsigned charmode,unsigned char checkout)//详细初始化模式
{

SREG&=0x7F;
UCSRC&=~(1/* 设置波特率 */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* 接收器与发送器使能 */
UCSRB = (1/*UDR数据寄存器为空时中断使能 */
UCSRB = (1

switch(mode)//异同模式选择
{
case 0:UCSRB&=~(1 case 1:UCSRB|=1 default :UCSRB&=~(1}
UCSRC|=1/* 如果发送9位数据的数据帧(UCSZ = 7),应先将数据的第9位写入寄存器UCSRB的TXB8,然后再将低8位数据写入发送数据寄存器UDR, */
switch(digit)//// 设置帧格式 : digit数据位5-9,
{
case 5:UCSRB&=~(1 case 6:UCSRB&=~(1 case 7:UCSRB&=~(1 case 8:UCSRB&=~(1 case 9:UCSRB|=1 default:UCSRB&=~(1}
switch(checkout)//checkout校验模式
{
case 0:UCSRC&=~(1 case 2:UCSRC|=1 case 3:UCSRC|=(3 default:UCSRC&=~(1}
UCSRC|=1//UCSRC&=~(1UCSRC&=~(1//*
//UCSRA|=1//UCSRA|=1SREG|=0x80;//使能全局中断
}

/UBRR的baud设置参数表*/
//U2X=0;8mhz晶振9600:UBRR=51;误差:0.2%。4800:UBRR=103;误差:0.2%.2400:UBRR=207;误差:0.2%
//U2X=1;8mhz晶振9600:UBRR=103;误差:0.2%。4800:UBRR=207;误差:0.2%.2400:UBRR=416;误差:-0.1%
//U2X=0;11.0592mhz晶振9600:UBRR=71;误差:0.0%。4800:UBRR=143;误差:0.0%.2400:UBRR=287;误差:0.0%
//U2X=1;11.0592mhz晶振9600:UBRR=143;误差:0.0%。4800:UBRR=287;误差:0.0%.2400:UBRR=575;误差:0.0%
void USART_Init_commonage(unsigned int baud)//通用初始化
{

/* 设置波特率 */
SREG&=0x7F;
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* 接收器与发送器使能 数据寄存器空使能禁止*/
UCSRB = (1/* 设置帧格式 : 8个数据位 , 2个停止位 ,禁止校验,XCK上升沿发送数据下降沿接收数据,异步模式*/
UCSRC = (1//UCSRA=0;单机处理模式。中断标志清零,波特率的普通模式(非加倍,倍速模式)
SREG|=0x80;//使能全局中断
}
/*
USART数据寄存器空标志UDRE及传输结束标志TXC,两个标志位都可以产生中断。
*/
void UDR_empty()
//使能要求:全局中断使能,数据寄存器空中断使能位 UDRIE置位。 UDRE 被置位(自动)。
//对寄存器 UDR 执行写操作将清零 UDRE
{

unsigned char data;
UDR = data;
//add your code here
}
void TXC_END()
{

UDR =UASART_DATA;

//add your code here
}
void RXC_END()
{
UASART_DATA=UDR;
//add your code here
}
void USART_Transmit5_8( unsigned char data )//对 UDRE标志采用轮询方式发送数据(发送5-8位数据)
{

/* 等待发送缓冲器为空 */
while ( !( UCSRA & (1/* 将数据放入缓冲器,发送数据 */
UDR = data;
}
void USART_Transmit_9( unsigned int data )//用查询法发送9位数据的数据帧
{

/* 等待发送缓冲器为空 */
while ( !( UCSRA & (1/* 将第 9 位到 TXB8 */
UCSRB &= ~(1if ( data & 0x0100 )
UCSRB |= (1/* 将数据放入缓冲器,发送数据 */
UDR = data;
}
unsigned char USART_Receive5_8( void )//用查询RXC接受5-8位的数据
{
/*等待接收数据*/
while ( !(UCSRA & (1/* 从缓冲器获得数据并返回数据*/
return UDR;
}
unsigned int USART_Receive_9( void )//接受9位的数据帧
{
unsigned char status, resh, resl;
/*等待接收数据 */
while ( !(UCSRA & (1/*从缓冲器获得状态及其第九位数据*/
/* from buffer */
status = UCSRA;
resh = UCSRB;
resl = UDR;
/* 如果出错返回*/
if ( status & (1 return 255;
/* 过滤第九位数据然后返回*/
resh = (resh >> 1) & 0x01;
return ((resh < 8) | resl);
}
/*
禁止接收器时缓冲器 FIFO 被刷新,缓冲器被清空。导致未读出的数据丢失。如果由于出错而必须在正常操作下刷新缓冲器?
则需要一直读取 UDR 直到 RXC 标志清零。
*/
void USART_Flush( void )
{
unsigned char dummy;
while ( UCSRA & (1}

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

网站地图

Top