1、 教学目的:了解80C51系列单片机内部定时器/计数器、串行口和中断系统的结构与工作原理;能够对他们编程、应用。l教学重点:1.主要功能单元的工作原理;l 2.主要功能单元的控制方法。l教学难点:1.定时/计数器的工作方式;2.中断系统的应用。l 1.定时定时/计数器计数器T0T0、T1T1的结构的结构 l 图9.1 80C51定时器/计数器T0、T1原理结构框图 80C51单片机内部有两个16位的可编程定时计数器 T0、T1,其组成如图91。可编程是指其功能如工作方式、定时时间、量程、启动方式等均可由指令来确定和改变。有6个8位寄存器用于T0、T1的控制与管理,其访问地址依次为8AH8DH,
2、每个寄存器均可单独访问。16位的T0、T1寄存器是用于存放定时或计数初值与当前值的,两个特殊功能寄存器 TCON和TMOD 是用于管理与控制定时计数器 工作的。l 16位的定时计数器实质上是一个加1计数器,其控制电路受软件控制、切换。通过软件可以设置为4种工作方式(详见9.3节),每种方式都可以用作定时或者计数。不同的工作方式,计数器长度分别为:16位、13位和8位。l1)定时器的工作原理 当选择定时器工作方式时,对片内振荡器的12分频信号计数,实现定时;定时器的定时时间与计数器的初值和系统的振荡频率有关。如果晶振的频率为12 MHz,则计数周期为T=611 s1(12 10)122)计数器工
3、作原理计数器在每个机器周期的S5P2期间对引脚输入电平采样。如果一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1,新的计数值装入计数器。当计数器达到FFFFH,此时再来一个脉冲,计数器即清零,此即计数器溢出。3计数脉冲来源当定时/计数器作为定时器时,计数脉冲是由单片机内部产生的,这个信号的频率和幅值都是稳定的;作为计数器时,计数脉冲是由单片机外部提供的。l M0M1C/TGATEM0M1C/TGATEM0M1C/TGATEM0M1C/TGATET1T0 1.定时计数器寄存器 1)工作方式寄存器 TMOD:设置定时器/计数器的工作方式及控制模式,TMOD在SFR的字节地址为89H。
4、M1 M0 工作方式 功能描述 0 0方式0 13位计数器 0 1方式1 16位计数器1 0方式2自动再装入8位计数器1 1方式3 定 时 器 0:分 成 两 个 8 位 计 数 器定时器1:只能工作在方式0、1、2 TF1TR1TF0TR0IE1IT1IE0IE0 l控制寄存器TCON:控制定时器的启、停和定时器的溢出标志。TCON在SFR的字节地址为88H,可位寻址。l2)定时/计数器控制寄存器TCON 位7 TF1定时器1溢出标志。位6 TR1定时器1运行控制位。位5 TF0定时器0溢出标志。位4 TR0定时器0运行控制位。位3 IE1外部中断1请求标志。位2 IT1外部中断1触发方式选
5、择位。位1 IE0外部中断0请求标志。位0 IT0外部中断0触发方式选择位。l 2.定时/计数器的初始化与启动 l初始化步骤一般如下:l1)确定工作方式对TMOD赋值。l2)预置定时或计数的初值可直接将初值写入TH0、TL0或TH1、TL1。l3)根据需要开放定时/计数器的中断直接对IE寄存器的定时器中断位赋值。l在对T0和T1初始化后,即可准备启动定时/计数器工作。l现假设最大计数值为M,那么各方式下的M值如下:l方式0:M2138192l方式1:M21665536l方式2:M28256l方式3:定时器0分成两个8位计数器,所以两个M均为256。l因为定时/计数器是做“加1”计数,并在计满溢
6、出时产生中断,因此初值X可以这样计算:l X M 计数值l举例说明,如果 80C51时钟频率为6MHz,要求产生1ms的定时。则初值 XM计数值 6553650065036FE0CH。l通过对M1、M0位的设置,T0可选择4种工作方式,T1可选择3种工作方式。本节将介绍这4种工作方式的结构、特点及工作过程。l方式0和方式1:结构和工作原理基本相同基本相同,只是,只是方式0 为13位计数器方式,方式1 为16位计数器方式。l 图9.2 T0(或T1)方式1结构方式2:计数常数可自动再装入的8位计数器方式。l 图9.3 T0(或Tl)方式2结构l方式3:T1作波特率发生器,T0可以构成两个独立的计
7、数器。l 图9.4 T0方式3结构 图9.5 T0方式3下的T1结构(a)T1方式1(或方式0)(b)T1方式2l定时器/计数器的复位状态:工作方式0、选择内部启动、计数器停止工作、溢出中断标志清零。l定时器/计数器的初始化:对TMOD赋值确定工作方式;预置定时或计数的初值;根据需要开放定时器/计数器的中断;启动定时/计数器工作。计数器初值最大计数值 要求的计数值 定时时间=(最大计数值 计数器初值)机器周期l计数的“飞读”:解决计数器工作过程中,正确读取计数值的问题,避免由于低位计数器的溢出而导致读数的粗大误差。以定时器T0为例:RP:MOV A,TH0 ;读TH0 MOV R0,TL0 ;
8、读TL0 CJNE A,TH0,RP ;比较两次读得的TH0,不等则重读 MOV R1,A RETl例9.19.1 用T1定时,完成日历时钟秒、分、时的定时,设晶振为12 MHz。l解 根据题目要求,首先要完成1s的定时,在这个基础上,每计满60s,分钟加1,而每计满60min,时钟的时加1,计满一天,时钟清零,从零时开始继续上述循环,因此要完成日历时钟的设计,首先要解决1s的定时。AT89S51单片机在方式1下定时时间最长,最大的定时时间为lTmax=M12/fOSC=65536 s=65.536mslT1的初始值X的表达式为l(MX)1106=50l03lX=6553650000=1553
9、6=3CB0Hl汇编语言源程序如下:lMOV50H,#20 ;定时1s循环次数lMOV51H,#60 ;定时1min循环次数lMOV52H,#60 ;定时1h循环次数lMOV53H,#24 ;定时24h循环次数lMOVTMOD,#10H;设T1为方式1lMOVTH1,#3CH ;赋定时初值高字节lMOVTL1,#0B0H;赋定时初值低字节lSETBTR1 ;启动T1lL2:JBCTF1,L1 ;查询计数溢出,有溢出清TF1为0 lSJMPL2lL1:MOVTH1,#3CH;重赋定时初值lMOVTL1,#0B0HlDJNZ50H,L2 ;未到ls继续循环l DJNZ 51H,L2 ;未到lmin
10、继续循环MOV51H,#60DJNZ52H,L2 ;未到lh继续循环MOV52H,#60DJNZ53H,L2 ;未到24h继续循环MOV53H,#24SJMPL2 ;反复循环C51语言程序如下:#include/包含51单片机SFR库#define sec_data 20 /定义秒计数上限#define min_data 60 /定义分计数上限#define hou_data 60 /定义1小时计数上限#define day_data 24 /定义1天计数上限unsigned char second,minute,hour,day;/定义各变量void main(void)TMOD=0 x10
11、;/设定时器1为方式1TH1=0 x3c;/赋初值TL1=0 xb0;TR1=1;/启动T1for(day=0;dayday_data;day+)/天计数循环 for(hour=0;hourhou_data;hour+)/时计数循环 for(minute=0;minutemin_data;minute+)/分计数循环 for(second=0;secondsec_data;second+)/秒计数循环 while(TF1=0);TF1=0;/标志位清零TH1=0 x3c;/重赋初值TL1=0 xb0;2 2计数器应用举例计数器应用举例例9.2 用T0对外部信号计数,要求每计满50次,将P1.0
12、引脚电平状态取反。解:外部计数信号由T0(P3.4)引脚引入,每产生一次负跳变,计数器加1,由程序查询TF0位。方式2具有初值自动重装入功能,初始化后不必再置初值。初值计算如下:X=2850=206=CEH汇编语言源程序如下:MOV TMOD,#06H ;设置T0为方式2下计数工作方式 MOV TH0,#0CEH ;赋初值 MOV TL0,#0CEH SETBTR0 ;启动T0DEL:JBC TF0,REP ;查询计数溢出,使TF0位清零 SJMPDELREP:CPL P1.0 ;输出取反 SJMPDELC51语言程序如下:#include sbit output=P10;void main(
13、void)TMOD=0 x06;/设置T0为方式2下计数工作方式 TH0=0 xce;/赋初值 TL0=0 xce;TR0=1;/启动T0 while(1)dowhile(TF0=0);/等待计数溢出 TF0=0;/标志位清零 output=!output;/输出取反 3 3定时定时/计数器综合应用举例计数器综合应用举例例9.3 已知单片机的晶振频率为6MHz。由T0的P3.4引脚输入一低频(小于0.5kHz)脉冲信号,要求输入P3.4引脚的信号每发生一次负跳变,P1.0引脚就输出一个500 s的同步负脉冲。图9.6 例9.3时序示意图图9.6 例9.3时序示意图设定时500s的初始值为X,则
14、(256X)2106=500106 X=256250=6汇编语言源程序如下:BEGIN:MOVTMOD,#06H;设T0为方式2下计数工作方式 MOV TH0,#0FFH;计数值加1即溢出 MOVTL0,#0FFHSETBTR0;启动计数器DEL1:JBCTF0,RESP1;检测外跳变信号 SJMPDEL1RESP1:CLRTR0 MOVTMOD,#02H ;重置T0为500s定时MOVTH0,#06H;重置定时初值MOVTL0,#06HCLRP1.0;P1.0引脚清零SETB TR0;启动T0DEL2:JBC TF0,RESP2;检测第1次500 s到否SJMP DEL2 ;没到继续RESP
15、2:SETB P1.0;P1.0引脚恢复1CLRTR0LJMP BEGIN例9.49.4、利用门控位测量一个低频方波信号的周期,被测信号从(P3.2)引脚输入,图9.7所示为门控位应用示意图。已知低频信号频率在100 Hz100 kHz范围内,晶振频率为12 MHz,测量结果依次存入片内RAM 71H、70H单元。解:为实现方波信号周期的测量,可以利用定时/计数器的门控位测量出方波信号的高电平时间,这个时间的两倍就是方波信号的周期。测量过程如下:图9.7 门控位应用示意图 ORG 200H MOVTMOD,09H ;设T0为方式1,GATE1。MOVTL0,00H MOVTH0,00H MOV
16、R0,70H JBP3.2,;等P3.2变低 SETB TR0;启动T0准备工作 JNB P3.2,;等待P3.2变高 JB P3.2,;等待P3.2再次变低 CLR TR0;停止计数l MOV A,TL0lRLC A;低字节乘以2lMOV R0,A;存放计数的低字节lINC R0lMOV A,TH0lRLC A;高字节乘以2lMOV R0,A;存放计数的高字节l C51语言程序如下:#include sbit input=P32;/定义信号输入引脚data unsigned int count _at_ 0 x70;/定义测量结果存放位置void main(void)TMOD=0 x09;/
17、设T0为方式1,GATE1 TL0=0;/计数器清0TH0=0;input=1;/置P3.2输入方式while(input=1);/等待输入变低TR0=1;/允许由INT0引脚信号启/停计数器while(input=0);/等待输入变高while(input=1);/等待输入再次变低TR0=0;/T0停止工作count=TL0;/取计数值的低8位count+=TH0*256;/高8位乘以256后与低8位相加,得到计数值count=count*2;/计数值乘以2得到信号周期while(1);l9.2.1 80C51串行接口简介串行接口简介l1串行口的结构与工作原理 图9.8 串行口的结构框图 串
18、行口组成:两个数据缓冲寄存器SBUF、一个输入移位寄存器、波特率发生器以及串行控制寄存器SCON等组成。l串行口的接收发送操作:首先对串行口初始化。发送时CPU写SBUF,一方面修改发送寄存器,同时启动数据串行发送到TXD端,发送完毕后置标志位TI;接受时置允许接收位才开始接受操作,接受完毕置位RI,这时CPU可以读SBUF,即读接收到的数据。l各位名称SM0 SM1 SM2 REN TB8 RB8 TI RIl各位功能如下:l(1)SM0和SM1串行方式选择位。这两位用于选择串行口的4种工作方式,见表9.5。l(2)SM2多机通信控制位。l(3)REN允许串行接收位。l(4)TB8发送数据的
19、第9位(D8)。l(5)RB8接收数据的第9位(D8)。l(6)TI发送中断标志位。l(7)RI接收中断标志位。l80C51的串行口通过编程可设置4种工作方式,3种帧格式。l方式0以8位数据为一帧,不设起始位和停止位,先发送或接收最低位。l方式1以10位为一帧传输,设有1个起始位0,8个数据位和1个停止位1l方式2和方式3以11位为一帧传输,设有1个起始位0,8个数据位,1个可编程位(第9数据位)D8和1个停止位1。l l1)方式0和方式2的波特率l在方式0时,每个机器周期发送或接收一位数据,因此波特率固定为时钟频率的 112。l方式2的波特率=oscSMODf642322SMOD方式l和方式
20、3的波特率由定时器T1的溢出率与SMOD值决定。方式1和方式3的波特率 T1溢出率定时器T1作波特率发生器使用时,通常是选用自动重装载方式,即方式2。在方式2中,TL1作计数用,而自动重装载的值放在TH1内,设计数初值为X,那么每过256-X个机器周期,定时器1就会产生一次溢出。为了避免因溢出而产生不必要的中断,此时应禁止T1中断。322SMOD例9.59.5 已知80C51单片机的时钟振荡频率为11.059 2MHz,选用T1工作方式2作为串行口波特率发生器,波特率为2 400 b/s,求T1初值。解:设波特率控制位SMOD=0,T1的初值为X=256 =244=F4H所以,TH1=TL1=
21、F4H。611.0592 10(01)38424001.方式0用作同步移位寄存器,以8位数据为一帧,发送/接收低位在先,数据由RXD(P3.0)端输入或输出,同步移位脉冲由TXD(P3.l)端送出,波特率固定为 fosc12。这种方式常用于扩展IO 口。2.方式1l串行口为10位通用异步接口。数据帧格式为l位起始位“0”,8位数据位和1位停止位“1”。波特率由指令设置,T1溢出率决定。l发送操作:当数据写入发送缓冲器SBUF时,就启动发送器发送数据从引脚TXD端输出。当发送完一帧数据后,TI标志=1,并申请中断,通知CPU可以发送下一个数据。l接收操作:当RI=0,软件置REN为1时,串行口采
22、样RXD,确认串行数据的起始位后开始接收一帧数据,直到停止位的到来。若SM2初始清零,则接收到停止位后硬件置RI=1,可以从SBUF中读取接收数据;若SM2初始置1,则只有接收到有效停止位后硬件置RI=1。l 3.方式2和方式3方式2和方式3均为11位异步通信方式。发送或接收一帧信息包括l位起始位“0”、8位数据位、1位可编程位TB8/RB8和1位停止位“1”。方式2波特率与SMOD有关,方式3波特率取决于T1溢出率。发送操作:发送前,先根据通信协议由软件设置TB8(如作奇偶校验位或地址数据标识位),然后执行任何一条以SBUF作为目的寄存器的写指令即启动发送器,同时TB8自动装到发送移位寄存器
23、的第9位位置上,从TXD端输出一帧数据,发送完毕,TI标志=1。多机通信中,TB8=1为地址帧;TB8=0为数据帧。l接收操作:先置位REN为1,使串行口处于允许接收状态,同时还要将RI清0。在满足这个条件的前提下,再根据SM2的状态和所接收到的RB8的状态决定是否会使RI置1,并申请中断,接收数据。当SM20时,不管RB8为0还是为1,RI都置1,此串行口将接收发来的信息。当SM21,且RB8为l时,表示在多机通信情况下,接收的信息为地址帧,此时RI置1。串行口将接收发来的地址。当SM21,且RB8为0时,表示接收的信息为数据帧,但不是发给本从机的,此时RI不置1,因而SBUF中所接收的数据
24、帧将丢失。图9.9多机通信连接图9.2.3 串行口应用举例 例9.6 用并行输入8位移位寄存器74HC165扩展16位并行输入口。编程实现从16位扩展口读入20字节数据,并把它们转存到内部RAM的50H63H中。解:本题是采用74HC165与单片机相接实现I/O口扩展,单片机与74HC165的具体接线如图6-5所示。图9.10 利用串行口扩展输入口按题意,用汇编语言编程如下:MOVR7,#20 ;设置读入字节数MOVR0,#50H ;设置片内RAM指针SETBF0 ;设置读入字节奇偶数标志RCV0:CLR P1.0 ;允许并行置入数据SETBP1.0 ;允许串行移位RCV1:MOV SCON,
25、#10H;设串行口为方式0并启动接收JNB RI,$;接收1帧数据 CLR RI;接收中断标志位清零MOV A,SBUF;取缓冲器数据MOV R0,AINC R0CPL F0JB F0,RCV2;判断是否接收完偶数帧,接收完则重新并行置入DEC R7SJMP RCV1;否则再接收1帧数据RCV2:DJNZ R7,RCV0;判断是否已读入预定的字节数;对读入数据进行处理C51语言程序如下:#include /定义51寄存器unsigned char Data_buf20 _at_ 0 x50;/定义输入数据数组存在50H开始的RAM unsigned char i;/定义变量sbit Input
26、_C=P10;/定义输入引脚 void main(void)Input_C=0;/允许并行置入数据Input_C=1;/允许串行移位SCON =0 x10;/设串行口方式0并启动接收for(i=0;i20;i+)while(RI=0);/等待接收1帧数据 Data_bufi=SBUF;/存入接收数组 RI=0;/清接收中断标志位 i+;while(RI=0);/等待接收1帧数据 Data_bufi=SBUF;/存入接收数组 RI=0;/清接收中断标志位 /数据接收完毕 /进行数据的后续处理while(1);/程序停止 例9.7 用两片8位串入并出移位寄存器74HC164扩展16位输出接口。图9
27、.11是利用74HC164(也可选用其他同样功能的CMOS器件)扩展的16位发光二极管接口电路。编程使这16个发光二极管交替为间隔点亮状态,循环交替时间为2s。图9.11 利用串行口扩展输出接口按题意,用汇编语言编程如下:ST:MOV SCON,#00H;设串行口的工作方式为方式0 MOV A,#55H;发光二极管间隔点亮初值LP2:MOV R0,#2;输出口字节数CLR P1.0;对74HC164清零,熄灭所有发光二极管SETB P1.0 ;允许数据串行移位LP1:MOV SBUF,A;启动串行口发送 JNB TI,$;;等待1帧数据发送结束CLR TI;串行口发送中断标志位清零DJNZ R
28、0,LP1;判断预定字节数发送完否LCALL DEL2s;调用延时2s子程序(略)CPL A;交替点亮发光二极管SJMP LP2;循环显示C51语言程序如下:#include unsigned char i;sbit Output_C=P10;void main(void)unsigned char Out_data;SCON =0 x0;Out_data=0 x55;while(1)/程序循环输出for(i=0;i2;i+)Output_C=0;/对74HC164清0Output_C=1;/允许数据串行移位SBUF=Out_data;/启动串行口发送while(TI=0);/等待1帧发送结束
29、TI=0;Delay2S();/延时可通过软件或定时器实现(省略)Out_data=Out_data;/交替点亮二极管 2.用串行口进行异步通信l例9.8双机异步通信的连接线路如图9.12所示。编程把甲机片内RAM 60H7FH单元中的数据块从串行口输出。定义在工作方式3下发送,TB8作奇偶校验位。采用定时器1方式2作为波特率发生器,波特率为4800,fOSC=11.0592MHz,定时器初始预置值TH1=TL1=0FAH。l编程使乙机从甲机接收32字节数据块,并存入片外1000H101FH单元。接收过程中要求判断奇偶校验标志RB8。若出错置F0标志为1;如果正确置F0标志为0,然后返回。RX
30、DTXD80C51应用系统(甲)GNDTXDRXD80C51应用系统(乙)GND图9.12 双机异步通信连接图按题意,用汇编语言编发送子程序如下:MOVTMOD,#20H;设置T1的工作方式为方式2MOVTL1,#0FAH;设预置值MOVTH1,#0FAHSETB TR1 ;启动T1MOVSCON,#0C0H;设置串行口的工作方式为方式3解:根据波特率计算T1的时间常数,T1工作在方式2。设SMOD=0,已知波特率4800,计算出T1的初始值X=250=FAH MOVPCON,#00H;SMOD=0MOVR0,#60H ;设置数据块指针MOVR7,#20H ;设置数据块长度为20HTRS:MO
31、VA,R0 ;取数据送入累加器AMOVC,PMOVTB8,C ;将奇偶位P送入TB8MOVSBUF,A ;将数据送入SBUF,启动发送WAIT:JNBTI,$;判断1帧数据是否发送完CLRTI INCR0 ;更新数据单元DJNZR7,TRS;循环发送至结束C51语言甲机发送子程序如下:#include unsigned char Uart_buf32 _at_ 0 x60;void main(void)unsigned char i;TMOD=0 x20;/设置定时器T1为方式2 TL1 =0 xfa;/设预置值 TH1 =0 xfa;TR1 =1;/启动定时器T1 SCON=0 xc0;/设
32、置串行口为方式3 PCON=0 x00;/SMOD0 for(i=0;i32;i+)ACC =Uart_bufi;/将要发送的数据送到累加器,改变P值 TB8 =P;/将P值送至TB8 SBUF=Uart_bufi;/发送数据 while(TI=0);/等待发送完 TI=0;/清标志位 while(1);接收汇编子程序如下:MOVTMOD,#20H;设置T1的工作方式为方式2MOVTL1,#0FAH;设预置值MOVTH1,#0FAHSETB TR1;启动T1MOVSCON,#0C0H;设置串行口的工作方式为方式3MOVPCON,#00H;SMOD=0MOVDPTR,#1000H;设置数据块指针
33、MOVR7,#20H;设置数据块长度SETB REN;允许接收WAIT:JNB RI,$;判断1帧数据是否接收完 CLR RIMOVA,SBUF;读入1帧数据JNBPSW.0,PZ;奇偶位P为0则跳转JNBRB8,ERR;P=1,RB8=0则出错SJMPYES;二者全为1则正确 PZ:JBRB8,ERR;P=0,RB8=0,则正确;RB8=1则出错YES:MOVX DPTR,A;正确则存放数据INCDPTR;修改地址指针DJNZR7,WAIT;判断数据块是否接收完CLRPSW.5;接收正确,且接收完,则置F0为0RET;返回ERR:SETBPSW.5;出错则置F0为1RET;返回乙机接收子程序
34、#include xdata unsigned char Uart_buf32 _at_ 0 x1000;void main(void)unsigned char i;TMOD=0 x20;TL1 =0 xfa;TH1 =0 xfa;TR1 =1;SCON=0 xc0;PCON=0 x00;REN =1;/允许接收 for(i=0;i32;i+)lwhile(RI=0);/等待数据接收完毕 lRI=0;lACC =SBUF;/数据送入累加器中lif(PRB8=1)/判断奇偶校验位llUart_bufi=SBUF;lelsell F0=1;l l lwhile(1);l 9.3 AT89S51单
35、片机的中断系统 9.3.1 AT89S51单片机的系统 1.中断系统的结构:AT89S51的中断系统主要由几个与中断源、中断控制、中断允许、中断优先级和顺序查询逻辑电路等组成。图9.13 AT89S51的中断系统结构l2.中断源及中断入口 l中断源:外部中断源INT0、INT1;定时器T0、T1溢出 中断和串行口接收/发送中断。当允许某个中断源中断时,五个中断源标志位EX0、EX1、ET0、ET1、ES各自的中断允许位应为1。l中断优先级管理:两个中断优先级,同优先级按自然优先级排列。中断源自然优先级中断入口地址INT0中断T0中断INT1中断T1中断串口发送/接收中断最高最低0003H000
36、BH0013H001BH0023H3.与中断控制有关的寄存器与中断系统有关的特殊功能寄存器有4个,分别为中断请求标志寄存器(TCON、SCON的相关位)、中断允许控制寄存器IE和中断优先级控制寄存器IP。1)中断允许寄存器IE,控制CPU及每个中断源的开放或禁止,可位寻址寄存器。EAESET1EX1ET0EX0EA:CPU中断总允许位。当EA1,CPU开放中断;当 EA0,CPU屏蔽所有的中断请求。EX0、EX1:外部中断允许位。EX0、EX11时,允许外部INT0、INT1中断。ET0、ET1:定时器中断允许位。ET0、ET1=1,允许定时器T0、T1中断ES:串行口发送/接收中断允许位。E
37、S1,允许串行口发送/接收中断。80C51系统复位后,IE中各中断允许位均被清0,即禁止所有中断。2)中断请求标志寄存器中断请求标志寄存器当有中断源发出中断申请时,由硬件将相应的中断标志位置1。在响应中断请求前,相应中断标志位被锁存在特殊功能寄存器TCON或SCON中。寄存器TCON中标志位如下(1)TF1、TF0T1、T0溢出标志位。(2)IT1、IT0外部中断1、外部中断0触发方式选择位。(3)IE1、IE0外部中断1、外部中断0中断请求标志位。寄存器SCON中标志位如下(1)TI发送中断标志位。(2)RI接收中断标志位。3)中断优先级寄存器IP,用来设定中断级,置位为高优先级中断,清零为
38、低优先级中断。可实现两级中断嵌套。IP可位寻址寄存器。PSPT1PX1PT0PX0PX0、PX1:外部中断源INT0、INT1中断优先级控制位。PT0、PT1:定时器T0、T1中断优先级控制位。PS:串行口发送/接收中断优先级控制位。如果几个同一优先级的中断源,同时向CPU申请中断,CPU通过内部硬件查询逻辑按自然优先级顺序确定该响应哪个中断请求。当系统复位后,IP低5位全部清0,将所有中断源设置为低优先级中断。9.3.3 中断请求的撤除 l对定时器0或1溢出中断标志TF0或TF1,还有边沿触发的外部中断标志IE0或IE1,在CPU响应中断后,是硬件自动撤除的。l对于串行口中断标志TI、RI,
39、CPU响应中断后,不能用硬件清除,而要靠软件来清除相应的标志。l只有对于电平激活的外部中断,撤除方法较复杂。要通过硬件,再配合软件来解决。l 9.3.4 扩充外中断源l1.利用定时器扩展外中断源法l2.中断和查询结合法 l l l l 图例 多外部中断源连接方法9.3.5 中断程序的设计与应用 1中断程序的一般设计方法 1)主程序中的中断初始化在80C51系列单片机中,管理和控制的项目如下:(1)CPU开中断与关中断。(2)某中断源中断请求的允许和禁止(屏蔽)。(3)各中断源优先级别的设定(即中断源优先级排队)。(4)外部中断请求的触发方式。主程序的一般编写格式如下:ORG0000H LJMP
40、 MAINORG00013H ;外部中断1的中断入口地址LJMP SUB1 ;转外部中断1的中断入口地址 ORG0023H ;串行口的中断入口地址LJMP SUB4 ;转串行口的中断入口地址 ORG0030HMAIN:MOVTCON,#04 ;外部中断1选择边沿触发方式MOVIE,#10010100B;CPU开中断,外部中断1和串行口开中断 ;执行主程序ORG100H ;外部中断1的中断入口地址SUB1:;外部中断1的中断服务程序 RETI ;中断返回 ORG200H ;串行口的中断入口地址SUB4:;串行口的中断处理程序RETI ;中断返回CH1:CLR EA ;关中断 PUSH ACC ;
41、保护现场 PUSH PSW SETB EA ;开中断(如果不希望高优先级中断进入,则不用开中断);中断处理程序 CLR EA ;关中断 ;恢复现场 POP PSW POP ACC SETB EA RETI ;中断返回例9.10 利用80C51单片机的T0定时,在P1.0引脚输出一方波,方波周期为20 ms,已知晶振频率为12 MHz。解:在第9.1节已用查询方法做过类似题目,现在采用中断的方法实现这一要求,T0的中断服务程序入口地址为000BH。T0的初值X=6553610000=55536=D8F0H。汇编语言源程序如下:ORG 0000H LJMP MAIN T0中断入口 ORG 000B
42、H LJMP SUB1;转T0中断服务程序入口 ORG 30HMAIN:MOV TMOD,#01H;设置定时器工作方式 MOV TL0,#0F0H;置10 ms定时初值 MOV TH0,#0D8H MOV IE,#82H;CPU开中断,T0开中断 SETB TR0;启动T0HERE:SJMP HERE;循环等待定时到 SUB1:MOV TL0,#0F0H;重赋初值 MOV TH0,#0D8H CPL P1.0;输出取反 RETI C51语言程序如下:#include sbit out=P10;void main(void)TMOD=0 x01;/设置定时器工作方式 TL0=0 xf0;TH0=
43、0 xd8;IE=0 x82;/CPU开中断,T0开中断 TR0=1;/启动定时器T0 while(1);/主程序等待void T0_int(void)interrupt 1 /定义T0中断服务程序TL0=0 xf0;/定时器重新赋初值TH0=0 xd8;out=!out;/输出反相例9.9.1111 要求用80C51单片机的P1.0引脚产生周期为200s的方波,用P1.1引脚产生周期为400s的方波,并要求用T1作为串行口波特率发生器,产生2400Baud的波特率,单片机的晶振频率为12MHz。解:由于所要求的两路方波周期较短,因而可采用T0在方式3下工作,此时T1可在方式2下工作,作为串行
44、口波特率发生器。首先计算两路信号的定时初值如下:TL0=28(12106100106)/12=256100=156TH0=28(12106200106)/12=256200=56T1的波特率时间常数X计算如下:X=28(12106(0+1)/(3842400)=25613=243=F3H汇编语言源程序如下:ORG 0000HLJMP MAINORG 000BH;TL0的中断入口地址LJMP ITL0 ORG 001BH;TH0的中断入口地址,原来是T1的中断入口地址LJMP ITH0ORG 100HMAIN:MOV SP,#50H;设堆栈指针MOV TMOD,#00100011B;设T0为方式
45、3,T1为方式2MOV TL0,#156 ;给TL0赋初值MOV TH0,#56 ;给TH0赋初值MOV TL1,#0F3H ;给TL1赋初值MOV TH1,#0F3H ;给TH1赋初值SETB TR0 ;启动TL0SETB TR1 ;启动TH0SETB ET0 ;允许TL0中断SETB ET1 ;允许TH0中断SETB EA ;CPU开放中断 SJMP$ORG 200HITL0:MOV TL0,#156 ;重新装初值 CPL P1.0 ;输出取反,形成方波 RETI ORG 300HITH0:MOV TH0,#56 ;重新装初值 CPL P1.1 ;输出取反,形成方波 RETIC51语言程序
46、如下:#include sbit out0=P10,out1=P11;void main(void)SP=0 x50;/设堆栈指针TMOD=0 x23;/设置定时器工作方式 TL0=156;/给定时器0赋初值 TH0=56;TL1=0 xf3;/给定时器1赋初值 TH1=0 xf3;TR0=1;/启动定时器TL0 TR1=1;/启动定时器TH0 ET0=1;/允许TL0中断 ET1=1;/允许TH0中断 EA=1;/CPU开放中断 while(1);/主程序等待void T0_int(void)interrupt 1 /定义TL0中断服务程序TL0=156;/重新装初值out0=!out;/输出反相,形成方波void T1_int(void)interrupt 3 /定义TH0中断服务程序TH0=56;/重新装初值out1=!out1;/输出反相,形成方波