MCS-51单片机

目录

[显现 ]

MCS-51单片机 - MCS-51单片机主要应用特性

MCS-51单片机是美国INTE公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MCS-51单片机可以算是相当成功的产品,一直到现在,MCS-51系列或其兼容的单片机仍是应用的主流产品,各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。

MCS-51单片机_第1张图片 MCS-51单片机
 

基本数据

MCS-51系列单片机主要包括8031、8051和8751等通用产品,其主要功能如下:
▲ 8位CPU
▲ 4kbytes 程序存储器(ROM)
▲ 128bytes的数据存储器(RAM)
▲ 32条I/O口线
▲ 111条指令,大部分为单字节指令
▲ 21个专用寄存器
▲ 2个可编程定时/计数器
▲ 5个中断源,2个优先级
▲ 一个全双工串行通信口
▲ 外部数据存储器寻址空间为64kB
▲ 外部程序存储器寻址空间为64kB
▲ 逻辑操作位寻址功能
▲ 双列直插40PinDIP封装
▲ 单一 5V电源供电  

发展历程


MCS-51以其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“名机”,为以后的其它单片机的发展奠定了基础。正因为其优越的性能和完善的结构,导致后来的许多厂商多沿用或参考了其体系结构,有许多世界大的电气商丰富和发展了MCS-51单片机,象PHILIPS、Dallas、ATMEL等著名的半导体公司都推出了兼容MCS-51的单片机产品,就连我国的台湾WINBOND公司也发展了兼容C51(人们习惯将MCS-51简称C51,如果没有特别声明,二者同指MCS-51系列单片机)的单片机品种。

近年来C51获得了飞速的发展,C51的发源公司INTEL由于忙于开发PC及高端微处理器而无精力继续发展自己的单片机,而由其它厂商将其发展,最典型的是PHILIPS和ATML 公司,PHILIPS公司主要是改善其性能,在原来的基础上发展了高速I/O口,A/D转换器,PWM(脉宽调制)、WDT等增强功能,并在低电压、微功耗、扩展串行总线(I2C)和控制网络总线(CAN)等功能加以完善。

PHILIPS公司在发展C51的低功耗,高速度和增强型功能上作了不少贡献,当初主要由其来发展 C51单片机,他们的83Cxx和87Cxx系列省去了并行 扩展总线,适合于作为家用电器类控制的经济型单片机。

ATMEL公司推出的AT89Cxx系列兼容C51的单片机,完美地将Flash(非易失闪存技术)EEPROM与80C51内核结合起来,仍采用C51的总体结构和指令系统,Flash的可反擦写程序存储器能有效地降低开发费用,并能使单片机作多次重复使用。

Siemens公司也沿用C51的内核,相继推出了C500系列单片机,在保持了与C51指令兼容的前提下,其产品的性能得到了进一步的提升,特别是在抗干扰性能,电磁兼容和通信控制总线功能上独树一帜,其产品常用于工作环境恶劣的场合。亦适用于通信和家用电器控制领域。

还有 台湾的 WINBOND公司亦开发了一系列兼容C51的单片机,其产品通常具备丰富的功能特性,而且与其质优价廉在市场也占有一定的分额。

类别


下表是80C51系列单片机的主要分类及功能特性:
系列 典型芯片 I/O口 定时/计数器 中断源 串行通信口 片内RAM 片内ROM 说明
51系列
80C31 4x8位 2x16位 5 1 128字节 无  
80C51 4x8位 2x16位 5 1 128字节 4kB掩膜ROM  
87C51 4x8位 2x16位 5 1 128字节 4kBEPROM  
89C51 4x8位 2x16位 5 1 128字节 4kBEEPROM  
52系列
80C32 4x8位 2x16位 6 1 256字节 无  
80C51 4x8位 2x16位 6 1 256字节 8kB掩膜ROM  
87C52 4x8位 2x16位 6 1 256字节 4kBEPROM  
89C52 4x8位 2x16位 6 1 256字节 4kBEEPROM  

代表产品8051性能简介


8051是MCS-51系列单片机中的代表产品,它内部集成了功能强大的中央处理器,包含了硬件乘除法器、21个专用控制寄存器、4kB的程序存储器、128字节的数据存储器、4组8位的并行口、两个16位的可编程定时/计数器、一个全双工的串行口以及 布尔处理器。

MCS-51具有比较大的寻址空间,地址线宽达16条,即外部数据存储器和程序存储器的寻址范围达2 ^16=64kB,这作为单片机控制来说已是比较大的,这同时具备对I/O口的访问能力。此外,MCS-51采用模块化结构,可方便地增删一个模块就可引脚和指令兼容的新产品。从而容易使产品形成系列化。

由于MCS-51集成了几乎完善的8位中央处理单元,处理功能强,中央处理单元中集成了方便灵活的专用寄存器,硬件的加、减、乘、除法器和 布尔处理机及各种逻辑运算和转移指令,这给应用提供了极大的便利。

MCS-51的指令系统近乎完善,指令系统中包含了全面的数据传送指令、完善的算术和逻辑运算指令、方便的逻辑操作和控制指令、对于编程来说,是相当灵活和方便的。

MCS-51 单片机的工作频率为2-12MHz,当振荡频率为12MHz时,一个机器周期为1us,这个速度应该说是比较快的。

8051中集成了完善的各种中断源,用户可十分方便地控制和使用其功能,使得它的应用范围加大,可以说它可以满足绝大部分的应用场合。

MCS-51把微型 计算机的主要部件都集成在一块心片上,使得数据传送距离大大缩短,可靠性更高,运行速度更块。由于属于芯片化的微型计算机,各功能部件在芯片中的布局和结构达最优化,抗干扰能力加强,工作亦相对稳定。因此,在工业测控系统中,使用单片机是最理想的选择。单片机属于典型的嵌入式系统,所以它是低端控制系统最佳器件。

MCS-51的开发环境要求较低,软件资源十分丰富,介绍其功能特性书籍和开发软件随处可取,只需配备一台PC(个人电脑——对电脑的配置基本上无要求),一台仿真编程器即可实现产品开发,早期的开发软件多使用DOS版本,随着 Windows视窗软件的普及,现在几乎都使用 Windows版本,并且软件种类繁多,琳琅满目,在众多的单片机品种中,C51的环境资源是最丰富的,这给C51用户带来极大的便利。

MCS-51单片机 - MCS-51结构原理


8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。

8051单片机包含 中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:
 
中央处理器
 
MCS-51单片机_第2张图片 805内部结构
    
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。

数据存储器(RAM)

    
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是 统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。

程序存储器(ROM)
    
8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。

定时/计数器(ROM)
   
8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。

并行输入输出(I/O)口
    
8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。

全双工串行口

 
8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。

中断系统
     
8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。

时钟电路

    
8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。

MCS-51的引脚说明 

MCS-51单片机_第3张图片 8051引脚图
     
MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置 石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加以说明:

    ·Pin20:接地脚。

    ·Pin40:正电源脚,正常工作或对片内EPROM 烧写程序时,接 5V电源。

    ·Pin19:时钟XTAL1脚,片内振荡电路的输入端。

    ·Pin18:时钟XTAL2脚,片内振荡电路的输出端。

8051的时钟有两种方式,一种是片内时钟振荡方式,但需在18和19脚外接 石英晶体(2-12MHz)和 振荡电容, 振荡电容的值一般取10p-30p。另外一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。   
  
输入输出(I/O)引脚
    
Pin39-Pin32为P0.0-P0.7输入输出脚,Pin1-Pin1为P1.0-P1.7输入输出脚,Pin21-Pin28为P2.0-P2.7输入输出脚,Pin10-Pin17为P3.0-P3.7输入输出脚,这些输入输出脚的功能说明将在以下内容阐述。
MCS-51单片机_第4张图片 8051时钟电路
 
Pin9:RESET/Vpd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指钟写入07H,其它专用寄存器被清“0”。RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。然而,初始复位不改变RAM(包括 工作寄存器R0-R7)的状态,8051的初始态如下表:

 特殊功能寄存器

       初始态            

特殊功能寄存器 

       初始态      

 ACC

 00H

 B

 00H

 PSW

 00H

 SP

 07H

 DPH

 00H

 TH0

 00H

 DPL

 00H

 TL0

 00H

 IP

 xxx00000B

 TH1

 00H

 IE

 0xx00000B

 TL1

 00H

 TMOD

 00H

 TCON

 00H

 SCon

 xxxxxxxxB

 SBUF

 00H

 P0-P3

  1111111B 

 PCON

 0xxxxxxxB


8051的复位方式可以是自动复位,也可以是手动复位,见下图。此外,RESET/Vpd还是一复用脚,Vcc掉电期间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。
5081时钟电路 5081时钟电路
                                                        
Pin30: ALE/PROG当访问外部程序器时,ALE( 地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。

如果单片机是EPROM,在编程其间,将用于输入编程脉冲。

Pin29:PESN当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。

Pin31:EA/Vpp程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的8031,EA端必须接地。

在编程时,EA/Vpp脚还需加上21V的编程电压。
  

MCS-51单片机 - MCS-51单片机的指令时序


时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍、状态、机器周期和指令周期,接下来我们分别加以说明。

节拍与状态

    
我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示),振荡脉冲经过二分频后即得到整个单片机工作系统的时钟信号,把时钟信号的周期定义为状态(用S表示),这样一个状态就有两个节拍,前半周期相应的节拍我们定义为1(P1),后半周期对应的节拍定义为2(P2)。

机器周期

    
MCS-51有固定的机器周期,规定一个机器周期有6个状态,分别表示为S1-S6,而一个状态包含两个节拍,那么一个机器周期就有12个节拍,我们可以记着S1P1、S1P2……S6P1、S6P2,一个机器周期共包含12个振荡脉冲,即机器周期就是振荡脉冲的12分频,显然,如果使用6MHz的时钟频率,一个机器周期就是2us,而如使用12MHz的时钟频率,一个机器周期就是1us。

指令周期

    
执行一条指令所需要的时间称为指令周期,MCS-51的指令有单字节、双字节和三字节的,所以它们的指令周期不尽相同,也就是说它们所需的机器周期不相同,可能包括一到四个不等的机器周期。

MCS-51的指令时序

    
MCS-51指令系统中,按它们的长度可分为单字节指令、双字节指令和三字节指令。执行这些指令需要的时间是不同的,也就是它们所需的机器周期是不同的,有下面几种形式:

    △ 单字节指令单机器周期
    △ 单字节指令双机器周期
    △ 双字节指令单机器周期
    △ 双字节指令双机器周期
    △ 三字节指令双机器周期
    △ 单字节指令四机器周期(如单字节的乘除法指令)

下图是MCS-51系列单片机的指令时序图: 
MCS-51单片机_第5张图片 MCS-51的取指时序
 











上图是单周期和双周期取指及执行时序,图中的ALE脉冲是为了锁存地址的选通信号,显然,每出现一次该信号单片机即进行一次读指令操作。从时序图中可看出,该信号是时钟频率6分频后得到,在一个机器周期中,ALE信号两次有效,第一次在S1P2和S2P1期间,第二次在S4P2和S5P1期间。 


典型的指令时序


单字节单周期指令:
    
单字节单周期指令只进行一次读指令操作,当第二个 ALE信号有效时,PC并不加1,那么读出的还是原指令,属于一次无效的读操作。

双字节单周期指令:
    
这类指令两次的 ALE信号都是有效的,只是第一个ALE信号有效时读的是操作码,第二个ALE信号有效时读的是操作数。

单字节双周期指令:
    
两个机器周期需进行四读指令操作,但只有一次读操作是有效的,后三次的读操作均为无效操作。

单字节双周期指令有一种特殊的情况,象MOVX这类指令,执行这类指令时,先在ROM中读取指令,然后对外部数据存储器进行读或写操作,头一个机器周期的第一次读指令的操作码为有效,而第二次读指令操作则为无效的。在第二个指令周期时,则访问外部数据存储器,这时,ALE信号对其操作无影响,即不会再有读指令操作动作。

上页的时序图中,我们只描述了指令的读取状态,而没有画出指令执行时序,因为每条指令都包含了具体的操作数,而操作数类型种类繁多,这里不便列出,有兴趣的读者可参阅有关书籍。 
 

外部程序存储器(ROM)读时序

  
MCS-51单片机_第6张图片 8051外部程序存储器读时序
   
右图8051外部程序存储器读时序图,从图中可看出,P0口提供低8位地址,P2口提供高8位地址,S2结束前,P0口上的低8位地址是有效的,之后出现在P0口上的就不再是低8位的地址信号,而是指令数据信号,当然地址信号与指令数据信号之间有一段缓冲的过度时间,这就要求,在S2其间必须把低8位的地址信号锁存起来,这时是用ALE 选通脉冲去控制锁存器把低8位地址予以锁存,而P2口只输出地址信号,而没有指令数据信号,整个机器周期地址信号都是有效的,因而无需锁存这一地址信号。  
    
从外部程序存储器读取指令,必须有两个信号进行控制,除了上述的ALE信号,还有一个 PSEN(外部ROM读选通脉冲),上图显然可看出,PSEN从S3P1开始有效,直到将地址信号送出和外部程序存储器的数据读入CPU后方才失效。而又从S4P2开始执行第二个读指令操作。 
     

外部数据存储器(RAM)读时序

  
MCS-51单片机_第7张图片 8051外部程序存储器读时序
   
右图8051外部数据存储器 读写时序图,从ROM中读取的需执行的指令,而CPU对外部数据存储的访问是对RAM进行数据的读或写操作,属于指令的 执行周期,值得一提的是,读或写是两个不同的机器周期,但他们的时序却是相似的,我们只对RAM的读时序进行分析。

上一个机器周期是取指阶段,是从ROM中读取指令数据,接着的下个周期才开始读取外部数据存储器RAM中的内容。  
    
在S4结束后,先把需读取RAM中的地址放到总线上,包括P0口上的低8位地址A0-A7和P2口上的高8位地址A8-A15。当RD选通脉冲有效时,将RAM的数据通过P0数据总线读进CPU。第二个机器周期的ALE信号仍然出现,进行一次外部ROM的读操作,但是这一次的读操作属于无效操作。
    
对外部RAM进行写操作时,CPU输出的则是WR(写选通信号),将数据通过P0数据总线写入外部存储中。 

MCS-51单片机 - MCS-51单片机输入输出口


8051有4组8位I/O口:P0、P1、P2和P3口,P1、P2和P3为 准双向口,P0口则为双向三态输入输出口,下面我们分别介绍这几个口线:
MCS-51单片机_第8张图片 P0口锁存器和缓存器结构
 

P0口和P2口


右图为P0口和P2口其中一位的电路图,由图可见,电路中包含一个数据输出锁存器和两个三态数据输入缓冲器,另外还有一个数据输出的驱动和控制电路。这两组口线用来作为CPU与外部数据存储器、外部程序存储器和I/O扩展口,而不能象P1、P3直接用作输出口。它们一起可以作为外部地址总线,P0口身兼两职,既可作为地址总线,也可作为数据总线。 
MCS-51单片机_第9张图片 P2口锁存器和缓存器结构
     
P2口作为外部数据存储器或程序存储器的地址总线的高8位输出口AB8-AB15,P0口由ALE选通作为地址总线的低8位输出口AB0-AB7。外部的程序存储器由PSEN信号选通,数据存储器则由WR和RD读写信号选通,因为216=64k,所以8051最大可外接64kB的程序存储器和数据存储器。
     

P1口


右图为P1口其中一位的电路图,P1口为8位准双向口,每一位均可单独定义为输入或输出口,当作为输入口时,1写入锁存器,Q(非)=0,T2截止,内上拉电阻将电位拉至"1",此时该口输出为1,当0写入锁存器,Q(非)=1,T2导通,输出则为0。
MCS-51单片机_第10张图片 P1口锁存器和缓存器结构
     
作为输入口时,锁存器置1,Q(非)=0,T2截止,此时该位既可以把外部电路拉成低电平,也可由内部上拉电阻拉成高电平,正因为这个原因,所以P1口常称为准双向口。需要说明的是,作为输入口使用时,有两种情况,其一是:首先是读锁存器的内容,进行处理后再写到锁存器中,这种操作即读—修改—写操作,象JBC(逻辑判断)、CPL(取反)、INC(递增)、DEC(递减)、ANL(与逻辑)和 ORL(逻辑或)指令均属于这类操作。其二是:读P1口线状态时,打开三态门G2,将外部状态读入CPU。  

P3口

    
P3口的电路如上图所示,P3口为准双向口,为适应引脚的第二功能的需要,增加了第二功能控制逻辑,在真正的应用电路中,第二功能显得更为重要。由于第二功能信号有输入输出两种情况,我们分别加以说明。
MCS-51单片机_第11张图片 P3口锁存器结构
 
P3口的输入输出及P3口锁存器、中断、定时/计数器、串行口和特殊功能寄存器有关,P3口的第一功能和P1口一样可作为输入输出端口,同样具有字节操作和位操作两种方式,在位操作模式下,每一位均可定义为输入或输出。
    
我们着重讨论P3口的第二功能,P3口的第二功能各管脚定义如下:

    △ P3.0     串行输入口(RXD)
    △ P3.1     串行输出口(TXD)
    △ P3.2     外中断0(INT0)
    △ P3.3     外中断1(INT1)
    △ P3.4     定时/计数器0的外部输入口(T0)
    △ P3.5     定时/计数器1的外部输入口(T1)
    △ P3.6     外部数据存储器写选通(WR)
    △ P3.7     外部数据存储器读选通(RD)
 
对于第二功能为输出引脚,当作I/O口使用时,第二功能信号线应保持高电平,与非门开通,以维持从锁存器到输出口数据输出通路畅通无阻。而当作第二功能口线使用时,该位的锁存器置高电平,使与非门对第二功能信号的输出是畅通的,从而实现第二功能信号的输出。对于第二功能为输入的信号引脚,在口线上的输入通路增设了一个缓冲器,输入的第二功能信号即从这个缓冲器的输出端取得。而作为I/O口线输入端时,取自 三态缓冲器的输出端。这样,不管是作为输入口使用还是第二功能信号输入,输出电路中的锁存器输出和第二功能输出信号线均应置“1”。 

MCS-51单片机 - MCS-51单片机存储器结构


程序存储器

    
一个微处理器能够聪明地执行某种任务,除了它们强大的硬件外,还需要它们运行的软件,其实微处理器并不聪明,它们只是完全按照人们预先编写的程序而执行之。那么设计人员编写的程序就存放在微处理器的程序存储器中,俗称只读程序存储器(ROM)。程序相当于给微处理器处理问题的一系列命令。其实程序和数据一样,都是由机器码组成的代码串。只是程序代码则存放于程序存储器中。

MCS-51具有64kB程序存储器寻址空间,它是用于存放用户程序、数据和表格等信息。对于内部无ROM的8031单片机,它的程序存储器必须外接,空间地址为64kB,此时单片机的端必须接地。强制CPU从外部程序存储器读取程序。对于内部有ROM的8051等单片机,正常运行时,则需接高电平,使CPU先从内部的程序存储中读取程序,当PC值超过内部ROM的容量时,才会转向外部的程序存储器读取程序。

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个地址单元是不能存下完整的中断服务程序的,因而一般也在中断响应的地址区安放一条无条件转移指令,指向程序存储器的其它真正存放中断服务程序的空间去执行,这样中断响应后,CPU读到这条转移指令,便转向其他地方去继续执行中断服务程序。

数据存储器

MCS-51单片机_第12张图片 内部数据存储器的配置
     
数据存储器也称为随机存取数据存储器。MCS-51单片机的数据存储器在物理上和逻辑上都分为两个地址空间,一个是内部数据存储区和一个外部数据存储区。MCS-51内部RAM有128或256个字节的用户数据存储(不同的型号有分别),它们是用于存放执行的中间结果和过程数据的。MCS-51的数据存储器均可读写,部分单元还可以位寻址。 
    
8051内部RAM共有256个单元,这256个单元共分为两部分。其一是地址从00H—7FH单元(共128个字节)为用户数据RAM。从80H—FFH地址单元(也是128个字节)为特殊寄存器(SFR)单元。从图1中可清楚地看出它们的结构分布。
MCS-51单片机_第13张图片 内部数据存储器的配置
 
在00H—1FH共32个单元中被均匀地分为四块,每块包含八个8位寄存器,均以R0—R7来命名,我们常称这些寄存器为通用寄存器。这四块中的寄存器都称为R0—R7,那么在程序中怎么区分和使用它们呢?聪明的INTEL工程师们又安排了一个寄存器—— 程序状态字寄存器(PSW)来管理它们,CPU只要定义这个寄存的PSW的第3和第4位(RS0和RS1),即可选中这四组通用寄存器。对应的编码关系如图2所示。

内部RAM的20H—2FH单元为位寻址区,既可作为一般单元用字节寻址,也可对它们的位进行寻址。位寻址区共有16个字节,128个位,位地址为00H—7FH。位地址分配如表1所示,CPU能直接寻址这些位,执行例如置“1”、清“0”、求“反”、转移,传送和逻辑等操作。我们常称MCS-51具有布尔处理功能,布尔处理的存储空间指的就是这些为寻址区。 
 
表1  RAM位寻址区地址表 
         单元地址               MSB        位地址        LSB 
          2FH                 7FH 7EH 7DH 7CH 7BH 7AH 79H 78H 
          2EH                 77H 76H 75H 74H 73H 72H  71H 70H 
          2DH                 6FH 6EH 6DH 6CH 6BH 6AH 69H 68H 
          2CH                 67H 66H 65H 64H 63H 62H 61H 60H 
          2BH                 5FH 5EH 5DH 5CH 5BH 5AH 59H 58H 
          2AH                 57H 56H 55H 54H 53H 52H 51H 50H 
          29H                 4FH 4EH 4DH 4CH 4BH 4AH 49H 48H 
          28H                 47H 46H  45H 44H 43H 42H 41H 40H 
          27H                 3FH 3EH 3DH 3CH 3BH 3AH 39H 38H 
          26H                 37H 36H 35H 34H 33H 32H 31H 30H 
          25H                 2FH 2EH 2DH 2CH 2BH 2AH 29H 28H 
          24H                 27H 26H 25H 24H 23H 22H 21H 20H 
          23H                 1FH 1EH 1DH 1CH 1BH 1AH 19H 18H 
          22H                 17H 16H 15H 14H 13H 12H 11H 10H 
          21H                 0FH 0EH 0DH 0CH 0BH 0AH 09H 08H 
          20H                 07H 06H 05H 04H 03H 02H 01H 00H 

特殊功能寄存器

    
特殊功能寄存器(SFR)也称为专用寄存器,特殊功能寄存器反映了MCS-51单片机的运行状态。很多功能也通过特殊功能寄存器来定义和控制程序的执行。

MCS-51有21个特殊功能寄存器,它们被离散地分布在内部RAM的80H—FFH地址中,这些寄存的功能已作了专门的规定,用户不能修改其结构。表2是特殊功能寄存器分布一览表,我们对其主要的寄存器作一些简单的介绍。

程序计数器PC(program Counter)

    
程序计数器在物理上是独立的,它不属于特殊内部数据存储器块中。PC是一个16位的计数器,用于存放一条要执行的指令地址,寻址范围为64kB,PC有自动加1功能,即完成了一条指令的执行后,其内容自动加1。PC本身并没有地址,因而不可寻址,用户无法对它进行读写,但是可以通过转移、调用、返回等指令改变其内容,以控制程序按我们的要求去执行。

累加器ACC(accumulator)

    
累加器A是一个最常用的专用寄存器,大部分单操作指令的一个操作数取 自累加器,很多双操作数指令中的一个操作数也取自累加器。加、减、乘、除法运算的指令,运算结果都存放于累加器A或AB累加器对中。大部分的数据操作都会通过累加器A进行,它形象于一个交通要道,在程序比较复杂的运算中,累加器成了制约软件效率的“瓶颈”,它的功能较多,地位也十分重要。以至于后来发展的单片机,有的集成了多累加器结构,或者使用寄存器阵列来代替累加器,即赋予更多寄存器以累加器的功能,目的是解决累加器的“交通堵塞”问题。提高单片机的软件效率。

 表2   特殊功能寄存器 
            标识符号           地址                     寄存器名称 
              ACC                 0E0H                       累加器 
               B                    0F0H                       B寄存器 
              PSW               0D0H                     程序状态字 
              SP                     81H                      堆栈指针 
              dptr            82H、83H   数据指针(16位)含DPL和DPH 
              IE                   0A8H               中断允许控制寄存器 
              IP                   0B8H                中断优先控制寄存器 
              P0                     80H                   I/O口0寄存器 
              P1                     90H                   I/O口1寄存器 
              P2                   0A0H                   I/O口2寄存器 
              P3                   0B0H                    I/O口3寄存器 
             PCON                87H         电源控制及波特率选择寄存器 
             SCON                98H               串行口控制寄存器 
             SBUF                 99H            串行数据缓冲寄存器 
             TCON                88H               定时控制寄存器 
             TMOD               89H            定时器方式选择寄存器 
             TL0                   8AH                 定时器0低8位 
             TH0                   8CH                 定时器0高8位 
             TL1                   8BH                 定时器1低8位 
             TH1                   8DH                定时器1高8位 
 

寄存器B

    
在乘除法指令中,乘法指令中的两个操作数分别取自累加器A和寄存器B,其结果存放于AB寄存器对中。除法指令中,被除数取自累加器A,除数取自寄存器B,结果商存放于累加器A,余数存放于寄存器B中。

程序状态字(Program Status Word)

    
程序状态字是一个8位寄存器,用于存放程序运行的状态信息,这个寄存器的一些位可由软件设置,有些位则由硬件运行时自动设置的。寄存器的各位定义如下,其中PSW.1是保留位,未使用。下表是它的功能说明,并对各

个位的定义介绍如下:

表3   程序状态字   

  位序

 PSW.7 

PSW.6 

PSW.5  

PSW.4 

PSW.3 

 PSW.2 

  PSW.1  

  PSW.0 

  位标志

 CY    

 AC

  F0

  RS1    

  RS0 

 OV 

   - 

 P 


       进位标志位,此位有两个功能:一是存放执行某写算数运算时,存放进位标志,可被硬件或软件置位或清零。二是在位操作中作累加位使用。

PSW.6(AC)  辅助进位标志位,当进行加、减运算时当有低4位向高4位进位或借位时,AC置位,否则被清零。AC辅助进位位也常用于十进制调整。

PSW.5(F0) 用户标志位,供用户设置的标志位。

PSW.4、PSW.3(RS1和 RS0) 寄存器组选择位。可参见本章的图2定义。

PSW.2(OV) 溢出标志。带符号加减运算中,超出了累加器A所能表示的符号数有效范围(-128— 127)时,即产生溢出,OV=1。表明运算运算结果错误。如果OV=0,表明运算结果正确。
    
执行加法指令ADD时,当位6向位7进位,而位7不向C进位时,OV=1。或者位6不向位7进位,而位7向C进位时,同样OV=1。
    
除法指令,乘积超过255时,OV=1。表面乘积在AB寄存器对中。若OV=0,则说明乘积没有超过255,乘积只在累加器A中。
    
除法指令,OV=1,表示除数为0,运算不被执行。否则OV=0。

PSW.0(P) 奇偶校验位。声明累加器A的奇偶性,每个指令周期都由硬件来置位或清零,若值为1的位数奇数,则P置位,否则清零。

数据指针(DPTR)

    
数据指针为16位寄存器,编程时,既可以按16位寄存器来使用,也可以按两个8位寄存器来使用,即高位字节寄存器DPH和低位字节DPL。
    
DPTR主要是用来保存16位地址,当对64kB外部数据存储器寻址时,可作为间址寄存器使用,此时,使用如下两条指令:

            MOVX    A, @DPTR
            MOVX    @DPTR, A

在访问程序存储器时,DPTR可用来作基址寄存器,采用基址 变址寻址方式访问程序存储器,这条指令常用于读取程序存储器内的表格数据。

             MOVC    A, @A @DPTR

堆栈指针SP(Stack Pointer)

   
MCS-51单片机_第14张图片 堆栈结构图
  
堆栈是一种数据结构,它是一个8位寄存器,它指示堆栈顶部在内部RAM中的位置。系统复位后,SP的初始值为07H,使得堆栈实际上是从08H开始的。但我们从RAM的结构分布中可知,08H—1FH隶属1—3工作寄存器区,若编程时需要用到这些数据单元,必须对堆栈指针SP进行初始化,原则上设在任何一个区域均可,但一般设在30H—1FH之间较为适宜。 
    
数据的写入堆栈我们称为入栈(PUSH,有些文献也称作插入运算或压入),从堆栈中取出数据称为出栈(POP,也称为删除运算或弹出),堆栈的最主要特征是“后进先出”规则,也即最先入栈的数据放在堆栈的最底部,而最后入栈的数据放在栈的顶部,因此,最后入栈的数据出栈时则是最先的。这和我们往一个箱里存放书本一样,需将最先放入箱底部的书取出,必须先取走最上层的书籍。这个道理非常相似。

那么 堆栈有何用途呢?堆栈的设立是为了中断操作和子程序的调用而用于保存数据的,即常说的断点保护和现场保护。微处理器无论是在转入子程序和中断服务程序的执行,执行完后,还是要回到主程序中来,在转入子程序和中断服务程序前,必须先将现场的数据进行保存起来,否则返回时,CPU并不知道原来的程序执行到哪一步,原来的中间结果如何?所以在转入执行其它子程序前,先将需要保存的数据压入堆栈中保存。以备返回时,再复原当时的数据。供主程序继续执行。   
    
转入中断服务程序或子程序时,需要保存的数据可能有若干个,都需要一一地保留。如果微处理器进行多重子程序或中断服务程序嵌套,那么需保存的数据就更多,这要求堆栈还需要有相当的容量。否则会造成 堆栈溢出,丢失应备份的数据。轻者使运算和执行结果错误,重则使整个程序紊乱。

MCS-51的堆栈是在RAM中开辟的,即堆栈要占据一定的RAM存储单元。同时MCS-51的堆栈可以由用户设置,SP的初始值不同,堆栈的位置则不一定,不同的设计人员,使用的堆栈区则不同,不同的应用要求,堆栈要求的容量也有所不同。堆栈的操作只有两种,即 进栈和出栈,但不管是向堆栈写入数据还是从堆栈中读出数据,都是对栈顶单元进行的,SP就是即时指示出栈顶的位置(即地址)。在子程序调用和中断服务程序响应的开始和结束期间,CPU都是根据SP指示的地址与相应的RAM存储单元交换数据。

堆栈的操作有两种方法:其一是自动方式,即在中断服务程序响应或子程序调用时, 返回地址自动进栈。当需要返回执行主程序时,返回的地址自动交给PC,以保证程序从断点处继续执行,这种方式是不需要编程人员干预的。第二种方式是人工指令方式,使用专有的堆栈操作指令进行进出栈操作,也只有两条指令:进栈为 PUSH指令,在中断服务程序或子程序调用时作为现场保护。出栈操作POP指令,用于子程序完成时,为主程序 恢复现场。

I/O口专用寄存器(P0、P1、P2、P3)
    
I/O口寄存器P0、P1、P2和P3分别是MCS-51单片机的四组I/O口锁存器。MCS-51单片机并没有专门的I/O口操作指令,而是把I/O口也当作一般的寄存器来使用,数据传送都统一使用MOV指令来进行,这样的好处在于,四组I/O口还可以当作寄存器 直接寻址方式参与其他操作。

定时/计数器(TL0、TH0、TL1和TH1)
    
MCS-51单片机中有两个16位的定时/计数器T0和T1,它们由四个8位寄存器组成的,两个16位定时/计数器却是完全独立的。我们可以单独对这四个寄存器进行寻址,但不能把T0和T1当作16位寄存来使用。

定时/计数器方式选择寄存器(TMOD)
    
TMOD寄存器是一个专用寄存器,用于控制两个定时计数器的工作方式,TMOD可以用字节传送指令设置其内容,但不能位寻址,各位的定义如下,更详细的内容,我们将在《MCS-51定时器和中断系统》章节中叙述。

 表4   定时/计数器工作方式控制寄存器 TMOD 

  位序   

  D7   

 D6    

 D5  

  D4  

 D3    

 D2  

     D1  

  D0 

 位标志

  GATE

 

 M1

 M0

 GATE  

 

 M1 

   M0 

 

 

    定时/计数器1

 

 

 

 定时/计数器0 

 

 


 串行 数据缓冲器(SBUF)
    
串行数据缓冲器SBUF用来存放需发送和接收的数据,它由两个独立的寄存器组成,一个是发送缓冲器,另一个是接收缓冲器,要发送和接收的操作其实都是对串行数据缓冲器进行。

其他控制寄存器(TMOD)

    
除了以上我们简述的几个专用寄存外,还有IP、IE、TCON、SCON和PCON等几个寄存器,这几个控制寄存器主要用于中断和定时的,我们将在《MCS-51定时器和中断系统》中详细说明。
 

MCS-51单片机 - MCS-51的定时和计数器 


 MCS-51的单片机内有两个16位可编程的定时/计数器,它们具有四种工作方式,其控制字和状态均在相应的特殊功能寄存器中,通过对控制寄存器的编程,就可方便地选择适当的工作方式。下面我们对它们的特性进行阐述。

定时/计数器的工作方式
    
MCS-51单片机_第15张图片 MCS-51定时/计数器结构图
 
MCS-51单片机内部的定时/计数器的结构如图1所示,定时器T0特性功能寄存器TL0(低8位)和TH0(高8位)构成,定时器T1由特性功能寄存器TL1(低8位)和TH1(高8位)构成。特殊功能寄存器TMOD控制定时寄存器的工作方式,TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志等。程序开始时需对TL0、TH0、TL1和TH1进行初始化编程,以定义它们的工作方式和控制T0和T1的计数。

TMOD和TCON这两个特殊功能寄存器的格式参见下表:

    [1]. 定时/计数器的方式控制字TMOD, 字节地址为89H,其格式如表1:  
 
  表1  TMOD寄存器结构 

 D7  

D6  

  D5  

D4  

 D3     

 D2

D1  

   D0 

 GATA  

 

 M1    

 M0

 GATA

 

 M1  

 M0 

 

 ←T1方式字段→

 

 

 

    ←T0方式字段→ 

 

 

                                                                                     [2]. 定时器控制积存器TCON,字节地址为88H,位地址为88H—8FH,其格式如表2:

 
  表2  TCON结构 

 D7    

  D6  

    D5 

D4  

   D3

 D2  

 D1    

 D0 

 TF1  

 TR1

 TF0

 TR0

 IE1  

 IT1

    IE0

   IT0 


 TMOD和TCON各位的意义和用途我们将在下面的章节中予以介绍,需要注意的是,TCON的D0—D3位与中断有关,我们会在中断的内容中加以说明,MCS-51的定时/计数器共有四种工作方式,我们逐个进行讨论。

工作方式0

    
定时/计数器0的工作方式0电路逻辑结构见图2(定时/计数器1与其完全一致),工作方式0是13位计数结构的工作方式,其计数器由TH的全部8位和TL的低5位构成,TL的高3位没有使用。当=0时,多路开关接通振荡脉冲的12分频输出,13位计数器以次进行计数。这就是定时工作方式。当=1时,多路开关接通计数引脚(To),外部计数脉冲由银南脚To输入。当计数脉冲发生负跳变时,计数器加1,这就是我们常称的计数工作方式。  
MCS-51单片机_第16张图片 定时/计数器内部结构
  
不管是哪种工作方式,当TL的低5位溢出时,都会向TH进位,而全部13位计数器溢出时,则会向计数器溢出标志位TF0进位。

我们讨论门控位GATA的功能,GATA位的状态决定定时器运行控制取决于TR0的一个条件还是TR0和INT0引脚这两个条件。当GATA=1时,由于GATA信号封锁了与门,使引脚INT0信号无效。而这时候如果TR0=1,则接通模拟开关,使计数器进行加法计数,即定时/计数工作。而TR0=0,则断开模拟开关,停止计数,定时/计数不能工作。

当GATA=0时,与门的输出端由TR0和INT0电平的状态确定,此时如果TR0=1,INT0=1与门输出为1,允许定时/计数器计数,在这种情况下,运行控制由TR0和INT0两个条件共同控制,TR0是确定定时/计数器的运行控制位,由软件置位或清“0”。

如上所述,TF0是定时/计数器的溢出状态标志,溢出时由硬件置位,TF0溢出中断被CPU响应时,转入中断时硬件清“0”,TF0也可由程序查询和清“0”。

    在工作方式下,计数器的计数值范围是:

          1—8192(2 ^13)

    当为定时工作方式时,定时时间的计算公式为:

         (2 ^13—计数初值)╳晶振周期╳12

    或   (2 ^13—计数初值)╳机器周期

    其时间单位与晶振周期或机器周期相同。

    如果单片机的晶振选为6.000MHz,则最小定时时间为:

        [2 ^13—(2 ^13—1)]╳1/6╳10-6╳12=2╳10 ^-6(s)=2(us)

        (2 ^13—0)╳1/6╳10-6╳12=16384╳10 ^-6(s)=16384(us)。

工作方式1
    
当M1,M0=01时,定时/计数器处于工作方式1,此时,定时/及数器的等效电路如图3所示,仍以定时器0为例,定时器1与之完全相同。 
  
MCS-51单片机_第17张图片 定时/计数器内部结构
 
可以看出,方式0和方式1的区别仅在于计数器的位数不同,方式0为13位,而方式1则为16位,由TH0作为高8位,TL0为低8位,有关控制状态字(GATA、、TF0、TR0)和方式0相同。

    在工作方式1下,计数器的计数值范围是:

          1—65536(2 ^16)

    当为定时工作方式1时,定时时间的计算公式为:

         (2 ^16—计数初值)╳晶振周期╳12

    或   (2 ^16—计数初值)╳机器周期

    其时间单位与晶振周期或机器周期相同。

    如果单片机的晶振选为6.000MHz,则最小定时时间为:

        [2 ^13—(2 ^16—1)]╳1/6╳10 ^-6╳12=2╳10 ^-6(s)=2(us)

        (2 ^16—0)╳1/6╳10 ^-6╳12=131072╳10 ^-6(s)=131072(us)。
  

工作方式2

    
当M1M0=10时,定时/计数器处于工作方式2.此时定时器的等效电阻如图4所示.我们还是以定时/计数器0为例,定时/计数器1与之完全一致。 
  
MCS-51单片机_第18张图片 定时/计数器内部结构
 
工作方式0和工作方式1的最大特点就是计数溢出后,计数器为全0,因而循环定时或循环计数应用时就存在反复设置初值的问题,这给程序设计带来许多不便,同时也会影响计时精度,工作方式2就针对这个问题而设置,它具有自动重装载功能,即自动加载计数初值,所以也有的文献称之为自动重加载工作方式。在这种工作方式中,16位计数器分为两部分,即以TL0为计数器,以TH0作为预置寄存器,初始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,不再象方式0和方式1那样需要“人工干预”,由软件重新赋值,而是由预置寄存器TH以硬件方法自动给计数器TL0重新加载。

程序初始化时,给TL0和TH0同时赋以初值,当TL0计数溢出时,置位TF0的同时把预置寄存器TH0中的初值加载给TL0,TL0重新计数。如此反复,这样省去了程序不断需给计数器赋值的麻烦,而且计数准确度也提高了。但这种方式也有其不利的一面,就是这样一来的计数结构只有8位,计数值有限,最大只能到255。所以这种工作方式很适合于那些 重复计数的应用场合。例如我们可以通过这样的计数方式产生中断,从而产生一个固定频率的脉冲。也可以当作串行数据通信的波特率发送器使用。

工作方式3

    
当M1M0=11时,定时/计数器处于工作方式3,此时,定时/及数器的等效电路如图3所示,仍以定时器0为例,值得注意的是,在工作方式3模式下,定时/计数器1的工作方式与之不同,下面我们分别讨论。 
 
MCS-51单片机_第19张图片 定时/计数器内部结构
 
在工作方式3模式下,定时/计数器0被拆成两个独立的8位计数器TL0和TH0。其中TL0既可以作计数器使用,也可以作为定时器使用,定时/计数器0的各控制位和引脚信号全归它使用。其功能和操作与方式0或方式1完全相同。TH0就没有那么多“资源”可利用了,只能作为简单的定时器使用,而且由于定时/计数器0的控制位已被TL0占用,因此只能借用定时/计数器1的控制位TR1和TF1,也就是以计数溢出去置位TF1,TR1则负责控制TH0定时的启动和停止。等效电路参见图6。     由于TL0既能作定时器也能作计数器使用,而TH0只能作定时器使用而不能作计数器使用,因此在方式3模式下,定时/计数器0可以构成二个定时器或者一个定时器和一个计数器。

如果定时/计数器0工作于工作方式3,那么定时/计数器1的工作方式就不可避免受到一定的限制,因为自己的一些控制位已被定时/计数器借用,只能工作在方式0、方式1或方式2下,等效电路参见图6 
 
在这种情况下,定时/计数器1通常作为串行口的波特率发生器使用,以确定串行通信的速率,因为已没有TF1被定时/计数器0借用了,只能把计数溢出直接送给串行口。当作波特率发生器使用时,只需设置好工作方式,即可自动运行。如要停止它的工作,需送入一个把它设置为方式3的方式控制字即可,这是因为定时/计数器本身就不能工作在方式3,如硬把它设置为方式3,自然会停止工作。 

MCS-51单片机 - MCS-51单片机的中断系统


对初学者来说,中断这个概念比较抽象,其实单片机的处理系统与人的一般思维有着许多异曲同工之妙,我们举个很贴切的比方,在日常生活和工作中有很多类似的情况。假如你正在上班,例如是编译资料,这时侯电话铃响了,你在书本上做个记号(以记下你现在正编译到某某页),然后与对方通电话,而此时恰好有客人到访,你先停下通电话,与客人说几句话,叫客人稍侯,然后回头继续通完电话,再与客人谈话。谈话完毕,送走客人,继续你的资料编译工作。

这就是日常生活和工作中的中断现象,类似的情况还有很多,从编译资料到接电话是第一次中断,通电话的过程中引有客人到访,这是第二次中断,即在中断的过程中又出现第二次中断,这就是我们常说的中断嵌套。处理完第二个中断任务后,回头处理第一个中断,第一个中断完成后,再继续你原先的主要工作。

为什么会出现这样的中断呢?道理很简单,人非三头六臂,人只有一个脑袋,在一种特定的时间内,可能会面对着两、三甚至更多的任务。但一个人又不可能在同一时间去完成多样任务,因此你只能采分析任务的轻重缓急,采用中断的方法穿插去完成它们。那么这种情况对于单片机中的中央处理器也是如此,单片机中CPU只有一个,但在同一时间内可能会面临着处理很多任务的情况,如运行主程序、数据的输入和输出,定时/和计数时间已到要处理、可能还有一些外部的更重要的中断请求(如超温超压)要先处理。此时也得象人的思维一样停下某一样(或几样)工作先去完成一些紧急任务的中断方法。

这样的一样处理方法上升到计算机理论,就是一个资源面对多项任务的处理方式,由于资源有限,面对多项任务同时要处理时,就会出现资源竞争的现象。中断技术就是为了解决资源竞争的一个可行的方法,采用中断技术可使多项任务共享一个资源,所以有些文献也称中断技术是一种资源共享技术。 
    

MCS-51的中断结构 

  
MCS-51单片机_第20张图片 中断系统结构
 
计算机的中断系统能够加强CPU对多任务事件的处理能力。从而使它的应用范围进一步扩大。在MCS-48结构的基础上,MCS-51在增强了I/O的种类、功能和数量的同时,也增强了 中断能力。MCS-51提供了5个中断源,两个中断优先级控制,可实现两个中断服务嵌套。当CPU支持中断屏蔽指令后,可将一部分或所有的中断关断,只有打开相应的中断控制位后,方可接收相应的中断请求。程序设置中断的允许或屏蔽,也可设置中断的优先级。

中断处理流程


CPU响应中断请求后,就立即转入执行中断服务程序。不同的中断源、不同的中断要求可能有不同的中断处理方法,但它们的处理流程一般都如下所述。

现场保护和现场恢复

    
中断是在执行其它任务的过程中转去执行临时的任务,为了在执行完中断服务程序后,回头执行原先的程序时,知道程序原来在何处打断的,各有关寄存器的内容如何,就必须在转入执行中断服务程序前,将这些内容和状态进行备份——即保护现场。就象文章开头举的例子,在看书时,电话玲响需传去接电话时,必须在书本上做个记号,以便在接完电话后回来看书时,知道从哪些内容继续往下看。计算机的中断处理方法也如此,中断开始前需将个有关寄存器的内容压入堆栈进行保存,以便在恢复原来程序时使用。

中断服务程序完成后,继续执行原先的程序,就需把保存的现场内容从堆栈中弹出,恢复积存器和存储单元的原有内容,这就是现场恢复。

如果在执行中断服务时不是按上述方法进行现场保护和恢复现场,就会是程序运行紊乱,程序跑飞,自然使单片机不能正常工作。

中断打开和中断关闭

    
在中断处理进行过程中,可能又有新的中断请求到来,这里规定,现场保护和现场恢复的操作是不允许打扰的,否则保护和恢复的过程就可能使数据出错,为此在进行现场保护和现场恢复的过程中,必须关闭总中断,屏蔽其它所有的中断,待这个操作完成后再打开总中断,以便实现中断嵌套。

中断服务程序

    
既然有中断产生,就必然有其具体的需执行的任务,中断服务程序就是执行中断处理的具体内容,一般以子程序的形式出现,所有的中断都要转去执行中断服务程序,进行中断服务。

中断返回

    
执行完中断服务程序后,必然要返回,中断返回就是被程序运行从中断服务程序转回到原工作程序上来。在MCS-51单片机中,中断返回是通过一条专门的指令实现的,自然这条指令是中断服务程序的最后一条指令。

MCS-51的中断源

     
8051有5个中断源,它们是两个外中断INT0(P3.2)和INT1(P3.3)、两个片内定时/计数器溢出中断TF0和TF1,一个是片内串行口中断TI或RI,这几个中断源由TCON和SCON两个特殊功能寄存器进行控制。

在前一节,我们已对TCON的控制位进行了说明,现在继续对它的中断控制有关的位进行谈论。TCON寄存器的结构如下:

 表1  TCON寄存器结构 

TCON 

 D7    

 D6  

 D5 

D4   

   D3

   D2

  D1    

  D0 

 

  TF1  

 TR1

 TF0

  TR0  

 IE1

 IT1

 IE0

 IT0 

   位地址

 8FH

   8EH  

  8DH  

 8CH

   8BH  

8AH  

  89H  

   88H 


    · IE1:外部边沿触发中断1请求标志,其功能和操作类似于TF0。

    · IT1:外部中断1类型控制位,通过软件设置或清楚,用于控制外中断的触发信号类型。IT1=1,边沿触发。IT=0是电平触发。

    · IE0:外部边沿触发中断0请求标志,其功能和操作类似于IE1。

    · IT0:外部中断0类型控制位,通过软件设置或清楚,用于控制外中断的触发信号类型。其功能和操作类似于IE1。

    SCON是串行口控制寄存器,字节地址为98H,SCON的低二位是串行口的发送和接收中断标志,其格式如下:
 表2  SCON寄存器结构 

 SCON 

 D7

 D6

  D5

  D4  

D3   

D2   

 D1   

  D0 

 

 -

  -

 -  

 -

 -   

  -

  TI  

    RI 

   位地址

 

 

 

 

 

 

     99H  

 98H 


     · TI:MCS-51串行口的发送中断标志,在串行口以方式0发送时,每当发送完8位数据,由硬件置位。如果以方式1、方式2或方式3发送时,在发送停止位的开始时TI被置1,TI=1表示串行发送器正向CPU发出中断请求,向串行口的数据缓冲器SBUF写入一个数据后就立即启动发送器继续发送。但是CPU响应中断请求后,转向执行中断服务程序时,并不清零TI,TI必须由用户的中断服务程序清“0”,即中断服务程序必须有“CLR TI”或“ANL SCON, #0FDH”等指令来清零TI。                                        

    · RI:串行口接收中断标志.若串行口接收器允许接收,并以方式0工作,每当接收到8位数据时,RI被置1,若以方式1、2、3方式工作,当接收到半个停止位时,TI被置1,当串行口一方式2或3方式工作,且当 SM2=1时,仅当接收到第9位数据RB8为1后,同时还要在接收到半个停止位时,RI被置1。RI为1表示串行口接收器正向CPU申请中断。同样RI标志栩栩如生由用户的软件清“0”。 

中断的控制


对于中断控制,在上一节中我们已经对TCON和SCON进行了分析,其实它们两个寄存器也是中断的控制寄存器,负责对中断的部分功能进行控制。我们这里谈论的是另外两个控制寄存器IE和IP。

MCS-51的对中断的开放和屏蔽是由 中断允许寄存器IE控制来实现的,IE的结构格式如下。

 
  表3  IE寄存器结构 

    IE  

D7   

 D6 

 D5   

D4  

D3   

 D2  

D1   

 D0 

 

 EA  

   -

   -  

 ES  

 ET1  

 EX1

  ET0

EX0 

 位地址

 AFH

 

 

  ACH

  ABH  

  AAH

 A9H   

 A8H 


                                                        
     下面我们对IE寄存器的各控制位进行介绍:
    △ EA:中断总控制位,EA=1,CPU开放中断。EA=0,CPU禁止所有中断。

    △ ES: 串行口中断控制位,ES=1允许串行口中断,ES=0,屏蔽串行口中断。

    △ ET1: 定时/计数器T1中断控制位。ET1=1,允许T1中断,ET1=0,禁止T1中断。

    △ EX1: 外中断1中断控制位,EX1=1,允许外中断1中断,EX1=0,禁止外中断1中断。

    △ ET0: 定时/计数器T0中断控制位。ET1=1,允许T0中断,ET1=0,禁止T0中断。

    △ EX0: 外中断0中断控制位,EX1=1,允许外中断0中断,EX1=0,禁止外中断0中断。

MCS-51有两个中断优先级,即高优先级和低优先级,每个中断源都可设置为高或低中断优先级。如果有一低优先级的中断正在执行,那么高优先级的中断出现中断请求时,CPU则会响应这个高有限级的中断,也即高优先级的中断可以打断低优先级的中断。而若CPU正在处理一个高优先级的中断,此时,就算是有低优先级的中断发出中断请求,CPU也不会理会这个中断,而是继续执行正在执行的中断服务程序,一直到程序结束,执行最后一条返回指令,返回主程序然后再执行一条指令后才会响应新的中断请求。

为了实现上述功能,MCS-51的中断系统有两个不可寻址的优先级状态触发器,一个指出CPU是否在执行高优先级中断服务程序,另一个指出CPU是否正在执行低优先级的中断服务程序,这两个中断触发器的1状态分别屏蔽所有中断申请和同一级别的其他中断申请,此外,MCS-51还有一个申请优先级寄存IP,IP的格式如下,字节地址是B8H。

 
  表4  IP中断控制寄存器结构 

IP  

 D7

D6   

  D5  

 D4

D3    

D2   

D1   

D0 

 

  -  

  -  

   -  

 PS

 PT1

  Px1

  PT0  

 PX0 

    位地址

 

 

 

  BCH

 BBH

 BAH

  B9H  

    B8H 


                                                        △ PS:串行口中断口优先级控制位,PS=1,串行口中断声明为高优先级中断,PS=0,串行口定义为低优先级中断。

    △ PT1:定时器1优先级控制位。PT1=1,声明定时器1为高优先级中断,PT1=0定义定时器1为低优先级中断。

    △ PX1:外中断1优先级控制位。PT1=1,声明外中断1为高优先级中断,PX1=0定义外中断1为低优先级中断。

    △ PT0:定时器0优先级控制位。PT1=1,声明定时器0为高优先级中断,PT1=0定义定时器0为低优先级中断。

    △ PX0:外中断0优先级控制位。PT1=1,声明外中断0为高优先级中断,PX1=0定义外中断0为低优先级中断。

中断的响应


MCS-51CPU在每一个机器周期顺序检查每一个中断源,在机器周期的S6按优先级处理所有被激活的中断请求,此时,如果CPU没有正在处理更高或相同优先级的中断,或者现在的机器周期不是所执行指令的最后一个机器周期,或者CPU不是正在执行 RETI指令或访问IE和IP的指令(因为按MCS-51中断系统的特性规定,在执行完这些指令之后,还要在继续执行一条指令,才会响应中断),CPU在下一个机器周期响应激活了的最高级中断请求。

中断响应的主要内容就是由硬件自动生成一条长调用LCALL addr16指令,这里的addr16就是程序存储器中相应的中断区入口地址,这些中断源的服务程序入口地址如下:

      表5  个中断源的服务程序入口地址 

   中断源

 入口地址 

   外中断0

     0003H 

   定时/计数器0

  000BH 

      外中断1

   0013H 

 定时/计数器0

  001BH 

 串行口中断

     0023H 

                                                                                      
生成 lcall指令后,CPU紧跟着便执行之.首先将PC(程序计数器)的内容压入堆栈保护断点,然后把中断入口地址赋予PC,CPU便按新的PC地址(即中断服务程序入口地址)执行程序。

值得一提的是,各中断区只有8个单元,一般情况下(除非中断程序非常简单),都不可能安装下一个完整的中断服务程序。因此,通常是在这些入口地址区放置一条无条件转移指令,使程序按转移的 实际地址去执行真正的中断服务程序。 

MCS-51单片机 - MCS-51的串行通信口


MCS-51单片机内部有一个全双工的串行通信口,即串行接收和发送缓冲器(SBUF),这两个在物理上独立的接收发送器,既可以接收数据也可以发送数据。但接收缓冲器只能读出不能写入,而发送 缓冲器则只能写入不能读出,它们的地址为99H。这个通信口既可以用于网络通信,亦可实现 串行异步通信,还可以构成同步移位寄存器使用。如果在传行口的输入输出引脚上加上 电平转换器,就可方便地构成标准的RS-232接口。下面我们分别介绍。

基本概念


数据通信的传输方式
    
常用于数据通信的传输方式有单工、半双工、全双工和多工方式。

单工方式:数据仅按一个固定方向传送。因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集。

半双工方式:数据可实现双向传送,但不能同时进行,实际的应用采用某种协议实现收/发开关转换。

全双工方式:允许双方同时进行数据双向传送,但一般 全双工传输方式的线路和设备较复杂。

多工方式:以上三种传输方式都是用同一线路传输一种频率信号,为了充分地利用线路资源,可通过使用多路复用器或多路集线器,采用频分、时分或码分复用技术,即可实现在同一线路上资源共享功能,我们盛之为多工传输方式。

串行数据通信两种形式
     
异步通信
MCS-51单片机_第21张图片 定时/计数器内部结构
     
在这种通信方式中,接收器和发送器有各自的时钟,它们的工作是非同步的,异步通信用一帧来表示一个字符,其内容如下:一个起始位,仅接着是若干个数据位,图2是传输45H的数据格式。

同步通信
    
同步通信格式中,发送器和接收器由同一个 时钟源控制,为了克服在异步通信中,每传输一帧字符都必须加上起始位和停止位,占用了传输时间,在要求传送数据量较大的场合,速度就慢得多。同步传输方式去掉了这些起始位和停止位,只在传输数据块时先送出一个同步头(字符)标志即可。

同步传输方式比 异步传输方式速度快,这是它的优势。但同步传输方式也有其缺点,即它必须要用一个时钟来协调收发器的工作,所以它的设备也较复杂。  
    
串行数据通信的传输速率
    
串行数据传输速率有两个概念,即每秒转送的位数bps(Bit per second)和每秒符号数—波特率(Band rate),在具有调制解调器的通信中,波特率与 调制速率有关。

MCS-51的串行口和控制寄存器


串行口控制寄存器
  
定时/计数器内部结构 定时/计数器内部结构
 
MCS-51单片机串行口寄存器结构如图3所示。SBUF为串行口的收发缓冲器,它是一个可寻址的专用寄存器,其中包含了接收器和发送器寄存器,可以实现全双工通信。但这两个寄存器具有同一地址(99H)。MCS-51的串行数据传输很简单,只要向发送缓冲器写入数据即可发送数据。而从接收缓冲器读出数据即可接收数据。

此外,从图中可看出,接收缓冲器前还加上一级输入移位寄存器,MCS-51这种结构目的在于接收数据时避免发生数据帧重叠现象,以免出错,部分文献称这种结构为双缓冲器结构。而发送数据时就不需要这样设置,因为发送时,CPU是主动的,不可能出现这种现象。  
    
串行通信控制寄存器
    
在上一节我们已经分析了 SCON控制寄存器,它是一个可寻址的专用寄存器,用于串行数据的通信控制,单元地址是98H,其结构格式如下:

    表1  SCON寄存器结构 

  SCON     

D7   

 D6    

  D5  

D4   

   D3

  D2

D1   

   D0 

 

 SM0  

 SM1

 SM2  

  REN

   TB8

RB8   

 TI  

  RI 

   位地址

 9FH

  9EH  

  8DH

   9CH

   9BH

  9AH  

99H   

    98H 


                                 
下面我们对各控制位功能介绍如下:
    
     (1).SM0、SM1:串行口工作方式控制位。
        SM0,SM1    工作方式
            00      方式0
            01      方式1
            10      方式2
            11      方式3

    (2).SM2:多机通信控制位。

多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。当SM2=0时,就不管第位数据是0还是1,都难得数据送入SBUF,并发出中断申请。
    
工作于方式0时,SM2必须为0。

    (3).REN:允许接收位。

REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。

    (4).TB8:发送接收数据位8。
    
在方式2和方式3中,TB8是要发送的——即第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。

    (5).RB8:接收数据位8。
    
在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。

    (6).TI:发送中断标志位。
    
可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。

    (7).RI:接收中断标志位。
    
可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。

 

电源管理寄存器PCON

    
PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,其结构格式如下:

       表2  PCON电源管理寄存器结构 

  PCON    

 D7    

   D6    

 D5  

D4    

 D3    

 D2    

 D1    

   D0 

 位符号

 SMOD

 -

  -

   -

  GF1  

  GF0  

   PD  

    IDL 


 在CHMOS型单片机中,除SMOD位外,其他位均为虚设的,SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0。

 

中断允许寄存器IE

    
中断允许寄存器在前一节中已阐述,这里重述一下对串行口有影响的位ES。ES为串行中断允许控制位,ES=1允许串行中断,ES=0,禁止串行中断。

       表3  IE中断允许控制寄存器结构 

  位符号

  EA    

 -   

  -  

ES  

ET1  

 EX1  

ET0   

 EX0 

  位地址

  AFH  

    AEH  

 ADH

 ACH

   ABH

  AAH

A9H   

 A8H 



你可能感兴趣的:(MCS-51单片机)