新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > avr單片機(jī)USART串口通訊初始化配置及說(shuō)明

        avr單片機(jī)USART串口通訊初始化配置及說(shuō)明

        作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
        avr atmega16 單片機(jī)通用同步和異步串行接收器和轉(zhuǎn)發(fā)器 (USART) 是一個(gè)高度靈活的串行通訊設(shè)備,其工作模式及其初始化,寄存器說(shuō)明如下。

        //*****************************USART 控制和狀態(tài)寄存器A(UCSRA)********************************
        /*USART 控制和狀態(tài)寄存器A(UCSRA)

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

        bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

        RXC TXC UDRE FE DOR PE U2X MPCM

        RXC: USART 接收結(jié)束

        接收緩沖器中有未讀出的數(shù)據(jù)時(shí)RXC 置位,否則清零。接收器禁止時(shí),接收緩沖器被刷

        新,導(dǎo)致RXC 清零。RXC 標(biāo)志可用來(lái)產(chǎn)生接收結(jié)束中斷

        TXC: USART 發(fā)送結(jié)束

        發(fā)送移位緩沖器中的數(shù)據(jù)被送出,且當(dāng)發(fā)送緩沖器 (UDR) 為空時(shí)TXC 置位。執(zhí)行發(fā)送

        結(jié)束中斷時(shí)TXC 標(biāo)志自動(dòng)清零,也可以通過(guò)寫0進(jìn)行清除操作。TXC 標(biāo)志可用來(lái)產(chǎn)生發(fā)

        送結(jié)束中斷( 見(jiàn)對(duì)TXCIE 位的描述)。

        UDRE: USART 數(shù)據(jù)寄存器空

        UDRE標(biāo)志指出發(fā)送緩沖器(UDR)是否準(zhǔn)備好接收新數(shù)據(jù)。UDRE為1說(shuō)明緩沖器為空,已

        準(zhǔn)備好進(jìn)行數(shù)據(jù)接收。UDRE標(biāo)志可用來(lái)產(chǎn)生數(shù)據(jù)寄存器空中斷

        復(fù)位后UDRE 置位,表明發(fā)送器已經(jīng)就緒。

        FE: 幀錯(cuò)誤

        如果接收緩沖器接收到的下一個(gè)字符有幀錯(cuò)誤,即接收緩沖器中的下一個(gè)字符的第一個(gè)

        停止位為0,那么FE 置位。這一位一直有效直到接收緩沖器(UDR) 被讀取。當(dāng)接收到的

        停止位為1 時(shí), FE 標(biāo)志為0。對(duì)UCSRA 進(jìn)行寫入時(shí),這一位要寫0。

        DOR: 數(shù)據(jù)溢出

        數(shù)據(jù)溢出時(shí)DOR 置位。當(dāng)接收緩沖器滿( 包含了兩個(gè)數(shù)據(jù)),接收移位寄存器又有數(shù)據(jù),

        若此時(shí)檢測(cè)到一個(gè)新的起始位,數(shù)據(jù)溢出就產(chǎn)生了。這一位一直有效直到接收緩沖器

        (UDR) 被讀取。對(duì)UCSRA 進(jìn)行寫入時(shí),這一位要寫0。

        PE: 奇偶校驗(yàn)錯(cuò)誤

        當(dāng)奇偶校驗(yàn)使能(UPM1 1),且接收緩沖器中所接收到的下一個(gè)字符有奇偶校驗(yàn)錯(cuò)誤時(shí)

        UPE 置位。這一位一直有效直到接收緩沖器 (UDR) 被讀取。對(duì)UCSRA 進(jìn)行寫入時(shí),這

        一位要寫0。

        U2X: 倍速發(fā)送

        這一位僅對(duì)異步操作有影響。使用同步操作時(shí)將此位清零。此位置1可將波特率分頻因

        子從16降到8,從而有效的將異步通信模式的傳輸速率加倍。

        MPCM: 多處理器通信模式

        設(shè)置此位將啟動(dòng)多處理器通信模式。MPCM置位后,USART 接收器接收到的那些不包含

        地址信息的輸入幀都將被忽略。發(fā)送器不受MPCM設(shè)置的影響。

        */

        //***************************USART控制和狀態(tài)寄存器 B(UCSRB)*******************

        /* USART控制和狀態(tài)寄存器 B(UCSRB)

        bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

        RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8

        RXCIE: 接收結(jié)束中斷使能

        置位后使能RXC中斷。當(dāng)RXCIE為1,全局中斷標(biāo)志位SREG置位,UCSRA寄存器的RXC

        亦為1時(shí)可以產(chǎn)生USART接收結(jié)束中斷。

        TXCIE: 發(fā)送結(jié)束中斷使能

        置位后使能TXC中斷。當(dāng)TXCIE為1,全局中斷標(biāo)志位SREG置位,UCSRA寄存器的TXC

        亦為1時(shí)可以產(chǎn)生USART發(fā)送結(jié)束中斷。

        UDRIE: USART 數(shù)據(jù)寄存器空中斷使能

        置位后使能UDRE中斷。當(dāng)UDRIE 為1,全局中斷標(biāo)志位SREG置位,UCSRA寄存器的UDRE

        亦為1時(shí)可以產(chǎn)生USART數(shù)據(jù)寄存器空中斷。

        RXEN: 接收使能

        置位后將啟動(dòng)USART接收器。RxD 引腳的通用端口功能被USART功能所取代。禁止接

        收器將刷新接收緩沖器,并使 FE、DOR及PE標(biāo)志無(wú)效。

        TXEN: 發(fā)送使能

        置位后將啟動(dòng)將啟動(dòng)USART發(fā)送器。TxD引腳的通用端口功能被USART功能所取代。

        TXEN 清零后,只有等到所有的數(shù)據(jù)發(fā)送完成后發(fā)送器才能夠真正禁止,即發(fā)送移位

        寄存器與發(fā)送緩沖寄存器中沒(méi)有要傳送的數(shù)據(jù)。發(fā)送器禁止后,TxD引腳恢復(fù)其通用

        I/O功能。

        UCSZ2: 字符長(zhǎng)度

        UCSZ2與UCSRC寄存器的UCSZ1:0結(jié)合在一起可以設(shè)置數(shù)據(jù)幀所包含的數(shù)據(jù)位數(shù)(字符

        長(zhǎng)度)。

        RXB8: 接收數(shù)據(jù)位8

        對(duì)9位串行幀進(jìn)行操作時(shí),RXB8 是第9個(gè)數(shù)據(jù)位。讀取UDR包含的低位數(shù)據(jù)之前首先

        要讀取RXB8。

        TXB8: 發(fā)送數(shù)據(jù)位8

        對(duì)9位串行幀進(jìn)行操作時(shí),TXB8是第9個(gè)數(shù)據(jù)位。寫UDR之前首先要對(duì)它進(jìn)行寫操作。


        */
        //****************************狀態(tài)寄存器 C(UCSRC)*****************************
        /* 狀態(tài)寄存器 C(UCSRC)

        bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

        URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL

        UCSRC寄存器與UBRRH寄存器共用相同的I/O地址。對(duì)該寄存器的訪問(wèn)。
        URSEL: 寄存器選擇

        通過(guò)該位選擇訪問(wèn)UCSRC寄存器或UBRRH寄存器。 當(dāng)讀UCSRC時(shí),該位為1 ;當(dāng)寫UCSRC

        時(shí),URSEL為1。 URSEL 為 0 ,對(duì)UBRRH 值更新; 若 URSEL 為 1 ,對(duì)UCSRC 設(shè)置更新

        UMSEL: USART 模式選擇

        通過(guò)這一位來(lái)選擇同步或異步工作模式。

        UMSEL設(shè)置

        UMSEL 模式

        0 異步操作

        1 同步操作

        UPM1:0: 奇偶校驗(yàn)?zāi)J?/p>

        這兩位設(shè)置奇偶校驗(yàn)的模式并使能奇偶校驗(yàn)。如果使能了奇偶校驗(yàn),那么在發(fā)送數(shù)

        據(jù),發(fā)送器都會(huì)自動(dòng)產(chǎn)生并發(fā)送奇偶校驗(yàn)位。對(duì)每一個(gè)接收到的數(shù)據(jù),接收器都會(huì)

        產(chǎn)生一奇偶值,并與UPM0 所設(shè)置的值進(jìn)行比較。如果不匹配,那么就將UCSRA 中

        的PE 置位。

        UPM 設(shè)置

        UPM1 UPM0 奇偶模式

        0 0 禁止

        0 1 保留

        1 0 偶校驗(yàn)

        1 1 奇校驗(yàn)

        USBS: 停止位選擇

        通過(guò)這一位可以設(shè)置停止位的位數(shù)。接收器忽略這一位的設(shè)置。

        USBS 設(shè)置

        USBS 停止位位數(shù)

        0 1

        1 2

        UCSZ1:0: 字符長(zhǎng)度

        UCSZ1:0與UCSRB寄存器的 UCSZ2結(jié)合在一起可以設(shè)置數(shù)據(jù)幀包含的數(shù)據(jù)位數(shù)(字

        符長(zhǎng)度)。

        UCSZ 設(shè)置

        UCSZ2 UCSZ1 UCSZ0 字符長(zhǎng)度
        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: 時(shí)鐘極性

        這一位僅用于同步工作模式。使用異步模式時(shí),將這一位清零。UCPOL 設(shè)置了輸出

        數(shù)據(jù)的改變和輸入數(shù)據(jù)采樣,以及同步時(shí)鐘XCK 之間的關(guān)系。

        UCPOL 設(shè)置

        UCPOL 發(fā)送數(shù)據(jù)的改變(TxD引腳的輸出) 接收數(shù)據(jù)的采樣(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地址。對(duì)該寄存器的訪問(wèn)。

        URSEL: 寄存器選擇

        通過(guò)該位選擇訪問(wèn)UCSRC 寄存器或UBRRH 寄存器。當(dāng)讀UBRRH時(shí),該位為0;當(dāng)寫

        UBRRH時(shí), URSEL為0。

        Bit 14:12 – 保留位

        這些位是為以后的使用而保留的。為了與以后的器件兼容,寫UBRRH時(shí)將這些位清零。

        UBRR11:0: USART 波特率寄存器

        這個(gè)12位的寄存器包含了USART的波特率信息。其中UBRRH包含了USART波特率高4

        位,UBRRL包含了低8位。波特率的改變將造成正在進(jìn)行的數(shù)據(jù)傳輸受到破壞。寫UBRRL

        將立即更新波特率分頻器


        */


        /*
        波特率定義為每秒的位傳輸速度 (bps)
        BAUD 波特率 ( bps)
        fOSC 系統(tǒng)時(shí)鐘頻率
        UBRR UBRRH 與 UBRRL 的數(shù)值 (0-4095)

        異步正常模式 (U2X = 0)
        FOSC FOSC
        BAUD = -------------- UBRR = ------------ -1
        16( UBRR+ 1) 16BAUD
        異步倍速模式 (U2X = 1)
        fOSC fOSC
        BAUD = -------------- UBRR = ------------ -1
        8(UBRR+ 1) 8BAUD
        同步主機(jī)模式
        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)//詳細(xì)初始化模式
        { SREG&=0x7F;
        UCSRC&=~(1</* 設(shè)置波特率 */
        UBRRH = (unsigned char)(baud>>8);
        UBRRL = (unsigned char)baud;
        /* 接收器與發(fā)送器使能 */
        UCSRB = (1</*UDR數(shù)據(jù)寄存器為空時(shí)中斷使能 */
        UCSRB = (1<


        switch(mode)//異同模式選擇
        {
        case 0:UCSRB&=~(1<case 1:UCSRB|=1<default :UCSRB&=~(1<}
        UCSRC|=1</* 如果發(fā)送9位數(shù)據(jù)的數(shù)據(jù)幀(UCSZ = 7),
        應(yīng)先將數(shù)據(jù)的第9位寫入寄存器UCSRB的TXB8,
        然后再將低8位數(shù)據(jù)寫入發(fā)送數(shù)據(jù)寄存器UDR, */
        switch(digit)//// 設(shè)置幀格式 : digit數(shù)據(jù)位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校驗(yàn)?zāi)J?br />{
        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設(shè)置參數(shù)表*****************************/
        //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)//通用初始化

        {/* 設(shè)置波特率 */

        SREG&=0x7F;
        UBRRH = (unsigned char)(baud>>8);
        UBRRL = (unsigned char)baud;
        /* 接收器與發(fā)送器使能 數(shù)據(jù)寄存器空使能禁止*/
        UCSRB = (1</* 設(shè)置幀格式 : 8個(gè)數(shù)據(jù)位 , 2個(gè)停止位 ,禁止校驗(yàn),XCK上升沿發(fā)送數(shù)據(jù)下降沿接收數(shù)據(jù),異步模式*/
        UCSRC = (1<//UCSRA=0;單機(jī)處理模式。中斷標(biāo)志清零,波特率的普通模式(非加倍,倍速模式)
        SREG|=0x80;//使能全局中斷

        }
        }

        /*
        USART數(shù)據(jù)寄存器空標(biāo)志UDRE及傳輸結(jié)束標(biāo)志TXC,兩個(gè)標(biāo)志位都可以產(chǎn)生中斷。
        */
        void UDR_empty()
        //使能要求:全局中斷使能,數(shù)據(jù)寄存器空中斷使能位 UDRIE置位。 UDRE 被置位(自動(dòng))。
        //對(duì)寄存器 UDR 執(zhí)行寫操作將清零 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 )//對(duì) UDRE 標(biāo)志采用輪詢方式發(fā)送數(shù)據(jù)(發(fā)送5-8位數(shù)據(jù))
        { /* 等待發(fā)送緩沖器為空 */
        while ( !( UCSRA & (1</* 將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù) */
        UDR = data;
        }
        void USART_Transmit_9( unsigned int data )//用查詢法發(fā)送9位數(shù)據(jù)的數(shù)據(jù)幀
        { /* 等待發(fā)送緩沖器為空 */
        while ( !( UCSRA & (1</* 將第 9 位復(fù)制到 TXB8 */
        UCSRB &= ~(1<if ( data & 0x0100 )
        UCSRB |= (1</* 將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù) */
        UDR = data;
        }

        unsigned char USART_Receive5_8( void )//用查詢RXC接受5-8位的數(shù)據(jù)
        {
        /*等待接收數(shù)據(jù)*/
        while ( !(UCSRA & (1</* 從緩沖器獲得數(shù)據(jù)并返回?cái)?shù)據(jù)*/
        return UDR;
        }
        unsigned int USART_Receive_9( void )//接受9位的數(shù)據(jù)幀
        {
        unsigned char status, resh, resl;
        /*等待接收數(shù)據(jù) */
        while ( !(UCSRA & (1</*從緩沖器獲得狀態(tài)及其第九位數(shù)據(jù)*/
        /* from buffer */
        status = UCSRA;
        resh = UCSRB;
        resl = UDR;
        /* 如果出錯(cuò)返回*/
        if ( status & (1<return 255;
        /* 過(guò)濾第九位數(shù)據(jù)然后返回*/
        resh = (resh >> 1) & 0x01;
        return ((resh << 8) | resl);
        }

        /*
        禁止接收器時(shí)緩沖器 FIFO 被刷新,緩沖器被清空。導(dǎo)致未讀出的數(shù)據(jù)丟失。如果由于出錯(cuò)而必須在正常操作下刷新緩沖器?
        則需要一直讀取 UDR 直到 RXC 標(biāo)志清零。
        */
        void USART_Flush( void )

        {
        unsigned char dummy;
        while ( UCSRA & (1<}



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 河南省| 恭城| 改则县| 保亭| 府谷县| 阿尔山市| 华蓥市| 仲巴县| 门源| 商都县| 罗源县| 红原县| 玉溪市| 闻喜县| 股票| 玉田县| 葵青区| 全州县| 永春县| 德庆县| 阿拉善右旗| 富源县| 获嘉县| 香港| 鄂托克旗| 旬邑县| 瑞安市| 吴江市| 万山特区| 虞城县| 阜平县| 湘阴县| 图木舒克市| 宜昌市| 黑水县| 安西县| 中阳县| 孟州市| 新干县| 南通市| 辽源市|