新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Atmega128串口詳解

        Atmega128串口詳解

        作者: 時間:2016-11-23 來源:網絡 收藏
        Atmega128有兩個串口:USART0與USART1
        以USART0為例
        串口的初始化包括:
        傳輸模式的選擇:同步還是異步,默認為異步模式,可通過選擇USART控制和狀態寄存器UCSR0C中的UMSEL位來選擇,UMSEL為0,是異步模式.
        波特率的設置:通信的雙方都必須有相同的波特率,波特率可以通過設置波特率發生寄存器UBRR0來確定,UBRR0為兩字節16位的寄存器,可分為UBRR0H和UBRR0L.同時起作用的還有UCSR0A中的波特率加倍位UX2,當UX2為1時設置的波特率加倍.
        傳輸幀格式的設置:默認是8位數據位,一位停止位
        發送接受的使能與中斷:通過設置UCSR0B來根據需要選擇接收或發送的使能和是否使用中斷,對使用中斷的USART操作,初始化前要關閉中斷
        USART0的控制和狀態寄存器有:UCSR0A,UCSR0B,UCSR0C,波特率寄存器有UBRR0,即UBRR0H和UBRR0L,數據寄存器為UDR0
        1、初始化:
        設置波特率前,要關閉USART0的所有使用,包括使能和中斷:
        UCSR0B=0B00000000; //關閉USART0
        2、設置UCSR0A:
        UCSR0A能寫的有Bit0,Bit1,Bit6,其他5位為狀態位.我們一般使用的有Bit1-U2X0,當這一位為1時,波特率的分頻因子從16降到8,能夠有效的將異步通信模式的傳輸速率加倍,但是這一位僅對異步操作有影響,使用同步操作時應將此位清零.
        UCSR0A=0B00000000; //不使用倍速發送
        3、設置UCSR0C:
        Bit6-UMSEL0:USART0的模式選擇,0為異步模式,1為同步模式
        Bit5:4-UPM01:0:奇偶校驗模式,00禁止,01,保留,10偶校驗,11,奇校驗
        Bit3-USBS0:停止位的選擇,0停止位為1bit,1停止位為2-bits
        Bit2:1-UCSZ01:0:字符長度,當UCSZ02為0時,00表示5位,01表示6位,10表示7位,11表示8位.當UCSZ02為1時,11表示9位.(UCSZ02為UCSR0B里的一位寄存器)
        eg:
        UCSR0C=0B00000110 //異步模式,禁止奇偶校驗,停止位為1位,數據位為8位
        4、設置UBRR:
        UBRR的設置和這些參數有關:U2X0,CPU頻率,波特率
        當U2X0為0時,即異步正常模式下,UBRR的計算公式:
        1、U2X=0時的公式計算
        UBRR0L= (F_CPU/BAUDRATE/16-1)%256;
        UBRR0H= (F_CPU/BAUDRATE/16-1)/256;

        2、U2X=1時的公式計算
        UBRRL= (F_CPU/BAUDRATE/8-1)%256;
        UBRRH= (F_CPU/BAUDRATE/8-1)/256;
        //也可根據數據手冊的[波特率設置的例子]查得
        //UBRRL = 0x2F; //set baud rate lo
        //UBRRH = 0x00; //set baud rate hi
        設置一般會有誤差,誤差計算方法為:Error[%]=(BaudRate_ture/BaudRate-1)*100%;
        5、然后就是設置UCSR0B:
        Bit7-RXCIE0為接收結束中斷使能,Bit6-TXCIE0為發送結束中斷使能,Bit4-RXEN0為接收使能,Bit3-TXEN0為發送使能.一般情況下,接收使用中斷方式,所以使用接收結束中斷使能.
        UCSR0B=0B10011000 //發送接收使能,接收結束使能
        還一種寫法是UCSR0B|=(1<< RXEN0)|(1<< TXEN0)|(RXCIE0);
        如果更熟練,可以直接以10進制活16進制來設置這些寄存器:
        UCSR0B=0x98;或者UCSR0B=152;

        串口的初始化函數:
        void uart_init(void) //串口0初始化
        {
        UCSR0B=0x00; //disable while setting baud rate
        UCSR0A=0B00000000; //Bit1為1則倍速發送 U2X=0
        UCSR0C=0x06; //B00000110 //奇偶模式無,八位數據位,一位停止位
        UBRR0L=103; //B00011001波特率:9600 Bps
        UBRR0H=0x00; //誤差率:0.156%
        UCSR0B=0x98;
        }
        初始化之后就是對USART0進行讀寫了.
        UCSR0A的Bit5-UDRE0標志指出發送緩沖器UDR0是否準備好接收新數據,UDRE0為1說明緩沖器為空,可以接收新數據,UDRE0標志也可用來產生寄存器空中斷.復位后的UDRE0置位,表明發送器已經就緒:
        當UDRE0為1時!(UCSR0A&(1<< UDRE0))為0
        void putchar(uchar c) //串口0發送字符
        {
        while(!(UCSR0A&(1<< UDRE0))); //while(!(UCSR0A&32)); 表明發送器已經就緒。
        UDR0=c;
        }
        串口0發送字符串:
        void putstr(uchar *s) //串口0發送字符串
        {
        while(*s)
        {
        putchar(*s);
        s++;
        }
        }
        RXC0為UCSR0A里的Bit7位,為USART0接收結束的狀態位,接收緩沖器中有未讀出的數據時RXC0置位,否則清零.
        串口0接收字符:
        uchar getchar(void) //串口0接收字符
        {
        while(!(UCSR0A&(1<< RXC0)));
        return UDR0;
        }
        在使用串口的程序中一般包含這些文件:
        #include
        #include
        #include
        #include
        avr/io.h里有各種寄存器的定義,avr/signal.h,avr/interrupt.h里有中斷的定義,avr/delay.h包含延時函數.

        例程:
        串口通信(USART0)
        /***************************************************************************/
        /*串口0測試程序 */
        /*目標器件:ATmega128 */
        /*晶振:RC 8MHZ */
        /*編譯環境:ICCAVR 7.13A */
        /*時間:2010年3月14日*/
        /*E-Mail:number007cool@163.com */
        /***************************************************************************/
        /*********************************包含頭文件********************************/
        #include
        #include
        /***********************************宏定義**********************************/
        #define fosc 8000000 //晶振8MHZ
        #define baud 2400//波特率
        /****************************************************************************
        函數功能:uart0初始化程序
        入口參數:
        出口參數:
        ****************************************************************************/
        void uart0_init(void)
        {
        UCSR0B = 0x00; //關閉UART00
        UCSR0A = 0x00; //不使用倍速發送(異步)
        UCSR0C =(1<UBRR0L=(fosc/16/(baud+1))%256; //異步正常情況下的計算公式
        UBRR0H=(fosc/16/(baud+1))/256;
        UCSR0B =(1<}
        /****************************************************************************
        函數功能:uart0發送單字節數據
        入口參數:c
        出口參數:
        ****************************************************************************/
        void putchar0(unsigned char c)
        {
        while (!(UCSR0A&(1< UDR0=c; //將要發送的數據裝入UDR0寄存器
        }

        /****************************************************************************
        函數功能:uart0接收單字節數據
        入口參數:
        出口參數:
        ****************************************************************************/
        unsigned char getchar0(void)
        {
        while(!(UCSR0A& (1< return UDR0;
        }

        /****************************************************************************
        函數功能:uart0發送字符串數據
        入口參數:*s
        出口參數:
        ****************************************************************************/
        void puts0(char *s)
        {
        while (*s)
        {
        putchar0(*s);
        s++;
        }
        putchar0(0x0a);//回車換行
        //putchar0(0x0d);
        }

        /****************************************************************************
        函數功能:主程序
        入口參數:
        出口參數:
        ****************************************************************************/
        void main(void)
        {
        unsigned char i;
        uart0_init();//UART0初始化
        puts0("HELLO!");
        while(1)
        {
        puts0("test ok!");
        }
        }

        串口通信(USART1)
        /***************************************************************************/
        /*串口1測試程序 */
        /*目標器件:ATmega128 */
        /*晶振:RC 8MHZ */
        /*選用的波特率:9600(也可以另外設定),改了波特率后需要將電源拔了再插上方可使用*/
        /*編譯環境:ICCAVR 7.13 */
        /*E-Mail:number007cool@163.com */
        /*時間:2010年1月14日 */
        /***************************************************************************/
        /*********************************包含頭文件********************************/
        #include
        #include
        /***********************************宏定義**********************************/
        #define fosc 8000000 //晶振8MHZ
        #define baud 9600//波特率
        /****************************************************************************
        函數功能:uart1初始化程序
        入口參數:
        出口參數:
        ****************************************************************************/
        void uart1_init(void) //USART1初始化
        {
        UCSR1B = 0x00; //關閉USART1
        UCSR1A = 0x00; //不適使用倍速發送
        UCSR1C = (1<UBRR1L=(fosc/16/(baud+1))%256;//異步正常模式下,UBRR的計算公式
        UBRR1H=(fosc/16/(baud+1))/256;
        UCSR1B =(1<}
        /****************************************************************************
        函數功能:uart1發送單字節數據
        入口參數:c
        出口參數:
        ****************************************************************************/
        void putchar1(unsigned char c)//串口1發送字符
        {
        while (!(UCSR1A&(1< UDR1=c;
        }

        /****************************************************************************
        函數功能:uart1接收單字節數據
        入口參數:
        出口參數:
        ****************************************************************************/
        unsigned char getchar1(void) //串口1接回收數據
        {
        while(!(UCSR1A& (1< return UDR1; //將接收到的字符返回
        }

        /****************************************************************************
        函數功能:uart1發送字符串數據
        入口參數:*s
        出口參數:
        ****************************************************************************/
        void puts1(char *s)
        {
        while (*s)
        {
        putchar1(*s);
        s++;
        }
        putchar1(0x0a);//回車換行
        putchar1(0x0d);
        }

        /****************************************************************************
        函數功能:主程序
        入口參數:
        出口參數:
        ****************************************************************************/
        void main(void)
        {
        unsigned char i;
        uart1_init();
        puts1("HELLO!");
        while(1)
        {
        puts1("test ok!");
        }
        }



        關鍵詞: Atmega128串口詳

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 肇源县| 呈贡县| 新昌县| 高雄市| 渝北区| 阳城县| 龙山县| 平南县| 勃利县| 伊春市| 中方县| 汝州市| 姚安县| 扶绥县| 兰西县| 灵寿县| 子洲县| 武胜县| 油尖旺区| 抚宁县| 马龙县| 铁力市| 灌阳县| 项城市| 垣曲县| 临沂市| 伽师县| 汶上县| 定襄县| 保靖县| 措美县| 将乐县| 工布江达县| 贞丰县| 新沂市| 梓潼县| 敦煌市| 九龙县| 凤山县| 慈利县| 綦江县|