1、重点内容:输入输出控制中断系统定时/计数器本章小结,第7章 C51单片机的内部资源,一、输入输出控制,单片机I/O 口即输入/输出接口,它可对开关量进行检测、判断、处理,从而去控制开关量设备。单片机I/O 口是单片机与外界发生联系的窗口,只有了解和掌握I/O 口的特点、性能、原理,才能真正发挥I/O 口的功能,才能使单片机作为一种嵌入式微控制器,应用到各种领域,发挥单片机的功能。下面是reg51.h和reg52.h中并行I/O口的定义。使用I/O口时,不用关心I/O口的具体地址,直接使用P0、P1、P2、P3这些变量名就可以了。sfr P0 = 0x80; /*8位I/O口P0*/sfr P1
2、 = 0x90; /*8位I/O口P1*/sfr P2 = 0xA0; /*8位I/O口P2*/sfr P3 = 0xB0; /*8位I/O口P3*/在I/O口直接用做输入/输出时,CPU既可以把它们看做数据口,也可以看做状态口,这是由用户决定的。在前面我们介绍的流水灯就是一个很好的例子。这里不再赘述。下面看是有关I/O应用的例子。,一、输入输出控制,【例7-1】I/O应用设计一电路,监视某开关K,用发光二极管LED显示开关状态,如果开关合上,LED灯亮;否则,LED等灭。分析:设计电路图如图7.1所示。开关接在P1.4口,LED灯接在P1.0口,当开关断开时,P1.4为Vcc,对应数字量为“
3、1”,开关合上时,P1.1电平为0,对应数字量为“0”。根据LED的解法,当P1.0输出为“0”时,LED灯亮,反之输出为“1”时,灯则熄灭。程序清单如下:用C 语言编程如下:,一、输入输出控制,#include sbit p1_0=P10;sbit p1_1=P11; /*定义位变量*/void main()p1_0=0; /*使发光二极管灭*/for(;) p1_1=1; if (p1_1=0) p1_0=1; else p1_0=0; ,二、中断系统,首先有关中断的几个基本概念。1.中断所谓中断,是指CPU在正常运行程序时,由于内部/外部事件或由程序预先安排的事件,引起CPU中断正在运行
4、的程序,而转到为内部/外部事件或为预先安排的事件服务的程序中去,服务完毕,再返回去执行波暂时中断的程序。2. 中断源中断源即引起中断的原因,中断申请的来源,中断源可以是I/O设备、故障、时钟、调试中人为设置。3.中断优先级和中断的嵌套当有多个中断源同时 向CPU申请中断时,CPU优先响应最需紧急处理的中断请求,处理完毕再响应优先级别较低的 ,这种预先安排的响应次序就叫做中断优先级。值得一提的是,在中断系统中,高优先级的中断请求能中断正在进行的较低级的中断源处理,我们把这叫做中断的嵌套。,1、中断的基本概念,二、中断系统,4. 中断系统能实现中断功能并能对中断进行管理的硬件和软件称为中断系统。中
5、断请求是在执行程序的过程中随机发生的,中断系统要解决的问题是:(1)CPU在不断地执行指令中,是如何检测到随机发生的中断请求的?(2)如何使中断的双方(CPU方和中断源方)均能人为控制允许中断或禁止中断?(3)由于中断产生的随机性,因此不可能在程序中使用调用子程序指令或转移指令,那么如何在实现正确的转移,从而更好地为该中断源服务呢?(4)中断源有多个,而CPU只有一个,当有多个中断源同时有中断请求时,用户怎么控制CPU按照自己的需要安排响应次序?(5)中断服务完毕,如何正确地返回到原断点处?,1、中断的基本概念,二、中断系统,51单片机有5个中断源,3个在片内,2个在片外,它们在程序存贮器中有
6、固定的中断入口地址, 当CPU响应中断时,硬件自动形成这些地址,由此进入中断服务程序;5个中断源有两级中断优先级,可形成中断嵌套;这6个中断源的符号、名称、产生条件及中断服务程序的入口地址如表7-1。,2、中断源及其中断的入口地址,二、中断系统,1. 中断允许控制寄存器IE(地址0A8H)每个中断源都可以通过置位或清除中断允许寄存器IE 中的相关中断允许控制位分别使得中断源有效或无效。IE还包括一个中断允许总控制位EA,它能一次禁止所有中断。中断允许寄存器格式如下表7-2。,3、中断控制相关的寄存器,二、中断系统,2.定时器/计数器控制寄存器(TCON)(地址88H)该寄存器用于保存外部中断请
7、求以及定时器的计数溢出。寄存器的内容及位地址表7-3如下:,3、中断控制相关的寄存器,二、中断系统,3.串行口控制寄存器(SCON)(98H)串行口控制寄存器与中断有关的控制位共2位,如表7-4所示,3、中断控制相关的寄存器,二、中断系统,4. 中断优先级寄存器IP(地址8BH)单片机采用了自然优先级和人工设置高、低优先级的策略,即可以由程序员设定那些中断是高优先级、哪些中断是低优先级。AT89S52可设置两个中断优先级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定。六个中断源的自然优先级(由高到低排列)为:外部中断0定时器0中断外部中断1定时器1中断串口中断定时器2中断。中断
8、优先级由中断优先级寄存器IP(见表7-5)来设置的,IP中某位设为1,相应的中断就是高优先级,否则就是低优先级。,3、中断控制相关的寄存器,二、中断系统,单片机在每个机器周期的S5P2期间,顺序采样每个中断源,CPU在下一个机器周期S6期间按优先级顺序查询中断标志,如查询到某个中断标志为1,将在再下一个机器周期S1期间按优先级进行中断处理。中断得到响应后自动清除中断标志,由硬件将程序计数器PC内容压入堆栈保护,然后将对应的中断矢量装入程序计数器PC,使程序转向中断矢量地址单元中去执行相应的中断服务程序。 在下列三种情况之一时,CPU将封锁对中断的响应:(1)CPU正在处理一个同级或更高级别的中
9、断请求。(2)现行的机器周期不是当前正执行指令的最后一个周期。我们知道,单片机有单周期、双周期、三周期指令,当前执行指令是单字节没有关系,如果是双字节或四字节的,就要等整条指令都执行完了,才能响应中断(因为中断查询是在每个机器周期都可能查到的)。(3)当前正执行的指令是返回指令(RETI)或访问IP、IE寄存器的指令,则CPU至少再执行一条指令才应中断。这些都是与中断有关的,如果正访问IP、IE则可能会开、关中断或改变中断的优先级,而中断返回指令则说明本次中断还没有处理完,所以都要等本指令处理结束,再执行一条指令才可以响应中断。,4、中断响应过程,二、中断系统,具体地说,CPU响应中断的过程分
10、为以下几个步骤:(1) 保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。(2) 寻找中断入口,根据6个不一样的中断源所产生的中断,查找6个不一样的入口地址。这6个中断源的编号和入口地址如表7-6所示各中断服务程序入口地址仅间隔8字节,编译器在这些地址放入无条件转移指令,跳转到服务程序的实际地址。以上工作是由计算机自动完成的,与编程者无关。(3) 执行中断处理程序。(4) 中断返回:执行完中断指令后,就从中断处返回到主程序,继续执行。,4、中断响应过程,二、中断系统,5、C51中断的程序设计,C51使用户能编写高效的中断服务程序,编译器在规定的中断源的矢量地址中放入无条件转移指
11、令,使CPU响应中断后自动地从矢量地址跳转到中断服务程序的实际地址,而无需用户去安排。中断服务程序定义为函数,函数的完整定义如下: 返回值 函数名(参数)模式再入interrupt nusing m下面分别介绍后面3个参数:再入:通过属性关键字reentrant将函数定义为再入函数,这样函数才能才能递归调用。这是因为在C51中,普通函数(非再入的)不能递归调用, 只有再入函数才可被递归调用。interrupt n :表示将函数声明为中断服务函数,n 为中断源编号,它可以是031间的整数 ,不允许为带运算符的表达式。n 通常取以下值:0 外部中断0;1 定时器/计数器0溢出中断2 外部中断1;3
12、 定时器/计数器1溢出中断4 串行口发送与接收中断,二、中断系统,5、C51中断的程序设计,Using m:定义函数所使用的工作寄存器组,m的取值范围为03,可缺省,它对目标代码有如下作用:函数入口处将当前寄存器保存,使用m指定的寄存器组,函数退出时原寄存器组恢复。选不同的工作寄存器组,可方便实现寄存器组的现场保护。值得注意的是,中断服务函数不允许用于外部函数,因为它对目标代码有下面这些影响:当调用函数时,SFR中的ACC、B、DPH、DPL和PSW实际需要时应该入栈。如果不使用寄存器组切换,中断函数所需的所有工作寄存器Rn都入栈。函数退出前,所有工作寄存器出栈。函数由“RETI”指令终止。【
13、例7-2】中断应用要求:电路原理图如图7.2所示。每按一次键,产生一次中断,P1口输出并取反,用C语言编程如下:,二、中断系统,5、C51中断的程序设计,/按键中断程序#includemain() P1=0x55;/P1口初始值 EA=1;/全局中断开 EX0=1;/外部中断0开 IT0=1;/低电平产生中断 while(1); /等待中断,也是中断的返回点 void Izdcs(void) interrupt 0 using 1 P1=P1;/按下触发一次,P1取反一次,二、中断系统,5、C51中断的程序设计,【例7-3】 利用中断来点亮灯。硬件电路图如图7.2,用INT1 引脚的按钮控制P
14、1口的灯,要求每按一下按钮就申请一次中断,点亮一盏灯,依次点亮八盏灯中的一盏。采用边沿触发。程序如下:#include bit flag; /*中断申请标志*/unsigned char ledstatus;/*每一位分别对应P1口灯亮状态,用于计算*/void int1_isr (void) interrupt 2 /*INT1的中断服务程序*/ flag = 1; void main (void) /*初始化灯*/P1 = 0xFF;/*初始化P1口的八盏灯,全灭*/ledstatus = 0x01;/*第一次是P1.0口的灯亮*/*初始化中断相关的寄存器*/EX1 = 1; /*允许 E
15、X1 中断*/IT1 = 1; /*边沿触发 */EA = 1; /*允许总中断*/ while (1) if(flag) P1 = (ledstatus);/*取反,因为低电平时灯亮*/ ledstatus = (ledstatus 1) ;/*下一次中断时灯的状态*/ flag = 0;/*处理完成清标志*/ ,二、中断系统,5、C51中断的程序设计,【例7-4】多中断源控制灯采用图7.3的硬件电路图,要求每按一下INT1 引脚的按钮就依次点亮八盏灯中的一盏,而每按一下INT0 就使灯的亮灭变为相反的状态,INT1 为最高优先级。均采用边沿触发。,二、中断系统,5、C51中断的程序设计,因
16、为INT1 的自然优先级比INT0 低,如果我们想让INT1 为高优先级,就要设置中断优先级寄存器为0x04。程序如下:#include unsigned char ledstatus;/*对应P1口的灯亮状态,用于计算*/void delay(void) /*延时子程序*/ int x,y; for(x=0; x100; x+) for(y=0; y5000; y+); void int1_isr (void) interrupt 2 /*INT1的中断服务程序*/ P1 = (ledstatus);/*取反,因为低电平时灯亮*/ delay();/*延时*/ ledstatus = (le
17、dstatus 1) ; /*下一次中断时灯的状态*/ flag1 = 0;/*处理完成清标志*/,二、中断系统,5、C51中断的程序设计,void int0_isr (void) interrupt 0 /*INT0的中断服务程序*/ flag0 = 1; P1 = P1;/*灯由亮变灭或由灭变亮*/delay();/*延时*/flag0 = 0;/*处理完成清标志*/void main (void) /*初始化中断相关的寄存器*/IP = 0x04;/*设INT1为高优先级*/EX1 = 1; /*允许 EX1 中断*/EX0 = 1;/*允许 EX0 中断*/IT1 = 0; /*INT
18、1低电平触发 */IT0 = 0; /*INT0低电平触发 */EA = 1; /*允许总中断*/ ledstatus = 0x01;/*按下INT1开关时,第一次是P1.0口的灯亮*/while (1) P1 = 0xff;/*复位P1口的八盏灯,全灭*/ ,三、定时/计数器,1、定时/计数器的结构和工作方式,51系列单片机片内有二个十六位定时/计数器:定时器0(T0)和定时器1(T1)。定时器T1有寄存器TH1、TL1组成,定时器T0由寄存器TH0、TL1组成,他们均为8位寄存器。图7.4是定时器T0的内部结构和控制信号。定时器T1也是一样。T0和T1由如下功能:两个定时器都有定时或事件计
19、数的功能,由软件选择是定时工作方式还是计数工作方式 定时/计数器实际上是16位加1计数器。 T0由2个8位持殊功能寄存器TH0和TL0构成,T1由2个8位持殊功能寄存TH1和TL1构成。T0和T1受特殊功能寄存器TMOD和TCON控制。对于一些增强型的单片机中,增加了定时器2(T2)。T2除了具有T1,T0的计数功能外,还有16位自动重装载、捕获方式和加、减计数方式。定时器0和定时器1实质上是一个加1计数器,他可以工作于定时方式,也可以工作于计数方式。两种工作方式实际都是对脉冲计数,只不过所计脉冲的来源不同。,三、定时/计数器,1、定时/计数器的结构和工作方式,1.定时方式C/T =0,开关S
20、打向上,计数器TH0、TL0的计数脉冲来自振荡器的12分频后的脉冲(即fosc/12),即对系统的机器周期计数。当开关K受控合上时,每过一个机器周期,计数器TH0,TL0加1;当计数了预设的个数,TH0,TL0回零,置位定时/计数器溢出中断标志位TF0(或TF1),产生溢出中断。例如,机器周期为2us,计满了3个机器周期即定时了6us,中断标志位TF0(或TF1)被置位。如果允许中断,产生溢出中断。由于51单片机的定时/计数器是加1计数,预定计数初值应载入负值(补码),TH0,TL0才可能加1回零。定时时计数脉冲的最高频率为f= fosc/12。,三、定时/计数器,1、定时/计数器的结构和工作
21、方式,2.计数方式C/T =1,开关S打向上,计数器T0,T1的计数脉冲分别来自于引脚T0(P3.4)或引脚T1(P3.5)上的外部脉冲。当开关K受控合上时,计数器对此外部脉冲的下降沿进行加1计数,直至计满预定值回零,置位定时/计数器中断标志位TF0(或TF1),产生溢出中断。由于检测一个由“1”到“0”的跳变需两个机器周期,前一个机器周期测出“1”,后一个机器周期测出“0”,故计数脉冲的最高频率不得超过fosc/24。对外部脉冲的占空比无特殊要求。当软件设定了定时/计数器的工作方式,启动以后,定时/计数器就按规定的方式工作,不占用CPU的操作时间。此时CPU可执行其他程序,除非定时/计数器溢
22、出,才可能中断CPU执行的程序。这种工作的方式如同人类的所设的闹钟一样,人在工作或睡觉的时候,闹钟仍然继续运走,到了设定闹钟,就会响。,三、定时/计数器,2、定时/计数器的寄存器,1.T/C0和T/C1的寄存器定时/计数器0和定时/计数器1是所有51系列单片机都具有的功能,对它们的控制是通过定时/计数器控制寄存器TCON和定时/计数器模式寄存器TMOD来实现。(1)定时/计数器模式寄存器TMOD定时/计数器模式寄存器TMOD主要用来设置定时/计数器的工作模式,它的地址是89H,不能进行位寻址,只能用字节传送指令设置定时器工作方式,复位时,TMOD所有位均为0。每一位的定义见表7-7,高四位与定
23、时/计数器1有关,低四位与定时/计数器0有关。,三、定时/计数器,2、定时/计数器的寄存器,GATE :定时操作开关控制位,当GATE=1时,INT0或INT1引脚为高电平,同时TCON中的TR0或TR1控制位为1时,定时/计数器0或1才开始工作。若GATE=0,则只要将TR0或TR1控制位设为1,计时/计数器0或1就开始工作。C/T :定时器或计数器功能的选择位。C/T =1为计数器,通过外部引脚T0或T1输入计数脉冲。C/T =0时为定时器,由内部系统时钟提供计时工作脉冲。M1和M0:分别是模式选择位的高位和低位,通过它们对定时/计数器的工作模式进行设置,见表7-8。,三、定时/计数器,2
24、、定时/计数器的寄存器,(2)定时/计数器控制寄存器TCON定时/计数器控制寄存器TCON的地址是88H,可位寻址。该寄存器除了用作定时/计数器控制寄存器之外,还有几位与中断有关,我们在前面已介绍过。每一位的定义见表7-9。,三、定时/计数器,2、定时/计数器的寄存器,2.T/C2的寄存器与T/C2相关的寄存器有控制寄存器T2CON和方式寄存器T2MOD。(1)定时/计数器2控制寄存器T2CON定时/计数器2控制寄存器T2CON用来对其进行设置。T2CON的地址为0C8H,可位寻址,复位值是0000 0000B,寄存器每一位的定义见表7-10。,三、定时/计数器,2、定时/计数器的寄存器,定时
25、/计数器2既可以做定时器,又可以做事件计数器。其工作方式由特殊寄存器T2CON中的C/T2 位选择。定时/计数器2有三种工作方式:捕获方式,自动重装载(向上或向下计数)方式和波特率发生器方式,工作方式由T2CON的控制位RCLK,TCLK,CP/RL2 ,TR2来选择,参见表7-11。,三、定时/计数器,2、定时/计数器的寄存器,(2)定时/计数器2模式寄存器T2MOD当定时器2 工作于16 位自动重载模式,可对其编程实现向上计数或向下计数。这一功能可以通过定时/计数器2模式寄存器T2MOD(见表7-12)中的DCEN(向下计数允许位)来实现。T2MOD的地址是0C9H,不可位寻址。,三、定时
26、/计数器,3、定时/计数器的工作方式,1.方式0方式0是13位计数结构的工作方式,其计数器由TH0全部8位和TL0的低5位构成。当TL0的低5位计数溢出时,向TH0进位,而全部13位计数溢出时,则向计数溢出标志位TF0进位。 在方式0下,当为计数工作方式时,计数值的范围是:18192(213);当为定时工作方式时,定时时间的计算公式为: (213计数初值)晶振周期12 或 (213计数初值)机器周期 其时间单位与晶振周期或机器周期相同(ms)。,三、定时/计数器,3、定时/计数器的工作方式,2.方式1方式1是16位计数结构的工作方式,计数器由TH0全部8位和TL0全部8位构成。与工作方式0基本
27、相同,区别仅在于工作方式1的计数器TL1和TH1组成16位计数器,从而比工作方式0有更宽的定时/计数范围。当为计数工作方式时,计数值的范围是: 165536(216) 当为定时工作方式时,定时时间计算公式为: (216计数初值)晶振周期12或 (216计数初值)机器周期,三、定时/计数器,3、定时/计数器的工作方式,3.方式2 8位自动装入时间常数方式。由TLl构成8位计数器,THl仅用来存放时间常数。启动T1前,TLl和THl装入相同的时间常数,当TL1计满后,除定时器回零标志TFl置位,具有向CPU请求中断的条件外,THl中的时间常数还会自动地装入TLl,并重新开始定时或计数。所以,工作方
28、式2是一种自动装入时间常数的8位计数器方式。由于这种方式不需要指令重装时间常数,因而操作方便,在允许的条件下,应尽量使用这种工作方式。当然,这种方式的定时计数范围要小于方式0和方式1。当计数溢出后,不是像前两种工作方式那样通过软件方法,而是由预置寄存器TH以硬件方法自动给计数器TL重新加载。变软件加载为硬件加载。 初始化时,8位计数初值同时装入TL0和TH0中。当TL0计数溢出时,置位TF0,同时把保存在预置寄 存器TH0中的计数初值自动加载TL0,然后TL0重新计数。如此重复不止。这不但省去了用户程序中的重装指令,而且也有利于提高定时精度。但这种工作方式下是8位计数结构,计数值有限,最大只能
29、到255。 这种自动重新加载工作方式非常适用于循环定时或循环计数应用,例如用于产生固定脉宽的脉冲,此外还可以作串行数据通信的波特率发送器使用。,三、定时/计数器,3、定时/计数器的程序设计,4.方式3 2个8位方式。方式3只适用于定时器0。如果使定时器1为工作方式3,则定时器1将处于关闭状态。 当T0为工作方式3时,TH0和TL0分成2个独立的8位计数器。其中,TL0既可用作定时器,又可用作计数器,并使用原T0的所有控制位及其定时器回零标志和中断源。TH0只能用作定时器,并使用T1的控制位TRl、回零标志TFl和中断源,见下图。通常情况下,T0不运行于工作方式3,只有在T1处于工作方式2,并不
30、要求中断的条件下才可能使用。这时,T1往往用作串行口波特率发生器(见14),TH0用作定时器,TL0作为定时器或计数器。所以,方式3是为了使单片机有1个独立的定时器计数器、1个定时器以及1个串行口波特率发生器的应用场合而特地提供的。这时,可把定时器l用于工作方式2,把定时器0用于工作方式3。,三、定时/计数器,4、定时/计数器的程序设计,由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作。初始化的步骤一般如下:(1)确定工作方式(即对TMOD赋值);(2)预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1);(3)
31、根据需要开放定时器/计数器的中断(直接对IE位赋值);(4)启动定时器/计数器(若已规定用软件启动,则可把TR0或TR1置“1”;若已规定由外中断引脚电平启动,则需给外引脚步加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。因为在不同工作方式下计数器位数不同,因而最大计数值也不同。现假设最大计数值为M,那么各方式下的最大值M值如下:方式0:M=213=8 192方式1:M=216=65 536方式2:M=28=256方式3:定时器0分成两个8位计数器,所以两个M均为256。因为定时器/计数器是作“加1”计数,并在计数满溢出时产生中断,因此初值X可以这样计算: X=
32、M-计数值,三、定时/计数器,4、定时/计数器的程序设计,【例7-5】在XTAL频率是12MHz的标准8051器件上,用Timer1产生10kHz定时器滴答中断。 分析:利用T1来产生10kHz的滴答中断,也就是长生周期为100us的滴答中断。因为时钟频率为12MHZ,采用方式2,先计算计数初值: 机器周期 MC=12/ fosc=12/12=1us; 应计脉冲个数 100us/1us=100程序如下:#include static unsigned long overflow_count = 0;/*定时器1中断服务程序:每100个时钟周期执行1次*/void timer1_ISR (voi
33、d) interrupt 3overflow_count +; /*溢出计数器加1*/*主函数:置定时器1为8位定时器重装(方式2)定时器计数到255时溢出,用156重装并产生中断*/void main (void)TMOD = (TMOD & 0x0F) | 0x20; /*设置方式(8位定时器)*/TH1 = 256 100; /*重装TL1来计数100个时钟周期*/TL1 = TH1;ET1 = 1; /*允许定时器1中断*/TR1 = 1; /*启动定时器1运行*/EA = 1; /*总中断允许*/while (1); /*无限循环,等待定时器溢出中断*/,三、定时/计数器,4、定时/
34、计数器的程序设计,【例7-7】如图7.5所示,在P1.7端接有一个发光二极管,要求利用定时/计数器控制,使LED亮1s,来1s,周而复始。分析:题目要求定时1s,定时器的3种工作方式都不能满足。对于较长时间的定时,应采用复合定时的方法。这里使定时/计数器0工作在定时器方式1,定时100ms,定时时间到后P1.0反相,即P1.0端输出周期200ms和方波脉冲。另设定时/计数器1工作在计数器方式2,对T1输入的脉冲计数,当计数满5次时,定时1s时间到,将P1.7端反相,改变灯的状态。采用6MHz晶振,方式1的最大定时才能达到100多ms。对于100ms,机器周期2s需要的计数次数=100103/2
35、=50 000,即初值为65 536-50 000。方式2满5次溢出中断,初值为256-5。,三、定时/计数器,4、定时/计数器的程序设计,程序如下:#include sbit P1_0=P10;sbit P1_7=P17;timer0( )interrupt 1 using 1 /*T/C0中断服务程序*/ P1_0=!P1_0; /*100ms到,P1.0反相*/ TH0=(65536-50000)/256; /*重载计数初值*/ TL0=(65536-50000)%256;timer1( )interrupt 3 using 2 /*定时/计数器1中断服务程序*/ P1_7=!P1_7;
36、 /*1s到,灯改变状态*/,三、定时/计数器,4、定时/计数器的程序设计,main( ) P1_7=0; /*置灯初始灭*/P1_0=1; /*保证第一次反相便开始计数*/TMOD=0x61; /*定时/计数器0方式1定时,定时/计数器1方式2计数*/TH0=(65536-50000)/256; /*预置计数初值*/TL0=(65536-50000)%256;TH1=256-5;TH0=256-5;IP=0x08; /*置优先级寄存器*/EA=1; /*CPU开中断*/ ET0=1; /*开T/C0中断*/ET1=1; /*开T/C1中断*/TR0=1; /*启动T/C0*/TR1=1; /*启动T/C1*/ for( ; ; ) ,四、本章小结,本章主要介绍了单片机的内部资源,详细介绍了单片机的I/O口,中断系统以及定时/计数器的应用。通过本章的学习,读者应该掌握以下几个知识点:1.熟悉4个I/O口的应用,重点理解4个口的使用特点。2.理解51单片机的中断结构、中断响应过程以及中断程序的编制方法。3.理解单片机定时/计数器的结构,工作方式以及特点,掌握它们的编程方法。,