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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51 單片機串行通訊中波特率的自動檢測

          51 單片機串行通訊中波特率的自動檢測

          作者: 時間:2012-10-16 來源:網(wǎng)絡 收藏

          AutoBaud: MOV TMOD, #01h ;初始化T0(串行口定時器)
          MOV TH0, #0 ;將T0 置于16位定時器模式
          MOV TL0, #0
          MOV TCON, #0
          MOV CharH, #0 ;預置檢測結果
          MOV CharL, #0
          AB0: JB RX, AB0 ;等待起始
          SETB TR0 ;起動定時器 T0
          AB1: JB TF0, AB3 ;檢查定時器是否溢出?
          JNB RX, AB1 ;檢測串行信號上升沿?
          MOV CharH, TH0 ;在串行信號上升沿捕獲定時器T0數(shù)值
          MOV CharL, TL0
          AB2: JB TF0, AB3 ;檢查定時器是否溢出?
          JB RX, AB2 ;檢查串行信號下降沿?
          SJMP AB1 ;返回,繼續(xù)采集
          AB3: CLR TR0 ;最大的采集時間已經(jīng)超過,檢查結果
          CLR TF0 ;清除定時器溢出標志
          MOV BaudRate, #19 ;設置表指針
          CmpLoop: MOV A, BaudRate
          MOV DPTR, #CmpTable
          MOVC A, @A+DPTR ;取一個表項目(高位字節(jié))以進行比較
          DEC BaudRate
          CJNE A, CharH, Cmp1 ;捕獲值與表項目的高位字節(jié)相等?
          SJMP CmpLow ;高位字節(jié)相等,檢查低位字節(jié)
          Cmp1: JC CmpMatch ;表項目小于定時值,則符合?
          DJNZ BaudRate, CmpLoop ;未至表項目的結尾,則繼續(xù)?
          SJMP CmpMatch ;至比較結束
          CmpLow: MOV A, BaudRate
          MOVC A, @A+DPTR ;取一個表項目(低位字節(jié))以進行比較
          CJNE A, CharL, Cmp2 ;捕獲值與表項目的低位字節(jié)相等?
          SETB C ;結果相等
          Cmp2: JC CmpMatch ;如果表項目<定時值,則置位C
          DJNZ BaudRate, CmpLoop ;未至表項目的結尾,則繼續(xù)?
          CmpMatch: MOV A, BaudRate ;數(shù)據(jù)比較完成
          CLR C ;產(chǎn)生結果(波特率索引)
          RRC A
          MOV BaudRate, A ;保存結果
          RET
          ;*******************************************************
          ; CmpTable 比較表
          ;*****************************************************
          ;比較表所保持的定時值用于公認的波特率轉換情況。表項目為低位(LSB)、高位(MSB)。
          ;這些數(shù)據(jù)是以12MHz為基準操作。
          CmpTable: DB 40h,0 ;0 – 超出范圍,值太低
          DB 80h,0 ;1 – 38400 baud.
          DB 0,01h ;2 – 19200 baud.
          DB 0,02h ;3 – 9600 baud.
          DB 0,04h ;4 – 4800 baud.
          DB 0,08h ;5 – 2400 baud.
          DB 0,10h ;6 – 1200 baud.
          DB 0,20h ;7 – 600 baud.
          DB 0,40h ;8 – 300 baud.
          DB 0,80h ;9 – 超出范圍,值太高
          END

          附: 波特率自動檢測程序(通過驗證)
          RX BIT P3.0 ;串行數(shù)據(jù)接收端
          CharH EQU 30H ;計時數(shù)據(jù)高位 TH0
          CharL EQU 31H ;計時數(shù)據(jù)低位 TL0
          BaudRt EQU 32H ;波特率計算值
          ;subroutine
          AutoBaud: MOV TMOD, #01H ;初始化“T0”為計時器
          MOV TH0, #0
          MOV TL0, #0
          MOV TCON, #0
          MOV CharH, #0
          MOV CharL, #0
          JB RX, $ ;等待通訊開始位
          SETB TR0
          CHK1: JBC TF0, CHK_END ;若溢出,則開始計算
          JNB RX, $-2 ;檢測串行數(shù)據(jù)上升沿
          MOV CharH, TH0 ;捕獲“T0”計時數(shù)
          MOV CharL, TL0
          JBC TF0, CHK_END ;若溢出,則開始計算
          JB RX, $-2 ;檢測串行數(shù)據(jù)下降沿
          SJMP CHK1
          CHK_END: CLR TR0 ;停止計數(shù)器
          MOV DPTR, #baudtable
          MOV BaudRt, #19
          LOOP: MOV A, BaudRt ;
          MOVC A, @A+DPTR ;取表格數(shù)據(jù)(高位)
          DEC BaudRt ;索引地址減 1
          CJNE A, CharH, CMP_1 ;檢查結果范圍
          SJMP CMP_LOW
          CMP_1: JC MATCH ;若表中值 計時值,則匹配
          DJNZ BaudRt, LOOP
          SJMP MATCH ;表查完,至結束查表程序
          CMP_LOW: MOV A, BaudRt ;高位相等,比較低位
          MOVC A, @A+DPTR
          CJNE A, CharL, CMP_2
          SETB C ;相等則匹配
          CMP_2: JC MATCH ;若低位字節(jié) 計時值,則匹配
          DJNZ BaudRt, LOOP
          MATCH: MOV A, BaudRt ;轉換為波特率索引值
          CLR C
          RRC A
          MOV BaudRt, A ;保存
          RET
          ;波特率索引表(LSB 在前,MSB 在后,晶振為11.0592MHz)
          baudtable: DB 03CH,00H ;0-越限,值太小
          DB 078H,00H ;1-波特率 38400
          DB 0F0H,00H ;2-波特率 19200
          DB 0E0H,01H ;3-波特率 9600
          DB 0C0H,03H ;4-波特率 4800
          DB 080H,07H ;5-波特率 2400
          DB 00H,00FH ;6-波特率 1200
          DB 00H,01EH ;7-波特率 600
          DB 00H,03CH ;8-波特率 300
          DB 00H,078H ;9-越限,值太大
          END


          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();