標題: 6課:單片機并行口結(jié)構(gòu) [打印本頁]

作者: admin    時間: 2013-5-21 02:50
標題: 6課:單片機并行口結(jié)構(gòu)
  上兩次我們做過兩個實驗,都是讓P1.0這個管腳使燈亮,我們能設(shè)想:既然P1.0能讓燈亮,那么其它的管腳可不能呢?看一下圖1,它是8031單片機管腳的說明,在P1.0旁邊有P1.1,P1.2….P1.7,它們是否都能讓燈亮呢?除了以P1開頭的外,還有以P0,P2,P3開頭的,數(shù)一下,一共是32個管腳,前面我們以學(xué)過7個管腳,加上這32個這39個了。它們都以P字開頭,只是后面的數(shù)字不一樣,它們是否有什么聯(lián)系呢?它們能不能都讓燈亮呢?在我們的實驗板上,除了P10之外,還有P11 -> P17都與LED相連,下面讓我們來做一個實驗,程序如下:MAIN: MOV P1,#0FFH
LCALL DELAY
MOV P1,#00H
LCALL DELAY
LJMP MAIN
DELAY:MOV R7,#250
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET
END
  將這段程序燒寫到單片機中,結(jié)果如何?通電以后我們能看到8只LED全部在閃動。因此,P10->P17是全部能點亮燈的。事實上,凡以P開頭的這32個管腳都是能點亮燈的,也就是說:這32個管腳都能作為輸出使用,如果不用來點亮LED,能用來控制繼電器,能用來控制其它的執(zhí)行機構(gòu)。
程序分析:這段程序和前面做過的程序比較,只有兩處不一樣:第一句:原來是SETB P1.0,現(xiàn)在改為MOV P1,#0FFH,第三句:原來是CLR P1.0,現(xiàn)在改為MOV P1.0,#00H。從中能看出,P1是P1.0->P1.7的全體的代表,一個P1就表示了所有的這八個管腳了。當然用的指令也不一樣了,是用MOV指令。為什么用這條指令?看圖2,我們把P1作為一個整體,就把它當作是一個存儲器的單元,對一個單元送進一個數(shù)能用MOV指令。
二、第四個實驗
除了能作為輸出外,這32個管腳還能做什么呢?下面再來做一個單片機實驗,源程序如下:
MAIN: MOV P3,#0FFH
LOOP: MOV A,P3
MOV P1,A
LJMP LOOP
  先看一下這個實驗的結(jié)果:所有燈全部不亮,然后我按下一個按鈕,第(1)個燈亮了,再按下另一個按鈕,第(2)個燈亮了,松開按鈕燈就滅了。從這個實驗現(xiàn)象結(jié)合電路來分析一下程序。
  從硬件電路的連線能看出,有四個按鈕被接入到P3口的P32,P33,P34,P35。第一條指令的用途我們能猜到:使P3口全部為高電平。第二條指令是MOV A,P3,其中 MOV已經(jīng)知道,是送數(shù)的意思,這條指令的意思就是將P3口的數(shù)送到A中去,我們能把A當成是一個中間單元(看圖3),第三句話是將A中的數(shù)又送到P1口去,第四句話是循環(huán),就是持續(xù)地重復(fù)這個過程,這我們已見過。當我們按下第一個按鈕時,第(3)只燈亮了,所以P12口應(yīng)當輸出是低電平,為什么P12口會輸出低電平呢?我們看一下有什么被送到了P1口,只有從P3口進來的數(shù)送到A,又被送到了P1口,所以,肯定是P3口進來的數(shù)使得P12位輸出電平的。P3口的P32位的按鈕被按下,使得P32位的電平為低,通過程序,又使P12口輸出低電平,所以P3口起來了一個輸入的作用。驗證:按第二、三、四個按鈕,同時按下2個、3個、4個按鈕都能得到同樣的結(jié)論,所以P3口確實起到了輸入作用,這樣,我們能看到,以P字開頭的管腳,不僅能用作輸出,還能用作輸入,其它的管腳是否能呢?是的,都能。這32個管腳就稱之為并行口,下面我們就對并行口的結(jié)構(gòu)作一個分析,看一下它是怎樣實現(xiàn)輸入和輸出的。
并行口結(jié)構(gòu)分析:
1、輸出結(jié)構(gòu)

<并行口結(jié)構(gòu)圖>
  先看P1口的一位的結(jié)構(gòu)示意圖(只畫出了輸出部份):從圖中能看出,開關(guān)的打開和合上代表了管腳輸出的高和低,如果開關(guān)合上了,則管腳輸出就是低,如果開關(guān)打開了,則輸出高電平,這個開關(guān)是由一根線來控制的,這根數(shù)據(jù)總線是出自于CPU,讓我們回想一下,數(shù)據(jù)總線是一根大家公用的線,很多的器件和它連在一起,在不一樣的時候,不一樣的器件當然需要不一樣的信號,如某一時刻我們讓這個管腳輸出高電平,并要求保持若干時間,在這段時間里,計算機當然在忙個不停,在與其它器件進行聯(lián)絡(luò),這根控制線上的電平未必能保持原來的值不變,輸出就會發(fā)生變化了。怎么解決這個問題呢?我們在存儲器一節(jié)中學(xué)過,存儲器中是能存放電荷的,我們不妨也加一個小的存儲器的單元,并在它的前面加一個開關(guān),要讓這一位輸出時,就把開關(guān)打開,信號就進入存儲器的單元,然后馬上關(guān)閉開關(guān),這樣這一位的狀態(tài)就被保存下來,直到下一次命令讓它把開關(guān)再打開為止。這樣就能使這一位的狀態(tài)與別的器件無關(guān)了,這么一個小單元,我們給它一個很形象的名字,稱之為“鎖存器”。
2、輸入結(jié)構(gòu)
  這是并行口的一位的輸出結(jié)構(gòu)示意圖,再看,除了輸出之外,還有兩根線,一根從外部管腳接入,另一根從鎖存器的輸出接出,分別標明讀管腳和讀鎖存器。這兩根線是用于從外部接收信號的,為什么要兩根呢?原來,在51單片機中輸入有兩種方式,分別稱為‘讀管腳’和‘讀鎖存器’,第一種方式是將管腳作為輸入,那是真正地從外部管腳讀進輸入的值,第二種方式是該管腳處于輸出狀態(tài)時,有時需要改變這一位的狀態(tài),則并不需要真正地讀管腳狀態(tài),而只是讀入鎖存器的狀態(tài),然后作某種變換后再輸出。
  請注意輸入結(jié)構(gòu)圖,如果將這一根引線作為輸入口使用,我們并不能保證在任何時刻都能得到正確的結(jié)果(為什么?)參考圖2輸入示意圖。接在外部的開關(guān)如果打開,則應(yīng)當是輸入1,而如果閉合開關(guān),則輸入0,但是,如果單片機內(nèi)部的開關(guān)是閉合的,那么不管外部的開關(guān)是開還是閉,單片機接受到的數(shù)據(jù)都是0?梢,要讓這一端口作為輸入使用,要先做一個‘準備工作’,就是先讓內(nèi)部的開關(guān)斷開,也就是讓端口輸出‘1’才行。正因為要先做這么一個準備工作,所以我們稱之為“準雙向I/O口”。
  以上是P1口的一位的結(jié)構(gòu),P1口其它各位的結(jié)構(gòu)與之相同,而其它三個口:P0、P2、P3則除入作為輸入輸出口之外還有其它用途,所以結(jié)構(gòu)要稍復(fù)雜一些,但其用于輸入、輸出的結(jié)構(gòu)是相同的?磮D()。對我們來說,這些附加的功能不必由我們來控制,所以我們就不去關(guān)心它了。
  你如果你裝了office軟件的話 你可以打開這個ppt動態(tài)演示文件看下加深對并口的理解:http://www.torrancerestoration.com/f/51單片機并行口及其應(yīng)用.ppt
作者(胡琴)點評:根據(jù)本文的評論來看,大家感覺開始越來越難學(xué)了,其實并行口的原理我們并不需要去深入理解,不需要把內(nèi)部的工作原理及電路都完全弄懂,我們是要用單片機不是設(shè)計單片機芯片的,所以我們只需要會用就行了,比如說 給一個 CLR P3.5 這個指令就是為了讓P3.5輸出0,這一條 MOV P3,#0FFH 就是讓整個P3口(從P3.0-P3.7)全部都輸出1.

下一課:7課:單片機的特殊功能寄存器

作者: 阿格拉瑞    時間: 2013-5-25 21:58
受益匪淺
作者: linhuikui    時間: 2013-7-16 12:29
怎么沒有C語言的啊??
作者: 最愛大雙    時間: 2013-7-16 17:10
謝謝,對我的幫助很大
作者: wenzi198944    時間: 2013-7-24 15:47
感謝樓主,不過示意圖的標記不是很明確,看的時候有點對不上
作者: danpianji889    時間: 2013-8-19 15:11
比較深刻的
作者: c2y3h2    時間: 2013-8-31 09:29
有點費力了!!
作者: 鄉(xiāng)村小鎮(zhèn)    時間: 2013-12-3 16:51
初學(xué)者
作者: zkj12272053    時間: 2014-2-4 19:09
非常深刻。
作者: 知秋一葉    時間: 2014-3-15 08:32
學(xué)習(xí)學(xué)習(xí)
作者: jiajun678    時間: 2014-4-2 16:43
感受頗深
作者: lixichunedu    時間: 2014-4-5 14:44
講解的很好,受益匪淺
作者: 蘆葦不是草    時間: 2014-5-4 09:47
真心不錯、不錯。。。。
作者: 涉世未深    時間: 2014-5-15 19:04
匯編太難了,不想學(xué)。C一句話能搞定的,匯編一大篇才能搞定。
作者: ylyn029    時間: 2014-7-4 16:13
理解了,單片機四種并行口。通俗易懂啊
作者: 匹夫    時間: 2014-8-5 08:39
電路看起來有些費勁,但正如老是所說,會用就可以。
作者: 覃明明    時間: 2014-9-24 22:48
又上了一堂深刻的課,樓主辛苦你了
作者: yjj2011    時間: 2014-12-16 21:31
謝謝樓主,學(xué)習(xí)中
作者: yjj2011    時間: 2014-12-17 10:25
受益很大
作者: ardu    時間: 2014-12-18 20:00
初學(xué)者
作者: hans11    時間: 2014-12-26 00:22
學(xué)習(xí)中
作者: dimozun    時間: 2015-3-31 10:50
對呀,從這一章開始有點比較難懂了,繼續(xù)努力,F(xiàn)IGHT
作者: b4082    時間: 2015-4-2 11:34
學(xué)習(xí)了,感謝分享!
作者: moyuqilin    時間: 2015-5-4 20:15
以前一直自學(xué)用c來編程,總是聽說匯編語言的效率高。果然是的
作者: 51-danpianji    時間: 2015-5-10 21:16
非常謝謝
作者: skg_wj    時間: 2015-5-18 11:46
看了,感覺很不錯!
作者: 思辰    時間: 2015-5-19 14:58
怎么前后聯(lián)系不起來呢,是不是少了一些
作者: lanrumu    時間: 2015-5-28 00:18
感覺很不錯!
作者: wf312522    時間: 2015-6-9 13:57
受益匪淺
作者: yanse51    時間: 2015-6-11 21:44
看著挺不錯的
作者: 為自己而奮斗    時間: 2015-6-21 17:28
P1是P1.0->P1.7的全體的代表,一個P1就表示了所有的這八個管腳了
作者: silverdj    時間: 2015-8-7 13:56
強悍的開始從這里起步!
作者: 2832042310    時間: 2015-9-6 19:56
越來越難了,
作者: HJZ    時間: 2015-12-21 03:47
謝謝樓主,還在深刻理解中。給個小建議:圖中字和線都用深色紅、黑、棕、深藍標注,避開黃、粉紅、淺藍等淺色。淺色標注在白底色上看不清。
作者: absflash    時間: 2015-12-21 09:13
研究的真細致,看到各種門就頭疼
作者: panchun310    時間: 2016-1-19 13:40
開始變難了
作者: MUCV    時間: 2016-4-29 14:42

 受益匪淺 謝謝樓主
作者: 251495979    時間: 2016-5-26 10:57
堅持到底
作者: 依丿臣    時間: 2016-6-22 10:06
初學(xué)者,看現(xiàn)在有點難理解
作者: 堅毅追夢人    時間: 2016-9-24 19:30
請問樓主,“先看P1口的一位的結(jié)構(gòu)示意圖(只畫出了輸出部份):從圖中能看出,開關(guān)的打開和合上。。!睂(yīng)的圖在哪里能看到?
作者: yjs    時間: 2016-9-26 07:51
很詳細的話
作者: B型血    時間: 2016-11-9 19:51
并行結(jié)構(gòu)基本不懂了,缺少硬件圖,理解的比較費勁
作者: (xiaobai)    時間: 2016-11-16 13:06
問一下這個開發(fā)板去哪里買
作者: v115488    時間: 2016-12-7 22:21
試驗四,用的電路圖是那個?找不到電路圖,看著好難理解。
作者: alainyyj    時間: 2016-12-12 18:04
p1并行口圖上沒有開關(guān),是說的P2口吧?
作者: lyl44    時間: 2017-1-3 13:24
匯編好難啊
作者: ztadvance    時間: 2017-2-24 13:20
圖2和圖3呢?怎么沒有圖
作者: zm614    時間: 2017-3-10 19:05
通俗易懂
作者: xuwei517    時間: 2017-3-17 23:08
很好 很詳細 謝謝老師得教程!
作者: vip10481089    時間: 2017-4-12 11:23
太給力了!帥氣帥氣!
作者: 蛻變    時間: 2017-4-13 15:07
受益匪淺 深入淺出 受教了 謝謝
作者: 蛻變    時間: 2017-4-13 15:08
深刻 受益匪淺
作者: 蛻變    時間: 2017-4-13 15:09
很棒  收獲頗豐
作者: cp3_kuo    時間: 2017-9-1 16:12
老濕,文中提到的原理圖在那里?
作者: wodetianna    時間: 2017-10-28 11:42
很給力
作者: hsyxyz123    時間: 2017-11-23 15:37
受益匪淺 好好學(xué)習(xí),堅持再堅持!!
作者: js_gary    時間: 2017-12-4 11:42
不錯,寫得很好
作者: wyuejun8888    時間: 2017-12-8 10:28
感謝分享如此之詳細
作者: 旺旺0000000    時間: 2017-12-17 13:58
感謝樓主資源,剛好學(xué)到單片機,對我?guī)椭艽?hr noshade size="2" width="100%" color="#808080"> 作者: xiaoqiandao    時間: 2017-12-18 20:28
膜拜大佬分享~
作者: luohui8008    時間: 2018-1-11 18:00
很給力!
作者: liuzclzc    時間: 2018-1-16 20:23
這節(jié)講的是輸入輸出接口。
作者: ft2316377    時間: 2018-3-3 21:15
圖片字體顏色看起來費勁
作者: 太陽黑子1    時間: 2018-4-13 20:52
真的是非常好
作者: linyingjiang    時間: 2018-5-25 17:19
基礎(chǔ)的沉淀對后期很重要,贊一個
作者: 陽春巴人    時間: 2018-6-12 15:31
作者寫得很通俗易懂,受益匪淺。畢業(yè)八年之后,再又重新開始學(xué)習(xí)單片機,有種溫故而新的感覺。
作者: keneng    時間: 2018-6-25 16:09
這個內(nèi)容我覺得理解一下就行了。
作者: 260050663    時間: 2018-7-7 14:12
講解的很好,受益匪淺
作者: 51黑影    時間: 2018-8-14 16:40
大神,能不能用c需要編程。
作者: 51黑影    時間: 2018-8-14 16:42
大神能用c需要編程嘛?
作者: 904973396    時間: 2018-8-18 15:09
寫入這程序后無法編譯不知道是咋回事。
作者: DSKJBI    時間: 2018-10-6 15:05
醍醐灌頂
作者: cheney03    時間: 2020-5-25 14:25
涉世未深 發(fā)表于 2014-5-15 19:04
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

其實匯編比C語言簡練,只是匯編不易于移植
作者: cedtek    時間: 2020-12-29 16:13
PPT動態(tài)演示加深了對CPU讀引腳和讀鎖存方式的理解,從前面的對位的操作到這節(jié)對字節(jié)的操作也讓我對并行口的理解更加清楚了,感謝LZ
作者: bard12333    時間: 2021-3-11 15:58
是不是缺少圖?后面沒看懂
作者: cedtek    時間: 2021-11-3 15:38
貌似缺少了幾張圖片
作者: cedtek    時間: 2024-1-6 18:10
blink.a51 內(nèi)容如下:
  1. ; 外設(shè)端口切換寄存器 2 的地址
  2. P_SW2   DATA    0BAH

  3. ; 端口模式配置寄存器的地址
  4. P1M0    DATA    092H
  5. P1M1    DATA    091H

  6.         ORG     0000H        ; 設(shè)置程序的起始地址為 0000H,即程序的入口點
  7.         LJMP    MAIN         ; 通過長跳轉(zhuǎn)指令 (LJMP) 跳轉(zhuǎn)到 MAIN 主程序的地址
  8.         ORG     0100H        ; 設(shè)置程序的重定位地址為 0100H,用于存放中斷向量等信息

  9. ; 主程序:
  10. MAIN:
  11.     MOV SP, #5FH             ; 設(shè)置堆棧指針
  12.    
  13.     ORL P_SW2, #80H          ; 使能訪問 XFR
  14.    
  15.     MOV P1M0, #00H           ; 清空 P1M0 寄存器
  16.     MOV P1M1, #00H           ; 清空 P1M1 寄存器
  17.    
  18.     MOV P1M0, #0FFH         ;設(shè)置 P1 為推挽輸出模式。#0FFH 中的 0 不能省略
  19.     MOV P1M1, #00H
  20.    
  21.     LJMP LOOP                ; 跳轉(zhuǎn)到循環(huán)體

  22. ; 循環(huán)體
  23. LOOP:
  24.     MOV P1, #0FFH            ; 將 0xFF 賦值給 P1 寄存器,即將端口 P1 的所有引腳設(shè)為高電平,熄滅小燈
  25.     LCALL DELAY_1S           ; 延時一段時間
  26.     MOV P1, #00H             ; 將 0 賦值給 P1 寄存器,即將端口 P1 的所有引腳設(shè)為低電平,點亮小燈
  27.     LCALL DELAY_1S           ; 延時一段時間
  28.     AJMP LOOP                ; 無條件跳轉(zhuǎn)到循環(huán)體

  29. ; ====================延時1秒子程序====================
  30. DELAY_1S:         ; 延時子程序,12MHz 晶振延時 1.002035 秒
  31.     MOV R4, #10   ; 設(shè)置 R4 寄存器為 10,1 指令周期
  32.    
  33. L3:
  34.     MOV R2, #200  ; 設(shè)置 R2 寄存器為 200,1 指令周期
  35.    
  36. L1:
  37.     MOV R3, #249  ; 設(shè)置 R3 寄存器為 249,1 指令周期
  38.     L2:
  39.         DJNZ R3, L2     ; 2 指令周期
  40.    
  41.     DJNZ R2, L1          ; 2 指令周期
  42.     DJNZ R4, L3          ; 2 指令周期
  43.    
  44.     RET                      ; 2 指令周期
  45. ; 循環(huán)體延時時間: [(249*2+1+2)*200+1+2]*10*12/12000000=1.002032s
  46. ; 加上 LCALL 指令和第一條 MOV 指令以及最后一條 RET 指令算出來整個函數(shù)的時間為 1.002035s
  47. ; =====================================================

  48. END
復(fù)制代碼

Proteus 8 Professional 仿真結(jié)果如下圖:


作者: cedtek    時間: 2024-1-6 19:14
陽春巴人 發(fā)表于 2018-6-12 15:31
作者寫得很通俗易懂,受益匪淺。畢業(yè)八年之后,再又重新開始學(xué)習(xí)單片機,有種溫故而新的感覺。

考古
我也是畢業(yè)后又倒回來瀏覽這個教程
作者: cedtek    時間: 2024-1-6 19:19
圖 3 好像缺少了,我覺得可以使用燒烤的鐵簽來比作累加器 A
作者: cedtek    時間: 2024-1-6 19:35
燒烤時使用的鐵簽子來理解累加器 A下面這行代碼我是這樣理解的:P3 寄存器的內(nèi)容好比燒烤食材,此時累加器 A 好比打荷時還沒有穿上“衣服”的鐵簽子,這行代碼執(zhí)行過程不就和將燒烤食材串在鐵簽子上一樣嗎?
  1. MOV A, P3
復(fù)制代碼
那么下面這行代碼又該如何理解呢?

  1. MOV P1, A
復(fù)制代碼
此時
累加器 A 好比烤制完成后的一串烤串P1 寄存器好比我這貪吃的嘴,這行代碼執(zhí)行過程對應(yīng)過來就是擼串




作者: cedtek    時間: 2024-1-7 08:48
按鍵控制LED的亮滅
匯編程序:
  1. ; ====================按鍵控制LED====================
  2. ; 外設(shè)端口切換寄存器 2 的地址
  3. P_SW2   DATA    0BAH

  4. ; 端口模式配置寄存器的地址
  5. P1M0    DATA    092H
  6. P1M1    DATA    091H
  7. P3M0    DATA    0B2H
  8. P3M1    DATA    0B1H

  9.         ORG     0000H   ; 設(shè)置程序的起始地址為 0000H,即程序的入口點
  10.         LJMP    MAIN    ; 通過長跳轉(zhuǎn)指令 (LJMP) 跳轉(zhuǎn)到 MAIN 主程序的地址
  11.         ORG     0100H   ; 設(shè)置程序的重定位地址為 0100H,用于存放中斷向量等信息

  12. ; 主程序:
  13. MAIN:
  14.     MOV SP, #5FH        ; 設(shè)置堆棧指針
  15.    
  16.     ORL P_SW2, #80H     ; 使能訪問 XFR
  17.    
  18.     MOV P1M0, #00H      ; 清空 P1M0 寄存器
  19.     MOV P1M1, #00H      ; 清空 P1M1 寄存器
  20.     MOV P3M0, #00H      ; 清空 P3M0 寄存器
  21.     MOV P3M1, #00H      ; 清空 P3M1 寄存器
  22.    
  23.     MOV P1M0, #0FFH     ;設(shè)置 P1 為推挽輸出模式。#0FFH 中的 0 不能省略
  24.     MOV P1M1, #00H
  25.     MOV P3M0, #00H      ;設(shè)置 P3.2、P3.3、P3.4、P3.5 為高阻輸入模式。
  26.     MOV P3M1, #3CH
  27.    
  28.     MOV P1, #0FFH       ; 將 0xFF 賦值給 P1 寄存器,即將端口 P1 的所有引腳設(shè)為高電平,熄滅小燈
  29.    
  30.     LJMP LOOP           ; 跳轉(zhuǎn)到循環(huán)體

  31. ; 循環(huán)體
  32. LOOP:
  33.     MOV A, P3   ; 將 P3 寄存器的值移動到累加器 A
  34.     MOV P1, A   ; 將累加器 A 的值移動到端口 P1,實現(xiàn) P1 輸出與 P3 寄存器相同的值
  35.     LJMP LOOP   ; 無條件跳轉(zhuǎn)到循環(huán)體,實現(xiàn)持續(xù)循環(huán)

  36. END
  37. ; ================================================================
復(fù)制代碼
硬件連接:


Proteus 8 Professional 仿真結(jié)果:
1. 4 個按鍵都沒有按下

2. 按鍵 K1、K2、K3、K4 分別單獨按下

3. 同時按下按鍵 K1、K2、K3、K4 中的兩個


3. 同時按下按鍵 K1、K2、K3、K4 中的三個


3. 同時按下按鍵 K1、K2、K3、K4 中的四個





作者: cedtek    時間: 2024-1-7 11:03
absflash 發(fā)表于 2015-12-21 09:13
研究的真細致,看到各種門就頭疼

小時候腦袋被門擠了,導(dǎo)致現(xiàn)在看到門就頭疼
作者: cedtek    時間: 2024-1-7 11:11
v115488 發(fā)表于 2016-12-7 22:21
試驗四,用的電路圖是那個?找不到電路圖,看著好難理解。

下面這個是我自己根據(jù)文字描述猜測的硬件連接原理圖,希望對你有所幫助

51hei.png (147.44 KB, 下載次數(shù): 184)

51hei.png

作者: cedtek    時間: 2024-1-7 11:12
cp3_kuo 發(fā)表于 2017-9-1 16:12
文中提到的原理圖在那里?

51hei.png (147.44 KB, 下載次數(shù): 186)

51hei.png





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1