单片机并行总线开发及模块设计(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-04 01:51:33

点击下载

作者:牛余朋,蔡艳平,成曙

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

单片机并行总线开发及模块设计

单片机并行总线开发及模块设计试读:

前言

近年来,随着单片机技术的不断提高,功能的不断完善,其应用也日趋成熟,应用领域也日趋扩大,特别是在工业测控、尖端武器、电子仪器、日用家电领域,更是因为有了单片机而生辉增色。因此,会用单片机也已经成为嵌入式电子产品开发工程师的基本技能。在设计嵌入式系统时有两种不同方案,即总线式设计方案和非总线式设计方案。

所谓总线式设计方案,就是利用单片机的读写外部RAM功能,将要设计的外部设备(如键盘、液晶显示器等)统统挂载到单片机总线上,使其统一按类似读写外部RAM功能的指令方法进行操作;而所谓非总线式设计方案,则不利用单片机的读写外部RAM功能,而是直接利用单片机I/O口读写方式进行外部设备的读写,也就是说单片机I/O口模拟单片机总线的时序来操作外部设备,所以业界工程师也把这种方式称为模拟I/O方式。

对于总线式设计方案和非总线式设计方案,这两种方案哪一种好呢?其实,这两种方案各有利弊。对于总线式设计方案来说,优点就是能够充分发挥单片机的总线读写功能,对于功能复杂的系统开发有利,且易于日后的升级和扩展,缺点是单片机读写总线时必定要产生一定的总线时间延迟,这样对于低速的单片机来说,如果设计的系统非常庞大,则需要设计人员考虑实时性要求;对于非总线式设计方案来说,最大的优点就是灵活性强,这种方案在符合设计原则的前提下,可以根据设计者的开发习惯自由选择单片机端口进行外围设备的设计,缺点是功能复杂的系统开发时,控制复杂,设计困难,且升级需要重新设计电路图。

本书主要对功能复杂的单片机系统存在的并行总行设计重点和难点进行介绍,主要解决单片机外围存储器并行总线设计、开关量输入/输出并行总线设计、A/D和D/A并行总线设计、液晶并行总线设计、键盘并行总线设计、实时时钟并行总线设计、可编程并行接口芯片设计等难点问题。本书以市场占有率较高的51单片机为例展开介绍,深入探讨了51单片机的外部并行总线扩展电路的设计原理,详细介绍了单片机与各种常见外部设备的并行总线设计开发实例,介绍了以ATMEGA128为例的AVR单片机外部并行总线扩展的原理和设计方法,并且全部进行了实验仿真。

本书由牛余朋、蔡艳平执笔,参加编写的人员还有成曙、姚良、林旭泽、曲从善、曾轩、元原,在此一并表示感谢。另外最值得感谢的是清华大学出版社的编辑,没有他们,本书不可能如期顺利出版。

由于编者水平有限,书中难免存在疏漏之处,殷切希望广大读者批评指正。编者第1章单片机基础知识1.1 概述1.1.1 单片机发展历程

单片机专业名称为Micro Controller Unit(微控制器件),是由Intel公司发明的,最早的系列是MCS-48,后来有了MCS-51。常说的51系列单片机就是MCS-51(Micro Controller System),这是一种8位的单片机。后来Intel公司把它的核心技术转让给世界上很多小公司,所以就有许多公司生产51系列兼容单片机,例如,飞利浦的87LPC系列、华邦的W78系列、达拉斯的DS87系列、现代的GSM97系列等。目前在我国比较流行的就是美国ATMEL公司的89C51,它是一种带Flash ROM的单片机,本书的内容就是基于该型号的单片机来开展相关设计和实验仿真的。讲到这里,也许有的读者会有疑问,为什么平时在各种书上看到全是讲解8031、8051等型号的单片机,二者又有什么不同呢?其实8031、8051与89C51同属于一个系列,只是89C51的单片机更新型一些。目前89C51已经被89S51代替,89S51兼容89C51,同时近几年也出现了像宏晶公司研发生产的STC89C系列的51内核的单片机,该单片机最大的特点就是可以利用串口线在线下载程序,使用非常方便,因此该系列单片机近几年占据了国内51单片机的大部分市场。1.1.2 几种常见的单片机

除了上述介绍的单片机,还经常在各种刊物上看到AVR系列和PIC系列单片机,这么多的单片机,应该先学哪一种呢?在没有学习单片机之前,这是一个令很多初学者非常困惑的问题。

AVR系列单片机是ATMEL公司生产的一种8位单片机,采用的是RISC精简指令集单片机结构,所以其技术和51系列有所不同,开发设备和51系列也是不通用的,AVR系列一条指令的运行速度可以达到纳秒级,即每秒1000000000次,是8位单片机中的高端产品,由于其出色性能,目前应用范围越来越广,大有取代51系列的趋势,所以学完51系列,还有必要学习AVR系列。PIC系列单片机则是美国MICROCHIP公司生产的另一种8位单片机,采用的也是RISC的指令集,其指令系统和开发工具与51系列更是不同,但由于其价格低和性能出色,目前用户越来越多,国内也有很多公司在推广此系列,不过PIC的影响力远没有51系列大,所以作为初学者,51系列仍然是首选。以上几种只是比较常见的系列,日常应用中还有许多其他公司生产的各种各样的单片机,例如,Motorola的MC68H系列、TI的MSP430C系列、德国的西门子PLC等,都有各自的结构体系,并不与51系列兼容,这里不再深入介绍,感兴趣的读者可在入门后自己研究,下面介绍51系列单片机的结构及组成。1.1.3 单片机的结构及组成

单片机到底是什么,究竟能做什么呢?其实单片机就是一种能进行数学和逻辑运算,根据不同使用对象完成不同控制任务的面向控制而设计的集成电路,就像在计算机中可以用不同的软件在相同的硬件上实现不同的功能。单片机其实也是如此,同样的芯片可以根据不同的要求做出截然不同的产品,只不过计算机是面向应用的,而单片机是面向控制的,例如,控制一个指示灯的亮和灭,控制一台电机的启动和停止等。那么单片机的内部究竟由哪些部件组成呢?大家都知道计算机中有很多的部件,如CPU(中央处理器)、RAM(内存条)、ROM(程序存储器)、输入/输出设备(并行口/串行口)等,在单片机中这些部件也都具备,并且全部集成在一块芯片上,这就是单片机名称的由来。如图1-1所示为单片机的典型组成结构。单片机提供静态逻辑操作功能,工作频率可以低至0Hz,支持两种软件编程的节约电源管理模式,一种是空闲模式,一种是电源关闭模式。在空闲模式下,单片机的CPU停止工作,而内部数据存储器、定时器、串口和中断系统仍然工作。在电源关闭模式下,单片机保存数据存储器的内容,晶体振荡器工作,其余的部分停止工作,直到有中断或硬件复位时,单片机芯片的其他部分才能工作。如图1-2所示是AT89S51的内部结构图。图1-1 单片机的典型组成结构图1-2 单片机AT89S51的内部结构图1.2 数的进制及位和字节的含义1.2.1 数制及其转换1. 3种基本数制

数制指的是数据的表现形式。在计算机中常用的数制有二进制数、十进制数和十六进制数。无论是什么数制,将这个数制所包含的数码个数称为基,将各个数字所具有的数值称为权。(1)十进制数(Decimal)

十进制数是日常生活中最为常用的数制形式。十进制数的基为10,其包含10个数码,即0、1、2、3、4、5、6、7、8、9。十进制数的权是以10为底的幂,每个数所处位置不同,则其代表值不同。前一个数的权值为其相邻后一个数权值的10倍。

例如,一个十进制数为2345.678D,则其代表的数值为:

2345.678D=2×103+3×102+4×101+5×100+6×10-1+7×10-2+8×10-3

从左到右各位代表的权值为:

103 102 101 100 10-1 10-2 10-3

也就是平常所说的千、百、十、个、0.1、0.01、0.001。(2)二进制数(Binary)

二进制数是计算机中的基本数据形式,所有数据在计算机中都以二进制数形式进行存储和运算。二进制数的基为2,在二进制数中只包含0和1两个数码。二进制数的权是以2为底的幂,每个数所处位置不同,则其代表值不同。前一个数的权值为其相邻后一个数权值的2倍。

例如,一个二进制数为1011.1001B,则其代表的十进制数值为:

1001.1011B=1×23+0×22+0×21+1×20+1×2-1+0×2-2+1×2-3+1×2-4

=8+0+0+1+0.5+0.25+0.125+0.0625

=9.9375

从左到右各位代表的权值为:

23 22 21 20 2-1 2-2 2-3 2-4

8 4 2 1 1/2 1/4 1/8 1/16

二进制数之所以能够成为计算机工作基本数据形式,这是由计算机中的电路工作原理决定的。计算机中的电路通常只有两种状态,在二进制数中可以用1代表电路中的高电平,用0代表电路中的低电平;或者用1代表电路中的导通,用0代表电路中的截止。采用二进制数可以方便地对电路进行计数工作。(3)十六进制数(Hexadecimal)

十六进制数的基为16,在十六进制数中包含了16个数码,各个数码表示如下:

0 1 2 3 4 5 6 7 8 9 A B C D E F

十六进制数的权是以16为底的幂,与二进制数相同,每个数所处位置不同,则其代表值不同。前一个数的权值为其相邻后一个数权值的16倍。

例如,一个十六进制数为F72.C4H,则其代表的十进制数值为:

F72.C4H=15×162+7×161+2×160+12×16-1+4×16-2

=3954.765625

从左到右各位代表的权值为:

162 161 160 16-1 16-2

相对于二进制数而言,十六进制数能够用较少的位数表现较大的数值,便于书写和记忆。由于二进制数与十六进制数的转换非常简单,所以在计算机中的数值常常采用十六进制数来表示。在汇编语言中,为了将十六进制数中的A、B、C、D、E、F与字母区分开来,书写时常常会在其前面加一个0。例如F7H写作0F7H。2. 数制间的转换

由于不同数制的特性不同,常常需要将一个数转换为十进制数来理解数值大小,将一个数转换为十六进制数来编写程序,将一个数转换为二进制数来理解对应数据在计算机中的含义。下面介绍计算机中不同数制的转换方法。(1)转换为十进制数

在前面介绍数制的过程中已经介绍了二进制数和十六进制数转换为十进制数的方法。将一个二进制数或十六进制数转换为十进制数只需将该数各个数位的基与权相乘累加即可。例如:

10110101B=1×27+0×26+1×25+1×24+0×23+1×22+0×21+1×20

=181

B5H=11×161+5×160=181(2)十六进制数与二进制数的转换

由于十六进制数的基16是二进制数基2的4次方,所以二进制数与十六进制数的转换十分简单。

十六进制数转换为二进制数时,只需从右至左将各个位上的数以二进制数表示出来即可。二进制数转换为十六进制数时,整数部分需要从右至左依次将4个二进制数表示成一个十六进制数,左侧不满4个时在前面补0到4个即可。小数部分自左向右每4位一组,最后不满4位的在后面补0,写出对应的十六进制数即可。如表1-1所示为0~15的十进制数、二进制数、十六进制数的转换关系表。表1-1 不同数制的数据转换表

例如,一个二进制数10010110101B要转换为十六进制数,其过程如下:

10010110101B=0100 1011 0101=4B5H

一个十六进制数A3FBH转换为二进制数的过程如下:

A3FBH=1010 0011 1111 1011B(3)十进制数转换为二进制数或者十六进制数

将一个十进制数转换为二进制数时,对于十进制数整数部分采用“除2取整”的方法,小数部分采用“乘2取整”的方法。十进制数转换为十六进制数时可以采用类似的“除16取整”以及“乘16取整”的方法。由于十六进制数与二进制数之间的转换十分简单,在十进制数转换为十六进制数时,也可以先转换为二进制数继而转换为十六进制数。

下面以一个十进制数78.8125D为例来介绍“除2取整”以及“乘2取整”方法的使用。

78.8125D整数部分为78,转换为二进制数时将此数不停除2直到商为0为止,然后将所有余数逆向整合即可得到想要的二进制数。

如上所示将余数逆向整合得到78D=1001110B。

小数部分0.8125转换为二进制数时将该数的纯小数部分不停乘以2直至乘积为1为止,将所有结果整数部分一次组合即可得到想要的二进制数。

如上所示将整数顺次整合得到0.8125D=0.1101B。

将小数部分以及整数部分整合得到78.8125D=1001110.1101B。1.2.2 数和物理现象的关系

在数字电路中,可以用一盏灯的亮和灭来表示电平的高和低,即用“1”表示高电平(亮),用“0”表示低电平(灭),如果现在有两盏灯,那么会有几种状态呢?如表1-2所示为两盏灯的亮灭与二进制数之间的对应关系。表1-2 两盏灯的亮灭与二进制数之间的对应关系

两盏灯的组合可以表示4种状态,即00,01,10,11。这样看来,灯的亮和灭这种物理现象同数字确实有着某种联系,如果把各状态按一定的规律排好,那么电平的高或低就可以用数字来表示了,换句话说,不同的数字可以代表不同数量灯的电平高或低,例如,0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111,这16种组合就可以代表4盏灯的不同状态。1.2.3 位和字节的含义

在单片机中一盏灯(实际上是一根线)可看作一位,有0和1有两种状态,分别对应电平的低和高,是单片机最基本的数量单位,用bit来表示。8盏灯(8根线)有256种状态,这8盏灯(也就是8位)可称为一个字节,用B(即BYTE)表示。那么单片机是如何来储存这些数字所代表的字节的状态的呢?后文介绍存储器时将做详细说明。1.3 51单片机基本硬件结构1.3.1 硬件结构

前面提到过单片机的内部结构是由CPU、ROM、RAM等组成,现在介绍外部引脚。如图1-3所示为单片机的引脚图,这就是实验中要用的89C51单片机的外部引脚图。如表1-3所示为89C51单片机引脚分配表。图1-3 89C51单片机的引脚图表1-3 89C51单片机引脚分配表1.3.2 端口结构分析

从1.3.1节的硬件结构中可以看出,89C51单片机总共有4组端口,P0、P1、P2和P3,了解这4组端口的结构原理对于日后的编程会有很大的帮助,由于这4组端口结构不尽相同,下面分别介绍单片机总的4组端口。由于每组端口都是由8位组成,故在下面的讲解中,只以每组端口的其中一位来解释。1. P0口的结构及工作原理

P0口字节地址为80H,位地址80H~87H。P0端口8位中的一位结构图如图1-4所示。图1-4 P0端口位结构图

由图1-4可见,P0端口由锁存器、输入缓冲器、多路开关、一个非门、一个与门及场效应管驱动电路构成。图1-4中标号为P0.X引脚的图标,表示引脚可以是P0.0~P0.7的任何一位,即在P0口有8个与图1-4所示相同的电路组成。下面先介绍组成P0口的每个单元部分。(1)输入缓冲器

在P0口中,有两个三态的缓冲器,学过数字电路的读者都知道三态门有3个状态,即在其输出端可以是高电平、低电平,同时还有一种高阻状态(或称为禁止状态),图1-4中,上面一个是读锁存器的缓冲器,也就是说,要读取D锁存器输出端Q的数据,需要使读锁存器中这个缓冲器的三态控制端(图1-4中标号为“读锁存器”端)有效,下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为“读引脚”的三态缓冲器的控制端有效,引脚上的数据才会传输到单片机的内部数据总线上。(2)D锁存器

构成一个锁存器,通常要用一个时序电路(时序的单元电路内容请参考数字电路相关知识),一个触发器可以保存一位二进制数(即具有保持功能),在51单片机的32根I/O口线中,都是用一个D触发器来构成锁存器的。图1-4中的D锁存器,D端是数据输入端,CP是控制端(即时序控制信号输入端),Q是输出端,是反向输出端。

对于D锁存器来讲,当D输入端有一个输入信号,如果这时控制端CP没有信号(即时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及反向输出端的。如果时序控制端CP的时序脉冲到达,这时D端输入的数据就会传输到Q及端。数据传送过来后,当CP时序控制端的时序信号消失时,输出端还会保持着上次输入端D的数据(即把上次的数据锁存起来)。如果下一个时序控制脉冲信号到来,这时D端的数据才再次传送到Q端,从而改变Q端的状态。(3)多路开关

在51单片机中,当内部的存储器够用时(即不需要外扩展存储器时,这里讲的存储器包括数据存储器及程序存储器),P0口可以作为通用的输入/输出端口(即I/O)使用,对于8031(内部没有ROM)的单片机,或者编写的程序超过了单片机内部的存储器容量需要外扩存储器时,P0口就作为地址/数据总线使用。那么这个多路选择开关就是用于选择是作为普通I/O口使用还是作为地址/数据总线使用的选择开关了。从图1-4可知,当多路开关与下端接通时,P0口作为普通的I/O口使用;当多路开关是与上端接通时,P0口作为地址/数据总线使用。(4)输出驱动

从图1-4中可看出,P0口的输出是由两个MOS管组成的推拉式结构,也就是说,这两个MOS管一次只能导通一个,当Vl导通时,V2截止,当V2导通时,Vl截止。

上面已对P0口的各单元部件进行了详细的讲解,下面研究一下P0口作为I/O口及地址/数据总线使用时的具体工作过程。(1)作为I/O端口使用时的工作原理

P0口作为I/O端口使用时,多路开关的控制信号为0(低电平),如图1-4所示,多路开关的控制信号同时和与门的一个输入端相接,与门的逻辑特点是“全l出1,有0出0”,那么控制信号如果是0,这时与门输出的也是一个0(低电平),此时Vl管就截止,在多路控制开关的控制信号是0(低电平)时,多路开关是与锁存器的端相接的(即P0口作为I/O口线使用)。

P0口用作I/O口线,其由数据总线向引脚输出(即输出状态Output)的工作过程:写锁存器信号CP有效,数据总线的信号的输出流程为锁存器的输入端D→锁存器的反向输出端→多路开关→V2管的栅极→V2管的漏极→输出端P0.X。前面已经介绍过,当多路开关的控制信号为低电平0时,与门输出为低电平,Vl管是截止的,所以作为输出口时,P0是漏极开路输出状态,类似于OC门,当驱动上接电流负载时,需要外接上拉电阻。如图1-5所示就是由内部数据总线向P0口输出数据的流程图。图1-5 P0口内部数据总线向引脚输出时的流程图

P0口用作I/O口线,其由一引脚向内部数据总线输入(即输入状态Input)的工作过程,数据输入时(读P0口)有以下两种情况:

第一种情况是读引脚,即读芯片引脚上的数据。读引脚数时,读引脚缓冲器打开(即三态缓冲器的控制端要有效),通过内部数据总线输入。如图1-6所示为P0口读引脚时的流程图。图1-6 P0口读引脚时的流程图

第二种情况是读锁存器,通过打开读锁存器三态缓冲器读取锁存器输出端Q的状态。如图1-7所示为P0口读锁存器时的流程图。图1-7 P0口读锁存器时的流程图

在输入状态下,从锁存器和从引脚上读取的信号一般是一致的,但也有例外。例如,当从内部总线输出低电平后,锁存器Q=0,=l,场效应管V2开通,端口线呈低电平状态,此时无论端口线上外接的信号是低电平还是高电平,从引脚读入单片机的信号都是低电平,因而不能正确地读入端口引脚上的信号。又如,当从内部总线输出高电平后,锁存器Q=1,=0,场效应管V2截止,如果外接引脚信号为低电平,从引脚上读入的信号就与从锁存器读入的信号不同。为此,8031单片机在对端口P0~P3的输入操作有如下约定:凡属于读—改—写方式的指令,从锁存器读入信号,其他指令则从端口引脚线上读入信号。读—改—写指令的特点是,从端口输入(读)信号,在单片机内加以运算(修改)后,再输出(写)到该端口上。下面是几条读—改—写指令的示例。ORL P0, A P0→AP0INC P1 P1+1→P1DEC P3 P3-1→P3CPL P2 P2→P2

这样安排的原因在于读—改—写指令需要得到端口原输出的状态,修改后再输出,读锁存器而不是读引脚,可以避免因外部电路的原因使原端口的状态被读错。

注意:P0端口是8031单片机的总线口,分时出现数据D7~D0、低8位地址A7~A0以及三态,用来连接存储器、外部电路与外部设备。P0端口是使用最广泛的I/O端口。(2)作为地址/数据复用口使用时的工作原理

在访问外部存储器时,P0口作为地址/数据复用口使用,这时多路开关控制信号为l,与门解锁,与门输出信号电平由地址/数据线信号决定;多路开关与反相器的输出端相连,地址信号经地址/数据线→反相器→V2场效应管栅极→V2漏极输出。例如,控制信号为l,地址信号为0时,与门输出低电平,Vl管截止;反相器输出高电平,V2管导通,输出引脚的地址信号为低电平。如图1-8所示为P0口作为地址线,控制信号为1,地址信号为0时的工作流程图。图1-8 P0口作为地址线,控制信号为1,地址信号为0时的工作流程图

反之,控制信号为l、地址信号为l,与门输出为高电平,Vl管导通;反相器输出低电平,V2管截止,输出引脚的地址信号为高电平。如图1-9所示为P0口作为地址线,控制信号为1,地址信号为1时的工作流程图。图1-9 P0口作为地址线,控制信号为1,地址信号为1时的工作流程图

可见,在输出地址/数据信息时,Vl、V2管是交替导通的,负载能力很强,可以直接与外设存储器相连,无须增加总线驱动器。P0口又作为数据总线使用,在访问外部程序存储器时,P0口输出低8位地址信息后,将变为数据总线,以便读指令码(输入)。在存取指令期间,控制信号为0,Vl管截止,多路开关也跟着转向锁存器反相输出端;CPU自动将0FFH(11111111,即向D锁存器写入一个高电平1)写入P0口锁存器,使V2管截止,在读引脚信号控制下,通过读引脚三态门电路将指令码读到内部总线。如图1-10所示为P0口作为数据总线,取指期间工作流程图。图1-10 P0口作为数据总线时取指期间工作流程图

如果该指令是输出数据,如“MOVX@DPTR,A”,该指令将累加器的内容通过P0口数据总线传送到外部RAM中,则多路开关控制信号为1,与门解锁,与输出地址信号的工作流程类似,数据由地址/数据线→反相器→V2场效应管栅极→V2漏极输出。

如果该指令是输入数据(读外部数据存储器或程序存储器),如“MOVX A,@DPTR”,该指令将外部RAM某一存储单元内容通过P0口数据总线输入到累加器A中,则输入的数据仍通过读引脚三态缓冲器到内部总线,其过程类似于读取指令码流程图。

通过以上分析可以看出,当P0作为地址/数据总线使用时,在读指令码或输入数据前,CPU自动向P0口锁存器写入0FFH,破坏了P0口原来的状态。因此,不能再作为通用的I/O端口。

注意:系统设计中务必注意,程序中不能再含有以P0口作为操作数(包含源操作数和目的操作数)的指令。

当由P0口输入数据时,由于外部输入信号既加在缓冲输入端上,又加在驱动电路的漏极上。如果这时T2是导通的,则引脚上的电位始终被钳位在0电平上,输入数据不可能被正确地读入。因此,在输入数据时,应先把P0口置1,使两个输出FET均关断,使引脚“浮置”,成为高阻状态,这样才能正确地插入数据,这就是准双向口。

I/O口作为输入口时有两种工作方式,即读端口与读引脚,读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器,只有读端口时才真正地把外部的数据读入到内部总线,图1-10中的两个三角形表示的就是输入缓冲器,CPU将根据不同的指令分别发出读端口或读引脚信号以完成不同的操作,这是由硬件自动完成的。读引脚时,就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置1,然后再进行读引脚操作,否则就可能读入出错,为什么?看图1-10中,如果不对端口置1,端口锁存器原来的状态有可能为0,Q端为0,端为1,加到场效应管栅极的信号为1,该场效应管就导通,对地呈现低阻抗,此时即使引脚上输入的信号为1,也会因端口的低阻抗而使信号变低,使得外加的1信号读入后不一定是1,若先执行置1操作,则可以使场效应管截止,引脚信号直接加到三态缓冲器中,实现正确的读入,由于在输入操作时还必须附加一个准备动作,所以这类I/O口被称为准双向口,89C51的P0、P1、P2、P3口作为输入时都是准双向口。接下来再看另一个问题,从图1-10中可以看出,这4个端口还有一个差别,除了P1口外,P0、P2、P3口都还有其他功能,这些功能又作什么用的呢?下面就来详细讲解这个问题。

每个I/O端口都有一个8位数据锁存器和两个8位数据缓冲器。P0~P3(8位锁存器)是SFR,有各自的端口地址,可直接用指令寻址,用于存放需要输出的数据。数据输入时只有缓冲没有锁存,各引脚上输入的数据必须一直保持到CPU将其读走为止,如图1-11所示为P0位结构图。图1-11 P0位结构图

从图1-11中可以看出,P0口的内部有一个二选一的选择器,受内部信号的控制,如果在图1-11中的位置,则处在I/O口工作方式,此时相当于一个准双向口输入,须先将P0口置1,每根口线可以独立定义为输入或输出,但是必须在口线上加上拉电阻,如果将开关拨向另一个方向,则作为地址/数据复用总线用,此时不能逐位定义为输入/输出,有两种用法,当作数据总线用时输入8位数据,当作地址总线用时则输出低8位地址,注意,当P0口作为地址/数据复用总线用之后就不能再作I/O口使用了。那么什么叫做地址/数据复用?这其实是当单片机的并行口不够用时需要扩展输入/输出口时的一种用法,具体使用方法会在后续的章节中逐步讲解。

利用P0口进行扩展外部存储器和I/O时,P0口将作为地址和数据分时复用,CPU发控制信号,打开与门,使MUX打向上边,形成推拉式结构,数据信号可直接读入或输出到内部总线。利用P0作为通用I/O时,此时P0口是一个准双向口,CPU发控制信号,封锁与门,使上拉管截止,MUX打向下边,与D触发器Q连接。

输入程序举例:MOV P0, #FFH

输出程序举例:MOV A, P02. P1口的结构及工作原理

P1口字节地址为90H,位地址为90H~97H,如图1-12所示为P1位结构图。图1-12 P1位结构图

与P0不同,P1口只能作为I/O口使用,无MUX,但其内部有一个上拉电阻,所以连接外围负载时不需要外接上拉电阻,这一点P1、P2、P3都一样。

输入程序举例:MOV P1, #FFHMOV A, P1

输出程序举例:MOV A, P13. P2口的结构及工作原理

P2口字节地址为A0H,位地址为A0H~A7H,如图1-13所示为P2位结构图。图1-13 P2位结构图

P2口作为I/O口线时用法与P0口一样,当内部开关拨向另一个方向,即作地址输出时,可以输出程序存储器或外部数据存储器的高8位地址,并与P0口输出的低地址一起构成16位的地址线。

注意:和数据总线的区别,数据总线是8位的,很多书上都会提到51单片机是8位数据总线,16位地址总线,但都不会解释有什么不同,看到这里读者应该明白二者的区别。

16位的地址总线可以寻址64KB的程序存储器或外部数据存储器,后续章节会讲解,此处要注意的是当P2口作为地址总线时,高8位地址线是8位一起输出的,不能像I/O口线那样逐位定义,这与P0口是一样的。

当P2口用来扩展外存储器和I/O时,作为高8位地址输出,当进行外部存储器或I/O设备读写操作时,CPU自动发出控制信号,打开与门,使MUX拨向上边。当P2口当作通用I/O时,CPU自动发出控制信号,MUX拨向下边,与D触发器Q连接。

输入程序举例:MOV P2, #FFHMOV A, P2

输出程序举例:MOV A, P24. P3口的结构及工作原理

P3口字节地址为B0H,位地址为B0H~B7H。如图1-14所示为P3位结构图。图1-14 P3位结构图

P3口作为I/O口线用时同其他的端口相同,也是准双向口,不同的是,P3口的每一位都有另一种功能,也叫第二功能,具体作用在用到时将详细解释。当P3口作为通用I/O口时,准双向口第二功能端保持高电平。

输入程序举例:MOV P3, #FFHMOV A, P3

输出程序举例:MOV A, P3

当P3口作为第二功能时,锁存器输出Q=1,如表1-4所示为P3口第二功能列表。表1-4 P3口第二功能列表

既然单片机的引脚有第二功能,那么CPU是如何识别的呢?这是一个令许多初学者困惑的问题,其实单片机的第二功能是不需要人工干预的,也就是说只要CPU执行到相应的指令,就自动转成了第二功能。

思考:输入和输出口简称I/O口,是单片机与外部电路接口的唯一途径,4个并行口的结构是有一定区别的,如何根据系统的设计要求和产品用途来正确灵活地使用是初学者必须掌握的基本功,还需要清楚其功能和用途。5. 应用注意事项(1)在无片外扩展存储器的系统中,这4个端口的每一位都可以作为准双向通用I/O端口使用。在具有片外扩展存储器的系统中,P2口作为高8位地址线,P0口作为双向总线,分时作为低8位地址和数据的输入/输出线。(2)P0口作为通用双向I/O口使用时,必须外接上拉电阻。(3)P3口除了作通用I/O口使用外,各位还具有第二功能。当P3口某一位用于第二功能作输出时,则不能再作通用I/O口使用。(4)当P0~P4端口用作输入时,为了避免误读,都必须先向对应的输出锁存器写入1,使FET截止,然后再读端口引脚,例如以下程序:MOV P1, #0FFHMOV A, P11.4 单片机存储器知识介绍1.4.1 概述1. 存储器的工作原理

存储器就是用来存放数据的地方,是利用电平的高或低来存放数据的,也就是说,存储器实际上存放的是电平的高或低的状态,而不是习惯上认为的1、2、3、4这样的数字。如图1-15所示为存储器的内部结构示意图。图1-15 存储器的内部结构示意图

从图1-15可以看出,一个存储器就像一个小抽屉,一个小抽屉里有8个小空间,也就是单片机的8位小盒子,每个小盒子用来存放1位电荷,电荷通过与其相连的电线传进来或释放掉,至于电荷在小盒子里是怎样存放的,可以把电线想象成水管,小盒子里的电荷就像是水,这样就好理解了,存储器中的一个小抽屉称为一个单元,相当于1个字节,而一个小盒子就相当于1位,有了这样一个构造,就可以开始存放数据了。例如,要放进一个数据00011010,只要把第2、4、5号小盒子里存满电荷,而其他小盒子里的电荷放掉即可。可是问题又出来了,一个存储器有好多相同的单元,线是并联的,看D7~D0在放

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载