在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            Atmega128串口詳解

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

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

            串口的初始化函數(shù):
            void uart_init(void) //串口0初始化
            {
            UCSR0B=0x00; //disable while setting baud rate
            UCSR0A=0B00000000; //Bit1為1則倍速發(fā)送 U2X=0
            UCSR0C=0x06; //B00000110 //奇偶模式無,八位數(shù)據(jù)位,一位停止位
            UBRR0L=103; //B00011001波特率:9600 Bps
            UBRR0H=0x00; //誤差率:0.156%
            UCSR0B=0x98;
            }
            初始化之后就是對(duì)USART0進(jìn)行讀寫了.
            UCSR0A的Bit5-UDRE0標(biāo)志指出發(fā)送緩沖器UDR0是否準(zhǔn)備好接收新數(shù)據(jù),UDRE0為1說明緩沖器為空,可以接收新數(shù)據(jù),UDRE0標(biāo)志也可用來產(chǎn)生寄存器空中斷.復(fù)位后的UDRE0置位,表明發(fā)送器已經(jīng)就緒:
            當(dāng)UDRE0為1時(shí)!(UCSR0A&(1<< UDRE0))為0
            void putchar(uchar c) //串口0發(fā)送字符
            {
            while(!(UCSR0A&(1<< UDRE0))); //while(!(UCSR0A&32)); 表明發(fā)送器已經(jīng)就緒。
            UDR0=c;
            }
            串口0發(fā)送字符串:
            void putstr(uchar *s) //串口0發(fā)送字符串
            {
            while(*s)
            {
            putchar(*s);
            s++;
            }
            }
            RXC0為UCSR0A里的Bit7位,為USART0接收結(jié)束的狀態(tài)位,接收緩沖器中有未讀出的數(shù)據(jù)時(shí)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包含延時(shí)函數(shù).

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

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

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

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

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

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

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

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



            關(guān)鍵詞: Atmega128串口詳

            評(píng)論


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

            關(guān)閉