USART數(shù)據(jù)寄存器UDR:
當對此寄存器進行讀的時候,實際就是接收數(shù)據(jù)緩沖寄存器(RXB)。
當對此寄存器進行寫的時候,實際就是發(fā)送數(shù)據(jù)緩沖寄存器(TXB)。
USART控制和狀態(tài)寄存器A:UCSRA(RXC,TXC,UDRE,FE,DOR,PE,U2X,MPCM)
RXC:USART接受結(jié)束。接受緩沖器中仍然有未讀出的數(shù)據(jù)時,RXC置位。如果沒有任何需要讀的數(shù)據(jù)時,RXC清零。當接收器禁止時,接收緩沖器刷新,導(dǎo)致RXC清零,RXC標志也可以用來產(chǎn)生接收結(jié)束中斷。
TXC:USART發(fā)送結(jié)束。發(fā)送移位寄存器中的數(shù)據(jù)被送出,且當發(fā)送緩沖器(UDR/TXB)為空時,TXC置位。執(zhí)行發(fā)送結(jié)束中斷時TXC標志自動清零。
UDRE:USART數(shù)據(jù)寄存器空。當UDRE為“1”時,說明緩沖器為空,已準備好進行數(shù)據(jù)接受。
FE:幀錯誤。如果接收緩沖器接收到下一個字符有幀錯誤,即下一個字符的第一個停止位為“0”,那么FE置位。當對USART數(shù)據(jù)寄存器UDR進行寫入時,這一位必須寫“0”;
DOR:數(shù)據(jù)溢出。當接收緩沖器滿(包含了兩個數(shù)據(jù)),接收移位寄存器又有數(shù)據(jù)時,若檢測到一個新的起始位,數(shù)據(jù)溢出就產(chǎn)生了。DOR就置為“1”。當對USART進行寫時,DOR要寫為“0”。
PE:奇偶校驗錯誤。當奇偶校驗使能(UPM = 1),且接收緩沖中所接收的下一個字符有奇偶校驗錯誤,PE置位。對USART進行寫時,這一位寫為“0”;
U2X:倍速發(fā)送。僅僅對異步操作有影響。使用同步操作時把這一位寫“0”;
MPCM:設(shè)置此位將啟動多處理器通信模式。即,USART不再接收那些不包含地址信息的輸入幀,發(fā)送時USART不受MPCM的影響。
USART控制和狀態(tài)寄存器B:
UCSRB(RXCIE,TXCIE,UDRIE,RXEN,TXEN,UCSZ2,RXB8,TXB8)
RXCIE:接收結(jié)束中斷使能。TXCIE:發(fā)送結(jié)束中斷使能;
UDRIE:USART數(shù)據(jù)寄存器空中斷使能;
RXEN:接收使能。置位后將啟動USART接收器RxD引腳的通用端口功能被USART功能所取代。
TXEN:發(fā)送使能。置位后將啟動USART發(fā)送器TxD引腳的通用端口功能被USART功能所取代。當該位清零后,并所有數(shù)據(jù)發(fā)送完成后,發(fā)送器才能真正禁止。I/O恢復(fù)通用功能。
UCSZ2:與UCSZ1, UCSZ0,結(jié)合在一起確定字符長度。
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位
RXB8:對9位串行幀進行操作時,RXB8就是第9個數(shù)據(jù)位。讀取UDR包含的低位數(shù)據(jù)之前首先要讀取RXB8。如果小于9位,則忽略RXB8
TXB8:對9位串行幀進行操作時,TXB8就是第9個數(shù)據(jù)位。寫UDR包含的低位數(shù)據(jù)之前首先要寫TXB8。如果小于9位,則忽略TXB8
USART控制和狀態(tài)寄存器C:
UCSRC(URSEL,UMSEL,UPM1,UPM0,USBS,UCSZ1,UCSZ0,UCPOL)
URSEL:寄存器選擇。通過該位選擇訪問UCSRC或者UBRRH,當讀寫UCSRC時,置位。當讀寫UBRRH時,弄為“0”
UMSEL:USART模式選擇,通過這一位來選擇同步或者異步工作模式,異步模式時為“0”,同步模式時為“1”。
UPM1:0奇偶校驗?zāi)J?。如果校驗的結(jié)果不匹配(有錯誤)那么就將UCSRA中PE置位。
UPM1
UPM0
奇偶模式
0
0
禁止
0
1
保留
1
0
偶校驗
1
1
奇校驗
USBS:停止位選擇。當為“0”時,一位停止位,當為“1”時,兩位停止位。通過這一位可以設(shè)置停止位的位數(shù),接收器忽略此位設(shè)置。
UCSZ1:0 字符長度。
UCPOL:時鐘極性這一位僅僅用于同步工作模式,異步工作模式時清零。
UCPOL
TxD引腳的輸出
RxD引腳的輸入
0
XCK上升沿
XCK下降沿
1
XCK下降沿
XCK上升沿
USART波特率寄存器
UBRRH(URSEL,-,-,-,UBRR[11:8])和UBRRL(UBRR[7:0])
URSEL:寄存器選擇,
UBRRH包含了USART波特率高4位,UBRRL包含了低8位。
傳輸線路RxD或TxD沒有數(shù)據(jù)傳輸,線路空閑時必須保持高電平。
時鐘工作模式
波特率計算公式
寄存器UBRR值計算公式
普通異步模式
UBRR=
UBRR=
倍速異步模式
BAUD=
UBRR=
主機同步模式
BAUD=
UBRR=
#include
//函數(shù)聲明
voiddelay(unsignedinttime);
voidUSART_Init();
voidUSART_Transmit(unsignedchardata);
//主函數(shù)
voidmain()
{
unsignedchari=0;
unsignedcharj=0;
//初始化E端口
PORTE=0x03;
DDRE=0x02;
//初始化C端口
DDRC=0xff;//全為輸出方式
PORTC=0x0f;//燈全亮
USART_Init();
while(1)
{
USART_Transmit(48+i);
j++;
PORTCPORTC=PORTC<<1;
if(j>=4){j=0;PORTC=0x0f;}
delay(10000);
if(++i>=10){i=0;}
}
}
//延時函數(shù)
voiddelay(unsignedinttime)
{
unsignedintj;
for(;time>0;time--)
{
for(j=100;j>0;j--);
}
}
//初始化串口
voidUSART_Init()
{
//波特率設(shè)置
UBRR1H=0x00;
UBRR1L=0x2f;
UCSR1A=UCSR0A&0x02;
//UCSR0B=(1< //UCSR0C=(3< //數(shù)據(jù)發(fā)送設(shè)置 UCSR1B=0x18; UCSR1C=0x06; } //數(shù)據(jù)傳輸 voidUSART_Transmit(unsignedchardata) { //while(!(UCSR0A&(1< while(!(UCSR1A)&0x20); UDR1=data; }