单片机技术及应用_第1页
单片机技术及应用_第2页
单片机技术及应用_第3页
单片机技术及应用_第4页
单片机技术及应用_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机技术及应用第一页,共四十六页,2022年,8月28日一、输入\输出控制单片机I/O口即输入/输出接口,它可对开关量进行检测、判断、处理,从而去控制开关量设备。单片机I/O口是单片机与外界发生联系的窗口,只有了解和掌握I/O口的特点、性能、原理,才能真正发挥I/O口的功能,才能使单片机作为一种嵌入式微控制器,应用到各种领域,发挥单片机的功能。 下面是reg51.h和reg52.h中并行I/O口的定义。使用I/O口时,不用关心I/O口的具体地址,直接使用P0、P1、P2、P3这些变量名就可以了。 sfrP0=0x80; /*8位I/O口P0*/ sfrP1=0x90; /*8位I/O口P1*/ sfrP2=0xA0; /*8位I/O口P2*/ sfrP3=0xB0; /*8位I/O口P3*/在I/O口直接用做输入/输出时,CPU既可以把它们看做数据口,也可以看做状态口,这是由用户决定的。在前面我们介绍的流水灯就是一个很好的例子。这里不再赘述。下面看是有关I/O应用的例子。第二页,共四十六页,2022年,8月28日一、输入\输出控制【例7-1】I/O应用设计一电路,监视某开关K,用发光二极管LED显示开关状态,如果开关合上,LED灯亮;否则,LED等灭。分析:设计电路图如图7.1所示。开关接在P1.4口,LED灯接在P1.0口,当开关断开时,P1.4为Vcc,对应数字量为“1”,开关合上时,P1.1电平为0,对应数字量为“0”。根据LED的解法,当P1.0输出为“0”时,LED灯亮,反之输出为“1”时,灯则熄灭。用C语言编程如下:注意:书上有误第三页,共四十六页,2022年,8月28日一、输入\输出控制#include<reg51.h>sbitp1_0=P1^0;sbitp1_4=P1^4;/*定义位变量*/voidmain(){

p1_0=0;/*使发光二极管灭*/

for(;;)

{

p1_4=1;

if(p1_4==0)

p1_0=1;

else

p1_0=0;

}}第四页,共四十六页,2022年,8月28日二、中断系统首先有关中断的几个基本概念。1.中断所谓中断,是指CPU在正常运行程序时,由于内部/外部事件或由程序预先安排的事件,引起CPU中断正在运行的程序,而转到为内部/外部事件或为预先安排的事件服务的程序中去,服务完毕,再返回去执行波暂时中断的程序。1、中断的基本概念第五页,共四十六页,2022年,8月28日二、中断系统2.中断源中断源即引起中断的原因,中断申请的来源,中断源可以是I/O设备、故障、时钟、调试中人为设置。3.中断优先级和中断的嵌套当有多个中断源同时向CPU申请中断时,CPU优先响应最需紧急处理的中断请求,处理完毕再响应优先级别较低的,这种预先安排的响应次序就叫做中断优先级。值得一提的是,在中断系统中,高优先级的中断请求能中断正在进行的较低级的中断源处理,我们把这叫做中断的嵌套。1、中断的基本概念第六页,共四十六页,2022年,8月28日二、中断系统4.中断系统能实现中断功能并能对中断进行管理的硬件和软件称为中断系统。中断请求是在执行程序的过程中随机发生的,中断系统要解决的问题是:(1)CPU在不断地执行指令中,是如何检测到随机发生的中断请求的?(2)如何使中断的双方(CPU方和中断源方)均能人为控制——允许中断或禁止中断?(3)由于中断产生的随机性,因此不可能在程序中使用调用子程序指令或转移指令,那么如何在实现正确的转移,从而更好地为该中断源服务呢?(4)中断源有多个,而CPU只有一个,当有多个中断源同时有中断请求时,用户怎么控制CPU按照自己的需要安排响应次序?(5)中断服务完毕,如何正确地返回到原断点处?1、中断的基本概念第七页,共四十六页,2022年,8月28日二、中断系统51单片机有5个中断源,3个在片内,2个在片外,它们在程序存贮器中有固定的中断入口地址,当CPU响应中断时,硬件自动形成这些地址,由此进入中断服务程序;5个中断源有两级中断优先级,可形成中断嵌套;这6个中断源的符号、名称、产生条件及中断服务程序的入口地址如表7-1。2、中断源及其中断的入口地址第八页,共四十六页,2022年,8月28日二、中断系统2、中断源在芯片引脚的定义8051中断系统的5个中断源为:外部中断0请求,通过P3.2引脚输入。外部中断1请求,通过P3.3引脚输入。T0定时器/计数器0溢出中断请求。T1定时器/计数器1溢出中断请求。TI/RI串行口中断请求。第九页,共四十六页,2022年,8月28日二、中断系统1.中断允许控制寄存器IE(地址0A8H)每个中断源都可以通过置位或清除中断允许寄存器IE中的相关中断允许控制位分别使得中断源有效或无效。IE还包括一个中断允许总控制位EA,它能一次禁止所有中断。中断允许寄存器格式如下表7-2。3、中断控制相关的寄存器第十页,共四十六页,2022年,8月28日二、中断系统2.定时器/计数器控制寄存器(TCON)(地址88H)该寄存器用于保存外部中断请求以及定时器的计数溢出。寄存器的内容及位地址表7-3如下:3、中断控制相关的寄存器第十一页,共四十六页,2022年,8月28日二、中断系统3.串行口控制寄存器(SCON)(98H)串行口控制寄存器与中断有关的控制位共2位,如表7-4所示3、中断控制相关的寄存器第十二页,共四十六页,2022年,8月28日二、中断系统4.中断优先级寄存器IP(地址8BH)单片机采用了自然优先级和人工设置高、低优先级的策略,即可以由程序员设定那些中断是高优先级、哪些中断是低优先级。AT89S52可设置两个中断优先级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定。六个中断源的自然优先级(由高到低排列)为: 外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 定时器2中断。中断优先级由中断优先级寄存器IP(见表7-5)来设置的,IP中某位设为1,相应的中断就是高优先级,否则就是低优先级。3、中断控制相关的寄存器第十三页,共四十六页,2022年,8月28日二、中断系统单片机在每个机器周期的S5P2期间,顺序采样每个中断源,CPU在下一个机器周期S6期间按优先级顺序查询中断标志,如查询到某个中断标志为1,将在再下一个机器周期S1期间按优先级进行中断处理。中断得到响应后自动清除中断标志,由硬件将程序计数器PC内容压入堆栈保护,然后将对应的中断矢量装入程序计数器PC,使程序转向中断矢量地址单元中去执行相应的中断服务程序。在下列三种情况之一时,CPU将封锁对中断的响应:(1)CPU正在处理一个同级或更高级别的中断请求。(2)现行的机器周期不是当前正执行指令的最后一个周期。我们知道,单片机有单周期、双周期、三周期指令,当前执行指令是单字节没有关系,如果是双字节或四字节的,就要等整条指令都执行完了,才能响应中断(因为中断查询是在每个机器周期都可能查到的)。(3)当前正执行的指令是返回指令(RETI)或访问IP、IE寄存器的指令,则CPU至少再执行一条指令才应中断。这些都是与中断有关的,如果正访问IP、IE则可能会开、关中断或改变中断的优先级,而中断返回指令则说明本次中断还没有处理完,所以都要等本指令处理结束,再执行一条指令才可以响应中断。4、中断响应过程第十四页,共四十六页,2022年,8月28日二、中断系统具体地说,CPU响应中断的过程分为以下几个步骤:(1)保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。(2)寻找中断入口,根据6个不一样的中断源所产生的中断,查找6个不一样的入口地址。这6个中断源的编号和入口地址如表7-6所示各中断服务程序入口地址仅间隔8字节,编译器在这些地址放入无条件转移指令,跳转到服务程序的实际地址。。以上工作是由计算机自动完成的,与编程者无关。(3)执行中断处理程序。(4)中断返回:执行完中断指令后,就从中断处返回到主程序,继续执行。4、中断响应过程第十五页,共四十六页,2022年,8月28日二、中断系统5、C51中断的程序设计C51使用户能编写高效的中断服务程序,编译器在规定的中断源的矢量地址中放入无条件转移指令,使CPU响应中断后自动地从矢量地址跳转到中断服务程序的实际地址,而无需用户去安排。中断服务程序定义为函数,函数的完整定义如下:返回值函数名([参数])[模式][再入]interruptn[usingm]下面分别介绍后面3个参数:再入:通过属性关键字reentrant将函数定义为再入函数,这样函数才能才能递归调用。这是因为在C51中,普通函数(非再入的)不能递归调用,只有再入函数才可被递归调用。interruptn:表示将函数声明为中断服务函数,n为中断源编号,它可以是0~31间的整数,不允许为带运算符的表达式。n通常取以下值:0外部中断0;1定时器/计数器0溢出中断2外部中断1;3定时器/计数器1溢出中断4串行口发送与接收中断第十六页,共四十六页,2022年,8月28日二、中断系统5、C51中断的程序设计usingm:定义函数所使用的工作寄存器组,m的取值范围为0~3,可缺省,它对目标代码有如下作用:函数入口处将当前寄存器保存,使用m指定的寄存器组,函数退出时原寄存器组恢复。选不同的工作寄存器组,可方便实现寄存器组的现场保护。值得注意的是,中断服务函数不允许用于外部函数,因为它对目标代码有下面这些影响:①当调用函数时,SFR中的ACC、B、DPH、DPL和PSW实际需要时应该入栈。②如果不使用寄存器组切换,中断函数所需的所有工作寄存器Rn都入栈。③函数退出前,所有工作寄存器出栈。④函数由“RETI”指令终止。【例7-2】中断应用要求:电路原理图如图7.2所示。每按一次键,产生一次中断,P1口输出并取反,用C语言编程如下:第十七页,共四十六页,2022年,8月28日二、中断系统5、C51中断的程序设计//按键中断程序#include<reg52.h>main(){P1=0x55;//P1口初始值EA=1;//全局中断开EX0=1;//外部中断0开IT0=1;//低电平产生中断while(1);//等待中断,也是中断的返回点}voidIzdcs(void)interrupt0using1{P1=~P1;//按下触发一次,P1取反一次 }第十八页,共四十六页,2022年,8月28日二、中断系统5、C51中断的程序设计【例7-3】利用中断来点亮灯。

硬件电路图如图7.2,用INT1引脚的按钮控制P1口的灯,要求每按一下按钮就申请一次中断,点亮一盏灯,依次点亮八盏灯中的一盏。采用边沿触发。程序如下:#include<reg51.h>bitflag;

/*中断申请标志*/unsignedcharledstatus;

/*每一位分别对应P1口灯亮状态,用于计算*/voidint1_isr(void)interrupt2 /*INT1的中断服务程序*/{

flag=1;}第十九页,共四十六页,2022年,8月28日二、中断系统5、C51中断的程序设计voidmain(void){

P1=0xFF; /*初始化P1口的八盏灯,全灭*/

ledstatus=0x01; /*第一次是P1.0口的灯亮*//*初始化中断相关的寄存器*/

EX1=1; /*允许EX1中断*/

IT1=1; /*边沿触发*/

EA=1; /*允许总中断*/

while(1)

{

if(flag)

{

P1=(~ledstatus); /*取反,因为低电平时灯亮*/

ledstatus=(ledstatus<<1);

/*下一次中断时灯的状态*/

flag=0; /*处理完成清标志*/

}

}}第二十页,共四十六页,2022年,8月28日二、中断系统5、C51中断的程序设计【例7-4】多中断源控制灯采用图7.3的硬件电路图,要求每按一下INT1引脚的按钮就依次点亮八盏灯中的一盏,而每按一下INT0就使灯的亮灭变为相反的状态,INT1为最高优先级。均采用边沿触发。第二十一页,共四十六页,2022年,8月28日二、中断系统5、C51中断的程序设计因为INT1的自然优先级比INT0低,如果我们想让INT1为高优先级,就要设置中断优先级寄存器为0x04。程序如下:#include<reg51.h>unsignedcharledstatus; /*对应P1口的灯亮状态,用于计算*/voiddelay(void) /*延时子程序*/{intx,y;for(x=0;x<100;x++)for(y=0;y<5000;y++);

}第二十二页,共四十六页,2022年,8月28日二、中断系统5、C51中断的程序设计voidint1_isr(void)interrupt2 /*INT1的中断服务程序*/{P1=(~ledstatus); /*取反,因为低电平时灯亮*/delay(); /*延时*/ledstatus=(ledstatus<<1);/*下一次中断时灯的状态*/flag1=0; /*处理完成清标志*/}voidint0_isr(void)interrupt0/*INT0的中断服务程序*/{flag0=1; P1=~P1; /*灯由亮变灭或由灭变亮*/delay(); /*延时*/flag0=0; /*处理完成清标志*/}第二十三页,共四十六页,2022年,8月28日二、中断系统5、C51中断的程序设计voidmain(void){ /*初始化中断相关的寄存器*/IP=0x04; /*设INT1为高优先级*/EX1=1; /*允许EX1中断*/EX0=1; /*允许EX0中断*/IT1=0; /*INT1低电平触发*/IT0=0; /*INT0低电平触发*/EA=1; /*允许总中断*/ledstatus=0x01; /*按下INT1开关时,第一次是P1.0口的灯亮*/while(1){ P1=0xff; /*复位P1口的八盏灯,全灭*/}}第二十四页,共四十六页,2022年,8月28日三、定时/计数器1、定时/计数器的结构和工作方式51系列单片机片内有二个十六位定时/计数器:定时器0(T0)和定时器1(T1)。定时器T1有寄存器TH1、TL1组成,定时器T0由寄存器TH0、TL1组成,他们均为8位寄存器。图7.4是定时器T0的内部结构和控制信号。定时器T1也是一样。T0和T1由如下功能:●两个定时器都有定时或事件计数的功能,由软件选择是定时工作方式还是计数工作方式●定时/计数器实际上是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计数器,可以工作于定时方式,也可以工作于计数方式。两种工作方式实际都是对脉冲计数,只不过所计脉冲的来源不同。第二十五页,共四十六页,2022年,8月28日三、定时/计数器1、定时/计数器的结构和工作方式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=fosc/12。第二十六页,共四十六页,2022年,8月28日三、定时/计数器1、定时/计数器的结构和工作方式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可执行其他程序,除非定时/计数器溢出,才可能中断CPU执行的程序。这种工作的方式如同人类的所设的闹钟一样,人在工作或睡觉的时候,闹钟仍然继续运走,到了设定闹钟,就会响。第二十七页,共四十六页,2022年,8月28日三、定时/计数器2、定时/计数器的寄存器1.T/C0和T/C1的寄存器定时/计数器0和定时/计数器1是所有51系列单片机都具有的功能,对它们的控制是通过定时/计数器控制寄存器TCON和定时/计数器模式寄存器TMOD来实现。(1)定时/计数器模式寄存器TMOD定时/计数器模式寄存器TMOD主要用来设置定时/计数器的工作模式,它的地址是89H,不能进行位寻址,只能用字节传送指令设置定时器工作方式,复位时,TMOD所有位均为0。每一位的定义见表7-7,高四位与定时/计数器1有关,低四位与定时/计数器0有关。第二十八页,共四十六页,2022年,8月28日三、定时/计数器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。第二十九页,共四十六页,2022年,8月28日三、定时/计数器2、定时/计数器的寄存器(2)定时/计数器控制寄存器TCON定时/计数器控制寄存器TCON的地址是88H,可位寻址。该寄存器除了用作定时/计数器控制寄存器之外,还有几位与中断有关,我们在前面已介绍过。每一位的定义见表7-9。第三十页,共四十六页,2022年,8月28日三、定时/计数器2、定时/计数器的寄存器2.T/C2的寄存器与T/C2相关的寄存器有控制寄存器T2CON和方式寄存器T2MOD。(1)定时/计数器2控制寄存器T2CON定时/计数器2控制寄存器T2CON用来对其进行设置。T2CON的地址为0C8H,可位寻址,复位值是00000000B,寄存器每一位的定义见表7-10。第三十一页,共四十六页,2022年,8月28日三、定时/计数器2、定时/计数器的寄存器定时/计数器2既可以做定时器,又可以做事件计数器。其工作方式由特殊寄存器T2CON中的C/T2位选择。定时/计数器2有三种工作方式:捕获方式,自动重装载(向上或向下计数)方式和波特率发生器方式,工作方式由T2CON的控制位RCLK,TCLK,CP/RL2,TR2来选择,参见表7-11。第三十二页,共四十六页,2022年,8月28日三、定时/计数器2、定时/计数器的寄存器(2)定时/计数器2模式寄存器T2MOD当定时器2工作于16位自动重载模式,可对其编程实现向上计数或向下计数。这一功能可以通过定时/计数器2模式寄存器T2MOD(见表7-12)中的DCEN(向下计数允许位)来实现。T2MOD的地址是0C9H,不可位寻址。第三十三页,共四十六页,2022年,8月28日三、定时/计数器3、定时/计数器的工作方式1.方式0方式0是13位计数结构的工作方式,其计数器由TH0全部8位和TL0的低5位构成。当TL0的低5位计数溢出时,向TH0进位,而全部13位计数溢出时,则向计数溢出标志位TF0进位。当为计数工作方式时,计数值的范围是:1~8192(213);当为定时工作方式时,定时时间的计算公式为:(213-计数初值)×晶振周期×12或(213-计数初值)×机器周期其时间单位与晶振周期或机器周期相同(ms)。第三十四页,共四十六页,2022年,8月28日例1设定时器T0选择工作模式0,求最长定时时间,如果要实现定时时间为1ms,fosc=6MHz。试确定T0的初值,并编程使P1.0输出2ms的方波。解:当T0处于工作模式0时,加1计数器为13位。T0最大定时时间对应于13位计数器T0的各位全为0,即(TH0)=00H,(TL0)=00H。最长定时时间为:tmax=(213-0)×12/6=213×2us=16.384ms设定时时间为1ms时的初值为X,则:X=213

–6/12×1000=7692按照低5位,高8位拆开,T0的低5位TL0=01100B=0CHT0的高8位TH0=11110B,即1EH方式0应用第三十五页,共四十六页,2022年,8月28日三、定时/计数器3、定时/计数器的工作方式2.方式1方式1是16位计数结构的工作方式,计数器由TH0全部8位和TL0全部8位构成。与工作方式0基本相同,区别仅在于工作方式1的计数器TL1和TH1组成16位计数器,从而比工作方式0有更宽的定时/计数范围。 当为计数工作方式时,计数值的范围是:1~65536(216) 当为定时工作方式时,定时时间计算公式为:(216-计数初值)×晶振周期×12 或(216-计数初值)×机器周期第三十六页,共四十六页,2022年,8月28日例1利用定时器T0产生一个频率为50Hz的方波,由P1.1输出。要求采用中断方式。fosc=12MHz。解:方波周期T=1/50Hz=0.02s=20ms,如果要输出方波,则需要将P1.1状态每半个周期翻转一次。故定时时间为10ms,则定时器初值为:X=65536–10000=55536=D8F0H则:TH0=0D8H,TL0=0F0H方式1应用第三十七页,共四十六页,2022年,8月28日三、定时/计数器3、定时/计数器的工作方式3.方式28位自动装入时间常数方式。由TLl构成8位计数器,THl仅用来存放时间常数。启动T1前,TLl和THl装入相同的时间常数,当TL1计满后,除定时器回零标志TFl置位,具有向CPU请求中断的条件外,THl中的时间常数还会自动地装入TLl,并重新开始定时或计数。所以,工作方式2是一种自动装入时间常数的8位计数器方式。由于这种方式不需要指令重装时间常数,因而操作方便,在允许的条件下,应尽量使用这种工作方式。当然,这种方式的定时/计数范围要小于方式0和方式1。当计数溢出后,不是像前两种工作方式那样通过软件方法,而是由预置寄存器TH以硬件方法自动给计数器TL重新加载。变软件加载为硬件加载。初始化时,8位计数初值同时装入TL0和TH0中。当TL0计数溢出时,置位TF0,同时把保存在预置寄存器TH0中的计数初值自动加载TL0,然后TL0重新计数。如此重复不止。这不但省去了用户程序中的重装指令,而且也有利于提高定时精度。但这种工作方式下是8位计数结构,计数值有限,最大只能到255。这种自动重新加载工作方式非常适用于循环定时或循环计数应用,例如用于产生固定脉宽的脉冲,此外还可以作串行数据通信的波特率发送器使用。第三十八页,共四十六页,2022年,8月28日三、定时/计数器3、定时/计数器的程序设计4.方式32个8位方式。方式3只适用于定时器0。如果使定时器1为工作方式3,则定时器1将处于关闭状态。当T0为工作方式3时,TH0和TL0分成2个独立的8位计数器。其中,TL0既可用作定时器,又可用作计数器,并使用原T0的所有控制位及其定时器回零标志和中断源。TH0只能用作定时器,并使用T1的控制位TRl、回零标志TFl和中断源,见下图。通常情况下,T0不运行于工作方式3,只有在T1处于工作方式2,并不要求中断的条件下才可能使用。这时,T1往往用作串行口波特率发生器(见1.4),TH0用作定时器,TL0作为定时器或计数器。所以,方式3是为了使单片机有1个独立的定时器/计数器、1个定时器以及1个串行口波特率发生器的应用场合而特地提供的。这时,可把定时器l用于工作方式2,把定时器0用于工作方式3。第三十九页,共四十六页,2022年,8月28日三、定时/计数器4、定时/计数器的程序设计由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作。初始化的步骤一般如下:(1)确定工作方式(即对TMOD赋值);(2)预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1);(3)根据需要开放定时器/计数器的中断(直接对IE位赋值);(4)启动定时器/计数器(若已规定用软件启动,则可把TR0或TR1置“1”;若已规定由外中断引脚电平启动,则需给外引脚步加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。因为在不同工作方式下计数器位数不同,因而最大计数值也不同。现假设最大计数值为M,那么各方式下的最大值M值如下:方式0:M=213=8192方式1:M=216=65536方式2:M=28=256方式3:定时器0分成两个8位计数器,所以两个M均为256。因为定时器/计数器是作“加1”计数,并在计数满溢出时产生中断,因此初值X可以这样计算:X=M-计数值第四十页,共四十六页,2022年,8月28日三、定时/计数器4、定时/计数器的程序设计【例7-5】在XTAL频率是12MHz的标准8051器件上,用Timer1产生10kHz定时器滴答中断。分析:利用T1来产生10kHz的滴答中断,也就是长生周期为100us的滴答中断。因为时钟频率为12MHZ,采用方式2,先计算计数初值:机器周期MC=12/fosc=12/12=1us;应计脉冲个数100us/1us=100程序如下: #include<reg52.h> staticunsignedlongoverflow_count=0; /*定时器1中断服务程序:每100个时钟周期执行1次*/ voidtimer1_ISR(void)interrupt3 { overflow_count++;/*溢出计数器加1*/ } 第四十一页,共四十六页,2022年,8月28日三、定时/计数器4、定时/计数器的程序设计/*主函数:置定时器1为8位定时器重装(方式2)定时器计数到255时溢出,用156重装并产生中断*/voidmain(void){TMOD=(TMOD&0x0F)|0x20;/*设置方式(8位定时器)*/TH1=256–100;/*重装TL1来计数100个时钟周期*/TL1=TH1; ET1=1;/*允许定时器1中断*/TR1=1; /*启动定时器1运行*/EA=1;/*总中断允许*/whi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论