新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR學習心得(四)

        AVR學習心得(四)

        作者: 時間:2016-11-10 來源:網絡 收藏
        AVR mega128簡單的串行通訊原理


        單片機同PC通訊是用的都是UART進行通訊,其實各種單片機的串行通訊原理是完全相同的,而不同的僅僅是器控制的寄存器不同。對于mega128來說比51功能強大些,完全不用占用任何別的資源。只要控制好相應的寄存器就好了。

        ATmega128具有兩個USART:USART0和USART1,這兩個USART的具體功能將在下面描述。USART0和USART1使用不同的IO寄存器注意:在ATmega103兼容模式中USART1.UBRR0H和UCRS0C無效.這意味ATmega128僅可以使用USART0以異步方式工作

        本文引用地址:http://www.104case.com/article/201611/317329.htm

        USARTn 數據寄存器-UDRn:接受和發送數據寄存器

        只有當UCSRA寄存器的UDRE標志置位后才可以對發送緩沖器進行寫操作。如果UDRE沒有置位,那么寫入UDR 的數據會被USART 發送器忽略。當數據寫入發送緩沖器后,若移位寄存器為空,發送器將把數據加載到發送移位寄存器。然后數據串行地從TxD 引腳輸出。
        接收緩沖器包括一個兩級FIFO,一旦接收緩沖器被尋址FIFO 就會改變它的狀態。因此不要對這一存儲單元使用讀- 修改- 寫指令(SBI 和CBI)。使用位查詢指令(SBIC 和SBIS)時也要小心,因為這也有可能改變FIFO 的狀態。

        USARTn 控制和狀態寄存器A -UCSRnA:

        &8226;Bit 7 – RXCn: USART 接收結束
        接收緩沖器中有未讀出的數據時RXCn 置位,否則清零。接收器禁止時,接收緩沖器被刷新,導致RXCn 清零。RXCn 標志可用來產生接收結束中斷( 見對RXCIEn 位的描述)。
        &8226; Bit 6 – TXCn: USART 發送結束
        發送移位緩沖器中的數據被送出,且當發送緩沖器 (UDRn) 為空時TXCn 置位。執行發送結束中斷時TXCn 標志自動清零,也可以通過寫1 進行清除操作。TXCn 標志可用來產生發送結束中斷( 見對TXCIEn 位的描述)。
        &8226; Bit 5 – UDREn: USART 數據寄存器空
        UDREn 標志指出發送緩沖器(UDRn) 是否準備好接收新數據。UDREn 為1 說明緩沖器為空,已準備好進行數據接收。UDREn 標志可用來產生數據寄存器空中斷( 見對UDRIEn位的描述)。復位后UDREn 置位,表明發送器已經就緒。
        &8226; Bit 4 – FEn: 幀錯誤
        如果接收緩沖器接收到的下一個字符有幀錯誤,即接收緩沖器中的下一個字符的第一個停止位為0,那么FEn 置位。這一位一直有效直到接收緩沖器(UDRn) 被讀取。當接收到的停止位為1 時, FEn 標志為0。對UCSRnA 進行寫入時,這一位要寫0。
        &8226; Bit 3 – DORn: 數據過速
        數據過速時DORn 置位。當接收緩沖器滿( 包含了兩個數據),接收移位寄存器又有數據,若此時檢測到一個新的起始位,數據溢出就產生了。這一位一直有效直到接收緩沖器(UDRn) 被讀取。對UCSRnA 進行寫入時,這一位要寫0。
        &8226; Bit 2 – UPEn: 奇偶校驗錯誤

        當奇偶校驗使能(UPMn1 = 1),且接收緩沖器中所接收到的下一個字符有奇偶校驗錯誤時UPEn 置位。這一位一直有效直到接收緩沖器 (UDRn) 被讀取。對UCSRnA 進行寫入時,這一位要寫0。
        &8226; Bit 1 – U2Xn: 倍速發送
        這一位僅對異步操作有影響。使用同步操作時將此位清零。此位置1 可將波特率分頻因子從16 降到8,從而有效的將異步通信模式的傳輸速率加倍。
        &8226; Bit 0 – MPCMn: 多處理器通信模式
        設置此位將啟動多處理器通信模式。MPCMn 置位后, USARTn 接收器接收到的那些不包含地址信息的輸入幀都將被忽略。發送器不受MPCMn 設置的影響。

        USARTn 控制和狀態寄存器B -UCSRnB:

        &8226; Bit 7 – RXCIEn: 接收結束中斷使能
        置位后使能RXCn 中斷。當RXCIEn 為1,全局中斷標志位SREG 置位,UCSRnA 寄存器的RXCn 亦為1 時可以產生USARTn 接收結束中斷。
        &8226; Bit 6 – TXCIE: 發送結束中斷使能
        置位后使能TXCn 中斷。當TXCIEn 為1,全局中斷標志位SREG 置位, UCSRnA 寄存器的TXCn 亦為1 時可以產生USARTn 發送結束中斷。
        &8226; Bit 5 – UDRIEn: USART 數據寄存器空中斷使能
        置位后使能UDREn 中斷。當UDRIEn 為1,全局中斷標志位SREG 置位, UCSRnA 寄存器的UDREn 亦為1 時可以產生USARTn 數據寄存器空中斷。
        &8226; Bit 4 – RXENn: 接收使能
        置位后將啟動USARTn 接收器。RxDn 引腳的通用端口功能被USARTn 功能所取代。禁止接收器將刷新接收緩沖器,并使 FEn、DORn 及UPEn 標志無效。
        &8226; Bit 3 – TXENn: 發送使能
        置位后將啟動將啟動USARTn 發送器。TxDn 引腳的通用端口功能被USARTn 功能所取代。TXENn 清零后,只有等到所有的數據發送完成后發送器才能夠真正禁止,即發送移位寄存器與發送緩沖寄存器中沒有要傳送的數據。發送器禁止后,TxDn 引腳恢復其通用I/O 功能。
        &8226; Bit 2 – UCSZn2: 字符長度
        UCSZn2與UCSRnC寄存器的UCSZn1:0結合在一起可以設置數據幀所包含的數據位數(字符長度)。
        &8226; Bit 1 – RXB8n: 接收數據位8
        對9 位串行幀進行操作時,RXB8n 是第9 個數據位。讀取UDRn 包含的低位數據之前首先要讀取RXB8n。
        &8226; Bit 0 – TXB8n: 發送數據位8
        對9位串行幀進行操作時,TXB8n是第9個數據位。寫UDRn之前首先要對它進行寫操作。

        USARTn 控制和狀態寄存器C -UCSRnC:

        &8226; Bit 7 – 保留位
        該位保留。為與未來器件兼容,對UCSRnC 寫入時該位必須寫0 。
        &8226; Bit 6 – UMSELn: USART 模式選擇
        通過這一位來選擇同步或異步工作模式。

        &8226; Bit 5:4 – UPMn1:0: 奇偶校驗模式
        這兩位設置奇偶校驗的模式并使能奇偶校驗。如果使能了奇偶校驗,那么在發送數據,發送器都會自動產生并發送奇偶校驗位。對每一個接收到的數據,接收器都會產生一奇偶值,并與UPMn0所設置的值進行比較。如果不匹配,那么就將UCSRnA中的UPEn置位。

        &8226; Bit 3 – USBSn: 停止位選擇
        通過這一位可以設置停止位的位數。接收器忽略這一位的設置。

        &8226; Bit 2:1 – UCSZn1:0: 字符長度
        UCSZn1:0與UCSRnB寄存器的 UCSZn2結合在一起可以設置數據幀包含的數據位數(字符長度)。

        Bit 0 – UCPOLn: 時鐘極性
        這一位僅用于同步工作模式。使用異步模式時,將這一位清零。UCPOLn 設置了輸出數據的改變和輸入數據采樣,以及同步時鐘XCKn 之間的關系。

        USART 波特率寄存器-UBRRnL 和UBRRnH:

        &8226; Bit 15:12 – 保留
        這些位是為以后的使用而保留的。為了與以后的器件兼容,寫UBRRnH 時將這些位清零。
        &8226; Bit 11:0 – UBRRn11:0: USARTn 波特率寄存器
        這個12 位的寄存器包含了USARTn 的波特率信息。其中UBRRnH 包含了USARTn 波特率高4 位,UBRRnL 包含了低8 位。波特率的改變將造成正在進行的數據傳輸受到破壞。寫UBRRnL 將立即更新波特率分頻器。

        附:實驗程序

        /*****************************************************
        函 數 名:void uart_init(void)
        功 能:初始化串口
        說 明:根據要求設置好波特率和數據位
        入口參數:無
        返 回 值:無
        *****************************************************/
        void uart_init(void)
        {
        UBRR0H=0; /* 設置波特率9600,時鐘8MHz,查表UBRR=51 */
        UBRR0L=51; /* UBR=51 */
        UCSR0B=(1<

        UCSR0C=0x06; /* 設置數據格式,8位數據位,1位停止位 */
        }

        /*****************************************************
        函 數 名:void Uart_Transmit(unsigned char c)
        功 能:向串口發送一字符(查詢方式)
        說 明:只有當寄存器UCSRA的UDRE標志置位后,才可以對發送緩沖進行寫操作
        入口參數:無
        返 回 值:無
        *****************************************************/
        void Uart_Transmit(unsigned char c)
        {
        while( !( UCSR0A & (1<
        UDR0=c; /* 發送數據 */
        }

        /*****************************************************
        函 數 名:void Uart_Transmits(unsigned char *arr)
        功 能:向串口寫入字符串(查詢方式)
        說 明:
        入口參數:無
        返 回 值:無
        *****************************************************/
        void Uart_Transmits(unsigned char *arr)
        {
        do
        {
        Uart_Transmit(*arr);
        arr++;
        }while(*arr!=/0);

        }



        關鍵詞: AVR學習心

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鲜城| 仪陇县| 澄江县| 祁门县| 布拖县| 南通市| 南漳县| 临泽县| 广河县| 商河县| 翁源县| 内乡县| 蒙阴县| 慈溪市| 金寨县| 乃东县| 德庆县| 铁岭县| 五峰| 天祝| 兴山县| 辉南县| 读书| 江华| 湛江市| 察哈| 辰溪县| 鹤岗市| 施秉县| 屏边| 莱州市| 高陵县| 通榆县| 崇仁县| 大渡口区| 澜沧| 外汇| 北宁市| 乳山市| 镇雄县| 灵川县|