您的位置 首页 发布

avr单片机USART串口通讯初始化装备及阐明

avratmega16单片机通用同步和异步串行接收器和转发器(USART)是一个高度灵活的串行通讯设备,其工作模式及其初始化,寄存器说明如下…

avr atmega16 单片机通用同步和异步串行接纳器和转发器 (USART) 是一个高度灵敏的串行通讯设备,其作业形式及其初始化,寄存器阐明如下。

//*****************************USART 操控和状况寄存器A(UCSRA)********************************
/*USART 操控和状况寄存器A(UCSRA)

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

RXC TXC UDRE FE DOR PE U2X MPCM

RXC: USART 接纳完毕

接纳缓冲器中有未读出的数据时RXC 置位,不然清零。接纳器制止时,接纳缓冲器被刷

新,导致RXC 清零。RXC 标志可用来发生接纳完毕中止

TXC: USART 发送完毕

发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDR) 为空时TXC 置位。履行发送

完毕中止时TXC 标志主动清零,也能够经过写0进行铲除操作。TXC 标志可用来发生发

送完毕中止( 见对TXCIE 位的描绘)。

UDRE: USART 数据寄存器空

UDRE标志指出发送缓冲器(UDR)是否准备好接纳新数据。UDRE为1阐明缓冲器为空,已

准备好进行数据接纳。UDRE标志可用来发生数据寄存器空中止

复位后UDRE 置位,标明发送器现已安排妥当。

FE: 帧过错

假如接纳缓冲器接纳到的下一个字符有帧过错,即接纳缓冲器中的下一个字符的第一个

中止位为0,那么FE 置位。这一位一向有用直到接纳缓冲器(UDR) 被读取。当接纳到的

中止位为1 时, FE 标志为0。对UCSRA 进行写入时,这一位要写0。

DOR: 数据溢出

数据溢出时DOR 置位。当接纳缓冲器满( 包括了两个数据),接纳移位寄存器又有数据,

若此刻检测到一个新的开始位,数据溢出就发生了。这一位一向有用直到接纳缓冲器

(UDR) 被读取。对UCSRA 进行写入时,这一位要写0。

PE: 奇偶校验过错

当奇偶校验使能(UPM1 1),且接纳缓冲器中所接纳到的下一个字符有奇偶校验过错时

UPE 置位。这一位一向有用直到接纳缓冲器 (UDR) 被读取。对UCSRA 进行写入时,这

一位要写0。

U2X: 倍速发送

这一位仅对异步操作有影响。运用同步操作时将此位清零。此方位1可将波特率分频因

子从16降到8,然后有用的将异步通讯形式的传输速率加倍。

MPCM: 多处理器通讯形式

设置此位将发动多处理器通讯形式。MPCM置位后,USART 接纳器接纳到的那些不包括

地址信息的输入帧都将被疏忽。发送器不受MPCM设置的影响。

*/

//***************************USART操控和状况寄存器 B(UCSRB)*******************

/* USART操控和状况寄存器 B(UCSRB)

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8

RXCIE: 接纳完毕中止使能

置位后使能RXC中止。当RXCIE为1,大局中止标志位SREG置位,UCSRA寄存器的RXC

亦为1时能够发生USART接纳完毕中止。

TXCIE: 发送完毕中止使能

置位后使能TXC中止。当TXCIE为1,大局中止标志位SREG置位,UCSRA寄存器的TXC

亦为1时能够发生USART发送完毕中止。

UDRIE: USART 数据寄存器空中止使能

置位后使能UDRE中止。当UDRIE 为1,大局中止标志位SREG置位,UCSRA寄存器的UDRE

亦为1时能够发生USART数据寄存器空中止。

RXEN: 接纳使能

置位后将发动USART接纳器。RxD 引脚的通用端口功用被USART功用所替代。制止接

收器将改写接纳缓冲器,并使 FE、DOR及PE标志无效。

TXEN: 发送使能

置位后将发动将发动USART发送器。TxD引脚的通用端口功用被USART功用所替代。

TXEN 清零后,只要比及一切的数据发送完成后发送器才能够真实制止,即发送移位

寄存器与发送缓冲寄存器中没有要传送的数据。发送器制止后,TxD引脚康复其通用

I/O功用。

UCSZ2: 字符长度

UCSZ2与UCSRC寄存器的UCSZ1:0结合在一起能够设置数据帧所包括的数据位数(字符

长度)。

RXB8: 接纳数据位8

对9位串行帧进行操作时,RXB8 是第9个数据位。读取UDR包括的低位数据之前首要

要读取RXB8。

TXB8: 发送数据位8

对9位串行帧进行操作时,TXB8是第9个数据位。写UDR之前首要要对它进行写操作。

*/
//****************************状况寄存器 C(UCSRC)*****************************
/* 状况寄存器 C(UCSRC)

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL

UCSRC寄存器与UBRRH寄存器共用相同的I/O地址。对该寄存器的拜访。
URSEL: 寄存器挑选

经过该位挑选拜访UCSRC寄存器或UBRRH寄存器。 当读UCSRC时,该位为1 ;当写UCSRC

时,URSEL为1。 URSEL 为 0 ,对UBRRH 值更新; 若 URSEL 为 1 ,对UCSRC 设置更新

UMSEL: USART 形式挑选

经过这一位来挑选同步或异步作业形式。

UMSEL设置

UMSEL 形式

0 异步操作

1 同步操作

UPM1:0: 奇偶校验形式

这两位设置奇偶校验的形式并使能奇偶校验。假如使能了奇偶校验,那么在发送数

据,发送器都会主动发生并发送奇偶校验位。对每一个接纳到的数据,接纳器都会

发生一奇偶值,并与UPM0 所设置的值进行比较。假如不匹配,那么就将UCSRA 中

的PE 置位。

UPM 设置

UPM1 UPM0 奇偶形式

0 0 制止

0 1 保存

1 0 偶校验

1 1 奇校验

USBS: 中止位挑选

经过这一位能够设置中止位的位数。接纳器疏忽这一位的设置。

USBS 设置

USBS 中止位位数

0 1

1 2

UCSZ1:0: 字符长度

UCSZ1:0与UCSRB寄存器的 UCSZ2结合在一起能够设置数据帧包括的数据位数(字

符长度)。

UCSZ 设置

UCSZ2 UCSZ1 UCSZ0 字符长度
0 0 0 5

0 0 1 6

0 1 0 7

0 1 1 8

1 0 0 保存

1 0 1 保存

1 1 0 保存

1 1 1 9

UCPOL: 时钟极性

这一位仅用于同步作业形式。运用异步形式时,将这一位清零。UCPOL 设置了输出

数据的改动和输入数据采样,以及同步时钟XCK 之间的联系。

UCPOL 设置

UCPOL 发送数据的改动(TxD引脚的输出) 接纳数据的采样(RxD 引脚的输入)

0 XCK上升沿XCK 下降沿

1 XCK 下降沿XCK 上升沿

*///*********************************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 char mode,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&=~(1<UCSRC&=~(1<//***************
//UCSRA|=1<//UCSRA|=1<SREG|=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 &= ~(1<if ( 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<}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/266645.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部