新聞中心

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

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

        作者: 時間:2012-10-16 來源:網絡 收藏

        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數值
        MOV CharL, TL0
        AB2: JB TF0, AB3 ;檢查定時器是否溢出?
        JB RX, AB2 ;檢查串行信號下降沿?
        SJMP AB1 ;返回,繼續采集
        AB3: CLR TR0 ;最大的采集時間已經超過,檢查結果
        CLR TF0 ;清除定時器溢出標志
        MOV BaudRate, #19 ;設置表指針
        CmpLoop: MOV A, BaudRate
        MOV DPTR, #CmpTable
        MOVC A, @A+DPTR ;取一個表項目(高位字節)以進行比較
        DEC BaudRate
        CJNE A, CharH, Cmp1 ;捕獲值與表項目的高位字節相等?
        SJMP CmpLow ;高位字節相等,檢查低位字節
        Cmp1: JC CmpMatch ;表項目小于定時值,則符合?
        DJNZ BaudRate, CmpLoop ;未至表項目的結尾,則繼續?
        SJMP CmpMatch ;至比較結束
        CmpLow: MOV A, BaudRate
        MOVC A, @A+DPTR ;取一個表項目(低位字節)以進行比較
        CJNE A, CharL, Cmp2 ;捕獲值與表項目的低位字節相等?
        SETB C ;結果相等
        Cmp2: JC CmpMatch ;如果表項目<定時值,則置位C
        DJNZ BaudRate, CmpLoop ;未至表項目的結尾,則繼續?
        CmpMatch: MOV A, BaudRate ;數據比較完成
        CLR C ;產生結果(波特率索引)
        RRC A
        MOV BaudRate, A ;保存結果
        RET
        ;*******************************************************
        ; CmpTable 比較表
        ;*****************************************************
        ;比較表所保持的定時值用于公認的波特率轉換情況。表項目為低位(LSB)、高位(MSB)。
        ;這些數據是以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 ;串行數據接收端
        CharH EQU 30H ;計時數據高位 TH0
        CharL EQU 31H ;計時數據低位 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 ;檢測串行數據上升沿
        MOV CharH, TH0 ;捕獲“T0”計時數
        MOV CharL, TL0
        JBC TF0, CHK_END ;若溢出,則開始計算
        JB RX, $-2 ;檢測串行數據下降沿
        SJMP CHK1
        CHK_END: CLR TR0 ;停止計數器
        MOV DPTR, #baudtable
        MOV BaudRt, #19
        LOOP: MOV A, BaudRt ;
        MOVC A, @A+DPTR ;取表格數據(高位)
        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 ;若低位字節 計時值,則匹配
        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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 翁源县| 越西县| 绥德县| 无极县| 保康县| 贵德县| 五指山市| 林甸县| 米林县| 彭水| 龙胜| 静海县| 镇坪县| 青神县| 霍山县| 互助| 南召县| 南丰县| 乌恰县| 新乡市| 华池县| 新建县| 延川县| 平遥县| 加查县| 嘉峪关市| 沁阳市| 永福县| 凉城县| 盘山县| 宿松县| 宁国市| 遂宁市| 双柏县| 周至县| 中方县| 舞钢市| 阿尔山市| 新巴尔虎左旗| 丽水市| 专栏|