第4章 定时与中断系统_第1页
第4章 定时与中断系统_第2页
第4章 定时与中断系统_第3页
第4章 定时与中断系统_第4页
第4章 定时与中断系统_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

本章内容定时/计数器

C语言的函数

中断系统第4章定时与中断系统一、定时器和计数器重点掌握C51单片机片内定时器/计数器的结构、功能,有关的特殊功能寄存器,状态字、控制字的含义、工作模式和工作方式的选择以及定时器/计数器的应用举例。//功能:间隔显示时间为1秒的流水灯程序//函数名:delay1s//函数功能:用T1工作在方式1下的1秒延时函数,采用查询方式实现voiddelay1s(){unsignedchari;

for(i=0;i<0x14;i++) //设置20次循环次数

{TH1=0x3c; //设置定时器初值为3CB0HTL1=0xb0;TR1=1; //启动T1while(!TF1); //查询计数是否溢出,即定时50ms时间到,TF1=1TF1=0;//50ms定时时间到,将T1溢出标志位TF1清零

}}voidmain() //主函数{unsignedchari,w;TMOD=0x10; //设置T1为工作方式1while(1){w=0x01; //显示码初值为01H

for(i=0;i<8;i++){P1=~w; //w取反后送P1口,点亮相应LED灯

w<<=1; //点亮灯的位置移动

delay1s(); //调用1秒延时函数

}}}4.1定时器/计数器的结构TMOD:选择定时器/计数器T0、T1的工作模式和工作方式。TCON:控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。

共同点:都是通过计数器计脉冲的个数来实现的定时方式与计数方式的主要区别1、定时方式

T/C计数8051内部机器周期信号的个数,由计数个数可以计算出定时时间。每个机器周期使T/C的计数器增加1,直至计满回零后自动产生溢出中断请求,表示定时时间到。

f=12MHz,一个机器周期是1μs

2、计数方式

T/C计数来自引脚T0(P3.4)和T1(P3.5)的外部脉冲信号的个数。输入脉冲由1变0的下降沿时,计数器的值增加1直到回零产生溢出中断,表示计数已达预期个数。

不同点:定时/计数器

8051定时器/计数器逻辑结构方式0方式1方式2方式3TH0TL0T/C1TH1TL1T/C0方式3串行口波特率发生器定时器计数器启动方式软件启动(通过写程序来控制)硬软共同启动(通过程序和硬件电路共同来控制)定时/计数器

设置计数初值T0、T1是16位加法计数器,分别由两个8位专用寄存器组成,T0由TH0和TL0组成,T1由TH1和TL1组成。TL0、TL1、TH0、TH1的访问地址依次为8AH8DH,每个寄存器均可被单独访问,因此可以被设置为8位、13位或16位计数器使用。在计数器允许的计数范围内,计数器可以从任何值开始计数,对于加1计数器,当计到最大值时(对于8位计数器,当计数值从255再加1时,计数值变为0),产生溢出。定时/计数器允许用户编程设定开始计数的数值,称为赋初值。初值不同,则计数器产生溢出时,计数个数也不同。例如:对于8位计数器,当初值设为100时,再加1计数156个,计数器就产生溢出;当初值设为200时,再加1计数56个,计数器产生溢出。

定时/计数器

启动定时/计数器根据设置的定时/计数器启动方式,启动定时/计数器。如果采用软件启动,则需要把控制寄存器中的TR0或TR1置1;如果采用硬软共同启动方式,不仅需要把控制寄存器中的TR0或TR1置1,还需要相应外部启动信号为高电平。工作方式控制寄存器IMOD用于选择定时器/计数器的工作模式和工作方式,字节地址为89H,不能位寻址。定时/计数器工作方式控制寄存器TMODGATE:门控位。0:只要软件控制位TR0或TR1置1即可启动定时器开始工作;1:只有INT0或INT1引脚为高电平,且TR0或TR1置1时,才能启动相应的定时器开始工作。返回例如:设定时器T0为定时工作方式,要求用软件启动定时器T0工作,按方式1工作;定时器T1为计数工作方式,要求软件启动,工作方式为方式2。则根据TMOD各位的定义可知,其控制字为:

即控制字为61H,其指令形式为:

TMOD=0x61H;格式:D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M001100001TCON的字节地址88H,可位寻址,位地址为88H~8FH。定时器/计数器控制寄存器TMOD定时器的四种工作方式方式的选择:根据M1,M0来选择。

00:方式001:方式110:方式211:方式3主要特点:方式0:13位定时器。

TH0的8位+TL0的低5位方式1:16位定时器。TH0的8位+TL0的8位方式2:能重复置初始值的8位定时器。TL0和TH0必须赋相同的值。方式3:只适用于定时器0,T0被拆成两个独立的8位定时器TL0,TH0。

其中:TL0与方式0、1相同,可定时或计数。用定时器T0的

GATE、C/T、TR0、TF0、T0、和INT0控制。

1方式0

M1、M0为00,定时器/计数器的框图:

图6-44.1.2定时器/计数器的4种工作方式为13位的计数器,C/T*位决定工作模式:

0:开关打在上面,为定时器工作模式;

1:开关打在下面,为计数器工作模式,计数脉冲为P3.4、P3.5引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1。GATE位:决定定时器/计数器的运行取决于TRx一个条件还是TRx和INTx*引脚两个条件。(1)0:A点是否计数,仅取决于TRx的状态。(2)1:B点电位由INTX*的输入电平和TRX的状态这两个条件来确定。是否计数是由TRx和INTx*二个条件来控制的。

试一试

用T1、工作方式0实现任务7中1s延时函数,晶振频率为12MHz.

方式0采用13位计数器,其最大定时时间为:8129×1us=8.192ms,可选择定时5ms,循环200次。定时时间为5ms,则计数值为5ms/1us=5000,T1的初值为:X=M-计数值=8192-5000=3192=C78H=0110001111000B13位计数器中TL1的高3位未用,填0,TH1占高8位,所以,实际上x的值为:X=0110001100011000B=6318H

用T0的工作方式0实现任务7中1s延时函数如下:voiddelay1s(){unsignedchari;TOMD=0x00;

for(i=0;i<0xc8;i++){TH1=0x63;TL1=0x18;TR1=1;while(!TF1);TF1=0;}}定时器的方式0、1示意图返回TF0TH0TL0

12分频OSC中断高8位8位或低5位控制+T0(P3.4)TR0GATEINT0(P3.2)C/T=0C/T=1初始化程序:TMOD=0x01H;TH0=0x3CH;TL0=0xB0H;TR0=1;方式0和方式1的最大特点是计数溢出后,计数器为全0.因此在循环定时或循环计数应用时就存在用指令反复装入计数初值的问题。3.方式2试一试

用T1、工作方式2实现任务7中1s延时函数,晶振频率为12MHz。分析:因工作方式2是8位计数器,其最大定时时间为:256×1us=256us,为实现1s延时,可选择定时时间为250us,再循环4000次。定时时间选定后,可确定计数值为250,则T1的初值为:X=M-计数值=256-250=6=6H。采用T1的工作方式2,因此,TMOD=0x20,voiddelay1s(){unsignedinti;

TMOD=0x20;TH1=6;TL1=6;

for(i=0;i<4000;i++){TR1=1;while(!TF1);TF1=0;}}定时器的初始值的计算对于不同的工作方式,计数器位数不同,故最大计数值M也不同:

方式0:M=213=8192

方式1:M=216=65536

方式2:M=28=256

方式3:定时器0分为2个8位计数器,每个M均为256。因为定时/计数器是作加1计数,并在计满溢出时产生中断,因此初值X的计算如下:

X=M–计数值计算出来的结果X转换为16进制数后分别写入TL0(TL1)、TH0(TH1)。注意!方式0时初始值写入时,对于TL不用的高3位应填入0!任务8:简易秒表控制

//功能:采用BCD码格式显示的0~59简易秒表程序#include<reg51.h>voiddelay1s()//1秒延时函数{unsignedchari;

for(i=0;i<0x14;i++) //设置20次循环次数

{ TH1=0x3c;//设置定时器初值为3CB0HTL1=0xb0;TR1=1; //启动T1while(!TF1);//查询计数是否溢出,即定时50ms时间到,TF1=1TF1=0; //50ms定时时间到,将T1溢出标志位TF1清零

}}voidmain(){unsignedchari,t;TMOD=0x10; //置T1为工作方式1while(1){

for(i=0;i<60;i++){t=(((i/10)<<4)|(i%10)); //将i转换为BCD码

P1=~t;//计数值取反后送P1口显示

delay1s();//调用1秒延时函数

}}}小知识

BCD码是用二进制数形式表示十进制数,例如十进制45,其BCD码形式为45H。BCD码知识一种表示形式,与其数值没有关系。BCD码用4位二进制数表示1一位十进制数,这4位二进制数的权为8421,所以BCD码又称为8421码.在C语言程序中,子程序的作用是由函数来实现的,函数是C语言的基本组成模块,一个C语言程序就是由若干个模块化的函数组成的。C程序都是由一个主函数main()和若干个子函数构成,有且只有一个主函数,程序由主函数开始执行,主函数根据需要来调用其他函数,其它函数可以有多个。4.2C语言的函数1.标准库函数标准库函数是由C51的编译器提供的,用户不必定义这些函数,可以直接调用。KEILC51编译器提供了100多个库函数供我们使用。常用的C51库函数包括一般I/O口函数、访问SFR地址函数等,在C51编译环境中,以头文件的形式给出。2.用户自定义函数用户自定义函数是用户根据需要自行编写的函数,它必须先定义之后才能被调用。函数分类和定义程序:ex4_6

功能:调用循环左移标准函数实现的流水灯控制程序

#include<reg51.h>#include<instrins.h>//此头文件中定义了循环左移函数_crol_()voiddelay(unsigned

inti){unsignedintk;for(k=0;k<i;k++);}voidmain(){unsignedcharaa;

aa=0x01;

while(1){P1=aa;delay(5000);

aa=_crol_(aa,1);

//_crol_()为循环左移函数,把变量aa的值循环左移一位

}}函数定义的一般形式是:函数类型函数名(形式参数表)

{局部变量定义函数体语句}

其中,“函数类型”说明了自定义函数返回值的类型。“函数名”是自定义函数的名字。“形式参数表”给出函数被调用时传递数据的形式参数,形式参数的类型必须要加以说明。ANSIC标准允许在形式参数表中对形式参数的类型进行说明。如果定义的是无参数函数,可以没有形式参数表,但是圆括号不能省略。“局部变量定义”是对在函数内部使用的局部变量进行定义。“函数体语句”是为完成函数的特定功能而设置的语句。2.用户自定义函数voiddelay(unsignedchari){unsignedcharj,k;

for(k=0;k<i;k++)

for(j=0;j<255;j++);}形式参数函数定义局部变量函数调用就是在一个函数体中引用另外一个已经定义的函数,前者称为主调用函数,后者称为被调用函数,函数调用的一般格式为:

函数名(实际参数列表);对于有参数类型的函数,若实际参数列表中有多个实参,则各参数之间用逗号隔开。实参与形参顺序对应,个数应相等,类型应一致。4.2.2函数调用函数的三种调用方式

函数语句。把被调函数作为主调函数的一个语句。delay1s();函数表达式。被调函数以一个运算对象的形式出现在一个表达式中。c=2*max(a,b);函数参数。被调函数作为另一个函数的实参或者本函数的实参。m=max(a,max(b,c));在一个函数中调用另一个函数需要具备如下条件:(1)被调用函数必须是已经存在的函数(库函数或者用户自己已经定义的函数。如果函数定义在调用之后,那么必须在调用之前(一般在程序头部)对函数进行声明。(2)如果程序使用了库函数,则要在程序的开头用#include预处理命令将调用函数所需要的信息包含在本文件中。如果不是在本文件中定义的函数,那么在程序开始要用extern修饰符进行函数原型说明。函数调用//程序:ex4_3.c//功能:可控信号灯程序#include<reg51.h>//函数名:delay0_5s//函数功能:用T0的方式1编制0.5秒延时程序,假定系统采用12MHz晶振,定时器1、工作方式1定时50ms,再循环10次即可定时到0.5秒//形式参数:无//返回值:无voiddelay0_5s(){unsignedchari;

for(i=0;i<0x0a;i++) //设置10次循环次数{ TH0=0x3c; //设置定时器初值

TL0=0xb0;TR0=1; //启动T0while(!TF0);//查询计数是否溢出,即定时50ms时间到,TF0=0TF0=0;//50ms定时时间到,将定时器溢出标志位TF0清零

}}//函数名:delay_t//函数功能:实现0.5秒~128秒延时//形式参数:unsignedchart;延时时间为0.5秒×tvoiddelay_t(unsignedchart){unsignedchari;

for(i=0;i<t;i++)delay0_5s();}//函数名:int_0//函数功能:外部中断0中断函数,当CPU响应外部中断0的中断请求时,自动执行该//函数,实现八个信号灯闪烁//形式参数:无voidint_0()interrupt0 //外部中断0的中断号为0{P1=0x00; //熄灭八个信号灯

delay0_5s(); //调用0.5秒延时函数

P1=0xff; //点亮八个信号灯

delay0_5s(); //调用0.5秒延时函数}voidmain() //主函数{unsignedchari,w;EA=1; //打开中断总允许位

EX0=1; //打开外部中断0允许位

IT0=1; //设置外部中断为边沿(下降沿)触发方式

TMOD=0x01;//设置T0为工作方式1while(1){w=0x01;//显示码初值为01H

for(i=0;i<8;i++){P1=~w; //w取反后送P1口,点亮相应LED灯

w<<=1; //点亮灯的位置移动

delay_t(2); //调用延时函数delay_t(),实际参数为2,延时1秒

}}}三、中断系统1、理解89C51单片机片内中断系统的工作原理及特性。2、重点掌握与中断系统有关的特殊功能寄存器,以及如何来对中断系统进行初始化编程,中断响应条件,如何撤销中断请求,以及如何进行中断服务子程序设计。中断是指通过硬件来改变CPU的运行方向。计算机在执行程序的过程中,外部设备向CPU发出中断请求信号,要求CPU暂时中断当前程序的执行而转去执行相应的处理程序,待处理程序执行完毕后,再继续执行原来被中断的程序。这种程序在执行过程中由于外界的原因而被中间打断的情况称为“中断”。

4.3什么是中断小提示

中断函数的调用过程类似于一般函数调用,区别在于:

何时调用一般函数在程序中是事先安排好的;而何时调用中断函数事先却无法确定,因为中断的发生时由外部因素决定的,程序中无法事先安排调用语句。因此,调用中断函数的过程是由硬件自动完成的。(1)中断服务程序:CPU响应中断后,转去执行相应的处理程序,该处理程序通常称之为中断服务程序。(2)主程序:原来正常运行的程序称为主程序。(3)断点:主程序被断开的位置(或地址)称为断点。(4)中断源:引起中断的原因,或能发出中断申请的来源,称为中断源。(5)中断请求:中断源要求服务的请求称为中断请求(或中断申请)。

中断基本概念同步工作异常处理实时处理中断特点4.3.2中断系统的结构

中断优先级(5个中断请求,2个中断优先级)当有多个中断源同时向CPU申请中断时,CPU优先响应最需紧急处理的中断请求,处理完毕再响应优先级别较低的,这种预先安排的响应次序。

二级中断嵌套CPU在执行主程序低级中断请求响应低级中断请求CPU执行低级中断服务程序高级中断请求响应高级中断请求CPU执行高级中断服务程序返回低级中断程序返回主程序符号名称中断引起原因中断服务程序入口地址INT0外部中断0

P3.2引脚的低电平或下降沿信号

0003HT0定时器0中断定时计数器0计数回零溢出000BHINT1外部中断1P3.3引脚的低电平或下降沿信号0013HT1定时器1中断

定时计数器1计数回零溢出

001BHTI/RI

串行口中断串行通信完成一帧数据发送或接收引起中断

0023H

图5-2中断申请中断排序中断控制中断允许寄存器IE中断优先级寄存器IP串行口控制寄存器INT0INT0INT1T0T1串行口中断中断标志中断标志位位名称说明TF1T1溢出中断标志TCON.7T1被启动计数后,从初值开始加1计数,计满溢出后由硬件置位TF1,同时向CPU发出中断请求,此标志一直保持到CPU响应中断后才由硬件自动清0。也可由软件查询该标志,并由软件清0。前述的定时器编程都是采用查询方式实现。TF0T0溢出中断标志TCON.5T0被启动计数后,从初值开始加1计数,计满溢出后由硬件置位TF0,同时向CPU发出中断请求,此标志一直保持到CPU响应中断后才由硬件自动清0。也可由软件查询该标志,并由软件清0。IE1中断标志TCON.3IE1=1,外部中断1向CPU申请中断。IT1中断触发方式控制位TCON.2当IT1=0,外部中断1控制为电平触发方式;当IT1=1,外部中断1控制为边沿(下降沿)触发方式。IE0中断标志TCON.1IE0=1,外部中断0向CPU申请中断。IT0中断触发方式控制位TCON.0当IT0=0,外部中断0控制为电平触发方式;当IT0=1,外部中断0控制为边沿(下降沿)触发方式。TI串行发送中断标志SCON.1CPU将数据写入发送缓冲器SBUF时,启动发送,每发送完一个串行帧,硬件都使TI置位;但CPU响应中断时并不自动清除TI,必须由软件清除。RI串行接收中断标志SCON.0当串行口允许接收时,每接收完一个串行帧,硬件都使RI置位;同样,CPU在响应中断时不会自动清除RI,必须由软件清除。5个中断请求源五个中断请求源(1)INT0—外部中断请求0,由引脚P3.2输入,中断请求标志为IE0。(2)INT1—外部中断请求1,由引脚P3.3输入,中断请求标志为IE1。(3)定时器/计数器T0溢出中断请求,中断请求标志为TF0。(4)定时器/计数器T1溢出中断请求,中断请求标志为TF1。(5)串行口中断请求,中断请求标志为TI或RI。特殊功能寄存器TCON和SCON的相应位锁存各中断请求标志。CPU将跳去执行中断服务程序当中断源向CPU申请中断时,相应中断标志位由硬件自动置1,当响应中断请求后,该如何撤除这些中断标志位。对于T0,T1溢出中断和边沿触发的外部中断,CPU在响应中断后即由硬件自动清除其中断标志位TF0,TF1或IE0,IE1,无须采取其他措施。2、对于串行口中断,CPU在响应中断后,硬件不能自动清除中断请求标志位TI或RI,必须在中断服务程序中用软件将其清除。3、对于电平触发的外部中断,硬件不会自动清除标志位,同时,也不能用软件将其清除,所以,当CPU响应中断后,应该立即撤除INT0和INT1外部引脚上的信号。P0=P0&0xfe;P0=P0|0x01;中断允许寄存器IE

CPU对中断源的开放或屏蔽,由片内的中断允许寄存器IE控制。字节地址A8H,可位寻址。格式如图。3中断的开放和禁止中断的开放和禁止中断允许位位名称说明EA总中断允许控制位IE.7EA=1,开放所有中断,各中断源的允许和禁止可通过相应的中断允许位单独加以控制;EA=0,禁止所有中断。ES串行口中断允许位IE.4ES=1,允许串行口中断;ES=0禁止串行口中断。ET1T1中断允许位IE.3ET1=1,允许T1中断;ET1=0,禁止T1中断。EX1(INT1)中断允许位IE.2EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。ET0T0中断允许位IE.1ET0=1,允许T0中断;ET0=0,禁止T0中断。EX0(INT0)中断允许位IE.0EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。

8051单片机系统复位后,IE寄存器中各中断允许位均被清零,即禁止所有中断例如:EA=1;//开放中断总允许位

EX0=1;//开放外部中断0允许位

上面的例题也可以用一条语句来实现:

IE=0x81;//寄存器IE=10000001B同时开放中断总允许位和外部中断0允许位。

若CPU正在执行高优先级的中断,则不能被任何中断源所中断。中断优先级寄存器IP,其字节地址为B8H,格式如图。IP各个位的含义:(1)PS——串行口中断优先级控制位

1:高优先级中断;

0:低优先级中断。4

温馨提示

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

评论

0/150

提交评论