收藏 分享(赏)

2014第4章AT89S51的并行IO端口的结构及工作原理.ppt

上传人:精品资料 文档编号:10782569 上传时间:2020-01-08 格式:PPT 页数:85 大小:3.79MB
下载 相关 举报
2014第4章AT89S51的并行IO端口的结构及工作原理.ppt_第1页
第1页 / 共85页
2014第4章AT89S51的并行IO端口的结构及工作原理.ppt_第2页
第2页 / 共85页
2014第4章AT89S51的并行IO端口的结构及工作原理.ppt_第3页
第3页 / 共85页
2014第4章AT89S51的并行IO端口的结构及工作原理.ppt_第4页
第4页 / 共85页
2014第4章AT89S51的并行IO端口的结构及工作原理.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

1、AT89S51片内并行端口的原理及编程,概述,并行端口,简称并口。所谓“并行”,是指8位数据同时通过并行线进行传送。 并行端口数据传输速率大大提高 并行传输的线路长度受到限制,因为随着长度的增加,干扰就会增加,数据也容易出错。,概述,可以将“0”与“1”转换为电压信号的端口 单片机中最常用的TTL电平:0V代表“0”,+5V代表“1” AT89S51单片机有4个8位I/O口:P0,P1,P2,P3,I/O口概述,I/O口的性能指标,灌电流能力:能够流入IO口的最大电流 拉电流能力:能够从IO口流出的最大电流 上拉电阻与下拉电阻 最大输入电压,为什么要使用拉电阻,数字电路有三种状态:高电平、低电

2、平和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定 。 为加大输出引脚的驱动能力 。上拉电阻是用来解决总线驱动能力不足时提供电流的,一般说法是拉电流。下拉电阻是用来吸收电流的。 在CMOS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻降低输入阻抗,提供泄荷通路。 芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。 提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。 长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰 。,上拉/下拉电阻阻

3、值的选择原则,从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。 从确保足够的驱动电流考虑应当足够小;电阻小,电流大。 对于高速电路,过大的上拉/下拉电阻可能边沿变平缓。综合考虑,关于开漏输出,开路电路中提到的“漏”就是指MOSFET的漏级。 MOSFET即金属-氧化层-半导体-场效晶体管 : Metal-Oxide-Semiconductor Field-Effect Transistor 开漏电路就是指以MOSFET的漏极为输出的电路。一般的用法是在漏极外部的电路上添加上拉电阻,因此,完整的开漏电路应该由开漏器件和开漏上拉电阻组成。 因此,开漏输出,在使用时需外接上拉电阻,利用外

4、部电路的驱动能力,减少IC内部的功耗。 可以将多个开漏输出的脚连接到一条线上,形成“与逻辑”,当任意一个变低后,开漏线上的逻辑就为0。,G栅极 D漏极 S源极 这图里面的MOS管是N沟道的,工作原理:只要G上的电压比S上的电压大5-6V,MOS管就开始导通,就有电流从S流向D.,关于推挽输出,一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。 如果输出级有两个三极管,始终处于一个导通、一个截止的状态,也就是两个三级管推挽相连,这样的电路结构称为推拉式电路或图腾柱(Totem-pole)输出电路 。 比如功放的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加

5、时,另一个“臂”的电流则减小,二者的状态轮流转换。对负载而言,好象是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。适用于低电压大电流的场合 两只对称的功率开关管每次只有一个导通,所以导通损耗小。,并行I / O 端口的使用,单片机总共有P0、P1、P2、P3四个8位准双向输入输出端口,共占32根引脚。 可以作为输出口,直接连接输出设备(如发光二极管),也可以作为输入口,直接连接输入设备(如开关设备)。还可以外接继电器、显示器、蜂鸣器、键盘等。 每个端口都有锁存器(即专用寄存器P0P3) 、输出驱动器和输入缓冲器。4个I/O端口都能作输入输出口用,其中P0和P2通常用于对外部存储器的访问

6、。 在具有片外扩展存储器的系统中,P2口作为高8位地址线,P0口分时作为低8位地址线和双向数据总线。,reg51.h这个文件中将所有寄存器映射为同名的变量,对这些变量的读写相当于对寄存器的读写,IO口的寄存器PX(X代表0-3) 输出状态IO寄存器设置PX某一位置1或0,对应IO口相应位的电平高低在读取PX某一位之前,要向该位写入1 (汇编语言需进行此步操作,C语言编译器会自动完成此步,C语言编程可省略此步骤),然后读回数据真实反映该位IO口的输入状态。,IO口的操作(位运算回顾),将某一位置1 (相应位与1进行按位或运算) 将某一位置0 (相应位与0按位进行与运算) 将某一位取反 (相应位与

7、1进行按位异或运算) 特有的位操作 sbit,下图为P0口的某位P0.n(n=07)结构图,它由一个输出锁存器、两个三态输入缓冲器和输出驱动电路及控制电路组成。从图中可以看出,P0口既可以作为I/O用,也可以作为地址/数据线用。 准双向口 内部无上拉电阻,T1,T2,P0口逻辑电路,当P0口作为输出口使用时,内部总线将数据送入锁存器,CPU发出控制信号“0”封锁“与”门,将输出上拉场效应管T1截止,同时多路开关MUX打向下面,把锁存器与输出驱动场效应管T2栅极接通。形成的P0口输出电路为漏极开路输出。,P0口逻辑电路,P0口用作输出口时,CPU的写脉冲加在D锁存器的CP端,内部总线上的数据写入

8、D锁存器,并由引脚P0.x输出。当锁存器为1时,/Q端为0,下方场效应管截止,输出为漏极开路,必须外接上拉电阻才能有高电平输出。当D锁存器为0时,下方场效应管管导通,P0口输出为低电平。,P0口逻辑电路,经过锁存器,T2反相后正好是内部总线的数据,送到P0口引脚输出。故内部总线与P0口同相。,P0口逻辑电路,P0口作为输出口使用:由于输出驱动级是漏极开路电路,若驱动NMOS或其它拉电流负载时,需要外接上拉电阻。P0的输出级可驱动8个LSTTL负载。,P0口逻辑电路, 输入时-分读引脚或读锁存器 读端口是指通过上面的缓冲器读锁存器Q端的状态。读端口是为了适应对I/O口进行“读-修改-写”操作语句

9、的需要。例如下面的C51语句:P0=P0 /将P0口的低4位引脚清0输出,原因:如果此时该端口的负载恰是一个晶体管基极,且原端口输出值为1,那么导通了的PN结会把端口引脚高电平拉低;若此时直接读端口引脚信号,将会把原输出的“1”电平误读为“0”电平。现采用读输出锁存器代替读引脚,图中,上面的三态缓冲器就为读锁存器Q端信号而设,读输出锁存器可避免上述可能发生的错误。, 输入时-分读引脚或读锁存器(读端口) 所谓读引脚,就是读芯片引脚的状态,这时使用下方的数据缓冲器,由“读引脚”信号把缓冲器打开,把端口引脚上的数据从缓冲器通过内部总线读进来。,P0口逻辑电路,51单片机的P1、P2、P3口为准双向

10、口,输出高电平是由内部开关管与地断开,上拉到高电平,如果内部的开关管与地是通的,那么输出的是低电平“0”,这样怎么读端口都会一直是低电平,所以要先写个“1”,锁存器的输出状态=1(即/Q端为0),使下方场效应管截止,这样内部开关管就与地断开了,读到的电平就是外部的电平了。,准双向口:从图中可以看出,在读入端口数据时,由于输出驱动FET并接在引脚上,如果T2导通,就会将输入的高电平拉成低电平,产生误读。所以在端口进行输入操作前,应先向端口锁存器写“1”,使T2截止,引脚处于悬浮状态,变为高阻抗输入。这就是所谓的准双向口。,P0作为地址/数据总线,在系统扩展时,P0端口作为地址/数据总线使用时,分

11、为:P0引脚输出地址/数据信息。,除了I/O功能以外,当单片机外扩存储器或I/O时,P0口是作为单片机系统的复用地址/数据线使用的,一般称为地址/数据分时复用引脚。当输出地址或数据时,由内部发出控制信号,使“控制”端为高电平,打开与门,并使多路开关MUX处于内部地址/数据线与驱动场效应管栅极反相接通状态。此时,输出驱动电路由于两个FET处于反相,形成推拉式电路结构,使负载能力大为提高。,P0口的结构,CPU发出控制电平“1”,打开“与”门,又使多路开关MUX把CPU的地址/数据总线与T2栅极反相接通,输出地址或数据。由图上可以看出,上下两个FET处于反相,构成了推拉式的输出电路,其负载能力大大

12、增强。,P0作为地址/数据总线,当输出的地址/数据信息为1时,“与门”输出为1,上方的场效应管管导通,下方的场效应管截止,P0.x引脚输出为1;当输出的地址/数据信息为0时,“与门”输出为0,上方的场效应管管截止,下方的场效应管导通,P0.x引脚输出为0。P0.x引脚的输出状态随地址/数据状态的变化而变化。,P0口的结构,P0引脚输出地址/输入数据控制信号为0,MUX接通锁存器的/Q端。CPU自动向P0口写入FFH,使下方的场效应管截止。由于控制信号为0,上方的场效应管也截止,从而保证数据信息的高阻抗输入。“读引脚”控制信号有效,下面的缓冲器打开,外部数据读入内部总线。,P0作为地址/数据总线

13、,-真正的双向口,真正的双向口,具有高电平、低电平和高阻抗输入3种状态的端口。因此,P0口作为地址/数据总线使用时是一个真正的双向端口。简称双向口。,P0口作为一般I/O口输出口使用时,由于T1截止,输出电路是漏极开路,需再外接上拉电阻才有高电平输出。 P0口作为输入口使用时,应区分读引脚和读端口。读引脚时,必须先向电路中的锁存器写入“1”,使输出级的FET截止引脚处于高阻态,以避免锁存器状态为“0”时对引脚读入的干扰。,P0口应用注意事项,P0口必须接上拉电阻; 在读信号之前数据之前,先要向相应的锁存器做写1操作的I/O口称为准双向口; 三态输入缓冲器的作用: (ANL P0,A),总结特点

14、: (1)P0口可作通用I / O口使用,又可作地址/数据总线口; (2)P0既可按字节寻址,又可按位寻址; (3)作地址/数据总线口时,P0是一真正双向口,用作与外部存储器的连接,输出低8位地址和输出/输入8位数据。 (4)P0口作通用I / O口时,输出是开漏输出,需要在片外接上拉电阻,端口不存在高阻抗状态,只是一个准双向口。为保证引脚信号的正确读入,应首先向锁存器写1.单片机复位后,锁存器自动被置1;当P0口由输出状态变为输入状态时,应首先置锁存器为1,方可执行输入操作。,P1口的内部结构,P1口:单功能I/O口,字节地址90H,位地址90H97H。,P1口的位电路的结构:它由一个输出锁

15、存器、两个三态输入缓冲器和输出驱动电路组成-准双向口。,P1口的内部结构,P1口工作过程分析,P1口作为输出口时,若CPU输出1,Q=1,/Q=0,场效应管截止,P1口引脚的输出为1;若CPU输出0,Q=0,/Q=1,场效应管截止导通,P1口引脚的输出为0;,P1口的内部结构,P1口工作过程分析,作为输入口时,分为读锁存器和读引脚两种方式。读锁存器时,锁存器的输出端Q的状态经输入缓冲器进入内部总线。,P1口的内部结构,P1口工作过程分析,读引脚时,先向锁存器写1,使场效应管截止,P1.x引脚上的电平经输入缓冲器进入内部总线。,P1口应用注意,P1口是准双向口,只能作为通用I/O口使用。 P1口

16、作为输出口使用时,无需再外接上拉电阻。 P1口作为输入口使用时,应区分读引脚和读端口。读引脚时,必须先向电路中的锁存器写入“1”,使输出级的FET截止。,P2的内部结构,P2口:双功能口, P2口某一位的电路包括:,(1)1个数据输出锁存器; (2)两个三态数据输入缓冲器; (3)1个多路转接开关MUX,它的一个输入是锁存器的Q端,两一个输入是地址的高8位。 (4)输出驱动电路,由场效应管管和内部上拉电阻组成。,P2的内部结构,P2口工作过程分析,(1)P2口作为普通I/O口 在内部控制信号作用下,MUX与锁存器的Q端接通。CPU输出1时,Q=1,场效应管截止,P2.x引脚输出1; CPU输出

17、0时,Q=0,场效应管导通,P2.x引脚输出0;,P2的内部结构,P2口工作过程分析,(1)P2口作为普通I/O口 输入时,分为读锁存器和读引脚两种方式。读锁存器时,锁存器的输出端Q的状态经输入缓冲器进入内部总线。读引脚时,先向锁存器写1,使场效应管截止,P1.x引脚上的电平经输入缓冲器进入内部总线。,(2)P2口作为地址总线 CPU发出控制电平“1”,使多路开关MUX倒内部地址线。此时,P2输出高8位地址。当地址线为0时,场效应管导通,P2口引脚输出0;当地址线为1时,场效应管截止,P2口引脚输出1。,P2口的特点: (1) P2口是准双向口,在实际应用中,可以用于为系统提供高8位地址,也能

18、作为通用I/O口使用。 (2) P2口作为通用I/O口的输出口使用时,与P1口一样无需再外接上拉电阻。 (3) P2口作为通用I/O口的输入口使用时,应区分读引脚和读端口。读引脚时,必须先向锁存器写入“1”。 (4)可位寻址,也可按字节寻址。,P3的内部结构,P3口:电路中增加了引脚的第二功能。,P3口某一位的电路包括: (1)1个数据输出锁存器;(2)3个三态数据输入缓冲器; (3)输出驱动电路,由“与非门”、场效应管和内部上拉电阻组成。,P3的内部结构,P3口工作过程分析,(1)P3口用作第二输入/输出功能 当选择第二输出功能时,该位的锁存器需要置“1”,使“与非门”为开启状态。当第二输出

19、为1时,场效应管截止,P3.x引脚输出为1;当第二输出为0时,场效应管导通,P3.x引脚输出为0;,P3的内部结构,P3口工作过程分析,(1)P3口用作第二输入/输出功能 当选择第二输入功能时,该位的锁存器和第二输出功能端需要置“1”, 保证场效应管截止,P3.x引脚的信息由输入缓冲器的输出获得。,P3的内部结构,P3口工作过程分析,(2)P3口用作第一功能:通用I/O口 当P3口用作第一功能通用输出时,第二输出功能端应保持高电平,“与非门”为开启状态。CPU输出1时,Q=1,场效应管截止,P3.x引脚输出为1; CPU输出0时,Q=0,场效应管0导通,P3.x引脚输出为0;,P3的内部结构,

20、P3口工作过程分析,(2) P3口用作第一功能:通用I/O口 当P3口用作第一功能通用输入时,该位的锁存器和第二输出功能端需要置“1”, 保证场效应管截止,P3.x引脚的信息通过BUF3和BUF2进入内部总线,完成“读引脚”操作。,BUF3,BUF2,BUF1,P3的内部结构,P3口工作过程分析,(2) P3口用作第一功能:通用I/O口 当P3口用作第一功能通用输入时,也可执行读锁存器操作,此时Q端信息经过缓冲器BUF1进入内部总线。,BUF3,BUF2,BUF1,P3口特点: (1)作通用I / O时,“选择输出功能”应保持高电平, (2)工作于第二功能时,该位锁存器应置1, (3)作输入口

21、时,输出锁存器和选择输出功能端都应置1 (4)第二功能专用输入,取自输入通道缓冲器 (BUF3)输出端,通用输入信号取自“读引脚”。,综上所述:当P0作为I/O口使用时,特别是作为输出时,输出级属于开漏电路,必须外接上拉电阻才会有高电平输出;如果作为输入,必须先向相应的锁存器写“1”,才不会影响输入电平。 当CPU内部控制信号为“1”时,P0口作为地址/数据总线使用,这时,P0口就无法再作为I/O口使用了。,P1、P2 和P3 口为准双向口, 在内部差别不大, 但使用功能有所不同。 P1口是用户专用 8 位准双向I/O口, 具有通用输入/输出功能, 每一位都能独立地设定为输入或输出。当有输出方

22、式变为输入方式时, 该位的锁存器必须写入“1”, 然后才能进入输入操作。 P2口是 8 位准双向I/O口。外接I/O设备时, 可作为扩展系统的地址总线, 输出高8位地址, 与P0 口一起组成 16 位地址总线。 对于 8031 而言, P2 口一般只作为地址总线使用, 而不作为I/O线直接与外部设备相连。,小结: 1、P0口:地址低8位与数据线分时使用端口, 2、P1口:按位可编址的输入输出端口, 3、P2口:地址高8位输出口 4、P3口:双功能口。若不用第二功能,也可作通用I / O 口。 5、按三总线划分:,地址线:P0低八位地址,P2高八地址; 数据线:P0输入输出8位数据; 控制线:P

23、3口的8位加上/PSEN、ALE共同完成 控制总线。,LED特性曲线,P1-P3口驱动LED发光二极管的问题,P1-P3口驱动LED发光二极管的问题,并行I/O端口的C51编程举例,从左到右流水灯,左右来回循环流水灯,(1)数组的字节操作实现 (2)移位运算符实现: (3)库函数实现:_cror_和_crol_在使用前,需要将头文件包含进来:,#include #define uchar unsigned char uchar tab=0xfe,0xfd,oxfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfe; void dela

24、y() uchar i,j;for(i=0;i255;i+)for(j=0;j255;j+); ,(1)数组的字节操作实现 建立一个字符型数组,将8个LED显示的8位数据作为数组元素,依次送到P1口来实现。,void main() uchar i;while(1)for(i=0;i16;i+)P1=tabi;delay(); ,(2)移位运算符实现 #include #define uchar unsigned char void delay() uchar i,j;for(i=0;i255;i+)for(j=0;j255;j+); ,void main() uchar i,temp;whil

25、e(1)temp=0x01;for(i=0;i1; ,(2)用移位函数实现 #include #include #define uchar unsigned char void delay() uchar i,j;for(i=0;i255;i+)for(j=0;j255;j+); ,void main() uchar i,temp;while(1)temp=0xfe;for(i=0;i7;i+)P1=temp;delay();temp=_crol_(temp,1);for(i=0;i7;i+)P1=temp;delay();temp=_cror_(temp,1); ,开关量检测,作为输入端口使

26、用,检测开关状态。,并行I/O端口的C51编程举例,例4-3:AT89S51单片机的P1.4P1.7接4个开关S0S3, P1.0P1.3接4个发光二极管LED0LED3。编写程序,将P1.4P1.7上的4个开关的状态反映在P1.0P1.3引脚控制的4个发光二极管上。1个发光二极管的状态,对应一个开关的状态。,#include #define uchar unsigned char void main() while(1)unsigned char temp;P1=0xff;temp=P1 ,课本例题43,蜂鸣器 在许多智能家电和工业控制中都有蜂鸣器,它以发声的形式将机器状态告知人们。 工作原

27、理:当P1.0引脚输出0时,晶体管导通,在蜂鸣器两端加工作电压,蜂鸣器发出声音;当P1.0引脚输出1时,晶体管截止,蜂鸣器不发声。通过给P1.0引脚输出高低电平持续时间不同的信号,可以使得蜂鸣器发出不同频率的声音。 可以应用此原理播放音乐。,蜂鸣器实验,有源蜂鸣器:加上电流电压即可发出鸣叫声,消耗电流20mA左右;AT89S51的IO口无法提供大电流,需采用三极管扩流或采用数字芯片驱动(如74HC573),用K1开关控制报警器,程序控制P1.0输出两种不同频率的声音,模拟很逼真的报警效果,开关控制报警器,开关控制报警器 #include #define uchar unsigned char

28、#define uint unsigned int sbit SPK = P10; sbit K1 = P17; void Alarm(uchar t) uchar i,j;for(i=0;i200;i+)SPK = SPK;for(j=0;jt;j+); ,void main() while(1)if(K1=1)Alarm(90);Alarm(120); ,例:蜂鸣器演示(按键发音)设置4个按键,按下不同的按键会使蜂鸣器发出不同频率的声音。,#include #define uchar unsigned char #define uint unsigned intsbit BEEP = P3

29、7; sbit K1 = P14; sbit K2 = P15; sbit K3 = P16; sbit K4 = P17;void DelayMS(uint x) uchar t;while(x-)for(t=0;t120;t+); ,void Play(uchar t) uchar i;for(i=0;i100;i+)BEEP = BEEP;DelayMS(t);BEEP = 0; void main() P1 = 0xff;while(1)if(K1=0) Play(1);if(K2=0) Play(2);if(K3=0) Play(3);if(K4=0) Play(4); ,继电器实验

30、,继电器: 基本原理:低电压控制高电压通断,电磁铁原理。 技术指标:线圈额定电压、触电最大电压、触电最大电流。,例题:用继电器控制白炽灯,#include #define uchar unsigned char #define uint unsigned int sbit K1 = P10; sbit RELAY = P24; void DelayMS(uint ms) uchar t;while(ms-)for(t=0;t120;t+); ,void main() P1 = 0xff;RELAY = 1;while(1)if(K1=0)while(K1=0);RELAY = RELAY;De

31、layMS(20); ,模拟救护车闪灯并发出警笛声,程序执行后不断交替输出2个频率的声音,类似救护车的声音;同时闪烁2个灯。,#include sbit P10=P10;/LED0 sbit P11=P11;/LED1 sbit BEEP=P25;/喇叭输出脚 /变频声救护车报警信号输出试验 void main(void) /主程序 unsigned char n; unsigned int ul; /先点一个灯,以便2个灯轮流闪烁 P10=0; while(1) /输出约1秒钟一个频率的声音 for(ul=0;ul3000;ul+) ,for(n=0;n80;n+);/延时 BEEP=BEE

32、P; /取反输出到喇叭的信号 P10=P10;/闪灯 P11=P11;/闪灯 /输出约1秒钟另一个频率的声音 for(ul=0;ul2500;ul+) for(n=0;n100;n+); BEEP=BEEP; P10=P10; P11=P11; ,K1-K4 控制LED移位说明:按下K1时,P0口LED上移一位;按下K2时,P0口LED下移一位;按下K3时,P2口LED上移一位;按下K4时,P2口LED下移一位;,#include #include #define uchar unsigned char #define uint unsigned int void DelayMS(uint x

33、) uchar i;while(x-)for(i=200;i0;i-); ,void Move_LED() if(P1 ,void main() uchar Recent_Key=0xff;P0=0xfe;P1=0xfe;P2=0xfe;while(1)if(Recent_Key != P1)Recent_Key=P1;Move_LED();DelayMS(10); ,K1-K4 分组控制LED 说明:每次按下K1时递增点亮一只LED,全亮时再次按下则再次循环开始, K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后关闭所有LED,#include #define ucha

34、r unsigned char #define uint unsigned int void DelayMS(uint x) uchar t;while(x-)for(t=0;t120;t-); ,void main() uchar k,t,Key_State;P0 = 0xff;P1 = 0xff;while(1)t = P1;DelayMS(10);if(t != P1) continue;Key_State = t 4;k = 0;while(Key_State != 0)k+;Key_State = 1;,switch(k)case 1: if(P0 = 0x00) P0 = 0xff;P0 = 1;DelayMS(200);break;case 2: P0 = 0xf0;break;case 3: P0 = 0x0f;break;case 4: P0 = 0xff; ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报