
第3章51单片机主要功能应用基础 51单片机主要功能部件包括并行口、中断、定时器/计数器、串行口。本章主要接好51 单片机主要功能部件应用基础。 3.151系列单片机P0~P3口应用编程举例 在认识51单片机的P0~P3口之前,先看两个概念。 双向口:单片机的I/O口是CPU与片外设备进行信息交换的通道,为了提高接口的驱动 能力,具有由场效应管组成的输出驱动器。当驱动器场效应管的漏极具有开路状态时,该 口就具有高电平、低电平和高阻抗3种状态,称为双向口。 准双向口:单片机I/0口的输出场效应管的漏极接有上拉电阻,该口具有高电平、低 电平两种状态,称为准双向口。 在51单片机内部包含有4个并行的I/0接口,分别称为P0口、P1口、P2口和P3口,每一 个口都是8位的,每个口的位都有一个输出锁存器和一个输入缓冲器。PO口是双向口,P1、 P2、P3是准双向口。 3.1.1P0~P3口结构 1.结构 图3-1所示为P0~P3口的位结构原理图。 地址/数据 控制 Vco 读锁存器 Vco & VT 读锁存器 1 PO.X 内部上拉电阻 内部总线 D Q 内部总线 锁存器 D Q 写锁存器 VT 写锁存器 锁存器 P1X CP MUJX CP Q HVT 读引脚 读引脚 地址/数据 控制 地址控制 读锁存器 & VT, 读锁存器 Vcc 1 PO.X 内部总线 D Q 内部总线 D Q 9.0 P2.X 锁存器 锁存器 。 写锁存器 CP VT1 写锁存器 CP MUJX 1 读引脚 读引脚 图3-1P0~P3口口的位结构示意图 2.操作一以P1口为例。 P1口作为通用的I/0接口使用,具有输出、读引脚、读锁存器三种工作方式。 69
69 第 章 单片机 3 51 主要功能应用基础 51单片机主要功能部件包括并行口、中断、定时器/计数器、串行口。本章主要接好51 单片机主要功能部件应用基础。 3.1 51系列单片机P0~P3口应用编程举例 在认识51单片机的P0~P3口之前,先看两个概念。 双向口:单片机的I/O口是CPU与片外设备进行信息交换的通道,为了提高接口的驱动 能力,具有由场效应管组成的输出驱动器。当驱动器场效应管的漏极具有开路状态时,该 口就具有高电平、低电平和高阻抗3种状态,称为双向口。 准双向口:单片机I/O口的输出场效应管的漏极接有上拉电阻,该口具有高电平、低 电平两种状态,称为准双向口。 在51单片机内部包含有4个并行的I/O接口,分别称为P0口、P1口、P2口和P3口,每一 个口都是8位的,每个口的位都有一个输出锁存器和一个输入缓冲器。P0口是双向口,P1、 P2、P3是准双向口。 3.1.1 P0 P3 ~ 口结构 1.结构 图3-1所示为P0~P3口的位结构原理图。 图3-1 P0~P3口口的位结构示意图 2.操作-以P1口为例。 P1口作为通用的I/O接口使用,具有输出、读引脚、读锁存器三种工作方式

(1)输出方式P1口工作于输出方式,此时数据经内部总线送入锁存器存储。如果某位的数据为1,则该位锁存器输出端Q=1,Q=0使V1截止,从而在引脚P1.X上出现高电平;反之,如果数据为0,则Q=0,Q=1使V1导通,在引脚P1.X上出现低电平。(2)读引脚方式读引脚时,控制器打开三态门1,引脚P1.X上的数据经三态门1进入芯片的内部总线,并送到累加器A。输入时无锁存功能。单在读引脚之前,一定要保证V1是截止的。(3)读锁存器方式51系列单片机有很多指令可以直接进行端口操作,这些指令的执行过程分成“读一修改一写”三步,即先将端口的数据读入CPU,在ALU中进行运算,运算结果再送回端口。执行“读一修改一写”类指令时,CPU实际是通过三态门2读回锁存器Q端的数据的。是读引脚还是读锁存器,其过程CPU内部会自动处理,读者不必在意。但应注意,当作为读引脚方式使用时,应先对该口写“1”,使场效应管截止,再进行读操作,以防止场效应管处于导通状态,使引脚为“0”,从而引起误读。3.特点总结:(1)若要执行输入操作,POP3口都必须先输出高电平,才能读取该端口所连接的外部设备的数据。(2)PO口8位皆为漏极开路输出,每个引脚可以驱动8个LS型TTL负载;P1~P3口的8位类似于漏极开路输出,但已接上拉电阻,每个引脚可驱动4个LS型TTL负载。(3)PO口内部无上拉电阻,执行输出功能时,外部必须接上拉电阻(一般1OkQ即可);P1P3口内部具有约30kQ的上拉电阻,执行输出操作时,无须连接外部上拉电阻。(4)若系统连接外部存储器或I/O口芯片,PO口作为地址总线(A7~A0)及数据总线(D7~DO)的复用引脚,此时内部具有上拉电阻,不用外接;若系统连接外部存储器或I/0口芯片,而外部存储器或I/0口芯片的地址线超过8条时,则P2可作为地址总线(A15A8)引脚;P3口的8个引脚各具有第二功能。(5)灌电流比拉电流大。3.1.2输出操作举例51单片机内部并行I/0输出操作包括字节操作和位操作。下面通过例子来说明具体的操作。【例3-1】字节操作。电路如图3-2所示,P1口接8个发光二极管作为输出指示,编程实现使8个发光二极管按一定的频率亮、灭闪烁。70
70 (1)输出方式 P1口工作于输出方式,此时数据经内部总线送入锁存器存储。如果某位的数据为1,则 该位锁存器输出端Q=1,Q =0使V1截止,从而在引脚P1.X上出现高电平;反之,如果数据为 0,则Q=0,Q =1使V1导通,在引脚P1.X上出现低电平。 (2)读引脚方式 读引脚时,控制器打开三态门1,引脚P1.X上的数据经三态门1进入芯片的内部总线, 并送到累加器A。输入时无锁存功能。 单在读引脚之前,一定要保证V1是截止的。 (3)读锁存器方式 51系列单片机有很多指令可以直接进行端口操作,这些指令的执行过程分成“读—修 改—写”三步,即先将端口的数据读入CPU,在ALU中进行运算,运算结果再送回端口。执 行“读—修改—写”类指令时,CPU实际是通过三态门2读回锁存器Q端的数据的。 是读引脚还是读锁存器,其过程CPU内部会自动处理,读者不必在意。但应注意,当作 为读引脚方式使用时,应先对该口写“1”,使场效应管截止,再进行读操作,以防止场效 应管处于导通状态,使引脚为“0”,从而引起误读。 3.特点总结: (1)若要执行输入操作,P0~P3口都必须先输出高电平,才能读取该端口所连接的外 部设备的数据。 (2)P0口8位皆为漏极开路输出,每个引脚可以驱动8个LS型TTL负载;P1~P3口的8位 类似于漏极开路输出,但已接上拉电阻,每个引脚可驱动4个LS型TTL负载。 (3)P0口内部无上拉电阻,执行输出功能时,外部必须接上拉电阻(一般10kΩ即可); P1~P3口内部具有约30kΩ的上拉电阻,执行输出操作时,无须连接外部上拉电阻。 (4)若系统连接外部存储器或I/O口芯片,P0口作为地址总线(A7~A0)及数据总线 (D7~D0)的复用引脚,此时内部具有上拉电阻,不用外接;若系统连接外部存储器或I/O 口芯片,而外部存储器或I/O口芯片的地址线超过8条时,则P2可作为地址总线(A15~A8) 引脚;P3口的8个引脚各具有第二功能。 (5)灌电流比拉电流大。 3.1.2 输出操作举例 51单片机内部并行I/O输出操作包括字节操作和位操作。下面通过例子来说明具体的操 作。 【例3-1】字节操作。电路如图3-2所示,P1口接8个发光二极管作为输出指示,编程实 现使8个发光二极管按一定的频率亮、灭闪烁

U1AT89C51VCC19XTAL1PO.D/ADCLED-GERRN4ADR1470RD1AD89388XTAL2nR2D2IADSnYAD7IAD7RSTnR3D3DIE2.1110YR422.2/A10福D4PSEN3/A127R5AID528A19930999R6O/RXDD6884886893.TXDYINTUP3.3/NTR7D7B3R8ORD87.7/RO图3-2P1口输出操作实例图分析:P1口输出“高电平”时灯“灭”,输出“低电平”时灯“亮”:亮、灭闪烁可以通过一软件延时程序实现。#include0):)//主函数void main()(while(1)//亮(P1=0x00;delay(50000);//灭P1=0xff;delay(50000) ;11【例3-2】位操作。电路如图3-2所示,编程实现P1.3所接的发光二极管亮、灭闪烁。#include//位定义sbit LED3=P1'3;intd)voiddelayunsigned( while(--d>0);)void main( )1while(1){LED3=0;delay(50000);LED3=1;delay(50000);11修改:(1)P1.0对应的灯亮时,P1.7对应的灯灭;P1.0对应的灯灭时,P1.7对应的灯亮。(2)循环操作:编程实现8个灯从低到高流水灯的显示闪烁。(3)从左到右,一个一个亮保持到全亮,然后再重复。(4)思考:灯的亮、灭没有什么规律(花样流水灯),应该怎样编程?71
71 图3-2 P1口输出操作实例图 分析:P1口输出“高电平”时灯“灭”,输出“低电平”时灯“亮”;亮、灭闪烁可 以通过一软件延时程序实现。 #include //特殊功能寄存器声明 void delay( unsigned int d ) //延时函数 { while(-d>0); } void main( ) //主函数 { while(1) { P1=0x00; delay(50000); //亮 P1=0xff; delay(50000); //灭 } } 【例3-2】 位操作。电路如图3-2所示,编程实现P1.3所接的发光二极管亮、灭闪烁。 #include sbit LED3=P1^3; //位定义 void delay( unsigned int d) { while(-d>0); } void main( ) { while(1) { LED3=0; delay(50000); LED3=1; delay(50000); } } 修改: (1)P1.0对应的灯亮时,P1.7对应的灯灭; P1.0对应的灯灭时,P1.7对应的灯亮。 (2)循环操作:编程实现8个灯从低到高流水灯的显示闪烁。 (3)从左到右,一个一个亮保持到全亮,然后再重复。 (4)思考:灯的亮、灭没有什么规律(花样流水灯),应该怎样编程?

(5)思考:如何编程使P1.0和P1.1输出不同周期的信号。(6)将P1口改为P3口。3.1.3输入操作举例51单片机的POP3口可以作为基本的输入口使用,其输入信号是由外部电路决定的,可以分为两大类:电平信号、脉冲信号。这两类信号可以通过闸刀开关、按钮开关两类开关来模拟。如图3-3所示。图3-3(a)是闸刀型开关示意图:图3-3(b)是按钮型开关示意图:图3-3(c)是闸刀型开关输入电路示意图:图3-3(d)是按钮型开关输入电路示意图oACCKC(a)KKNC(b)(e)(d)图3-3闸刀型与按钮型开关示意图1.闸刀型开关【例3-3】闸刀型开关输入信号例子。电路如图3-4所示,编程实现相应的开关闭合时,相应的灯亮。1ATaSS1K3E卫P3.7/RT服K228E3S2IRTEK1.1TXtSDRXD04KORNRNNNa1vCCoG/A1N4LED3R4空费招CTUR42.MAS中LED2R3ARMARRMARST+70RLED18R2AB1SALLTURPB.ABALEDOR1PODIADOXTAL1470R图3-4例4-7电路原理图分析:P1口高4位接开关,低4位接指示灯,因此P1口高4位为输入口,低4位为输出口;对于输入部分,键按下时输入口为低电平,抬起时输入口为高电平:对于输出部分,输出高电平灯灭,输出低电平灯亮;所以只要将相应的键的状态送到相应的输出位置就可以了。#includesbit LEDO=PO;//输出灯位定义sbit LED1=P1'1;sbit LED2=P1'2;72
72 (5)思考:如何编程使P1.0和P1.1输出不同周期的信号。 (6)将P1口改为P3口。 3.1.3 输入操作举例 51单片机的P0~P3口可以作为基本的输入口使用,其输入信号是由外部电路决定的, 可以分为两大类:电平信号、脉冲信号。这两类信号可以通过闸刀开关、按钮开关两类开 关来模拟。如图3-3所示。图3-3(a)是闸刀型开关示意图;图3-3(b)是按钮型开关示意 图;图3-3(c)是闸刀型开关输入电路示意图;图3-3(d)是按钮型开关输入电路示意图 。 图3-3 闸刀型与按钮型开关示意图 1.闸刀型开关 【例3-3】闸刀型开关输入信号例子。电路如图3-4所示,编程实现相应的开关闭合时 ,相应的灯亮。 图3-4 例4-7电路原理图 分析:P1口高4位接开关,低4位接指示灯,因此P1口高4位为输入口,低4位为输出 口;对于输入部分,键按下时输入口为低电平,抬起时输入口为高电平;对于输出部分, 输出高电平灯灭,输出低电平灯亮;所以只要将相应的键的状态送到相应的输出位置就可 以了。 #include sbit LED0=P1^0; //输出灯位定义 sbit LED1=P1^1; sbit LED2=P1^2;

sbit LED3=P1°3:sbit KO=P1~4;//输入按键位定义sbit K1=P1'5;sbit K2=P1'6;sbitK3=P1"7:voidmain()( while(1)K0=1; K1=l; K2=1; K3=1;//读之前先置1{LEDO=KO;LED1=K1:LED2=K2;LED3=K3;11思考:为什么在读键状态之前要先置1?修改:(1)开关闭合时灯灭。(2)KO控制LED3,K1控制LED2,K2控制LED1,K3控制LEDO。2.按钮型开关按钮型开关输入信号具有自动恢复(弹回)功能,当按下按钮,其中的接点接通,放开按钮后,接点恢复为断开。开关在动作时并不是理想的状态,将可发生许多非预想状态,如图3-5所示。这种非预想状态称为抖动。开关抖动的处理可以分为硬件去抖动和软件去抖动。硬件去抖动增加硬件投入,在单片机应用电路中,一般采用软件去抖动。软件去抖动就是执行一段软件延时程序(10ms左右)。这样,开关的处理参看图4-13所示的程序框图。在图3-6中关注两个问题:去抖动、判断按键是否抬起。开始输入键状态1《有键按下吗?》+Y延时消抖动输入键状态Y《有键按下吗?Y键处理Y输入键状态键按下《键拾起了吗?键稳定Y延时消抖动T-结束后沿抖动前沿抖动图3-5开关的抖动图3-6开关处理程序框图73
73 sbit LED3=P1^3; sbit K0=P1^4; //输入按键位定义 sbit K1=P1^5; sbit K2=P1^6; sbit K3=P1^7; void main( ) { while(1) K0=1; K1=1; K2=1; K3=1; //读之前先置1 { LED0=K0; LED1=K1; LED2=K2; LED3=K3; } } 思考:为什么在读键状态之前要先置1? 修改: (1)开关闭合时灯灭。 (2)K0控制LED3,K1控制LED2,K2控制LED1,K3控制LED0。 2.按钮型开关 按钮型开关输入信号具有自动恢复(弹回)功能,当按下按钮,其中的接点接通,放开 按钮后,接点恢复为断开。 开关在动作时并不是理想的状态,将可发生许多非预想状态,如图3-5所示。这种非预 想状态称为抖动。 开关抖动的处理可以分为硬件去抖动和软件去抖动。硬件去抖动增加硬件投入,在单 片机应用电路中,一般采用软件去抖动。 软件去抖动就是执行一段软件延时程序(10ms左右)。这样,开关的处理参看图4-13所 示的程序框图。在图3-6中关注两个问题:去抖动、判断按键是否抬起。 图3-5 开关的抖动 图3-6 开关处理程序框图

【例3-4】按钮开关模拟输入。电路如图3-7所示,开始高4位的灯亮,低4位的灯灭,编程实现S1按钮按一下,4个灯一组亮、灭交替。U1AT89C51R7 470RED7VC15R6 470RED614P3.S1R5 470RED5P3.1TXD0P3.0/RXDR4 470ED4中GNDB38A1P2.2R3470RED3P2.4/A12PSL43手29233/A1R2470RED2P2.0/AGR1470RED19RSTPO.7IADTPOROLEDO18XTAL207P19XTAL1图3-7例3-4电路原理图分析:按键按下时为低电平,抬起时为高电平:按键的消抖动需延时8mS:P1口作为输出口控制灯,初值为OFH,亮、灭交替取反即可。在对按键的处理过程中,一般采用编写个键处理函数,如keyscan(,在主函数中对该函数使用,同时可以定义一个位变量,按键动作将位置1(或变量取反)。#include#define ucharunsignedchar#defineintuint unsignedsbit S1=P3'2;//按键位定义bit il://存放键动作状态i1=0;void dlxms(uint xms)//延时xms毫秒( uint tl,t2;for( tl=0;tl<xms; tl++)for(t2=0; t2<110; t2++);1void keyscan(( S1=1;//读之前先置1if( S1==0)//如果按键按下(dlxms(8);//延时,去抖动if( S1==0)//键继续按下吗?( il=l;while( Sl==0) ;//按键没抬起,等待11174
74 【例3-4】按钮开关模拟输入。电路如图3-7所示,开始高4位的灯亮,低4位的灯灭, 编程实现S1按钮按一下,4个灯一组亮、灭交替。 图3-7 例3-4电路原理图 分析:按键按下时为低电平,抬起时为高电平;按键的消抖动需延时8ms;P1口作为输 出口控制灯,初值为0FH,亮、灭交替取反即可。在对按键的处理过程中,一般采用编写一 个键处理函数,如keyscan(),在主函数中对该函数使用,同时可以定义一个位变量,按键 动作将位置1(或变量取反)。 #include #define uchar unsigned char #define uint unsigned int sbit S1=P3^2; //按键位定义 bit i1; //存放键动作状态 i1=0; void dlxms(uint xms) //延时xms毫秒 { uint t1,t2; for( t1=0; t1<xms; t1++) for( t2=0; t2<110; t2++); } void keyscan() { S1=1; //读之前先置1 if( S1==0) //如果按键按下 { dlxms(8); //延时,去抖动 if( S1==0) //键继续按下吗? { i1=1; while( S1==0); //按键没抬起,等待 } } }

voidmain()(P1=0x0f;while(1)( keyacan();if(il==l)//如果按键按下{PI=PI;i1=0; ;1子1说明:开关接在P3.2上是为以后介绍中断的时间准备的:本例题是属于查询方式,后面介绍中断的时间可以模拟外部中断输入。修改:电路如图3-7所示,开始是所有的灯都亮,按一下S1,灯变为500ms闪烁,再按一下,变为全亮(相当于S1为一个控制开关,控制着等的亮、灭闪烁)。3.251单片机中断系统应用举例所谓中断,是指CPU正常运行程序时,由于CPU内部事件或外设请求,引起CPU终止正在运行的程序,转去执行请求中断的外设(或内部事件)的中断服务程序,中断服务程序执行完毕,再返回被中止的程序,这个过程称为中断。利用中断可以避免不断检测外设状态,提高CPU的效率。3.2.1中断系统的再认识1.中断的有关概念(1)中断源与中断请求引起中断的原因,或是能发出中断申请的来源,称为中断源。中断源有外部中断和内部中断,内部中断由程序预先安排的中断指令引起,或由于CPU运算中产生的某些错误(如除法出错、运算溢出)引起。外部中断是外设或协处理器向CPU发出的中断申请引起的,外部中断义称为硬件中断。中断源向CPU发出中断信号的过程称为中断甲请或中断请求。(2)可屏蔽中断与非屏蔽中断可屏蔽中断有时也称为直接中断。屏蔽是指CPU可以不处理的中断请求。这种屏蔽实际上是CPU的一种工作方式,可以通过软件(指令)来设置,也就是可以通过指令,使CPU或者允许接受中断请求,或者不接受中断请求。具体的指令由CPU的指令系统来决定。可屏蔽中断是最常见的一种中断方式,所有的微处理器都有这种中断方式。对非屏蔽中断来说,如果该中断源申请了中断,CPU是一定要处理的。CPU不可以也不能用软件将该中断屏蔽掉。一般一些紧急的情况,如掉电中断申请,就可以安排为这种中断方式,以保证紧急情况一定能得到处理。但并不是所有的微处理器的中断系统都有这种75
75 void main( ) { P1=0x0f; while(1) { keyacan(); if(i1==1) //如果按键按下 { P1=~P1; i1=0;; } } } 说明:开关接在P3.2上是为以后介绍中断的时间准备的;本例题是属于查询方式,后 面介绍中断的时间可以模拟外部中断输入。 修改:电路如图3-7所示,开始是所有的灯都亮,按一下S1,灯变为500ms闪烁,再按 一下,变为全亮(相当于S1为一个控制开关,控制着等的亮、灭闪烁)。 3.2 51单片机中断系统应用举例 所谓中断,是指CPU正常运行程序时,由于CPU内部事件或外设请求,引起CPU终止正在 运行的程序,转去执行请求中断的外设(或内部事件)的中断服务程序,中断服务程序执行 完毕,再返回被中止的程序,这个过程称为中断。利用中断可以避免不断检测外设状态, 提高CPU的效率。 3.2.1 中断系统的再认识 1.中断的有关概念 (1)中断源与中断请求 引起中断的原因,或是能发出中断申请的来源,称为中断源。中断源有外部中断和内 部中断,内部中断由程序预先安排的中断指令引起,或由于CPU运算中产生的某些错误(如 除法出错、运算溢出)引起。外部中断是外设或协处理器向CPU发出的中断申请引起的,外 部中断又称为硬件中断。 中断源向CPU发出中断信号的过程称为中断申请或中断请求。 (2)可屏蔽中断与非屏蔽中断 可屏蔽中断有时也称为直接中断。屏蔽是指CPU可以不处理的中断请求。这种屏蔽实际 上是CPU的一种工作方式,可以通过软件(指令)来设置,也就是可以通过指令,使CPU或 者允许接受中断请求,或者不接受中断请求。具体的指令由CPU的指令系统来决定。可屏蔽 中断是最常见的一种中断方式,所有的微处理器都有这种中断方式。 对非屏蔽中断来说,如果该中断源申请了中断,CPU是一定要处理的。CPU不可以也不 能用软件将该中断屏蔽掉。一般一些紧急的情况,如掉电中断申请,就可以安排为这种中 断方式,以保证紧急情况一定能得到处理。但并不是所有的微处理器的中断系统都有这种

中断方式,51单片机的中断系统就没有非屏蔽中断。(3)中断的开放与关闭中断的开放与关闭,亦称为开中断和关中断,是指CPU对中断系统的控制状态,只有当CPU处于开中断状态时,才能接受外部的中断申请。反之,当CPU处于关中断状态时,则不能接受外部的中断申请。CPU具有开中断和关中断控制状态,和CPU是否接受屏蔽中断申请是一致的。当CPU处于关中断控制时,也就是对外实现了中断的屏蔽。CPU只有在开中断的控制状态下,才可以接受可屏蔽中断申请。中断的开放与关闭和非屏蔽中断无关。CPU有开中断状态和关中断状态是中断系统工作的需要。当CPU在开中断状态下接受了一个外设的中断申请时,就应该处理这个外设要求CPU完成的工作。在此期间,一般来说,CPU不应该再去接受其他的中断申请,而是应该把中断关闭,一心一意地为已接受的中断申请服务。而当中断服务完毕之后,则使中断开放,以便接受新的中断申请。所以,开/关中断状态的存在与设置是完成中断系统的工作所不可缺少的。(4)中断优先级与中断嵌套当有多个中断源请求中断时,中断系统判别中断申请的优中所先级,CPU响应优先级高的中断,挂起优先级低的中断。CPU在氏L运行中断服务子程序时,若有新的更高优先级的中断申请进入35,则CPU要挂起原中断进入更高级的中断服务子程序,实现中区口店断嵌套功能。中断嵌套的示意图如图3-8所示。(5)中断响应与中断服务程序图3-8中断嵌套示意图CPU执行中断服务程序的过程称为中断响应;为相应的中断源而编写的程序称为中断服务程序;中断服务程序在内存中存放的首地址称为中断服务程序入口地址。2.中断处理过程对于不同的计算机,中断处理的具体过程可能不尽相同,即使是同一台计算机,由于中断方式的不同(如可屏蔽中断、非屏蔽中断等),中断处理也会有差别,但是基本的处理过程应该是相同的。一个完整的中断处理的基本过程应包括:中断请求、中断优先权判别、中断响应、中断处理及中断返回。(1)中断请求中断请求是中断源(或者通过接口电路)向CPU发出信号,要求CPU中断原来执行的程序并为它服务。中断请求信号可能是电平信号,也可能是脉冲信号。CPU能够接受的中断请求信号则随CPU而定。外设向CPU发出中断请求信号需要两个条件:①外设本身的工作已经完成,如键已按下、光电输入机已准备好数据、实时时钟的定时时间已到等,才可向CPU申请中断。②计算机系统允许该外设发中断请求信号。如果系统由于某种原因不充许它发中断请求,即使外设本身的工作已经完成并发出了状态信号,对应的I/0接口电路也不发出中断请求信号,这称为接口电路中断屏蔽或中断禁止。反之,则称为接口电路中断允许或中断开76
76 中断方式,51单片机的中断系统就没有非屏蔽中断。 (3)中断的开放与关闭 中断的开放与关闭,亦称为开中断和关中断,是指CPU对中断系统的控制状态,只有当 CPU处于开中断状态时,才能接受外部的中断申请。反之,当CPU处于关中断状态时,则不 能接受外部的中断申请。 CPU具有开中断和关中断控制状态,和CPU是否接受屏蔽中断申请是一致的。当CPU处于 关中断控制时,也就是对外实现了中断的屏蔽。CPU只有在开中断的控制状态下,才可以接 受可屏蔽中断申请。中断的开放与关闭和非屏蔽中断无关。 CPU有开中断状态和关中断状态是中断系统工作的需要。当CPU在开中断状态下接受了 一个外设的中断申请时,就应该处理这个外设要求CPU完成的工作。在此期间,一般来说, CPU不应该再去接受其他的中断申请,而是应该把中断关闭,一心一意地为已接受的中断申 请服务。而当中断服务完毕之后,则使中断开放,以便接受新的中断申请。所以,开/关中 断状态的存在与设置是完成中断系统的工作所不可缺少的。 (4)中断优先级与中断嵌套 当有多个中断源请求中断时,中断系统判别中断申请的优 先级,CPU响应优先级高的中断,挂起优先级低的中断。CPU在 运行中断服务子程序时,若有新的更高优先级的中断申请进入 ,则CPU要挂起原中断进入更高级的中断服务子程序,实现中 断嵌套功能。中断嵌套的示意图如图3-8所示。 (5)中断响应与中断服务程序 CPU执行中断服务程序的过程称为中断响应;为相应的中 断源而编写的程序称为中断服务程序;中断服务程序在内存中存放的首地址称为中断服务 程序入口地址。 2.中断处理过程 对于不同的计算机,中断处理的具体过程可能不尽相同,即使是同一台计算机,由于 中断方式的不同(如可屏蔽中断、非屏蔽中断等),中断处理也会有差别,但是基本的处 理过程应该是相同的。一个完整的中断处理的基本过程应包括:中断请求、中断优先权判 别、中断响应、中断处理及中断返回。 (1)中断请求 中断请求是中断源(或者通过接口电路)向CPU发出信号,要求CPU中断原来执行的程序 并为它服务。中断请求信号可能是电平信号,也可能是脉冲信号。CPU能够接受的中断请求 信号则随CPU而定。 外设向CPU发出中断请求信号需要两个条件: ① 外设本身的工作已经完成,如键已按下、光电输入机已准备好数据、实时时钟的定 时时间已到等,才可向CPU申请中断。 ② 计算机系统允许该外设发中断请求信号。如果系统由于某种原因不允许它发中断请 求,即使外设本身的工作已经完成并发出了状态信号,对应的I/O接口电路也不发出中断请 求信号,这称为接口电路中断屏蔽或中断禁止。反之,则称为接口电路中断允许或中断开 图 3-8 中断嵌套示意图

放。满足上述两个条件后,中断源可以向CPU提出中断请求。但CPU是否响应中断,还取决于它是处在允许中断状态还是处在禁正中断状态。这由CPU内部设置的中断允许触发器控制。中断允许触发器的状态由软件控制,这样CPU可处在中断允许状态或中断开放状态,或可处在中断屏蔽状态或中断禁止状态。(2)中断优先权判别一个计算机系统常有多个中断源:同一中断请求引脚也可以接有多个可以提出中断请求的外设,如图3-9所示。遇到几个设备同时中断请求时,CPU先响应谁,这就有一个中断优先权的问题。VOTH接口V/OTH接口VOTH接口价1ATCPU外设外设外设1+*INT图3-9同一中断源请求引脚有多个外设中断优先权有3条原则:1)多个中断源同时甲请中断时,CPU先响应优先权高的中断请求。②优先权级别低的中断正在处理时,若有级别高的中断请求,则在高级别中断服务程序执行完后再返回低级别中断服务程序继续执行,这称为中断嵌套。③同级别或低级别的中断源提出中断请求时,CPU要等到正在处理的中断服务程序执行完毕返回主程序,并执行广主程序的一条指令后,才接着响应。中断源中断优先权的高低有的是在计算机设计、制造时就规定了的,例如有的计算机规定掉电、故障处理等中断请求的优先权级别高于一般中断请求。有的是让用户自己安排的,这可以采用硬件办法,也可以采用软件办法。例如,将许多会提出中断请求的外设用电路连接成一个链,外设越排在前面,优先权越高,连成链的逻辑电路使排在后面的外设只有在它前面各外设均不中断请求时才能提出中断请求,当前面的外设有中断请求时,将屏蔽后面各外设的中断请求或中断后面外设原已进入的中断服务程序。软件办法采用查询手段依次询问各外设有未提出中断请求,如有则转去为该外设服务,如无则循序询问下一个外设,这样先查询的外设优先权高,后查询的外设优先权低。(3)中断响应如果提出中断请求的中断源优先权高,而且接口电路与CPU都中断开放,CPU将响应中断,自动执行下列工作:①保留断点:中止正在执行的程序,并对断点进行保护,即将断点地址的值压入堆栈保存,以便中断服务程序执行完后能返回断点处继续执行程序。②转入中断服务程序:将中断服务程序的人口地址送入PC,以转到中断服务程序。各中断源要求服务的内容不同,所以要编制不同的中断服务程序,它们有不同的入口地址。CPU首先要确定是哪一个中断源在申请中断,然后将对应的入口地址送入PC。(4)中断处理77
77 放。 满足上述两个条件后,中断源可以向CPU提出中断请求。但CPU是否响应中断,还取决 于它是处在允许中断状态还是处在禁止中断状态。这由CPU内部设置的中断允许触发器控 制。中断允许触发器的状态由软件控制,这样CPU可处在中断允许状态或中断开放状态,或 可处在中断屏蔽状态或中断禁止状态。 (2)中断优先权判别 一个计算机系统常有多个中断源;同一中断请求引脚也可以接有多个可以提出中断请 求的外设,如图3-9所示。遇到几个设备同时中断请求时,CPU先响应谁,这就有一个中断 优先权的问题。 图3-9 同一中断源请求引脚有多个外设 中断优先权有3条原则: ① 多个中断源同时申请中断时,CPU先响应优先权高的中断请求。 ② 优先权级别低的中断正在处理时,若有级别高的中断请求,则在高级别中断服务程 序执行完后再返回低级别中断服务程序继续执行,这称为中断嵌套。 ③ 同级别或低级别的中断源提出中断请求时,CPU要等到正在处理的中断服务程序执 行完毕返回主程序,并执行了主程序的一条指令后,才接着响应。 中断源中断优先权的高低有的是在计算机设计、制造时就规定了的,例如有的计算机 规定掉电、故障处理等中断请求的优先权级别高于一般中断请求。有的是让用户自己安排 的,这可以采用硬件办法,也可以采用软件办法。例如,将许多会提出中断请求的外设用 电路连接成一个链,外设越排在前面,优先权越高,连成链的逻辑电路使排在后面的外设 只有在它前面各外设均不中断请求时才能提出中断请求,当前面的外设有中断请求时,将 屏蔽后面各外设的中断请求或中断后面外设原已进入的中断服务程序。软件办法采用查询 手段依次询问各外设有未提出中断请求,如有则转去为该外设服务,如无则循序询问下一 个外设,这样先查询的外设优先权高,后查询的外设优先权低。 (3)中断响应 如果提出中断请求的中断源优先权高,而且接口电路与CPU都中断开放,CPU将响应中 断,自动执行下列工作: ① 保留断点:中止正在执行的程序,并对断点进行保护,即将断点地址的值压入堆栈 保存,以便中断服务程序执行完后能返回断点处继续执行程序。 ② 转入中断服务程序:将中断服务程序的人口地址送入PC,以转到中断服务程序。各 中断源要求服务的内容不同,所以要编制不同的中断服务程序,它们有不同的入口地址。 CPU首先要确定是哪一个中断源在申请中断,然后将对应的入口地址送入PC。 (4)中断处理

中断处理也称为中断服务,实际上就是在执行中断服务程序。在中断服务程序中,一般要完成以下工作:①保护现场:根据需要把断点处有关寄存器的内容推入堆栈保护。因为CPU的寄存器无论是在调用程序和被调用程序中都是可以使用的。如果某些寄存器在主程序中已经保存了数据,并且在以后的执行中还要继续使用,而在中断服务程序中也要用到这些寄存器,则原来的数据就会被新的数据取代,以后主程序再使用这些数据就要出错。因此,对于子程序中要使用的寄存器,一般都应先推入堆栈加以保护。具体应保护哪些寄存器的内容,则应视情况而定。②处理开/关中断:一般的中断系统在响应中断后是自动关中断的,在退出中断服务程序前,一定要恢复到开中断的状态,以便CPU在结束这次中断处理后,接受和处理其他的中断申请。另外,进入中断服务程序后,需要考虑是否还允许其他中断源申请中断。③执行中断服务程序:中断服务的核心就是执行中断服务程序,对于程序设计者来说,就是要根据外设和CPU交换数据的要求,编写中断服务程序。④恢复现场:在结束中断服务程序之前,要将推入堆栈保护的寄存器内容,弹出到各自所属的寄存器,以便回到主程序后,继续执行原来的程序。③结束中断服务程序:中断服务程序的最后必须有一条中断返回指令,用以结束中断服务程序的执行。(5)中断返回中断返回是在中断服务程序,用一条返回指令来实现的。此时,CPU将压入堆栈保护的断点地址弹出到计数器PC,从而使CPU继续执行中断了的主程序。3.2.251单片机中断系统结构51系列单片机中,不同型号的单片机的中断源数量不同。51单片机的51子系列有5个中断源,52子系列有6个中断源。它们均有两级优先级,通过4个专用中断控制寄存器(IE、IP、TCON、SCON)进行中断管理。1.原理结构图51单片机的中断系统包括中断源和中断控制等,其结构原理如图3-10所示。优先级中断允许寄存器IE0查询电路中断优先级INTO高优先级ITO寄存器IP源允许总允许中断请求国TFO源码向量入口INTI-ZET低优先级中断请求TFIL源码向量入口图3-1051单片机中断系统结构图78
78 中断处理也称为中断服务,实际上就是在执行中断服务程序。在中断服务程序中,一 般要完成以下工作: ① 保护现场:根据需要把断点处有关寄存器的内容推入堆栈保护。因为CPU的寄存器 无论是在调用程序和被调用程序中都是可以使用的。如果某些寄存器在主程序中已经保存 了数据,并且在以后的执行中还要继续使用,而在中断服务程序中也要用到这些寄存器, 则原来的数据就会被新的数据取代,以后主程序再使用这些数据就要出错。 因此,对于子程序中要使用的寄存器,一般都应先推入堆栈加以保护。具体应保护哪 些寄存器的内容,则应视情况而定。 ② 处理开/关中断:一般的中断系统在响应中断后是自动关中断的,在退出中断服务 程序前,一定要恢复到开中断的状态,以便CPU在结束这次中断处理后,接受和处理其他的 中断申请。 另外,进入中断服务程序后,需要考虑是否还允许其他中断源申请中断。 ③ 执行中断服务程序:中断服务的核心就是执行中断服务程序,对于程序设计者来 说,就是要根据外设和CPU交换数据的要求,编写中断服务程序。 ④ 恢复现场:在结束中断服务程序之前,要将推入堆栈保护的寄存器内容,弹出到各 自所属的寄存器,以便回到主程序后,继续执行原来的程序。 ⑤ 结束中断服务程序:中断服务程序的最后必须有一条中断返回指令,用以结束中断 服务程序的执行。 (5)中断返回 中断返回是在中断服务程序,用一条返回指令来实现的。此时,CPU将压入堆栈保护的 断点地址弹出到计数器PC,从而使CPU继续执行中断了的主程序。 3.2.2 51 单片机中断系统结构 51系列单片机中,不同型号的单片机的中断源数量不同。51单片机的51子系列有5个中 断源,52子系列有6个中断源。它们均有两级优先级,通过4个专用中断控制寄存器(IE、I P、TCON、SCON)进行中断管理。 1.原理结构图 51单片机的中断系统包括中断源和中断控制等,其结构原理如图3-10所示。 图3-10 51单片机中断系统结构图