网站建设科技公司,网站中文域名到期有没有影响,建站推广文案,法学网站阵地建设一、 51单片机串行口工作原理MCS-51系列单片机片内有一个串行I#xff0f;O端口#xff0c;通过引脚RXD(P3#xff0e;0)和TXD(P3#xff0e;1)可与外设电路进行全双工的串行异步通信。1#xff0e;串行端口的基本特点8031单片机的串行端口有4种基本工作方式#xff0c;通…一、 51单片机串行口工作原理MCS-51系列单片机片内有一个串行IO端口通过引脚RXD(P30)和TXD(P31)可与外设电路进行全双工的串行异步通信。1串行端口的基本特点8031单片机的串行端口有4种基本工作方式通过编程设置可以使其工作在任一方式以满足不同应用场合的需要。其中方式0主要用于外接移位寄存器以扩展单片机的IO电路方式1多用于双机之间或与外设电路的通信方式23除有方式l的功能外还可用作多机通信以构成分布式多微机系统。串行端口有两个控制寄存器用来设置工作方式、发送或接收的状态、特征位、数据传送的波特率(每秒传送的位数)以及作为中断标志等。串行端口有一个数据寄存器SBUF(在特殊功能寄存器中的字节地址为99H)该寄存器为发送和接收所共同。发送时只写不读接收时只读不写。在一定条件下向阳UF写入数据就启动了发送过程读SBUf就启动了接收过程。串行通信的波特率可以程控设定。在不同工作方式中由时钟振荡频率的分频值或由定时器Tl的定时溢出时间确定使用十分方便灵活。2串行端口的工作方式①方式08位移位寄存器输入输出方式。多用于外接移位寄存器以扩展IO端口。波特率固定为fosc/12。其中fosc为时钟频率。在方式0中串行端口作为输出时只要向串行缓冲器SBUF写入一字节数据后串行端口就把此8位数据以等的波特率从RXD引脚逐位输出(从低位到高位)此时TXD输出频率为fosc/12的同步移位脉冲。数据发送前仅管不使用中断中断标志TI还必须清零8位数据发送完后TI自动置1。如要再发送必须用软件将TI清零。串行端口作为输入时RXD为数据输入端TXD仍为同步信号输出端输出频率为fosc/12的同步移位脉冲使外部数据逐位移入RxD。当接收到8位数据(一帧)后中断标志RI自动置。如果再接收必须用软件先将RI清零。串行方式0发送和接收的时序过程见下图。②方式110位异步通信方式。其中1个起始位(0)8个数据位(由低位到高位)和1个停止位(1)。波特率由定时器T1的溢出率和SMOD位的状态确定。一条写SBUF指令就可启动数据发送过程。在发送移位时钟(由波特率确定)的同步下从TxD先送出起始位然后是8位数据位最后是停止位。这样的一帧10位数据发送完后中断标志TI置位。在允许接收的条件下(REN1)当RXD出现由1到O的负跳变时即被当成是串行发送来的一帧数据的起始位从而启动一次接收过程。当8位数据接收完并检测到高电乎停止位后即把接收到的8位数据装入SBUF置位RI一帧数据的接收过程就完成了。方式1的数据传送波特率可以编程设置使用范围宽其计算式为波特率2SMOD/32×(定时器T1的溢出率)其中SMOD是控制寄存器PCON中的一位程控位其取值有0和l两种状态。显然当SMOD0时波特率1/32(定时器Tl溢出率)而当SMOD1时波特率1/16(定时器T1溢出率)。所谓定时器的溢出率就是指定时器一秒钟内的溢出次数。波特率的算法以及要求一定波特率时定时器定时初值的求法后面将详细讨论。串行方式1的发送和接收过程的时序见下图。③方式2311位异步通信方式。其中1个起始位(0)8个数据位(由低位到高位)1个附加的第9位和1个停止住(1)。方式2和方式3除波特率不同外其它性能完全相同。方式23的发送、接收时序见下图。由图可见方式2和方式3与方式l的操作过程基本相同主要差别在于方式23有第9位数据。发送时发送机的这第9位数据来自该机SCON中的TB8而接收机将接收到的这第9位数据送入本机SCON中的RB8。这个第9位数据通常用作数据的奇偶检验位或在多机通信中作为地址数据的特征位。方式2和方式3的波特率计算式如下方式2的波特率2SMOD/64×fosc方式3的波特率2SMOD/32×定时器T1的溢出率由此可见在晶振时钟频率一定的条件下方式2只有两种波特率而方式3可通过编程设置成多种波特率这正是这两种方式的差别所在。3串行端口的控制寄存器串行端口共有2个控制寄存器SCON和PCON用以设置串行端口的工作方式、接收发送的运行状态、接收发送数据的特征、波特率的大小以及作为运行的中断标志等。一、P0端口的结构及工作原理P0端口8位中的一位结构图见下图由上图可见P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。再看图的右边标号为P0.X引脚的图标也就是说P0.X引脚可以是P0.0到P0.7的任何一位即在P0口有8个与上图相同的电路组成。下面我们先就组成P0口的每个单元部份跟大家介绍一下先看输入缓冲器在P0口中有两个三态的缓冲器在学数字电路时我们已知道三态门有三个状态即在其的输出端可以是高电平、低电平同时还有一种就是高阻状态(或称为禁止状态)大家看上图上面一个是读锁存器的缓冲器也就是说要读取D锁存器输出端Q的数据那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为‘读锁存器’端)有效。下面一个是读引脚的缓冲器要读取P0.X引脚上的数据也要使标号为‘读引脚’的这个三态缓冲器的控制端有效引脚上的数据才会传输到我们单片机的内部数据总线上。D锁存器构成一个锁存器通常要用一个时序电路时序的单元电路在学数字电路时我们已知道一个触发器可以保存一位的二进制数(即具有保持功能)在51单片机的32根I/O口线中都是用一个D触发器来构成锁存器的。大家看上图中的D锁存器D端是数据输入端CP是控制端(也就是时序控制信号输入端)Q是输出端Q非是反向输出端。对于D触发器来讲当D输入端有一个输入信号如果这时控制端CP没有信号(也就是时序脉冲没有到来)这时输入端D的数据是无法传输到输出端Q及反向输出端Q非的。如果时序控制端CP的时序脉冲一旦到了这时D端输入的数据就会传输到Q及Q非端。数据传送过来后当CP时序控制端的时序信号消失了这时输出端还会保持着上次输入端D的数据(即把上次的数据锁存起来了)。如果下一个时序控制脉冲信号来了这时D端的数据才再次传送到Q端从而改变Q端的状态。多路开关在51单片机中当内部的存储器够用(也就是不需要外扩展存储器时这里讲的存储器包括数据存储器及程序存储器)时P0口可以作为通用的输入输出端口(即I/O)使用对于8031(内部没有ROM)的单片机或者编写的程序超过了单片机内部的存储器容量需要外扩存储器时P0口就作为‘地址/数据’总线使用。那么这个多路选择开关就是用于选择是做为普通I/O口使用还是作为‘数据/地址’总线使用的选择开关了。大家看上图当多路开关与下面接通时P0口是作为普通的I/O口使用的当多路开关是与上面接通时P0口是作为‘地址/数据’总线使用的。输出驱动部份从上图中我们已看出P0口的输出是由两个MOS管组成的推拉式结构也就是说这两个MOS管一次只能导通一个当V1导通时V2就截止当V2导通时V1截止。与门、与非门这两个单元电路的逻辑原理我们在第四课数字及常用逻辑电路时已做过介绍不明白的同学请回到第四节去看看。前面我们已将P0口的各单元部件进行了一个详细的讲解下面我们就来研究一下P0口做为I/O口及地址/数据总线使用时的具体工作过程。1、作为I/O端口使用时的工作原理P0口作为I/O端口使用时多路开关的控制信号为0(低电平)看上图中的线线部份多路开关的控制信号同时与与门的一个输入端是相接的我们知道与门的逻辑特点是“全1出1有0出0”那么控制信号是0的话这时与门输出的也是一个0(低电平)与让的输出是0V1管就截止在多路控制开关的控制信号是0(低电平)时多路开关是与锁存器的Q非端相接的(即P0口作为I/O口线使用)。P0口用作I/O口线其由数据总线向引脚输出(即输出状态Output)的工作过程当写锁存器信号CP 有效数据总线的信号→锁存器的输入端D→锁存器的反向输出Q非端→多路开关→V2管的栅极→V2的漏极到输出端P0.X。前面我们已讲了当多路开关的控制信号为低电平0时与门输出为低电平V1管是截止的所以作为输出口时P0是漏极开路输出类似于OC门当驱动上接电流负载时需要外接上拉电阻。下图就是由内部数据总线向P0口输出数据的流程图(红色箭头)。P0口用作I/O口线其由引脚向内部数据总线输入(即输入状态Input)的工作过程数据输入时(读P0口)有两种情况1、读引脚读芯片引脚上的数据读引脚数时读引脚缓冲器打开(即三态缓冲器的控制端要有效)通过内部数据总线输入请看下图(红色简头)。2、读锁存器通过打开读锁存器三态缓冲器读取锁存器输出端Q的状态请看下图(红色箭头)在输入状态下从锁存器和从引脚上读来的信号一般是一致的但也有例外。例如当从内部总线输出低电平后锁存器Q0Q非1场效应管T2开通端口线呈低电平状态。此时无论端口线上外接的信号是低电乎还是高电平从引脚读入单片机的信号都是低电平因而不能正确地读入端口引脚上的信号。又如当从内部总线输出高电平后锁存器Q1Q非0场效应管T2截止。如外接引脚信号为低电平从引脚上读入的信号就与从锁存器读入的信号不同。为此8031单片机在对端口P0一P3的输入操作上有如下约定为此8051单片机在对端口P0一P3的输入操作上有如下约定凡属于读-修改-写方式的指令从锁存器读入信号其它指令则从端口引脚线上读入信号。读-修改-写指令的特点是从端口输入(读)信号在单片机内加以运算(修改)后再输出(写)到该端口上。下面是几条读--修改-写指令的例子。这样安排的原因在于读-修改-写指令需要得到端口原输出的状态修改后再输出读锁存器而不是读引脚可以避免因外部电路的原因而使原端口的状态被读错。P0端口是8031单片机的总线口分时出现数据D7一D0、低8位地址A7一AO以及三态用来接口存储器、外部电路与外部设备。P0端口是使用最广泛的IO端口。2、作为地址/数据复用口使用时的工作原理在访问外部存储器时P0口作为地址/数据复用口使用。这时多路开关‘控制’信号为‘1’‘与门’解锁‘与门’输出信号电平由“地址/数据”线信号决定多路开关与反相器的输出端相连地址信号经“地址/数据”线→反相器→V2场效应管栅极→V2漏极输出。例如控制信号为1地址信号为“0”时与门输出低电平V1管截止反相器输出高电平V2管导通输出引脚的地址信号为低电平。请看下图(兰色字体为电平)反之控制信号为“1”、地址信号为“1”“与门”输出为高电平V1管导通反相器输出低电平V2管截止输出引脚的地址信号为高电平。请看下图(兰色字体为电平)可见在输出“地址/数据”信息时V1、V2管是交替导通的负载能力很强可以直接与外设存储器相连无须增加总线驱动器。P0口又作为数据总线使用。在访问外部程序存储器时P0口输出低8位地址信息后将变为数据总线以便读指令码(输入)。在取指令期间“控制”信号为“0”V1管截止多路开关也跟着转向锁存器反相输出端Q非CPU自动将0FFH(11111111即向D锁存器写入一个高电平‘1’)写入P0口锁存器使V2管截止在读引脚信号控制下通过读引脚三态门电路将指令码读到内部总线。请看下图如果该指令是输出数据如MOVX DPTRA(将累加器的内容通过P0口数据总线传送到外部RAM中)则多路开关“控制”信号为‘1’“与门”解锁与输出地址信号的工作流程类似数据据由“地址/数据”线→反相器→V2场效应管栅极→V2漏极输出。如果该指令是输入数据(读外部数据存储器或程序存储器)如MOVX ADPTR(将外部RAM某一存储单元内容通过P0口数据总线输入到累加器A中)则输入的数据仍通过读引脚三态缓冲器到内部总线其过程类似于上图中的读取指令码流程图。通过以上的分析可以看出当P0作为地址/数据总线使用时在读指令码或输入数据前CPU自动向P0口锁存器写入0FFH破坏了P0口原来的状态。因此不能再作为通用的I/O端口。大家以后在系统设计时务必注意即程序中不能再含有以P0口作为操作数(包含源操作数和目的操作数)的指令。二、P1端口的结构及工作原理P1口的结构最简单用途也单一仅作为数据输入/输出端口使用。输出的信息有锁存输入有读引脚和读锁存器之分。P1端口的一位结构见下图.由图可见P1端口与P0端口的主要差别在于P1端口用内部上拉电阻R代替了P0端口的场效应管T1并且输出的信息仅来自内部总线。由内部总线输出的数据经锁存器反相和场效应管反相后锁存在端口线上所以P1端口是具有输出锁存的静态口。由上图可见要正确地从引脚上读入外部信息必须先使场效应管关断以便由外部输入的信息确定引脚的状态。为此在作引脚读入前必须先对该端口写入l。具有这种操作特点的输入/输出端口称为准双向I/O口。8051单片机的P1、P2、P3都是准双向口。P0端口由于输出有三态功能输入前端口线已处于高阻态无需先写入l后再作读操作。P1口的结构相对简单前面我们已详细的分析了P0口只要大家认真的分析了P0口的工作原理P1口我想大家都有能力去分析这里我就不多论述了。单片机复位后各个端口已自动地被写入了1此时可直接作输入操作。如果在应用端口的过程中已向P1一P3端口线输出过0则再要输入时必须先写1后再读引脚才能得到正确的信息。此外随输入指令的不同H端口也有读锁存器与读引脚之分。三、P2端口的结构及工作原理:P2端口的一位结构见下图由图可见P2端口在片内既有上拉电阻又有切换开关MUX所以P2端口在功能上兼有P0端口和P1端口的特点。这主要表现在输出功能上当切换开关向下接通时从内部总线输出的一位数据经反相器和场效应管反相后输出在端口引脚线上当多路开关向上时输出的一位地址信号也经反相器和场效应管反相后输出在端口引脚线上。对于8031单片机必须外接程序存储器才能构成应用电路(或者我们的应用电路扩展了外部存储器)而P2端口就是用来周期性地输出从外存中取指令的地址(高8位地址)因此P2端口的多路开关总是在进行切换分时地输出从内部总线来的数据和从地址信号线上来的地址。因此P2端口是动态的I/O端口。输出数据虽被锁存但不是稳定地出现在端口线上。其实这里输出的数据往往也是一种地址只不过是外部RAM的高8位地址。在输入功能方面P2端口与P0和H端口相同有读引脚和读锁存器之分并且P2端口也是准双向口。可见P2端口的主要特点包括①不能输出静态的数据②自身输出外部程序存储器的高8位地址②执行MOVX指令时还输出外部RAM的高位地址故称P2端口为动态地址端口。即然P2口可以作为I/O口使用也可以作为地址总线使用下面我们就不分析下它的两种工作状态。1、作为I/O端口使用时的工作过程当没有外部程序存储器或虽然有外部数据存储器但容易不大于256B即不需要高8位地址时(在这种情况下不能通过数据地址寄存器DPTR读写外部数据存储器)P2口可以I/O口使用。这时“控制”信号为“0”多路开关转向锁存器同相输出端Q输出信号经内部总线→锁存器同相输出端Q→反相器→V2管栅极→V2管9漏极输出。由于V2漏极带有上拉电阻可以提供一定的上拉电流负载能力约为8个TTL与非门作为输出口前同样需要向锁存器写入“1”使反相器输出低电平V2管截止即引脚悬空时为高电平防止引脚被钳位在低电平。读引脚有效后输入信息经读引脚三态门电路到内部数据总线。2、作为地址总线使用时的工作过程P2口作为地址总线时“控制”信号为‘1’多路开关车向地址线(即向上接通)地址信息经反相器→V2管栅极→漏极输出。由于P2口输出高8位地址与P0口不同无须分时使用因此P2口上的地址信息(程序存储器上的A15~A8)功数据地址寄存器高8位DPH保存时间长无须锁存。四、P3端口的结构及工作原理P3口是一个多功能口它除了可以作为I/O口外还具有第二功能P3端口的一位结构见下图。由上图可见P3端口和Pl端口的结构相似区别仅在于P3端口的各端口线有两种功能选择。当处于第一功能时第二输出功能线为1此时内部总线信号经锁存器和场效应管输入/输出其作用与P1端口作用相同也是静态准双向I/O端口。当处于第二功能时锁存器输出1通过第二输出功能线输出特定的内含信号在输入方面即可以通过缓冲器读入引脚信号还可以通过替代输入功能读入片内的特定第二功能信号。由于输出信号锁存并且有双重功能故P3端口为静态双功能端口。P3口的特殊功能(即第二功能)使P3端品各线处于第二功能的条件是:1、串行I/O处于运行状态(RXD,TXD);2、打开了处部中断(INT0,INT1);3、定时器/计数器处于外部计数状态(T0,T1)4、执行读写外部RAM的指令(RD,WR)在应用中,如不设定P3端口各位的第二功能(WR,RD信叼的产生不用设置),则P3端口线自动处于第一功能状态也就是静态IO端口的工作状态。在更多的场合是根据应用的需要把几条端口线设置为第二功能而另外几条端口线处于第一功能运行状态。在这种情况下不宜对P3端口作字节操作需采用位操作的形式。端口的负载能力和输入输出操作:P0端口能驱动8个LSTTL负载。如需增加负载能力可在P0总线上增加总线驱动器。P1P2P3端口各能驱动4个LSTTL负载。前已述及由于P0-P3端口已映射成特殊功能寄存器中的P0一P3端口寄存器所以对这些端口寄存器的读写就实现了信息从相应端口的输入输出。例如MOV A P1 把Pl端口线上的信息输入到AMoV P1 A 把A的内容由P1端口输出MOV P3 #0FFH 使P3端口线各位置l这里我们已将51单片机的4个8位的并行口跟大家一起来分析了一下~三、编码及译码器工作原理分析这里主要简单介绍下学过数字电路对编码译码了解的朋友可以跳过这部分。把所使用的每一种二进制代码状态都赋于特定的含义表示一个特定的信号或对象叫编码。如用四位二进制数的0000~1001这十种状太分别表示0~9这十个十进制数码称为8421编码。反过来把代码的特定含义翻译出来称为译码。计算机在处理各种文字符号或数码时必须把这些信息进行二进制编码在编码时所使用的第一种二进制代码状态都赋予了特定的含义即表示一个确定的信号或者对象实现这种功能的电路叫编码器如用于键盘的BCD码ASCII码编码器等。单片机外围电路用译码器较多所以在这节课我们主要与大家一起来学习下译码器的工作原理(购买了本站产品的朋友在我们配套的多媒体教学光盘中有相关的教学内容建议大家观看)把代码的含义‘翻译’成相应的输出信号以表示其原意。其功能恰恰与编码器相反。译码器可以将输入代码的状态翻译成相应的输出信号以高、低电平的形式在各自的输出端口送出以表示其意愿。译码器有多个输入端和多个输出端。假如输入的端个数为每个输出端只能有两个状态则输出端个数最多有2n个。常用译码器输入、输出端头数来称呼译码器如3线-8线译码器4线-10线译码器等。我们经常用到的74138就是一个三线-八线译码器朋友们可以到百度搜索74138的中文资料。编码、译码的概念我们了解下下面我们就来重点来讲一下三-八译码器的工作原理这在我们51单片机的接口电路中也是经常用到的。74138的工作原理如下图所示从上图可看出74138有三个输入端A0、A1、A2和八个输出端Q0~Q7。当输入端A0、A1、A2的编码为000时译码器输出为Q00而Q1~Q71。即Q0对应于A0、A1、A2为000状态低电平有效。A0、A1、A2的另外7种组合见后面的真值表。图中S1、S2、S3为使能控制端起到控制译码器是否能进行译码的作用。只有S1为高电平S2、S3均为低电平时才能进行译码否则不论输入羰输入为何值每个输出端均为1。下图是输入端A0、A1、A2为000控制端S11、S10、S20的电平示意图(红色数字为端口电平)大家可按下图进行分析也可以分析输出端另外七种组合时的输出情况。四、51单片机CPU结构分析在前面的文章里我们已知道了单片机内部有一个8位的CPU同时知道了CPU内部包含了运算器控制器及若干寄存器。在这节课我们就与大家一起来讨论一下51单片机CPU的内部结构及工作原理。从上图中我们可以看到在虚线框内的就是CPU的内部结构了8位的MCS-51单片机的CPU内部有数术逻辑单元ALU(Arithmetic Logic Unit)、累加器A(8位)、寄存器B(8位)、程序状态字PSW(8位)、程序计数器PC(有时也称为指令指针即IP16位)、地址寄存器AR(16位)、数据寄存器DR(8位)、指令寄存器IR(8位)、指令译码器ID、控制器等部件组成。1、运算器(ALU)的主要功能A)算术和逻辑运算可对半字节(一个字节是8位半个字节就是4位)和单字节数据进行操作。B)加、减、乘、除、加1、减1、比较等算术运算。C)与、或、异或、求补、循环等逻辑运算。D)位处理功能(即布尔处理器)。由于ALU内部没有寄存器参加运算的操作数必须放在累加器A中。累加器A也用于存放运算结果。例如执行指令 ADD AB执行这条指令时累加器A中的内容通过输入口In_1输入ALU寄存器B通过内部数据总线经输入口In_2输入ALUAB的结果通过ALU的输出口Out、内部数据总线送回到累加器A。2、程序计数器PCPC的作用是用来存放将要执行的指令地址共16位可对64K ROM直接寻址PC低8位经P0口输出高8位经P2口输出。也就是说程序执行到什么地方程序计数器PC就指到哪里它始终是跟蹿着程序的执行。我们知道用户程序是存放在内部的ROM中的我们要执行程序就要从ROM中一个个字节的读出来然后到CPU中去执行那么ROM具体执行到哪一条呢这就需要我们的程序计数器PC来指示。程序计数器PC具有自动加1的功能即从存储器中读出一个字节的指令码后PC自动加1(指向下一个存储单元)。3、指令寄存器IR指令寄存器的作用就是用来存放即将执行的指令代码。在这里我们先简单的了解下CPU执行指令的过程首先由程序存储器(ROM)中读取指令代码送入到指令寄存器经译码器译码后再由定时与控制电路发出相应的控制信号从而完成指令的功能。关于指令在单片机内部的执行过程我们在后面将会在后面的文章里进行详细的讲解。4、指令译码器ID用于对送入指令寄存器中的指令进行译码所谓译码就是把指令转变成执行此指令所需要的电信号。当指令送入译码器后由译码器对该指令进行译码根据译码器输出的信号CPU控制电路定时地产生执行该指令所需的各种控制信号使单片机正确的执行程序所需要的各种操作。5、地址寄存器AR(16位)AR的作用是用来存放将要寻址的外部存储器单元的地址信息指令码所在存储单元的地址编码由程序计数器PC产生而指令中操作数所在的存储单元地址码由指令的操作数给定。从上图中我们可以看到地址寄存器AR通过地址总线AB与外部存储器相连。6、数据寄存器DR用于存放写入外部存储器或I/O端口的数据信息。可见数据寄存器对输出数据具有锁存功能。数据寄存器与外部数据总线DB直接相连。7、程序状态字PSW用于记录运算过程中的状态如是否溢出、进位等。例如累加器A的内容83H执行ADD A#8AH 累加器A与立即数8AH相加并把结果存放在A中。指令后将产生和的结果为[1]0DH而累加器A只有8位只能存放低8位即0DH元法存放结果中的最高位B8。为些在CPU内设置一个进位标志位C当执行加法运算出现进位时进位标志位C为1。8、时序部件由时钟电路和脉冲分配器组成用于产生微操作控制部件所需的定时脉冲信号五、存储器的存储原理存储器用来存放计算机中的所有信息包括程序、原始数据、运算的中间结果及最终结果等。只读存储器(ROM)只读存储器在使用时只能读出而不能写入断电后ROM中的信息不会丢失。因此一般用来存放一些固定程序如监控程序、子程序、字库及数据表等。ROM按存储信息的方法又可分为以下几种1、掩膜ROM掩膜ROM也称固定ROM它是由厂家编好程序写入ROM(称固化)供用户使用用户不能更改内部程序其特点是价格便宜。2、可编程的只读存储器(PROM)它的内容可由用户根据自已所编程序一次性写入一旦写入只能读出而不能再进行更改这类存储器现在也称为OTP(Only Time Programmable)。3、可改写的只读存储器EPROM前两种ROM只能进行一次性写入因而用户较少使用目前较为流行的ROM芯片为EPROM。因为它的内容可以通过紫外线照射而彻底擦除擦除后又可重新写入新的程序。4、可电改写只读存储器(EEPROM)EEPROM可用电的方法写入和清除其内容其编程电压和清除电压均与微机CPU的5V工作电压相同不需另加电压。它既有与RAM一样读写操作简便又有数据不会因掉电而丢失的优点因而使用极为方便。现在这种存储器的使用最为广泛。随机存储器(RAM)这种存储器又叫读写存储器。它不仅能读取存放在存储单元中的数据还能随时写入新的数据写入后原来的数据就丢失了。断电后RAM中的信息全部丢失。因些RAM常用于存放经常要改变的程序或中间计算结果等信息。RAM按照存储信息的方式又可分为静态和动态两种1、静态SRAM其特点是只要有电源加于存储器数据就能长期保存。2、动态DRAM写入的信息只能保存若干ms时间因此每隔一定时间必须重新写入一次以保持原来的信息不变。可现场改写的非易失性存储器这种存储器的特点是从原理上看它们属于ROM型存储器从功能上看它们又可以随时改写信息作用又相当于RAM。所以ROM、RAM的定义和划分已逐渐的失去意义。1、快擦写存储器(FLASH)这种存储器是在EPROM和EEPROM的制造基础上产生的一种非易失性存储器。其集成度高制造成本低于DRAM既具有SRAM读写的灵活性和较快的访问速度又具有ROM在断电后可不丢失信息的特点所以发展迅速。2、铁电存储器FRAM它是利用铁电材料极化方向来存储数据的。它的特点是集成度高读写速度快成本低读写周期短。通过前面的学习我们已知道存储器是计算机的重组成部份。存储器是由大量缓冲寄存器组成的其用途是存放程序和数据使计算机具有记忆功能。这些程序和数据在存储器中是以二进制代码表示的。根据计算机的命令按照指定地址可以把代码取出来或存入新代码。在这我们的学习重点就是来研究一下存储器的内部结构、工作原理及其存储器的主要的技术指标。第一个要学习的问题存储器单元和存储单元地址存储器是由大量寄存器组成的其中每一个寄存器就称为一个存储单元。它可存放一个有独立意义的二进制代码。一个代码由若干位(bit)组成代码的位数称为位长习惯上也称为字长。每个存储单元存放几位二进制数呢一般情况下计算机中一个代码的位数和它的算术运算单元的位数是相同的。例如8051单片机中算术单元是8位则字长就是8位。在计算机中把一个8位的二进制代码称为一个字节(Byte)常写为B。对于一个8位二进制代码的最低位称为第0位(位0)最高位称为第7位(位7)。在计算机中的存储器往往有成千上万个存储单元为了使存入和取出不发生混淆必须给每个存储单元一个唯一的固定编号这个编号就称为存储单元的地址。因为存储单元的数量很大我们不可能每个存储单元都把线引到外部如果每个存储单元都引根线到外部那一个8位的单片机就需外向外部引出65536根线了这在现实中是不可能的。为了减少存储器向外引出的地址线在存储器内部都带有译码器。根据二进制编码、译码的原理除地线公用之外n根导线可以译成2n个地址号。例如当地址线为3根时可以译成238个地址号地址线为3根时可以译成28256个地址号。依此类推在8051单片机中有16根地址线也就是说在8051单片机中有21665 536个地址号地址号的多少就是我们寻址范围的大小也就是前面我们提到过的8051单片机的寻址范围是64K。从上面的介绍可以看出存储单元地址和这个存储单元的内容含义是不同的。存储单元如同一个旅馆的每个房间存储单元地址则相当于每个房间的房间号存储单元内容(二进制代码)就相当于这个房间的房客。前面我们已讲过8051的单片机有16根地址线它的存储地址有21665 536个这么多的存储地址而地址线却只有16根我们怎么用16根地址线来控制这6万多个存储地址呢接下来我们就这个问题与大家一起做个探讨在上节课《第九课51单片机CPU的结构》时我们已知道在51单片机的内部有一个叫做译码器的部件。用16根地址线来控制65536个存储地址就是用译码来实现的。我们知道计算机可以进行数学运算这可令我们非常的难以理解计算机吗里面只不过是一些电子元件组成的怎能么可以进行数学运算呢我们做数学题时如2536是这样做的先在纸上写25然后在下面写36然后大脑运算最后写出结果运算的原材料25、36和结果61都是写在纸上的。计算机中又是怎样存放的呢为了解决定个问题我们先做一个实验下面有一盏灯我们知道灯要么亮要么不亮就有两种状态我们可以用“0”和“1”来代替这两种状态规定亮为“1”不亮为“0”。南以上两盏灯一共有几种状态呢上面已例出两盏灯可以表达成00 01 10 11四种状态那么三盏灯呢三盏灯应该就是可以表达成000 001 010 011 100 101 110 111八种状态如果是八盏灯呢那么其状就表达就是00000000 00000001 00000010。。。。。11111111 共256种状态。我们来看上面这些000 001 010。。。。等等这些数不就是我们学过的二进制数吗本来灯的亮灭是一种物理现象可当我们把它们按一定的顺序排列好后灯的亮和灭就代表数字了。让我们再抽象一步灯为什么会亮呢是因为输出电路输出高电平给灯通了电。因此灯亮和灭就可以用电路的输出是高电平还是低电平来代替了。这样数字就和电平的高、低联系上了。位的含义通过上面的实验我们已知道一盏灯亮或者说一根线的电平的高低可以代表两种状态0和1。实际上这就是一个二进制位困此我们把一根线(或者一盏灯)称为一“位”用BIT表示。字节的含义一根线可以表示0和1两根线可以表达00011011四种状态也就是可以表示0到3而三根给可以表达0至7计算机中通常用8根线放在一起同时计数就可以表达到0~255共256种状态。这8根线或者8位就称之为一个字节(BYTE)。不要问我为什么是8根而不是其它数因为我也不知道。(计算机是一个人造的世界不是自然界很多事情无法问为什么只能说字是一种规定大家在以后的学习过程中也要注意这个问题)。存储器是用来存放数据的地方。它是利用电平的高低来存放数据的。也就是说它存放的实际上是电平的高、低而不是我们习惯认为的1234这样的数字。下面我们就来看看单片机内的存储器是怎样来寻址的也就是怎么来找到我们存放在存储器内的数据。MCS-51单片机在物理结构上有四个存储空间1、片内程序存储器2、片外程序存储器3、片内数据存储器4、片外数据存储器但在逻辑上即从用户的角度上8051单片机有三个存储空间1、片内外统一编址的64K的程序存储器地址空间2、256B的片内数据存储器的地址空间3、以及64K片外数据存储器的地址空间在访问三个不同的逻辑空间时应采用不同形式的指令(具体我们在后面的指令系统学习时将会讲解)以产生不同的存储器空间的选通信号。程序存储器一个微处理器能够聪明地执行某种任务除了它们强大的硬件外还需要它们运行的软件其实微处理器并不聪明它们只是完全按照人们预先编写的程序而执行之。那么设计人员编写的程序就存放在微处理器的程序存储器中俗称只读程序存储器(ROM)。程序相当于给微处理器处理问题的一系列命令。其实程序和数据一样都是由机器码组成的代码串。只是程序代码则存放于程序存储器中。MCS-51具有64kB程序存储器寻址空间它是用于存放用户程序、数据和表格等信息。对于内部无ROM的8031单片机它的程序存储器必须外接空间地址为64kB此时单片机的 端必须接地。强制CPU从外部程序存储器读取程序。对于内部有ROM的8051等单片机正常运行时 则需接高电平使CPU先从内部的程序存储中读取程序当PC值超过内部ROM的容量时才会转向外部的程序存储器读取程序。当 1时程序从片内ROM开始执行当PC值超过片内ROM容量时会自动转向外部ROM空间。当 0时程序从外部存储器开始执行例如前面提到的片内无ROM的8031单片机在实际应用中就要把8031的 引脚接为低电平。8051片内有4kB的程序存储单元其地址为0000H—0FFFH单片机启动复位后程序计数器的内容为0000H所以系统将从0000H单元开始执行程序。但在程序存储中有些特殊的单元这在使用中应加以注意其中一组特殊是0000H—0002H单元系统复位后PC为0000H单片机从0000H单元开始执行程序如果程序不是从0000H单元开始则应在这三个单元中存放一条无条件转移指令让CPU直接去执行用户指定的程序。另一组特殊单元是0003H—002AH这40个单元各有用途它们被均匀地分为五段它们的定义如下0003H—000AH 外部中断0中断地址区。000BH—0012H 定时/计数器0中断地址区。0013H—001AH 外部中断1中断地址区。001BH—0022H 定时/计数器1中断地址区。0023H—002AH 串行中断地址区。可见以上的40个单元是专门用于存放中断处理程序的地址单元中断响应后按中断的类型自动转到各自的中断区去执行程序。从上面可以看出每个中断服务程序只有8个字节单元用8个字节来存放一个中断服务程序显然是不可能的。因此以上地址单元不能用于存放程序的其他内容只能存放中断服务程序。但是通常情况下我们是在中断响应的地址区安放一条无条件转移指令指向程序存储器的其它真正存放中断服务程序的空间去执行,这样中断响应后CPU读到这条转移指令便转向其他地方去继续执行中断服务程序。下图是ROM的地址分配图从上图中大家可以看到0000H-0002H只有三个存储单元3个存储单元在我们的程序存放时是存放不了实际意义的程序的通常我们在实际编写程序时是在这里安排一条ORG指令通过ORG指令跳转到从0033H开始的用户ROM区域再来安排我们的程序语言。从0033开始的用户ROM区域用户可以通过ORG指令任意安排但在应用中应注意不要超过了实际的存储空间不然程序就会找不到。数据存储器数据存储器也称为随机存取数据存储器。数据存储器分为内部数据存储和外部数据存储。MCS-51内部RAM有128或256个字节的用户数据存储(不同的型号有分别)片外最多可扩展64KB的RAM构成两个地址空间访问片内RAM用“MOV”指令访问片外RAM用“MOVX”指令。它们是用于存放执行的中间结果和过程数据的。MCS-51的数据存储器均可读写部分单元还可以位寻址。MCS-51单片机的内部数据存储器在物理上和逻辑上都分为两个地址空间即数据存储器空间(低128单元)特殊功能寄存器空间(高128单元)这两个空间是相连的从用户角度而言低128单元才是真正的数据存储器。下面我们就来详细的与大家讲解一下低128单元片内数据存储器为8位地址所以最大可寻址的范围为256个单元地址对片外数据存储器采用间接寻址方式R0、R1和DPTR都可以做为间接寻址寄存器R0、R1是8位的寄存器即R0、R1的寻址范围最大为256个单元而DPTR是16位地址指针寻址范围就可达到64KB。也就是说在寻址片外数据存储器时寻址范围超过了256B就不能用R0、R1做为间接寻址寄存器而必须用DPTR寄存器做为间接寻址寄存器。从上图中我们可以看到8051单片机片内RAM共有256个单元(00H-FFH)这256个单元共分为两部分。其一是地址从00H—7FH单元(共128个字节)为用户数据RAM。从80H—FFH地址单元(也是128个字节)为特殊寄存器(SFR)单元。从图1中可清楚地看出它们的结构分布。1、通用寄存器区(00H-1FH)在00H—1FH共32个单元中被均匀地分为四块每块包含八个8位寄存器均以R0—R7来命名我们常称这些寄存器为通用寄存器。这四块中的寄存器都称为R0—R7那么在程序中怎么区分和使用它们呢聪明的INTEL工程师们又安排了一个寄存器——程序状态字寄存器(PSW)来管理它们CPU只要定义这个寄存的PSW的D3和D4位(RS0和RS1)即可选中这四组通用寄存器。对应的编码关系如下表所示。惹程序中并不需要用4组那么其余的可用做一般的数据缓冲器CPU在复位后选中第0组工作寄存器。2、位寻址区(20H-2FH)片内RAM的20H—2FH单元为位寻址区既可作为一般单元用字节寻址也可对它们的位进行寻址。位寻址区共有16个字节128个位位地址为00H—7FH。位地址分配如下表所示CPU能直接寻址这些位执行例如置“1”、清“0”、求“反”、转移传送和逻辑等操作。我们常称MCS-51具有布尔处理功能布尔处理的存储空间指的就是这些为寻址区。3、用户RAM区(30H-7FH)在片内RAM低128单元中通用寄存器占去32个单元位寻址区占去16个单元剩下的80个单元就是供用户使用的一般RAM区了地址单元为30H-7FH。对这部份区域的使用不作任何规定和限制但应说明的是堆栈一般开辟在这个区域。高128单元(80H-FFH)前面提到在片内的RAM中高128位是专用寄存器区因这节比较重要所以我们单独的安排一节课跟大家介绍。下节课我们就重点介绍51单片机片内RAM的高128位即专用寄存器区。