我在公车被蹭水后当晚就来了月经,在公车上露着奶被男人玩,公车上的人妻沦陷完整版,(NP、高H、纯肉)公车,公车娇喘抽搐喷潮H文苏小暖,公车全黄H全肉短篇公车之狼

技術熱線: 4007-888-234

技術支持

PIC單片機IO口單線通訊的實現(xiàn)

更新時間: 2019-03-22

單片機方案開發(fā)深圳英銳恩分享PIC單片機I/O口單線通訊的實現(xiàn)。中、低檔PIC單片機有些不帶串口,有些雖然有串行口,卻受串口固定協(xié)議的限制或留作他用,故需用普通I/O口進行通訊。由于中、低檔機I/O口數(shù)量相對較少,為節(jié)省口線,就要用I/O口模擬串行通訊。
    本文以兩片采用不同主頻的PIC單片機(A機時鐘頻率為6MHz,使用口線RB6;B機時鐘頻率為4MHz,使用口線RB4)之間用異步通訊方式傳送一組數(shù)據為例,說明I/O口一線通訊的實現(xiàn)方法。
    一、設計思想
    1.時鐘同步問題
    因兩個單片機的時鐘不同,故采用異步通訊方式。發(fā)送、接收一位數(shù)據時,采用軟件延時,保證發(fā)送、接收完全同步。
    2.數(shù)據發(fā)送、接收方式
    I/O口一線串行通訊,并-串(或串-并)轉換用軟件完成。將欲發(fā)送的字節(jié)存于16H中,經移位指令移至進位位。根據進位位的值,將口線RB6置0或1。接收端RB4接收并判斷后,置進位標志為0或1,再經移位指令移入14H中。這樣循環(huán)執(zhí)行8次,就可將一個字節(jié)由低位到高位一位位地發(fā)送出去。數(shù)據傳送速率可用延時循環(huán)的方法進行調節(jié)。
    3.握手協(xié)議
    先發(fā)握手信號,后發(fā)數(shù)據。假定A機為發(fā)送,B機為接收。A機開始發(fā)送時,先發(fā)送一個握手數(shù)據信號,B機收到后回送一個應答信號,表示同意接收。
    A機收到應答信號后,開始發(fā)送數(shù)據。握手信號和數(shù)據信號都按異步通訊格式,先發(fā)準備信號“1”,接著發(fā)送起始位“0”,然后發(fā)數(shù)據位。
    4.數(shù)據傳送

異步通訊時,發(fā)送時鐘控制數(shù)據位的定時移位串行輸出,接收時鐘檢測起始位,并控制數(shù)據的定時接收移入。兩個時鐘信號不是通過信號線傳遞,而是采用編程約定的辦法,使之和實際使用的數(shù)據速率基本保持一致,而數(shù)據信號中的起始位則是發(fā)和收的同步控制。接收時鐘為數(shù)據傳送波特率的16倍頻信號,即一個數(shù)據位寬的時間內將會出現(xiàn)16個接收時鐘的信號,這是檢測起始位和保證在數(shù)據位中央位置接收數(shù)據所需要的。為排除瞬時干擾,在檢測到數(shù)據輸入線的電平由“1”變?yōu)椤埃啊敝?,接收端將繼續(xù)檢測。僅當連續(xù)8個接收時鐘周期內都檢測到數(shù)據線上的電平為“0”時,才確認是起始位,且發(fā)送端每一個“0”或“1”都發(fā)送16次,接收端將以16倍的時鐘周期,即以位寬時間為間隔,接收各數(shù)據位(在其中央位置接收數(shù)據)。一個字長數(shù)據(8位)接收完后,子程序返回。
    二、程序框圖和源程序
    下面給出發(fā)送、接收一字長(8位)信號的子程序框圖(見圖1、圖2)和PIC單片機源程序(發(fā)送、接收聯(lián)絡信號與數(shù)據信號相同)。注:所有延時程序略。
    1.發(fā)送子程序
   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   ;發(fā)準備信號“1”
      ?。恚铮觯欤鳎埃埃?br/>       movwf1f       ;置發(fā)送字長
       call   ystb      ;延時同步
       movlw0x10
       movwf1c
fs1  bcf    portb,6   ;發(fā)16個起始位
       decfsz1c,1
       goto   fs1
ts    call   ystj      ;延時調節(jié)波特率
       rrf    16h,1     ;發(fā)送字節(jié)移位
     ?。猓簦妫螅?nbsp; status,0
       goto    ty
       movlw0x10
       movwf1c
fs2  bcf    portb,6   ;位為0,發(fā)16個“0”
       decfsz1c,1
       goto   fs2
       goto     tr
ty    movlw0x10
       movwf1c
fs3  bsf    portb,6   ;位為1,發(fā)16個“1”

 decfsz1c,1
      goto         fs3
tr    decfsz1f,  1
      goto    ts        ;發(fā)送未完,延時發(fā)下一位
       return          ;發(fā)送結束返回
      end
    2.接收子程序
   list p=16c65,f=inhx8m
portb  equ6
trisb  equ 16h
status equ 3
rp0    equ5
        ?。铮颍?nbsp;  0x200
js    bsf    status,rp0  ;選存儲體1
     ?。猓螅?nbsp;    trisb,4     ;置RB4為輸入
      bcf    status,rp0  ;恢復存儲體0
js1  btfss   portb,4    ;檢測收到“1”否

goto    js1        ;未收到“1”繼續(xù)檢測
      movlw0x08      ;置接收字長8位
      movwf1f
loop1 movlw0x08      ;置循環(huán)次數(shù)8
      ?。恚铮觯鳎妫保?br/>loop  btfsc  portb,4    ;檢測起始位
        goto   loop1     ;未收到“0”重置8次循環(huán)
      ?。洌澹悖妫螅保?,1
       goto   loop       ;收到“0”繼續(xù)檢測
jz    call     ystb       ;收到8個“0”,延時同步,接收數(shù)據
        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


404
返回首頁 |  返回上一頁
临清市| 沧州市| 明水县| 巴马| 鄂托克旗| 家居| 临清市| 宜黄县| 化隆| 渑池县| 筠连县| 康乐县| 吴旗县| 西充县| 南澳县| 岑溪市| 邹城市| 营山县| 青田县| 涿州市| 正定县| 石楼县| 武山县| 四会市| 白山市| 阜城县| 许昌县| 宝应县| 桂阳县| 沈阳市| 开阳县| 邹城市| 西乡县| 栾城县| 肇源县| 阳新县| 方城县| 营口市| 称多县| 建始县| 新乡市|