标题: 6课:单片机并行口结构 [打印本页]

作者: admin    时间: 2013-5-21 02:50
标题: 6课:单片机并行口结构
  上两次我们做过两个实验,都是让P1.0这个管脚使灯亮,我们能设想:既然P1.0能让灯亮,那么其它的管脚可不能呢?看一下图1,它是8031单片机管脚的说明,在P1.0旁边有P1.1,P1.2….P1.7,它们是否都能让灯亮呢?除了以P1开头的外,还有以P0,P2,P3开头的,数一下,一共是32个管脚,前面我们以学过7个管脚,加上这32个这39个了。它们都以P字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不能都让灯亮呢?在我们的实验板上,除了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
  将这段程序烧写到单片机中,结果如何?通电以后我们能看到8只LED全部在闪动。因此,P10->P17是全部能点亮灯的。事实上,凡以P开头的这32个管脚都是能点亮灯的,也就是说:这32个管脚都能作为输出使用,如果不用来点亮LED,能用来控制继电器,能用来控制其它的执行机构。
程序分析:这段程序和前面做过的程序比较,只有两处不一样:第一句:原来是SETB P1.0,现在改为MOV P1,#0FFH,第三句:原来是CLR P1.0,现在改为MOV P1.0,#00H。从中能看出,P1是P1.0->P1.7的全体的代表,一个P1就表示了所有的这八个管脚了。当然用的指令也不一样了,是用MOV指令。为什么用这条指令?看图2,我们把P1作为一个整体,就把它当作是一个存储器的单元,对一个单元送进一个数能用MOV指令。
二、第四个实验
除了能作为输出外,这32个管脚还能做什么呢?下面再来做一个单片机实验,源程序如下:
MAIN: MOV P3,#0FFH
LOOP: MOV A,P3
MOV P1,A
LJMP LOOP
  先看一下这个实验的结果:所有灯全部不亮,然后我按下一个按钮,第(1)个灯亮了,再按下另一个按钮,第(2)个灯亮了,松开按钮灯就灭了。从这个实验现象结合电路来分析一下程序。
  从硬件电路的连线能看出,有四个按钮被接入到P3口的P32,P33,P34,P35。第一条指令的用途我们能猜到:使P3口全部为高电平。第二条指令是MOV A,P3,其中 MOV已经知道,是送数的意思,这条指令的意思就是将P3口的数送到A中去,我们能把A当成是一个中间单元(看图3),第三句话是将A中的数又送到P1口去,第四句话是循环,就是持续地重复这个过程,这我们已见过。当我们按下第一个按钮时,第(3)只灯亮了,所以P12口应当输出是低电平,为什么P12口会输出低电平呢?我们看一下有什么被送到了P1口,只有从P3口进来的数送到A,又被送到了P1口,所以,肯定是P3口进来的数使得P12位输出电平的。P3口的P32位的按钮被按下,使得P32位的电平为低,通过程序,又使P12口输出低电平,所以P3口起来了一个输入的作用。验证:按第二、三、四个按钮,同时按下2个、3个、4个按钮都能得到同样的结论,所以P3口确实起到了输入作用,这样,我们能看到,以P字开头的管脚,不仅能用作输出,还能用作输入,其它的管脚是否能呢?是的,都能。这32个管脚就称之为并行口,下面我们就对并行口的结构作一个分析,看一下它是怎样实现输入和输出的。
并行口结构分析:
1、输出结构

<并行口结构图>
  先看P1口的一位的结构示意图(只画出了输出部份):从图中能看出,开关的打开和合上代表了管脚输出的高和低,如果开关合上了,则管脚输出就是低,如果开关打开了,则输出高电平,这个开关是由一根线来控制的,这根数据总线是出自于CPU,让我们回想一下,数据总线是一根大家公用的线,很多的器件和它连在一起,在不一样的时候,不一样的器件当然需要不一样的信号,如某一时刻我们让这个管脚输出高电平,并要求保持若干时间,在这段时间里,计算机当然在忙个不停,在与其它器件进行联络,这根控制线上的电平未必能保持原来的值不变,输出就会发生变化了。怎么解决这个问题呢?我们在存储器一节中学过,存储器中是能存放电荷的,我们不妨也加一个小的存储器的单元,并在它的前面加一个开关,要让这一位输出时,就把开关打开,信号就进入存储器的单元,然后马上关闭开关,这样这一位的状态就被保存下来,直到下一次命令让它把开关再打开为止。这样就能使这一位的状态与别的器件无关了,这么一个小单元,我们给它一个很形象的名字,称之为“锁存器”。
2、输入结构
  这是并行口的一位的输出结构示意图,再看,除了输出之外,还有两根线,一根从外部管脚接入,另一根从锁存器的输出接出,分别标明读管脚和读锁存器。这两根线是用于从外部接收信号的,为什么要两根呢?原来,在51单片机中输入有两种方式,分别称为‘读管脚’和‘读锁存器’,第一种方式是将管脚作为输入,那是真正地从外部管脚读进输入的值,第二种方式是该管脚处于输出状态时,有时需要改变这一位的状态,则并不需要真正地读管脚状态,而只是读入锁存器的状态,然后作某种变换后再输出。
  请注意输入结构图,如果将这一根引线作为输入口使用,我们并不能保证在任何时刻都能得到正确的结果(为什么?)参考图2输入示意图。接在外部的开关如果打开,则应当是输入1,而如果闭合开关,则输入0,但是,如果单片机内部的开关是闭合的,那么不管外部的开关是开还是闭,单片机接受到的数据都是0。可见,要让这一端口作为输入使用,要先做一个‘准备工作’,就是先让内部的开关断开,也就是让端口输出‘1’才行。正因为要先做这么一个准备工作,所以我们称之为“准双向I/O口”。
  以上是P1口的一位的结构,P1口其它各位的结构与之相同,而其它三个口:P0、P2、P3则除入作为输入输出口之外还有其它用途,所以结构要稍复杂一些,但其用于输入、输出的结构是相同的。看图()。对我们来说,这些附加的功能不必由我们来控制,所以我们就不去关心它了。
  你如果你装了office软件的话 你可以打开这个ppt动态演示文件看下加深对并口的理解:http://www.51hei.com/f/51单片机并行口及其应用.ppt
作者(胡琴)点评:根据本文的评论来看,大家感觉开始越来越难学了,其实并行口的原理我们并不需要去深入理解,不需要把内部的工作原理及电路都完全弄懂,我们是要用单片机不是设计单片机芯片的,所以我们只需要会用就行了,比如说 给一个 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
有点费力了!!!
作者: 乡村小镇    时间: 2013-12-3 16:51
初学者
作者: zkj12272053    时间: 2014-2-4 19:09
非常深刻。
作者: 知秋一叶    时间: 2014-3-15 08:32
学习学习
作者: jiajun678    时间: 2014-4-2 16:43
感受颇深
作者: lixichunedu    时间: 2014-4-5 14:44
讲解的很好,受益匪浅
作者: 芦苇不是草    时间: 2014-5-4 09:47
真心不错、不错。。。。
作者: 涉世未深    时间: 2014-5-15 19:04
汇编太难了,不想学。C一句话能搞定的,汇编一大篇才能搞定。
作者: ylyn029    时间: 2014-7-4 16:13
理解了,单片机四种并行口。通俗易懂啊
作者: 匹夫    时间: 2014-8-5 08:39
电路看起来有些费劲,但正如老是所说,会用就可以。
作者: 覃明明    时间: 2014-9-24 22:48
又上了一堂深刻的课,楼主辛苦你了
作者: yjj2011    时间: 2014-12-16 21:31
谢谢楼主,学习中
作者: yjj2011    时间: 2014-12-17 10:25
受益很大
作者: ardu    时间: 2014-12-18 20:00
初学者
作者: hans11    时间: 2014-12-26 00:22
学习中
作者: dimozun    时间: 2015-3-31 10:50
对呀,从这一章开始有点比较难懂了,继续努力,FIGHT
作者: b4082    时间: 2015-4-2 11:34
学习了,感谢分享!
作者: moyuqilin    时间: 2015-5-4 20:15
以前一直自学用c来编程,总是听说汇编语言的效率高。果然是的
作者: 51-danpianji    时间: 2015-5-10 21:16
非常谢谢
作者: skg_wj    时间: 2015-5-18 11:46
看了,感觉很不错!
作者: 思辰    时间: 2015-5-19 14:58
怎么前后联系不起来呢,是不是少了一些
作者: 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
初学者,看现在有点难理解
作者: 坚毅追梦人    时间: 2016-9-24 19:30
请问楼主,“先看P1口的一位的结构示意图(只画出了输出部份):从图中能看出,开关的打开和合上。。。”对应的图在哪里能看到?
作者: yjs    时间: 2016-9-26 07:51
很详细的话
作者: B型血    时间: 2016-11-9 19:51
并行结构基本不懂了,缺少硬件图,理解的比较费劲
作者: (xiaobai)    时间: 2016-11-16 13:06
问一下这个开发板去哪里买
作者: v115488    时间: 2016-12-7 22:21
试验四,用的电路图是那个?找不到电路图,看着好难理解。
作者: alainyyj    时间: 2016-12-12 18:04
p1并行口图上没有开关,是说的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
受益匪浅 好好学习,坚持再坚持!!
作者: js_gary    时间: 2017-12-4 11:42
不错,写得很好
作者: wyuejun8888    时间: 2017-12-8 10:28
感谢分享如此之详细
作者: 旺旺0000000    时间: 2017-12-17 13:58
感谢楼主资源,刚好学到单片机,对我帮助很大
作者: xiaoqiandao    时间: 2017-12-18 20:28
膜拜大佬分享~
作者: luohui8008    时间: 2018-1-11 18:00
很给力!
作者: liuzclzc    时间: 2018-1-16 20:23
这节讲的是输入输出接口。
作者: ft2316377    时间: 2018-3-3 21:15
图片字体颜色看起来费劲
作者: 太阳黑子1    时间: 2018-4-13 20:52
真的是非常好
作者: linyingjiang    时间: 2018-5-25 17:19
基础的沉淀对后期很重要,赞一个
作者: 阳春巴人    时间: 2018-6-12 15:31
作者写得很通俗易懂,受益匪浅。毕业八年之后,再又重新开始学习单片机,有种温故而新的感觉。
作者: keneng    时间: 2018-6-25 16:09
这个内容我觉得理解一下就行了。
作者: 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
涉世未深 发表于 2014-5-15 19:04
**** 作者被禁止或删除 内容自动屏蔽 ****

其实汇编比C语言简练,只是汇编不易于移植
作者: cedtek    时间: 2020-12-29 16:13
PPT动态演示加深了对CPU读引脚和读锁存方式的理解,从前面的对位的操作到这节对字节的操作也让我对并行口的理解更加清楚了,感谢LZ
作者: bard12333    时间: 2021-3-11 15:58
是不是缺少图?后面没看懂
作者: cedtek    时间: 2021-11-3 15:38
貌似缺少了几张图片
作者: cedtek    时间: 2024-1-6 18:10
blink.a51 内容如下:
  1. ; 外设端口切换寄存器 2 的地址
  2. P_SW2   DATA    0BAH

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

  6.         ORG     0000H        ; 设置程序的起始地址为 0000H,即程序的入口点
  7.         LJMP    MAIN         ; 通过长跳转指令 (LJMP) 跳转到 MAIN 主程序的地址
  8.         ORG     0100H        ; 设置程序的重定位地址为 0100H,用于存放中断向量等信息

  9. ; 主程序:
  10. MAIN:
  11.     MOV SP, #5FH             ; 设置堆栈指针
  12.    
  13.     ORL P_SW2, #80H          ; 使能访问 XFR
  14.    
  15.     MOV P1M0, #00H           ; 清空 P1M0 寄存器
  16.     MOV P1M1, #00H           ; 清空 P1M1 寄存器
  17.    
  18.     MOV P1M0, #0FFH         ;设置 P1 为推挽输出模式。#0FFH 中的 0 不能省略
  19.     MOV P1M1, #00H
  20.    
  21.     LJMP LOOP                ; 跳转到循环体

  22. ; 循环体
  23. LOOP:
  24.     MOV P1, #0FFH            ; 将 0xFF 赋值给 P1 寄存器,即将端口 P1 的所有引脚设为高电平,熄灭小灯
  25.     LCALL DELAY_1S           ; 延时一段时间
  26.     MOV P1, #00H             ; 将 0 赋值给 P1 寄存器,即将端口 P1 的所有引脚设为低电平,点亮小灯
  27.     LCALL DELAY_1S           ; 延时一段时间
  28.     AJMP LOOP                ; 无条件跳转到循环体

  29. ; ====================延时1秒子程序====================
  30. DELAY_1S:         ; 延时子程序,12MHz 晶振延时 1.002035 秒
  31.     MOV R4, #10   ; 设置 R4 寄存器为 10,1 指令周期
  32.    
  33. L3:
  34.     MOV R2, #200  ; 设置 R2 寄存器为 200,1 指令周期
  35.    
  36. L1:
  37.     MOV R3, #249  ; 设置 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. ; 循环体延时时间: [(249*2+1+2)*200+1+2]*10*12/12000000=1.002032s
  46. ; 加上 LCALL 指令和第一条 MOV 指令以及最后一条 RET 指令算出来整个函数的时间为 1.002035s
  47. ; =====================================================

  48. END
复制代码

Proteus 8 Professional 仿真结果如下图:


作者: cedtek    时间: 2024-1-6 19:14
阳春巴人 发表于 2018-6-12 15:31
作者写得很通俗易懂,受益匪浅。毕业八年之后,再又重新开始学习单片机,有种温故而新的感觉。

考古
我也是毕业后又倒回来浏览这个教程
作者: cedtek    时间: 2024-1-6 19:19
图 3 好像缺少了,我觉得可以使用烧烤的铁签来比作累加器 A
作者: cedtek    时间: 2024-1-6 19:35
烧烤时使用的铁签子来理解累加器 A下面这行代码我是这样理解的:P3 寄存器的内容好比烧烤食材,此时累加器 A 好比打荷时还没有穿上“衣服”的铁签子,这行代码执行过程不就和将烧烤食材串在铁签子上一样吗?
  1. MOV A, P3
复制代码
那么下面这行代码又该如何理解呢?

  1. MOV P1, A
复制代码
此时
累加器 A 好比烤制完成后的一串烤串P1 寄存器好比我这贪吃的嘴,这行代码执行过程对应过来就是撸串




作者: cedtek    时间: 2024-1-7 08:48
按键控制LED的亮灭
汇编程序:
  1. ; ====================按键控制LED====================
  2. ; 外设端口切换寄存器 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   ; 设置程序的起始地址为 0000H,即程序的入口点
  10.         LJMP    MAIN    ; 通过长跳转指令 (LJMP) 跳转到 MAIN 主程序的地址
  11.         ORG     0100H   ; 设置程序的重定位地址为 0100H,用于存放中断向量等信息

  12. ; 主程序:
  13. MAIN:
  14.     MOV SP, #5FH        ; 设置堆栈指针
  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     ;设置 P1 为推挽输出模式。#0FFH 中的 0 不能省略
  24.     MOV P1M1, #00H
  25.     MOV P3M0, #00H      ;设置 P3.2、P3.3、P3.4、P3.5 为高阻输入模式。
  26.     MOV P3M1, #3CH
  27.    
  28.     MOV P1, #0FFH       ; 将 0xFF 赋值给 P1 寄存器,即将端口 P1 的所有引脚设为高电平,熄灭小灯
  29.    
  30.     LJMP LOOP           ; 跳转到循环体

  31. ; 循环体
  32. LOOP:
  33.     MOV A, P3   ; 将 P3 寄存器的值移动到累加器 A
  34.     MOV P1, A   ; 将累加器 A 的值移动到端口 P1,实现 P1 输出与 P3 寄存器相同的值
  35.     LJMP LOOP   ; 无条件跳转到循环体,实现持续循环

  36. END
  37. ; ================================================================
复制代码
硬件连接:


Proteus 8 Professional 仿真结果:
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 发表于 2015-12-21 09:13
研究的真细致,看到各种门就头疼

小时候脑袋被门挤了,导致现在看到门就头疼
作者: cedtek    时间: 2024-1-7 11:11
v115488 发表于 2016-12-7 22:21
试验四,用的电路图是那个?找不到电路图,看着好难理解。

下面这个是我自己根据文字描述猜测的硬件连接原理图,希望对你有所帮助

51hei.png (147.44 KB, 下载次数: 184)

51hei.png

作者: cedtek    时间: 2024-1-7 11:12
cp3_kuo 发表于 2017-9-1 16:12
文中提到的原理图在那里?

51hei.png (147.44 KB, 下载次数: 186)

51hei.png





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1