AVR學習心得(四)
單片機同PC通訊是用的都是UART進行通訊,其實各種單片機的串行通訊原理是完全相同的,而不同的僅僅是器控制的寄存器不同。對于mega128來說比51功能強大些,完全不用占用任何別的資源。只要控制好相應的寄存器就好了。
ATmega128具有兩個USART:USART0和USART1,這兩個USART的具體功能將在下面描述。USART0和USART1使用不同的IO寄存器注意:在ATmega103兼容模式中USART1.UBRR0H和UCRS0C無效.這意味ATmega128僅可以使用USART0以異步方式工作
本文引用地址:http://www.ex-cimer.com/article/201611/317329.htmUSARTn 數(shù)據(jù)寄存器-UDRn:接受和發(fā)送數(shù)據(jù)寄存器
只有當UCSRA寄存器的UDRE標志置位后才可以對發(fā)送緩沖器進行寫操作。如果UDRE沒有置位,那么寫入UDR 的數(shù)據(jù)會被USART 發(fā)送器忽略。當數(shù)據(jù)寫入發(fā)送緩沖器后,若移位寄存器為空,發(fā)送器將把數(shù)據(jù)加載到發(fā)送移位寄存器。然后數(shù)據(jù)串行地從TxD 引腳輸出。
接收緩沖器包括一個兩級FIFO,一旦接收緩沖器被尋址FIFO 就會改變它的狀態(tài)。因此不要對這一存儲單元使用讀- 修改- 寫指令(SBI 和CBI)。使用位查詢指令(SBIC 和SBIS)時也要小心,因為這也有可能改變FIFO 的狀態(tài)。
USARTn 控制和狀態(tài)寄存器A -UCSRnA:
&8226;Bit 7 – RXCn: USART 接收結束
接收緩沖器中有未讀出的數(shù)據(jù)時RXCn 置位,否則清零。接收器禁止時,接收緩沖器被刷新,導致RXCn 清零。RXCn 標志可用來產(chǎn)生接收結束中斷( 見對RXCIEn 位的描述)。
&8226; Bit 6 – TXCn: USART 發(fā)送結束
發(fā)送移位緩沖器中的數(shù)據(jù)被送出,且當發(fā)送緩沖器 (UDRn) 為空時TXCn 置位。執(zhí)行發(fā)送結束中斷時TXCn 標志自動清零,也可以通過寫1 進行清除操作。TXCn 標志可用來產(chǎn)生發(fā)送結束中斷( 見對TXCIEn 位的描述)。
&8226; Bit 5 – UDREn: USART 數(shù)據(jù)寄存器空
UDREn 標志指出發(fā)送緩沖器(UDRn) 是否準備好接收新數(shù)據(jù)。UDREn 為1 說明緩沖器為空,已準備好進行數(shù)據(jù)接收。UDREn 標志可用來產(chǎn)生數(shù)據(jù)寄存器空中斷( 見對UDRIEn位的描述)。復位后UDREn 置位,表明發(fā)送器已經(jīng)就緒。
&8226; Bit 4 – FEn: 幀錯誤
如果接收緩沖器接收到的下一個字符有幀錯誤,即接收緩沖器中的下一個字符的第一個停止位為0,那么FEn 置位。這一位一直有效直到接收緩沖器(UDRn) 被讀取。當接收到的停止位為1 時, FEn 標志為0。對UCSRnA 進行寫入時,這一位要寫0。
&8226; Bit 3 – DORn: 數(shù)據(jù)過速
數(shù)據(jù)過速時DORn 置位。當接收緩沖器滿( 包含了兩個數(shù)據(jù)),接收移位寄存器又有數(shù)據(jù),若此時檢測到一個新的起始位,數(shù)據(jù)溢出就產(chǎn)生了。這一位一直有效直到接收緩沖器(UDRn) 被讀取。對UCSRnA 進行寫入時,這一位要寫0。
&8226; Bit 2 – UPEn: 奇偶校驗錯誤
當奇偶校驗使能(UPMn1 = 1),且接收緩沖器中所接收到的下一個字符有奇偶校驗錯誤時UPEn 置位。這一位一直有效直到接收緩沖器 (UDRn) 被讀取。對UCSRnA 進行寫入時,這一位要寫0。
&8226; Bit 1 – U2Xn: 倍速發(fā)送
這一位僅對異步操作有影響。使用同步操作時將此位清零。此位置1 可將波特率分頻因子從16 降到8,從而有效的將異步通信模式的傳輸速率加倍。
&8226; Bit 0 – MPCMn: 多處理器通信模式
設置此位將啟動多處理器通信模式。MPCMn 置位后, USARTn 接收器接收到的那些不包含地址信息的輸入幀都將被忽略。發(fā)送器不受MPCMn 設置的影響。
USARTn 控制和狀態(tài)寄存器B -UCSRnB:
&8226; Bit 7 – RXCIEn: 接收結束中斷使能
置位后使能RXCn 中斷。當RXCIEn 為1,全局中斷標志位SREG 置位,UCSRnA 寄存器的RXCn 亦為1 時可以產(chǎn)生USARTn 接收結束中斷。
&8226; Bit 6 – TXCIE: 發(fā)送結束中斷使能
置位后使能TXCn 中斷。當TXCIEn 為1,全局中斷標志位SREG 置位, UCSRnA 寄存器的TXCn 亦為1 時可以產(chǎn)生USARTn 發(fā)送結束中斷。
&8226; Bit 5 – UDRIEn: USART 數(shù)據(jù)寄存器空中斷使能
置位后使能UDREn 中斷。當UDRIEn 為1,全局中斷標志位SREG 置位, UCSRnA 寄存器的UDREn 亦為1 時可以產(chǎn)生USARTn 數(shù)據(jù)寄存器空中斷。
&8226; Bit 4 – RXENn: 接收使能
置位后將啟動USARTn 接收器。RxDn 引腳的通用端口功能被USARTn 功能所取代。禁止接收器將刷新接收緩沖器,并使 FEn、DORn 及UPEn 標志無效。
&8226; Bit 3 – TXENn: 發(fā)送使能
置位后將啟動將啟動USARTn 發(fā)送器。TxDn 引腳的通用端口功能被USARTn 功能所取代。TXENn 清零后,只有等到所有的數(shù)據(jù)發(fā)送完成后發(fā)送器才能夠真正禁止,即發(fā)送移位寄存器與發(fā)送緩沖寄存器中沒有要傳送的數(shù)據(jù)。發(fā)送器禁止后,TxDn 引腳恢復其通用I/O 功能。
&8226; Bit 2 – UCSZn2: 字符長度
UCSZn2與UCSRnC寄存器的UCSZn1:0結合在一起可以設置數(shù)據(jù)幀所包含的數(shù)據(jù)位數(shù)(字符長度)。
&8226; Bit 1 – RXB8n: 接收數(shù)據(jù)位8
對9 位串行幀進行操作時,RXB8n 是第9 個數(shù)據(jù)位。讀取UDRn 包含的低位數(shù)據(jù)之前首先要讀取RXB8n。
&8226; Bit 0 – TXB8n: 發(fā)送數(shù)據(jù)位8
對9位串行幀進行操作時,TXB8n是第9個數(shù)據(jù)位。寫UDRn之前首先要對它進行寫操作。
USARTn 控制和狀態(tài)寄存器C -UCSRnC:
&8226; Bit 7 – 保留位
該位保留。為與未來器件兼容,對UCSRnC 寫入時該位必須寫0 。
&8226; Bit 6 – UMSELn: USART 模式選擇
通過這一位來選擇同步或異步工作模式。
&8226; Bit 5:4 – UPMn1:0: 奇偶校驗模式
這兩位設置奇偶校驗的模式并使能奇偶校驗。如果使能了奇偶校驗,那么在發(fā)送數(shù)據(jù),發(fā)送器都會自動產(chǎn)生并發(fā)送奇偶校驗位。對每一個接收到的數(shù)據(jù),接收器都會產(chǎn)生一奇偶值,并與UPMn0所設置的值進行比較。如果不匹配,那么就將UCSRnA中的UPEn置位。
&8226; Bit 3 – USBSn: 停止位選擇
通過這一位可以設置停止位的位數(shù)。接收器忽略這一位的設置。
&8226; Bit 2:1 – UCSZn1:0: 字符長度
UCSZn1:0與UCSRnB寄存器的 UCSZn2結合在一起可以設置數(shù)據(jù)幀包含的數(shù)據(jù)位數(shù)(字符長度)。
Bit 0 – UCPOLn: 時鐘極性
這一位僅用于同步工作模式。使用異步模式時,將這一位清零。UCPOLn 設置了輸出數(shù)據(jù)的改變和輸入數(shù)據(jù)采樣,以及同步時鐘XCKn 之間的關系。
USART 波特率寄存器-UBRRnL 和UBRRnH:
&8226; Bit 15:12 – 保留
這些位是為以后的使用而保留的。為了與以后的器件兼容,寫UBRRnH 時將這些位清零。
&8226; Bit 11:0 – UBRRn11:0: USARTn 波特率寄存器
這個12 位的寄存器包含了USARTn 的波特率信息。其中UBRRnH 包含了USARTn 波特率高4 位,UBRRnL 包含了低8 位。波特率的改變將造成正在進行的數(shù)據(jù)傳輸受到破壞。寫UBRRnL 將立即更新波特率分頻器。
附:實驗程序
/***************************************************** UCSR0C=0x06; /* 設置數(shù)據(jù)格式,8位數(shù)據(jù)位,1位停止位 */ /***************************************************** /***************************************************** }
函 數(shù) 名:void uart_init(void)
功 能:初始化串口
說 明:根據(jù)要求設置好波特率和數(shù)據(jù)位
入口參數(shù):無
返 回 值:無
*****************************************************/
void uart_init(void)
{
UBRR0H=0; /* 設置波特率9600,時鐘8MHz,查表UBRR=51 */
UBRR0L=51; /* UBR=51 */
UCSR0B=(1<
}
函 數(shù) 名:void Uart_Transmit(unsigned char c)
功 能:向串口發(fā)送一字符(查詢方式)
說 明:只有當寄存器UCSRA的UDRE標志置位后,才可以對發(fā)送緩沖進行寫操作
入口參數(shù):無
返 回 值:無
*****************************************************/
void Uart_Transmit(unsigned char c)
{
while( !( UCSR0A & (1<
UDR0=c; /* 發(fā)送數(shù)據(jù) */
}
函 數(shù) 名:void Uart_Transmits(unsigned char *arr)
功 能:向串口寫入字符串(查詢方式)
說 明:
入口參數(shù):無
返 回 值:無
*****************************************************/
void Uart_Transmits(unsigned char *arr)
{
do
{
Uart_Transmit(*arr);
arr++;
}while(*arr!=/0);
評論