• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機I/O口單線通訊的實現

    PIC單片機I/O口單線通訊的實現

    作者: 時間:2014-01-09 來源:網絡 收藏

    中、低檔有些不帶串口,有些雖然有串行口,卻受串口固定協議的限制或留作他用,故需用普通I/O口進行通訊。由于中、低檔機I/O口數量相對較少,為節省口線,就要用I/O口模擬串行通訊。
    本文以兩片采用不同主頻的(A機時鐘頻率為6MHz,使用口線RB6;B機時鐘頻率為4MHz,使用口線RB4)之間用異步通訊方式傳送一組數據為例,說明I/O口一線通訊的實現方法。
    一、設計思想
    1.時鐘同步問題
    因兩個單片機的時鐘不同,故采用異步通訊方式。發送、接收一位數據時,采用軟件延時,保證發送、接收完全同步。
    2.數據發送、接收方式
    I/O口一線串行通訊,并-串(或串-并)轉換用軟件完成。將欲發送的字節存于16H中,經移位指令移至進位位。根據進位位的值,將口線RB6置0或1。接收端RB4接收并判斷后,置進位標志為0或1,再經移位指令移入14H中。這樣循環執行8次,就可將一個字節由低位到高位一位位地發送出去。數據傳送速率可用延時循環的方法進行調節。
    3.握手協議
    先發握手信號,后發數據。假定A機為發送,B機為接收。A機開始發送時,先發送一個握手數據信號,B機收到后回送一個應答信號,表示同意接收。
    A機收到應答信號后,開始發送數據。握手信號和數據信號都按異步通訊格式,先發準備信號“1”,接著發送起始位“0”,然后發數據位。
    4.數據傳送
    異步通訊時,發送時鐘控制數據位的定時移位串行輸出,接收時鐘檢測起始位,并控制數據的定時接收移入。兩個時鐘信號不是通過信號線傳遞,而是采用編程約定的辦法,使之和實際使用的數據速率基本保持一致,而數據信號中的起始位則是發和收的同步控制。接收時鐘為數據傳送波特率的16倍頻信號,即一個數據位寬的時間內將會出現16個接收時鐘的信號,這是檢測起始位和保證在數據位中央位置接收數據所需要的。為排除瞬時干擾,在檢測到數據輸入線的電平由“1”變為“0”之后,接收端將繼續檢測。僅當連續8個接收時鐘周期內都檢測到數據線上的電平為“0”時,才確認是起始位,且發送端每一個“0”或“1”都發送16次,接收端將以16倍的時鐘周期,即以位寬時間為間隔,接收各數據位(在其中央位置接收數據)。一個字長數據(8位)接收完后,子程序返回。
    二、程序框圖和源程序
    下面給出發送、接收一字長(8位)信號的子程序框圖(見圖1、圖2)和源程序(發送、接收聯絡信號與數據信號相同)。注:所有延時程序略。
    1.發送子程序
    list p=16c65,f=inhx8m
    portb equ6
    trisb equ 16h
    status equ3
    rp0 equ5
       org0x100
    fs bsf status,rp0;選存儲體1
      bcf trisb,6 ;置RB6為輸出
      bcf status,rp0;恢復存儲體0
      bsf portb,6 ;發準備信號“1”
     movlw0x08
      movwf1f ;置發送字長
      call ystb ;延時同步
      movlw0x10
      movwf1c
    fs1 bcf portb,6 ;發16個起始位
      decfsz1c,1
      goto fs1
    ts call ystj ;延時調節波特率
      rrf 16h,1 ;發送字節移位
     btfsc status,0
      goto ty
      movlw0x10
      movwf1c
    fs2 bcf portb,6 ;位為0,發16個“0”
      decfsz1c,1
      goto fs2
      goto tr
    ty movlw0x10
      movwf1c
    fs3 bsf portb,6 ;位為1,發16個“1”
      decfsz1c,1
      goto fs3
    tr decfsz1f, 1
       goto ts ;發送未完,延時發下一位
      return ;發送結束返回
      end
    2.接收子程序
    list p=16c65,f=inhx8m
    portb equ6
    trisb equ 16h
    status equ 3
    rp0  equ5
       org 0x200
    js bsf status,rp0 ;選存儲體1
      bsf trisb,4 ;置RB4為輸入
       bcf status,rp0 ;恢復存儲體0
    js1 btfss portb,4 ;檢測收到“1”否
       goto js1 ;未收到“1”繼續檢測
      movlw0x08 ;置接收字長8位
       movwf1f
    loop1 movlw0x08 ;置循環次數8
         movwf1d
    loop btfsc portb,4 ;檢測起始位
        goto loop1 ;未收到“0”重置8次循環
      decfsz1d,1
        goto loop ;收到“0”繼續檢測
    jz call ystb ;收到8個“0”,延時同步,接收數據
    btfsc portb,4 ;測試接收位
    goto jy
       bcf status,0 ;收到“0”置c=0
       goto j1
    jy bsf status,0 ;收到“1”置c=1
    j1 rrf 14h,1 ;接收位移入14h
       decfsz 1f,1
       goto jz ;未接收完,延時接收下一位
    return ;接收完返回
    end

    單片機相關文章:單片機教程


    單片機相關文章:單片機視頻教程


    單片機相關文章:單片機工作原理


    數字通信相關文章:數字通信原理


    通信相關文章:通信原理




    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 泰兴市| 木兰县| 杭锦旗| 乐昌市| 松滋市| 沿河| 资阳市| 兴安盟| 福州市| 平凉市| 玛多县| 富裕县| 宣武区| 新竹市| 涪陵区| 丰县| 五家渠市| 韶山市| 温州市| 阳朔县| 津南区| 额尔古纳市| 江山市| 哈尔滨市| 阳西县| 枣阳市| 滨州市| 漯河市| 无棣县| 乐清市| 广灵县| 工布江达县| 宜昌市| 贵定县| 繁昌县| 南澳县| 北票市| 灵璧县| 蕉岭县| 广安市| 桓台县|