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

          新聞中心

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

          模擬串口自動測量波特率的單片機程序

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

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

          UINT f_Test(void)//測試脈寬
          {
          TMOD=0x10;//設(shè)置計數(shù)器1為方式一計數(shù)器模式
          TH1=0;
          TL1=0;//定時器CLR
          while(!RX1);//等待頻率腳變高,這個是測低電平的
          while(RX1);//等待腳變低,更換符號可以測正脈沖
          TR1=1;//開啟定時器
          while(!RX1);//等待變高
          TR1=0;//停止計數(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();//測試
          }//測量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;//加補償,因為if語句讓機器周期加長
          //如果對于STC的新MCU,這里要按照情況調(diào)整
          }
          TMOD=0x20;//設(shè)置定時器1為自動裝載模式
          TH1=k;//載入新
          TL1=k;
          }
          void main()
          {
          while(1)
          {
          baud_t();//測量,阻塞模式
          printf("Hello world!n");
          printf("Here:mode=%d,T1=0x%Xrn",min_mode,TH1);//這里如果你要使用keil請自己寫字符串發(fā)送函數(shù),和sprintf配合使用
          printf("Could you please test another baudrate?rn");
          printf("But I think that I couldn't to do.....rn");
          }
          }


          上一頁 1 2 下一頁

          關(guān)鍵詞: 模擬串口 自動測量 波特率

          評論


          相關(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); })();