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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 模擬串口自動(dòng)測(cè)量波特率的單片機(jī)程序

          模擬串口自動(dòng)測(cè)量波特率的單片機(jī)程序

          作者: 時(shí)間:2012-08-02 來(lái)源:網(wǎng)絡(luò) 收藏

          void WByte(BYTE out)
          {
          //發(fā)送啟始位
          BYTE i=8;
          BYTE tmp=out;
          TR1=1;//開(kāi)定時(shí)器
          TX1=0;
          WaitTF1();
          //發(fā)送8位數(shù)據(jù)位
          while(i--)
          {
          TX1=(tmp0x01); //先傳低位
          tmp=tmp>>1;
          WaitTF1();
          }
          //發(fā)送校驗(yàn)位(無(wú))
          //發(fā)送結(jié)束位
          TX1=1;
          WaitTF1();
          TR1=0;
          }
          void putchar(char ch)
          {
          WByte(ch);
          }
          BYTE RByte()
          {
          BYTE in=0;
          BYTE cnt;
          while(RX1==1);//等待RXD變低,啟動(dòng)定時(shí)器,這個(gè)是阻塞模式
          TR1=1;//同步開(kāi)定時(shí)器//這里……
          //while(!TF1);
          //TF1=0;
          WaitTF1();
          if(min_mode !=0)
          {
          while(!TF1);//注意這里的周期稍微長(zhǎng)。要補(bǔ)償
          TF1=0;
          }
          for(cnt=0;cnt8;cnt++)
          {
          in=in >>1;//從高移到低
          if(RX1==1) in = in | 0x80;//如果RXD=1,則最高置位
          WaitTF1();//等待一位過(guò)去
          }
          while(!TF1);//注意這里的周期稍微長(zhǎng)。要補(bǔ)償
          TF1=0;
          TR1=0;//關(guān)閉定時(shí)器
          return in;
          }

          UINT f_Test(void)//測(cè)試脈寬
          {
          TMOD=0x10;//設(shè)置計(jì)數(shù)器1為方式一計(jì)數(shù)器模式
          TH1=0;
          TL1=0;//定時(shí)器CLR
          while(!RX1);//等待頻率腳變高,這個(gè)是測(cè)低電平的
          while(RX1);//等待腳變低,更換符號(hào)可以測(cè)正脈沖
          TR1=1;//開(kāi)啟定時(shí)器
          while(!RX1);//等待變高
          TR1=0;//停止計(jì)數(shù)
          //cyc=TH08;
          //cyc=cyc+TL0;
          return (TH18)+TL1;
          }
          void baud_t()
          {
          BYTE k;//復(fù)用變量
          ULONG frq=0; //周期變量
          for(k=0;k5;k++)// 變量復(fù)用大法
          {
          frq=frq+f_Test();//測(cè)試
          }//測(cè)量5次取平均
          frq=frq/5;
          if(frq0xff)
          {
          k=0x100-(frq0xff);
          min_mode=MIS_0;
          }
          else
          {
          if(frq / 2 0xff)
          {//2400baud
          k=0x100-((frq/2)0xff); //2分頻
          min_mode=MIS_2;
          }
          else if(frq / 4 0xff)
          {//1200baud
          k=0x100-((frq/4)0xff);//4分頻
          min_mode=MIS_4;
          }
          else if(frq / 8 0xff)
          {//1200baud
          k=0x100-((frq/8)0xff);//8分頻
          min_mode=MIS_8;
          }
          else if(frq / 16 0xff)
          {//1200baud
          k=0x100-((frq/16)0xff);//16分頻
          min_mode=MIS_16;
          }
          }
          if(k > 0x50)
          {
          k=k+6;//加補(bǔ)償,因?yàn)閕f語(yǔ)句讓機(jī)器周期加長(zhǎng)
          //如果對(duì)于STC的新MCU,這里要按照情況調(diào)整
          }
          TMOD=0x20;//設(shè)置定時(shí)器1為自動(dòng)裝載模式
          TH1=k;//載入新
          TL1=k;
          }
          void main()
          {
          while(1)
          {
          baud_t();//測(cè)量,阻塞模式
          printf("Hello world!n");
          printf("Here:mode=%d,T1=0x%Xrn",min_mode,TH1);//這里如果你要使用keil請(qǐng)自己寫字符串發(fā)送函數(shù),和sprintf配合使用
          printf("Could you please test another baudrate?rn");
          printf("But I think that I couldn't to do.....rn");
          }
          }


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(guān)推薦

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