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