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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 如何向單片機(jī)寫字符串

          如何向單片機(jī)寫字符串

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

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

          單片機(jī)實(shí)現(xiàn)接收從電腦發(fā)送過來的字符串的方法

          很多朋友會(huì)碰到這個(gè)問題:單片機(jī)接收從電腦串口發(fā)送出來的一串字符串,卻只能接收到第一個(gè)字符,其他的都丟失了或者是接收到的是亂碼,卻不知道是什么原因。其實(shí),那是因?yàn)?,雖然單片機(jī)的是全雙工串口,但是串口的緩沖區(qū)(SBUF)卻一般只有一個(gè)字節(jié),即1Byte,遠(yuǎn)沒有像電腦串口的緩沖區(qū)以KB計(jì)算那么大,并且,單片機(jī)的處理速度是很有限的,試想一下,假如要求一串字符串以9600bps的速率,一個(gè)起始位,一個(gè)結(jié)束位,無校正位,相當(dāng)于960Byte/s傳輸?shù)絾纹瑱C(jī),單片機(jī)要是能夠全部接收的話,那么單片機(jī)接收和處理一個(gè)字節(jié)的時(shí)間僅為約1ms的時(shí)間。這說明了,如果單片機(jī)的處理速度不夠快,還沒有將接收到的上一幀數(shù)據(jù)及時(shí)轉(zhuǎn)送到單片機(jī)的RAM中,而電腦串口又傳輸過來一幀新的數(shù)據(jù),這幀新的數(shù)據(jù)就會(huì)把單片機(jī)的串口輸入緩沖區(qū)的SBUF給刷新掉,或者說單片機(jī)壓根就沒有接收到新的一幀數(shù)據(jù),造成了數(shù)據(jù)的丟失或接收到亂碼。

          如果需要單片機(jī)接收到從串口發(fā)送過來的一段很長的字符串,并且能夠都正常接收和顯示,這在網(wǎng)上還找不到例子。

          在這里,筆者提供了一種方法,通過單片機(jī)內(nèi)部最高中斷等級的中斷源不斷的查詢從電腦串口發(fā)送過來的字符,并及時(shí)將接收到的字符串通過外接的1602顯示屏顯示出來。

          這里用最為常見的51單片機(jī)作為例程,因?yàn)?1單片機(jī)處理速度比較慢,所以需要將電腦串口發(fā)送速率調(diào)整為最低的600bps,那么單片機(jī)端接收和處理一個(gè)字符的時(shí)間約要求為14ms左右,基本足夠了。這個(gè)14ms間隔的定時(shí)處理和查詢工作,由單片機(jī)的最高等級內(nèi)部中斷源來控制,以保證電腦發(fā)送過來的每個(gè)字符單片機(jī)都能及時(shí)的去處理。

          //1602實(shí)時(shí)顯示單片機(jī)串口接收到電腦串口發(fā)送的字符串

          //波特率600bps由T2中斷產(chǎn)生,晶振12M

          //最高等級中斷T0負(fù)責(zé)定時(shí)查詢串口輸入SBUF

          //作者:小宣-天堂雨林博客blog.sina.com.cn/acerCopyright@2009

          //接線注釋:

          //P2.0-P2.7:LCD并行接口P0-P7

          //P3.2-P3.4:LCD的RS、RW、E

          //P3.0、P3.1:編程串口RXD、TXD

          #include

          unsigned char receive[32];

          unsigned char k;

          sbit rs=P3^2;

          sbit rw=P3^3;

          sbit e =P3^4;

          void delay1ms(unsigned int f)

          {

          unsigned int i,j;

          for(i=0;i

          for(j=0;j<120;j++);

          }

          void receivem(void)

          {

          while(RI==1)

          {

          if(k==32){k=0;}

          receive[k]=SBUF;

          RI=0;

          k++;

          }

          }

          void timer_int(void)

          {

          TMOD=0x11;//00010001

          SCON =0x50;

          T2CON=0x30;

          RCAP2H=0xFD;

          RCAP2L=0x8F;

          EA=1;

          TR0=1;

          TR1=0;

          TR2=1;

          ET0=ET1=ET2=1;

          }

          void time0(void) interrupt 1 using 1

          {

          TH0=0xCD;

          TL0=0x50;

          receivem();//定時(shí)將SBUF接收

          }

          void write_com(unsigned char com)

          {

          rw=0;

          rs=0;

          P2=com;

          delay1ms(1);

          e=1;

          delay1ms(1);

          e=0;

          }

          void write_data(unsigned char dat)

          {

          rw=0;

          rs=1;

          P2=dat;

          delay1ms(1);

          e=1;

          delay1ms(1);

          e=0;

          }

          void lcd_int(void)

          {

          rw=0;

          e=0;

          write_com(0x38);

          write_com(0x0c);

          write_com(0x06);

          write_com(0x80);

          }

          void dis(void)

          {

          unsigned char i;

          if(k>0 && k<16)

          {

          write_com(0x80);

          for(i=0;i

          {

          write_data(receive[i]);

          }

          }

          if(k>=16 && k<32)

          {

          write_com(0xC0);

          for(i=16;i

          {

          write_data(receive[i]);

          }

          }

          }

          void main()

          {

          timer_int();

          lcd_int();

          write_com(0x01);

          while(1)

          {dis();}

          }




          關(guān)鍵詞: 單片機(jī)字符

          評論


          技術(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); })();