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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STC12C5A60S2 串口中斷接收程序

          STC12C5A60S2 串口中斷接收程序

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          #define UART0_BUF_LEN32


          int UART1_Recv_count; //接收計(jì)數(shù)

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

          bit UART1_Overflow_Flag; //緩沖區(qū)滿標(biāo)志

          idata uchar UART1_Recv_BUF[UART0_BUF_LEN]; //串口接收緩沖區(qū)

          //串口初始化
          void Init_Uart()
          {
          UART1_Overflow_Flag=0;
          UART1_Recv_count=0;
          //22.1184M 晶振 115200波特率
          PCON &= 0x7f;//波特率不倍速
          SCON = 0x50;//8位數(shù)據(jù),可變波特率
          BRT = 0xFA;//設(shè)定獨(dú)立波特率發(fā)生器重裝值
          AUXR |= 0x04;//獨(dú)立波特率發(fā)生器時(shí)鐘為Fosc,即1T
          AUXR |= 0x01;//串口1選擇獨(dú)立波特率發(fā)生器為波特率發(fā)生器
          AUXR |= 0x10;//啟動(dòng)獨(dú)立波特率發(fā)生器
          ES = 1; //充許串口1中斷

          }

          //串口中斷接收程序

          /*

          說(shuō)明:

          (1)如果緩沖區(qū)接收滿了,則中斷接收程序不在接收數(shù)據(jù)。UART1_Recv_count=32

          (2)如果接收到“回車(chē)符”、“換行符”,則中斷不在接收數(shù)據(jù)。UART1_Recv_count={實(shí)際接收到的數(shù)據(jù)個(gè)數(shù)}

          以上2種情況觸發(fā)后 UART1_Overflow_Flag標(biāo)志位置為1,等待MAIN函數(shù)(主程序處理)

          */
          void UART1_Int(void) interrupt 4
          {
          if (RI == 1)
          {
          RI = 0;
          if(UART1_Overflow_Flag==0)
          {
          if(UART1_Recv_count {
          UART1_Recv_BUF[UART1_Recv_count++] = SBUF;
          if(SBUF==r || SBUF==n)
          {
          UART1_Overflow_Flag=1;
          }
          }
          else
          {
          UART1_Overflow_Flag=1; // 關(guān)閉串口中斷,停止接收
          }
          }
          LED2=~LED2;
          }
          }

          int main()
          {
          char i;
          TMOD=0x00;
          AUXR=0x00;

          LED1=0;
          LED2=1;

          Init_Uart();
          EA=1; //開(kāi)總中斷

          printf("System is start...rn");

          while(1)
          {
          if (UART1_Overflow_Flag==1) //串口中斷數(shù)據(jù)接收完畢,開(kāi)始處理
          {
          for(i=0;i printf("%c",UART1_Recv_BUF[i]);
          Appcall(UART1_Recv_BUF,UART1_Recv_count);
          printf("rn");
          UART1_Recv_count = 0; //緩存清零
          UART1_Overflow_Flag=0;//允許串口繼續(xù)接收數(shù)據(jù)
          }
          }
          }

          小知識(shí):

          [1]換行符、回車(chē)符的定義

          ASICC語(yǔ)言編程描述
          回車(chē)符0a(13)r
          換行符0dn

          換行符、回車(chē)符的來(lái)歷:

          在計(jì)算機(jī)還沒(méi)有出現(xiàn)之前,有一種叫做電傳打字機(jī)(Teletype Model 33)的玩意,每秒鐘可以打10個(gè)字符。但是它有一個(gè)問(wèn)題,就是打完一行換行的時(shí)候,要用去0.2秒,正好可以打兩個(gè)字符。要是在這0.2秒里面,又有新的字符傳過(guò)來(lái),那么這個(gè)字符將丟失。于是,研制人員想了個(gè)辦法解決這個(gè)問(wèn)題,就是在每行后面加兩個(gè)表示結(jié)束的字符。一個(gè)叫做“回車(chē)”,告訴打字機(jī)把打印頭定位在左邊界;另一個(gè)叫做“換行”,告訴打字機(jī)把紙向下移一行。這就是“換行”和“回車(chē)”的來(lái)歷,從它們的英語(yǔ)名字上也可以看出一二。

          后來(lái),計(jì)算機(jī)發(fā)明了,這兩個(gè)概念也就被般到了計(jì)算機(jī)上。那時(shí),存儲(chǔ)器很貴,一些科學(xué)家認(rèn)為在每行結(jié)尾加兩個(gè)字符太浪費(fèi)了,加一個(gè)就可以。于是,就出現(xiàn)了分歧。

          Unix系統(tǒng)里,每行結(jié)尾只有“<換行>”,即“n”;

          Windows系統(tǒng)里面,每行結(jié)尾是“<換行><回車(chē)>”,即“nr”;Mac系統(tǒng)里,每行結(jié)尾是“<回車(chē)>”。

          在ascii中,回車(chē)和換行是不同的字符。0x0A是回車(chē),即光標(biāo)移動(dòng)到本行的最左面; 0x0D是換行,即光標(biāo)移動(dòng)到下一行。

          [2]常見(jiàn)的串口工具如何發(fā)生“換行符”

          在用串口工具發(fā)送數(shù)據(jù)時(shí),如果勾選了發(fā)送新行,串口工具就會(huì)在數(shù)據(jù)尾部添加“換行符”

          [2] STC單片機(jī)波特率計(jì)算

          STC單片機(jī)官網(wǎng)上有一個(gè)比較好用的波特率計(jì)算工具,大家都可以自己下載了使用。

          選擇好晶振,波特率發(fā)生器、定時(shí)器時(shí)鐘后, 該程序就可以自動(dòng)生成代碼了。非常方便。

          STC官網(wǎng)地址:http://www.stcmcu.com/

          [3]關(guān)于STC單片機(jī)獨(dú)立波特率發(fā)生器的理解

          a. STC單片機(jī)有1個(gè)獨(dú)立的波特率發(fā)生器,雖然用獨(dú)立的波特率發(fā)生器就不需要用定時(shí)器了。但是要注意的時(shí),獨(dú)立波特率發(fā)生器和“晶振”頻率還是有關(guān)的。

          b. 如果要串口的數(shù)據(jù)收發(fā)誤碼率較低,還是要選用 11.0592 、22.1184 這些晶振。

          注意看上圖,誤碼率為 0.00%

          c. 6M、 12M 、24M 這些晶振如果在串口通信里,是不建議用的

          d. 在STC單片機(jī)上,用 11.0592 晶振,是可以非常方便的上 115200 波特率高速傳輸?shù)?,這是普通的AT89S51單片機(jī)很難實(shí)現(xiàn)的。

          只要讓單片機(jī)工作在1T的工作模式下,11.0592的晶振,也可以輕松跑到115200波特率。



          評(píng)論


          技術(shù)專區(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); })();