<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR 單片機(jī)UART以查詢(xún)、中斷方式發(fā)送數(shù)據(jù)

          AVR 單片機(jī)UART以查詢(xún)、中斷方式發(fā)送數(shù)據(jù)

          作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
          /****************************************************************************************************************

          * AVR 單片機(jī)UART查詢(xún)、中斷方式發(fā)送數(shù)據(jù)

          本文引用地址:http://www.ex-cimer.com/article/201611/315940.htm

          * 說(shuō)明:測(cè)試環(huán)境 硬件M16、開(kāi)發(fā)平臺(tái)IAR for AVR V5.11B

          ****************************************************************************************************************/

          //----------------------初始化-------------------------------------------------------------------

          void Uart_init(long int baud)
          {
          baud=mclk/16/baud-1; //波特率最大為65K
          UCSRB=0x00;
          UCSRA=0x00; //控制寄存器清零
          UCSRC=(0< UBRRL=baud;
          UBRRH=baud>>8; //設(shè)置波特率
          UCSRB=(1< SREG|=(1<<7); //全局中斷開(kāi)放
          }

          //---------------------查詢(xún)方式 發(fā)送--start----------------------------------------------------------

          /***********************************************************
          *名 稱(chēng):
          *功 能:從串口UART0發(fā)送一字節(jié)

          *入口參數(shù):sendB:發(fā)送的單個(gè)字節(jié)

          *說(shuō) 明:

          ***********************************************************/
          void Uart_sendB(uchar sendB)
          {
          while(!(UCSRA&(1<UDR=sendB; //發(fā)送數(shù)據(jù)
          while(!(UCSRA&(1<UCSRA|=1<}

          /***********************************************************
          *名 稱(chēng):
          *功 能:從串口UART0發(fā)送一字符串

          *入口參數(shù):*sendpt:字符串首地址
          *說(shuō) 明:

          ***********************************************************/

          void Uart_sentstr(uchar *sendpt)
          {
          while(*sendpt)//字符串未結(jié)束則繼續(xù)發(fā)送
          {
          Uart_sendB(*sendpt++);
          }
          }

          /***********************************************************
          *名 稱(chēng):
          *功 能:從串口UART0發(fā)送一組字節(jié)數(shù)據(jù)
          *入口參數(shù):*p:待發(fā)的首個(gè)字節(jié)數(shù)據(jù),len 發(fā)送個(gè)數(shù)
          *說(shuō) 明:

          ***********************************************************/

          void Uart_sentstr_Array(uchar *p,uchar len)
          {
          uchar i;
          for(i=0;i{
          Uart_sendB(*p++);
          }
          }

          //--------------------------------------------end--------------------------------------------------------

          //--------------------------------------------中斷方式發(fā)送-- start-----硬件M164P----------------------------------------

          /******************************************************
          **由宏定義TXRX_FIFO控制此段代碼的編譯
          **用于高效收發(fā)數(shù)據(jù),收發(fā)均不阻塞CPU運(yùn)行。

          **函數(shù)口中包含了兩種中斷發(fā)送方式,可選擇 緩沖空中斷 || 發(fā)送結(jié)束中斷。
          ******************************************************/
          //#if(TXRX_FIFO==1)
          #define TXRXBUF_SIZE 64
          uchar TXRX_BUFF[TXRXBUF_SIZE];
          volatile uint UART_OutLen=0;
          volatile uint TXRX_IndexR=0;
          volatile uint TXRX_IndexW=0;

          /***********************************************************
          *名 稱(chēng):Uart_IntSentBuf
          *功 能:從串口UART0發(fā)送一組字節(jié)數(shù)據(jù)
          *入口參數(shù):*p:待發(fā)的首個(gè)字節(jié)數(shù)據(jù),len 發(fā)送個(gè)數(shù)
          *出口參數(shù):返回1:發(fā)送成功
          * 返回0:發(fā)送失敗
          *說(shuō) 明:在發(fā)送過(guò)程中,不阻塞CPU的運(yùn)行。 函數(shù)口中包含了兩種中斷發(fā)送方式,可選擇
          ***********************************************************/
          UINT8 Uart_IntSentBuf(UINT8 *p,UINT8 len)
          {
          UINT8 i;

          if (len <= (TXRXBUF_SIZE-UART_OutLen))//緩存區(qū)空間不小于發(fā)送字節(jié)數(shù)
          {

          //------------方式一 緩沖空中斷--------------------------------------
          if(!(UCSR0B&(1< {
          UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
          }
          else
          {
          UCSR0B &= ~(1< }

          for ( i=0;i {
          UART_OutLen++;//發(fā)送字節(jié)數(shù)
          UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO數(shù)據(jù)
          if(++TXRX_IndexW >= TXRXBUF_SIZE)
          {
          TXRX_IndexW=0;//FIFO回頭
          }
          }

          if(UCSR0A&(1< UCSR0A|=(1< UCSR0B |= (1< //----------------------end 方式一 ------------------------------------
          /*

          //------------方式二 發(fā)送結(jié)束中斷--------------------------------------
          if(!(UCSR0B&(1< {
          UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
          for ( i=0;i {
          UART_OutLen++;//發(fā)送字節(jié)數(shù)
          UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO數(shù)據(jù)
          if(++TXRX_IndexW >= TXRXBUF_SIZE)
          {
          TXRX_IndexW=0;//FIFO回頭
          }
          }
          if(UCSR0A&(1< UCSR0A|=1< UCSR0B |= (1< UDR0=UART_RxTx[TXRX_IndexR];
          --UART_OutLen;
          ++TXRX_IndexR;
          }
          else
          {
          UCSR0B &= ~(1< for ( i=0;i {
          UART_OutLen++;//發(fā)送字節(jié)數(shù)
          UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO數(shù)據(jù)
          if(++TXRX_IndexW >= TXRXBUF_SIZE)
          {
          TXRX_IndexW=0;//FIFO回頭
          }
          }
          UCSR0B |= (1< }

          //----------------------end 方式二 ------------------------------------

          */


          return 1;
          }
          else
          return 0;

          }

          //------------方式一 緩沖空中斷--------------------------------------
          #pragma vector = USART0_UDRE_vect
          __interrupt void UsartUDRE(void) //串口緩沖器空中斷函數(shù)聲明
          {
          if(UART_OutLen>0)
          {
          UDR0=UART_RxTx[TXRX_IndexR];
          --UART_OutLen;
          if(++TXRX_IndexR >= TXRXBUF_SIZE)
          {
          TXRX_IndexR=0;//FIFO回頭
          }
          }
          else //發(fā)送結(jié)束
          {
          //UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
          UCSR0B &= ~(1< }

          }

          //----------------------end 方式一 ------------------------------------

          /*

          //------------方式二 發(fā)送結(jié)束中斷--------------------------------------
          #pragma vector = USART0_TX_vect
          __interrupt void UsartTx(void) //串口發(fā)送結(jié)束中斷函數(shù)聲明
          {
          if(UART_OutLen>0)
          {
          UDR0=UART_RxTx[TXRX_IndexR];
          --UART_OutLen;
          if(++TXRX_IndexR >= TXRXBUF_SIZE)
          {
          TXRX_IndexR=0;//FIFO回頭
          }
          }
          else //發(fā)送結(jié)束
          {
          //UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
          UCSR0B &= ~(1< }
          }

          //----------------------end 方式二 ------------------------------------

          */

          #endif

          //----------------------------------------------------end---------------------------------------------------------------------



          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();