AT89S52单片机定时器控制系统,内部定时器/计数器T0计数,按方式2工作,对T0引脚(P3.4)

————————————————————————————————————————————
定时/计数器结构(T0和T1)
16位寄存器T0、T1分别由TH0、TL0和TH1、TL1四个8位计数器组成
定时器的区别:
T0可分成2个独立的8位定时器,而定时器1则不能;
T1可作为串口的波特率发生器,而定时器0则不能。
用途:定时器和计数器
核心:加1计数器
原理:每来一个脉冲则加1计数器加1,当加到全1时再来一个脉冲使加1计数器归零,同时加1计数器的溢出使TCON寄存器中的TF0(或TF1)置1,向CPU发出中断请求
脉冲来源:
定时器:脉冲来源是由系统的时钟晶振器输出脉冲源提供
计数器:脉冲来源是由T0或T1引脚(P3.4或P3.5)输入的外部脉冲源提供
注:T0或T1都不能同时既做定时器也做计数器
计数器工作原理:
用作计数器时,对T0或T1引脚的外部脉冲计数,如果前一个机器周期采样值为1,后一个机器周期采样值为0 ,则说明有一个脉冲,计数器加1。
在每个机器周期的S5P2期间采样引脚输入电平。新的计数初值于下一个机器周期的S3P1期间装入计数器。
此种方式需要两个机器周期来检测一个1-&0负跳变信号,因此最高的计数频率为时钟频率的1/24。
S5P2指的是第5个时钟周期的相位2。
晶体振荡器的振荡信号从XTAL2端输入到片内的时钟发生器上,时钟发生器是一个二分频触发器电路,它将振荡器的信号频率除以2,向CPU提供了两相时钟信号P1和P2。时钟信号的周期称为机器状态时间S,它是振荡周期的2倍。在每个时钟周期(即机器状态时间S)的前半周期,相位1(即P1信号)有效,在每个时钟周期的后半周期,相位2(即P2信号)有效。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
使用的寄存器
TCON控制寄存器:启动和停止定时/计数器的计数,并控制定时器的工作状态,不能按位寻址
TMOD方式寄存器:设置定时器的工作方式,选择定时或计数的功能,可以按位寻址。(和中断共用寄存器,高四位为定时计数器使用,低四位为中断使用)
注:GATE逻辑结构此处略过,详见书P100
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
工作方式:
计算公式:
最大计数:8192个机器周期
工作原理:
13位计数器,使用TL0的低5位和TH0的高8位组成,TL0的低5位溢出时向TH0进位。TH0溢出时发出中断请求。
计算公式:
最大计数:65536个机器周期
工作原理:
16位计数器,TL0作为低8位,TH0作为高8位
方式2:自动重装初值的8位计数方式
计算公式:
p.s.晶振频率必须选择12的整数倍,因为定时器的频率是晶振频率的1/12。
最大计数:256个机器周期
适合做比较精准的脉冲信号发生器
工作原理:
计数器溢出后,计数器自动将上次设置的初值重装。
方式3:p.s.只能用于定时/计数器T0,T0工作在方式3时,T1不要使用在有中断的场合。通常该种情况下T1用作串口波特率发生器
工作原理:
将T0分成两个独立的8位定时/计数器TL0和TH0。
TL0为正常的8位定时/计数器,计数器溢出后置位TF0,申请中断,之后重装初值。
TH0也是8位定时/计数器,但由于TL0占用了TF0和TR0,因此TH0占用定时器TF1和TR1(所以T1不能用)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
时钟周期/机器周期计算:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
定时/计数器初始化
对TMOD赋值,确定T0和T1的工作方式
计算初值,并将其写入TH.x和TL.x
使用中断方式时对IE寄存器赋值开发中断
使TR0或TR1置位,启动定时/计数器
阅读(...) 评论()当前位置: >>
第7章 定时器计数器
第7章定时器/计数器的工 作原理及应用1 7.1 定时器/计数器的结构AT89S51定时器/计数器结构见图 7-1,定时器/计数器T0由特殊功能寄存器 TH0、TL0构成,T1由特殊功能寄存器TH1、TL1构成。图7-1 定时器/计数器结构框图2 T0、T1都有定时器和计数器两种工作模式,两种模式实质都是对脉冲信号进行计数,只不过计数信号来源不同。 计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数(见图7-1);定时器模式是对系统时钟信号经12分频后的内部脉冲信号(机器周期) 计数。由于系统时钟频率是定值,可根据计数值计算出定时时间。两个定时器/计数器属于增1计数器,即每计一个脉冲,计数器增1。T0、T1具有4种工作方式(方式0、1、2和3)。 图 7-1特殊功能寄存器TMOD用于选择定时器/计数器T0、T1的工作模式和工作方式。特殊功能寄存器TCON用于控制T0、T1的启动和停止计数, 同时包含了T0、T1状态。计数器起始计数从初值开始。单片机复位时计数器初值为0,也可给计数器装入1个新的初值。7.1.1 工作方式控制寄存器TMODTMOD用于选择定时器/计数器的工作模式和工作方式,字节地址为89H ,不能位寻址,格式见图7-2。 图7-2 寄存器TMOD格式8位分两组,高4位控制T1,低4位控制T0。 TMOD各位说明如下。(1)GATE―门控位GATE=0,定时器是否计数,由控制位TRx(x = 0,1)来控制。5 GATE=1,定时器是否计数,由外中断引脚INTx* 上的电平与运行控制位TRx共同控制。 (2)M1、M0―工作方式选择位M1、M0 4种编码,对应于4种工作方式的选择,见表7-1。表7-1M1、M0工作方式选择6 (3)C/T* ―计数器模式和定时器模式选择位C/T*=0,定时器模式,对系统时钟12分频后的脉冲进行计数。 C/T*=1,计数器模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5 )的外部脉冲(负跳变)计数。 7.1.2 定时器/计数器控制寄存器TCON TCON字节地址88H,位地址为88H~8FH。格式见图7-3。图7-3 TCON格式7 第6章已介绍与外中断有关的低4位。这里仅介绍高4位功能。(1)TF1、TF0―计数溢出标志位 当计数器计数溢出时,该位置“1”。使用查询方式时,此位可供CPU查询,但应注意查询后,用软件及时将该位清“0”。使用中断方式时,作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。 (2)TR1、TR0―计数运行控制位TR1位(或TR0)=1,启动计数器计数的必要条件。TR1位(或TR0)=0,停止计数器计数。 该位可由软件置“1”或清“0”。7.2 定时器/计数器的4种工作方式4种工作方式,分别介绍如下。8 7.2.1 方式0当M1、M0=00,设置为方式0,定时器/计数器等效逻辑结构见图7-4( 以T1为例,TMOD.5、TMOD.4 = 00)。图7-4 定时器/计数器方式0的逻辑结构框图9 方式0为13位计数器,由TLx(x = 0,1)的低5位和THx的高8位构成。TLx低5位溢出则向THx进位,THx计数溢出则把TCON中的溢出标志位 TFx置“1”。图7-2中,C/T*位控制电子开关决定2种工作模式。(1)C/T*=0,电子开关打在上面,T1(或T0)为定时器工作模式,系 统时钟12分频后的脉冲作为计数信号。(2)C/T*=1,电子开关打在下面,T1(或T0)为计数器工作模式,对P3.5(或P3.4)引脚上的外部输入脉冲计数,当引脚上发生负跳变时,计 数器加1。GATE位状态决定定时器/计数器运行控制取决于TRx一个条件,还是取决于TRx和INTx*引脚状态两个条件。10 (1) GATE=0时,A点(见图7-4)电位恒为1,B点电位仅取决于TRx状 态。TRx=1,B点为高电平,控制端控制电子开关闭合,允许T1(或T0) 对脉冲计数。TRx=0,B点为低电平,电子开关断开,禁止T1(或T0)计 数。 (2) GATE=1时,B点电位由INTx*(x = 0,1)的电平和TRx的状态两 个条件来确定。当TRx=1,且INTx* =1时,B点才为1,电子开关闭合,允 许T1(或T0)计数。故这种情况下计数器是否计数是由TRx和INTx*两个 条件来共同控制的。7.2.2 方式1 当M1、M0=01时,工作于方式1,等效电路逻辑结构见图7-5。 图7-5方式1的逻辑结构框图方式1和方式0差别仅仅在于计数器的位数不同,方式1为16位计数器,由 THx高8位和TLx低8位构成(x = 0,1),方式0则为13位计数器,有关控制 状态位含义(GATE、C/T* 、TFx、TRx)与方式0相同。12 7.2.3 方式2方式0和方式1最大特点是计数溢出后,计数器为全0。因此在循环定 时或循环计数应用时就存在用指令反复装入计数初值的问题,这会影响定时精度,方式2就是为解决此问题而设置的。当M1、M0=10时,工作方式2,等效逻辑结构见图7-6(以T1为例, x=1)。工作方式2为自动恢复初值(初值自动装入)的8位定时器/计数器,TLx(x=0,1)作为常数缓冲器,当TLx计数溢出时,在溢出标志TFx置 “1”的同时,还自动将THx中的初值送至TLx,使TLx从初值开始重新计数。定时器/计数器方式2工作过程见图7-7。13 图7-6方式2逻辑结构框图14 图7-7 方式2工作过程方式2可省去用户软件中重装初值的指令执行时间,简化定时初值的计 算方法,可相当精确地定时。15 7.2.4 方式3 方式3是为增加一个附加的8位定时器/计数器而设置的,从而使 AT89S51具有3个定时器/计数器。方式3只适用于T0,T1不能工作在方 式3。T1方式3时相当于TR1 = 0,停止计数(此时T1可作为串口波特率 产生器)。 1.工作方式3下的T0 当TMOD的低2位为11时,T0被选为方式3,各引脚与T0的逻辑关系 见图7-8。 T0分为两个独立的8位计数器TL0和TH0,TL0使用T0的状态控制位 C/T* 、GATE、TR0 ,而TH0被固定为一个8位定时器(不能作为外部 计数模式),并使用定时器T1的状态控制位TR1,同时占用定时器T1的 中断请求源TF1。16 2.T0工作在方式3时T1的各种工作方式 一般情况下,当T1用作串口波特率发生器时,T0才工作在方式3。T0 方式3时,T1可为方式0、1、2,作为串口波特率发生器,或不需要中断的 场合。17 图7-8T0方式3的逻辑结构框图 (1)T1工作在方式0T1的控制字中M1、M0 = 00时,T1工作在方式0,工作示意图如图79所示。图7-9 (2)T1工作在方式1T0方式3时T1为方式0工作示意图当T1的控制字中M1、M0 = 01时,T1工作在方式1,工作示意见图710。19 图7-10 T0方式3时T1为方式1工作示意图 (3)T1工作在方式2 当T1控制字中M1、M0 = 10时,T1为方式2,工作示意如图7-11所示。图7-11T0方式3时T1为方式2工作示意图20 (4)T1设置在方式3T0方式3时,再把T1也设置成方式3,此时T1停止计数。 7.3 对外部输入的计数信号的要求 计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生 负跳变时,计数值增1。每个机器周期S5P2期间,都对外部输入引脚T0或 T1进行采样。如在第1个机器周期中采得值为1,而在下一个机器周期中采 得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于 确认一次负跳变要花2个机器周期,即24个振荡周期,因此外部输入的计数 脉冲的最高频率为系统振荡器频率1/24。21 如选用6MHz晶体,允许输入脉冲频率最高为250kHz。如选用12MHz频率晶体,则可输入最高频率500kHz外部脉冲。对外输入信号占空比没有限 制,但为确保某一给定电平在变化前能被采样1次,则该电平至少保持1个 机器周期。故对外部输入信号要求见图7-12,图中Tcy为机器周期。图7-12 对外部计数输入信号的要求 7.4 定时器/计数器的编程和应用4种工作方式中,方式0与方式1基本相同,只是计数位数不同。方式0 为13位,方式1为16位。由于方式0是为兼容MCS-48而设,计数初值计 算复杂,所以在实际应用中,一般不用方式0,常采用方式1。 7.4.1 P1口控制8只LED每0.5s闪亮一次 【例7-1】在AT89S51的P1口上接有8只LED,原理电路见图7-13。 采用T0方式1的定时中断方式,使P1口外接的8只LED每0.5s闪亮一次。23 图7-13 方式1定时中断控制LED闪亮24 (1)设置TMOD寄存器T0工作在方式1,应使TMOD寄存器的M1、M0=01;应设置C/T*=0,为定 时器模式;对T0的运行控制仅由TR0来控制,应使相应的GATE位为0。定时 器T1不使用,各相关位均设为0。所以,TMOD寄存器应初始化为0x01。 (2)计算定时器T0的计数初值 设定时时间5ms(即5 000?s),设T0计数初值为X,假设晶振的频率为 11.059 2MHz,则定时时间为:25 定时时间=(216?X)×12/晶振频率则 5 000=(216 ?X) ×12/11.059 2 得 X = 60 928 转换成十六进制:0xee00,其中0xee装入TH0,0x00装入TL0。 (3)设置IE寄存器本例由于采用定时器T0中断,因此需将IE寄存器中的EA、ET0位置1。 (4)启动和停止定时器T0将定时器控制寄存器TCON中的TR0=1,则启动定时器T0;TR0=0,则 停止定时器T0定时。参考程序:#include&reg51.h& char i=100;void main (){ TMOD=0x01; TH0=0 TL0=0x00; //定时器T0为方式1 //设置定时器初值27 P1=0x00;EA=1; ET0=1; TR0=1; while(1); { ;//P1口8个LED点亮//总中断开 //开T0中断 //启动T0 //循环等待}} void timer0() interrupt 1 { TH0=0 TL0=0x00; //重新赋初值 //T0中断程序 i--;if(i&=0) { P1=~P1; i=100; } }//循环次数减1//P1口按位取反 //重置循环次数7.4.2 计数器的应用 【例7-2】如图7-14,T1采用计数模式,方式1中断,计数输入引脚T1(P3.5)上外接按钮开关,作为计数信号输入。按4次按钮开关后,P1口的8只LED闪烁不停。 (1)设置TMOD寄存器29 T1工作在方式1,应使TMOD的M1、M0=01;设置C/T*=1,为计数器模式;对T0运行控制仅由TR0来控制,应使GATE0=0。定时器T0不使用, 各相关位均设为0。所以,TMOD寄存器应初始化为0x50。 (2)计算定时器T1的计数初值 由于每按1次按钮开关,计数1次,按4次后,P1口的8只LED闪烁不停 。因此计数器初值为65 536?4=65 532,将其转换成十六进制后为0xfffc, 所以,TH0=0xff,TL0=0xfc。30 图7-14 由外部计数输入信号控制LED的闪烁 (3)设置IE寄存器本例由于采用T1中断,因此需将IE寄存器的EA、ET1位置1。 (4)启动和停止定时器T1 将寄存器TCON中TR1=1,则启动T1计数;TR1=0,则停止T1计数。 参考程序如下:#include &reg51.h& void Delay(unsigned int i) //定义延时函数Delay( ),i是形 //式参数,不能赋初值 { for(;i&0;i--) //变量i由实际参数传入一个值 //因此i不能赋初值 //空函数 //主函数 //设置定时器T1为方式1计数 //向TH1写入初值的高8位for(j=0;j&125;j++){;} } void main( ) { TMOD=0x50; TH1=0TL1=0EA=1;//向TL1写入初值的低8位//总中断允许33 ET1=1; TR1=1; while(1) ; }//定时器T1中断允许 //启动定时器T1 //无穷循环,等待计数中断void T1_int(void) interrupt 3 //T1中断函数 { for(;;) //无限循环 { P1=0 //8位LED全灭 Delay(500) ; //延时500ms P1=0; //8位LED全亮 Delay(500); //延时500ms } }34 7.4.3 控制P1.0产生周期为2ms的方波【例7-3】假设系统时钟为12MHz,设计电路并编写程序实现从P1.0引 脚上输出一个周期为2ms的方波,见图7-15。 要在P1.0上产生周期为2ms的方波,定时器应产生1ms的定时中断,定 时时间到则在中断服务程序中对P1.0求反。使用定时器T0,方式1定时中 断,GATE不起作用。 本例的原理电路见图7-16。其中在P1.0引脚接有虚拟示波器,用来观 察产生的周期2ms的方波。35 图7-15 定时器控制P1.0输出一个周期2ms方波 图7-16 定时器控制P1.0输出周期2ms的方波的原理电路37 下面来计算T0初值X :设T0的初值为X,有 (216?X )×1×10?6=1×10?3 即 65 536?X=1 000 得X=64 536,化为16进制数就是0xfc18。将高8位0xfc装入TH0,低8位 0x18装入TL0。 参考程序如下:#include &reg51.h& sbit P1_0=P1^0; void main(void) { TMOD=0x01; TR0=1; while(1) { //头文件reg51.h //定义特殊功能寄存器P1的位变量P1_0 //主程序 //设置T0为方式1 //接通T0 //无限循环38 TH0=0TL0=0x18; do{}while(!TF0); P1_0=!P1_0; TF0=0; } }//置T0高8位初值//置T0低8位初值 //TF0为0原地循环,为1则T0溢出,往下执行 // P1.0状态求反 //TF0标志清零仿真时,右键单击虚拟数字示波器,出现下拉菜单,点击“Digital oscilloscope”选项,就会在数字示波器上显示P1.0引脚输出周期为2ms方 波,如图7-17所示。39 图7-17 虚拟数字示波器显示的2ms的方波波形40 7.4.4 利用T1控制发出1kHz的音频信号【例7-4】利用T1的中断控制P1.7引脚输出频率为1kHz方波音频信号,驱 动蜂鸣器发声。系统时钟为12MHz。方波音频信号周期1ms,因此T1的定时中断时间为0.5 ms,进入中断服务程序后,对P1.7求反。电路见图7-18。 先计算T1初值,系统时钟为12MHz,则机器周期为1?s。1kHz音频信号周期为1ms,要定时计数的脉冲数为a。则T1初值:TH1=(65 536 ?a) /256; TL1=(65 536 ?a) %25641 图7-18控制蜂鸣器发出1kHz的音频信号42 参考程序如下:#include&reg51.h& sbit sound=P1^7; #define f1(a) (65536-a)/256 //包含头文件 //将sound位定义为P1.7脚 //定义装入定时器高8位时间常数#define f2(a) (65536-a)%256unsigned int i=500; unsigned int j=0; void main(void)//定义装入定时器低8位时间常数{EA=1; ET1=1; TMOD=0x10; TH1=f1(i); TL1=f2(i); TR1=1; while(1) //开总中断. //允许定时器T1中断 . //TMOD=B,使用T1的方式1定时 //给T1高8位赋初值. //给T1低8位赋初值. //启动T1 { i=460; while(j&2000); j=0; i=360; while(j&2000); j=0;//循环等待}} void T1(void) interrupt 3 using 0 { TR1= 0; sound=~ TH1=f1(i); TL1=f2(i); //定时器T1中断函数 //关闭T1 //P1.7输出求反 //T1的高8位重新赋初值. //T1的低8位重新赋初值.44 j++;TR1=1; } //启动定时器T17.4.5 LED数码管秒表的制作【例7-5】用2位数码管显示计时时间,最小计时单位为“百毫秒”,计时 范围0.1~9.9s。当第1次按一下计时功能键时,秒表开始计时并显示;第2次 按一下计时功能键时,停止计时,将计时的时间值送到数码管显示;如果计 时到9.9s,将重新开始从0计时;第3次按一下计时功能键,秒表清0。再次按 一下计时功能键,则重复上述计时过程。 本秒表应用定时器模式,计时范围0.1~9.9s。此外还涉及如何编写控制 LED数码管显示的程序。 原理电路见图7-19。45 图7-19 LED数码管显示的秒表原理电路及仿真46 参考程序如下:#include&reg51.h& unsigned char code discode1[]= {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //数码管显示0~9的段码表, 带小数点 unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //头文件//数码管显示0~9的段码表,不带小数点unsigned char timer=0;
unsigned char key=0; main() { TMOD=0x01; //定时器T0方式1定时 //timer记录中断次数 //second储存秒 //key记录按键次数 //主函数ET0=1;//允许定时器T0中断47 EA=1; second=0; P0=discode1[second/10]; P2=discode2[second%10]; while(1) {//总中断允许 //设初始值 //显示秒位0 //显示0.1s位0 //循环if((P3&0x80)==0x00){ key++; switch(key) { case 1: TH0=0//当按键被按下时//按键次数加1 //根据按键次数分三种情况 //第一次按下为启动秒表计时 //向TH0写入初值的高8位48 TL0=0x00; TR0=1; case 2: TR0=0; case 3: key=0; second=0; P0=discode1[second/10]; P2=discode2[second%10]; } while((P3&0x80)==0x00); }//向TL0写入初值的低8位,定时5ms //启动定时器T0//按下两次暂定秒表 //关闭定时器T0//按下3次秒表清0 //按键次数清 //秒表清0 //显示秒位0 //显示0.1s位0//如果按键时间过长在此循环49 }} void int_T0() interrupt 1 { TR0=0; TH0=0 TL0=0x00; //停止计时,执行以下操作(会带来计时误差) //向TH0写入初值的高8位 //向TL0写入初值的低8位,定时5ms using 0 //定时器T0中断函数timer++;if (timer==20) { timer=0; second++;//记录中断次数//中断20次,共计时20*5ms=100ms=0.1s //中断次数清0 //加0.1s //根据计时,即时显示秒位 //根据计时,即时显示0.1s位P0=discode1[second/10]; P2=discode2[second%10];}50 if(second==99) { TR0=0; second=0; key=2; } else { TR0=1; } }//当计时到9.9s时 //停止计时 //秒数清0 //按键数置2,当再次按下按键时, //key++,即key=3,秒表清0复原 //计时不到9.9s时 //启动定时器继续计时51 7.4.6 测量脉冲宽度―门控位GATEx的应用介绍门控位GATE应用。利用GATE测量INT1*脚上正脉冲宽度。 【例7-6】门控位GATE1可使T1启动计数受INT1*控制,当 GATE1=1,TR1=1时,只有INT1*引脚输入高电平时,T1才被允许计数。利用该 功能,可测量INT1*脚正脉冲宽度,方法见图7-20。 原理电路见图7-21,图中省略复位电路和时钟电路。利用门控位GATE1 来测量INT1*脚上正脉冲宽度,并在6位数码管上以机器周期数显示。对被测量 脉冲信号宽度,要求能通过旋转信号源旋钮可调。52 图7-20 利用GATE位测量正脉冲的宽度 图7-21 利用GATE位测量 INT1*引脚上正脉冲的宽度的原理电路54 参考程序如下:#include&reg51.h& #define uint unsigned int #define uchar unsigned char sbit P3_3=P3^3; uchar count_ uchar count_ //位变量定义 //定义计数变量,用来读取TH0 //定义计数变量,用来读取TL0uchar shiwan, wan, qian, bai, shi, uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管段码表 void delay(uint z) //延时函数55 {uint x,y; for(x=z;x&0;x--) for(y=110;y&0;y--);}void display(uint a,uint b,uint c,uint d,uint e,uint f) //数码管显示函数 {P2=0P0=table[f]; delay(2); P2=0 P0=table[e]; delay(2); P2=0 P0=table[d];56 delay(2);P2=0xf7; P0=table[c]; delay(2); P2=0 P0=table[b]; delay(2);P2=0P0=table[a]; delay(2); } void read_count() //读取计数寄存器的内容57 { do{ count_high=TH1; //读高字节 count_low=TL1; //读低字节 }while (count_high!=TH1); num=count_high*256+count_ /*可将两字节的机器周期数进行显示处理*/ } void main( ) { while(1) { flag=0; TMOD=0x90; //设置定时器T1为方式1定时58 TH1=0; TL1=0;//向定时器T1写入计数初值while(P3_3==1); //等待INT1*变低TR1=1;//如果INT1*为低,启动T1(未真正开始计数)while(P3_3==0); //等待INT1* 变高,变高后T1真正开始计数 while(P3_3==1); //等待INT1*变低,变低后T1停止计数 TR1=0; read_count(); shiwan=num/100000; wan=num%00; //读计数寄存器内容的函数qian=num%;bai=num%; shi=num%100/10;59 ge=num%10;while(flag!=100) { //减小刷新频率flag++;display(ge,shi,bai,qian,wan,shiwan); }}} 执行上述程序仿真,把INT1*引脚上出现的正脉冲宽度显示在LED数码管显示器上。晶振频率为12MHz,如果默认信号源输出频率为1kHz的方波,则数码管显示为500。 注意:在仿真时,偶尔显示501是因为信号源的问题,若将信号源换 成频率固定的激励源则不会出现此问题。60 7.4.7 LCD时钟的设计 【例7-7】使用定时器实现一个LCD显示时钟。采用LCD 1602,具体见第5 章的绍。LCD时钟的原理电路见图7-22。 最小计时单位是秒,如何获得1s的定时?可将T0定时时间定为50ms, 采用中断方式进行溢出次数累计,满20次,则秒计数变量second加1;若秒 计满60,则分计数变量minute加1,同时将秒计数变量second清0;若分钟 计满60,则小时计数变量hour加1;若小时计数变量满24,则将小时计数变 量hour清0。61 图7-22 LCD时钟的原理电路 先将定时器以及各计数变量设定完毕,然后调用时间显示子程序。秒计时由T0中断服务子程序来实现。 参考程序如下:#include&reg51.h&#include&lcd1602.h& #define uchar unsigned char #define uint unsigned int uchar int_ //定义中断次数计数变量 //秒计数变量63
uchar code date[]=& H.I.T. CHINA &;//分钟计数变量 //小时计数变量 //LCD第1行显示的内容uchar code time[]=& TIME 23:59:55 &;uchar second=55,minute=59,hour=23; void clock_init() { uchar i,j; for(i=0;i&16;i++) {//LCD第2行显示的内容write_data(date[i]);} write_com(0x80+0x40); for(j=0;j&16;j++) { write_data(time[j]); } } void clock_write( uint s, uint m, uint h) { write_sfm(0x47,h); write_sfm(0x4a,m); write_sfm(0x4d,s); } void main() { init1602(); //LCD初始化 clock_init(); //时钟初始化 TMOD=0x01; EA=1; ET0=1; TL0=()%256; TR0=1; int_time=0;//设置定时器T0为方式1定时 // 总中断开 // 允许T0中断TH0=()/256; //给T0装初值//中断次数、秒、分、时单元清0second=55;minute=59; hour=23; while(1){clock_write(second ,minute, hour); } } void T0_interserve(void) interrupt 1 using 1 //T0中断服务子程序 { int_time++; //中断次数加1 if(int_time==20) //若中断次数计满20次 { int_time=0; //中断次数变量清0 second++; //秒计数变量加 1 } if(second==60) //若计满60s { second=0; //秒计数变量清0 minute ++; //分计数变量加 1 } if(minute==60) { minute=0;//若计满60分 //分计数变量清0hour ++;} if(hour==24) { hour=0; }//小时计数变量加1//小时计数计满24,将小时计数变量清0TH0=()/256; //定时器T0重新赋值TL0=()%256;}执行上述程序仿真运行,就会在LCD上显示实时时间。 7.5 AT89S52新增定时器/计数器T2简介 AT89S52与AT89S51单片机相比,新增加了一个16位定时器/计数器T2 (可简写为T2)。 与T2相关的特殊功能寄存器共有2个:T2CON和T2MOD。 7.5.1 T2的特殊功能寄存器T2CON和T2MOD1. 特殊功能寄存器T2CONT2有3种工作方式:自动重装载(递增或递减计数)、捕捉和波特率发 生器,由特殊功能寄存器中的控制寄存器T2CON 中的相关位来进行选择。 T2CON的字节地址为C8H,可位寻址,位地址为C8H~CFH,格式见图723。 图7-23 TCON格式 T2CON寄存器各位的定义如下: TF2(D7):T2计数溢出中断请求标志位。当T2计数溢出时,由内部硬件置位TF2,向CPU发出中断请求。但是当RCLK位或TCLK位为1时将不予置位。本标志位必须由软件清0。 EXF2(D6):T2外部中断请求标志位。当由引脚T2EX上的负跳变引起“捕捉”或“自动重装载”且EXEN2位为1,则置位EXF2标志位,并向CPU发出中断请求。该标志位必须由软件清0。 RCLK(D5):串行口接收时钟标志位。当RCLK位为1时,串行通信端使用T2的溢出信号作为串行通信方式1和方式3的接收时钟;当RCLK位为0时,使用T1的溢出信号作为串行通信方式1和方式3的接收时钟。 TCLK(D4):串行发送时钟标志位。当TCLK位为1时,串行通信端使 用T2的溢出信号作为串行通信方式1和方式3的发送时钟;当TCLK位为0时, 串行通信端使用T1的溢出信号作为串行通信方式1和方式3的发送时钟; EXEN2(D3):T2外部采样允许标志位。当EXEN2位=1时,如果T2不是正工作在串行口的时钟,则在T2EX引脚(P1.1)上的负跳变将触发“捕捉”或“自动重装载”操作;当EXEN2位=0时,在T2EX引脚(P1.1)上的 负跳变对T2不起作用。TR2(D2):T2启动/停止控制位。当软件置位TR2时,即TR2=1,则启动T2开始计数,当软件清TR2位时,即TR2=0,则T2停止计数。 C/(D1):T2的计数或定时方式选择位,当设置C/=1时,为对外部事件 计数方式;C/=0时,为定时方式。 CP/RL2(D0):T2捕捉/自动重装载选择位。当设置CP/RL2=1时,如果 EXEN2为1,则在T2EX引脚(P1.1)上的负跳变将触发“捕捉”操作;当 设置CP/RL2=0时,如果EXEN2为1,则T2计数溢出或T2EX引脚上的负跳变 都将引起自动重装载操作;当RCLK位为1或TCLK位为1,CP/RL2标志位不 起作用。T2计数溢出时,将迫使T2进行自动重装载操作。 通过软件编程对T2CON 中的相关位进行设置来选择T2 的3种工作方式:16位自动重装载(递增或递减计数)、捕捉和波特率发生器,如表7-2所 示。 2. 特殊功能寄存器T2MOD与T2相关的另一个特殊功能寄存器为T2MOD。T2MOD寄存器的格式见 图7-24。T2MOD寄存器各位的定义如下:T2OE(D1):T2输出的启动位。 DCEN(D0):置位为1时允许T2增1/减1计数,并由T2EX引脚(P1.1)上的逻辑电平决定是增1还是减1计数。― :保留位。 当单片机复位时,DCEN为0,默认T2为增1计数方式;当把DCEN置1时,将由T2EX引脚(P1.1)上的逻辑电平决定T2是增1还是减1计数。图7-24 T2MOD的格式 7.5.2 T2的16位自动重装载方式 T2的16位自动重装载工作方式见图7-25。图中RCAP2L为陷阱寄存器低字节,字节地址为CAH;RCAP2H为陷阱寄存器高字节,字节地址为CBH。T2引脚为P1.0,T2EX引脚为P1.1,因 此当使用T2时,P1.0和P1.1就不能作I/O口用了。另外有两个中断请求,通过一个“或”门输出。因此当单片机响应中断后,在中断服务程序中应该用软件识别是哪一个中断请求,分别进行处理,该中断请求标志位必须用 软件清“0”。(1)当设置T2MOD寄存器的DCEN 位为0(或上电复位为0)时,T2为增1型自动重新装载方式,此时根据T2CON寄存器中的EXEN2位的状态, 可选择两种操作方式: 图7-25 T2的自动重装载方式的工作示意图 ① 当EXEN2标志位清0,T2计满溢出回0,一方面使中断请求标志位TF2 置1,同时又将陷阱寄存器RCAP2L、RCAP2H中预置的16位计数初值自动重装入计数器TL2、TH2中,自动进行下一轮的计数操作,其功能与T0、T1的方式2(自动装载)相同,只是本计数方式为16位,计数范 围大。RCAP2L、RCAP2H寄存器的计数初值由软件预置。 ② 当设置EXEN2标志位为1,T2仍具有上述①的功能,并增加了新的特性 。当外部输入引脚T2EX(P1.1)产生负跳变时,能触发三态门将 RCAP2L、RCAP2H陷阱寄存器中的计数初值自动装载到TH2和TL2中 ,重新开始计数,并置位EXF2为1,发出中断请求。 (2)当T2MOD寄存器的DCEN 位置为1时,可以使T2既可以增1计数,也 可实现减1计数,增1还是减1取决于T2EX引脚上的逻辑电平。图7-26为 T2增1/减1计数方式的结构示意图。 图7-26 T2的增1/减1计数的工作示意图 由图7-26可见,当设置DCEN 位为1时,可以使T2具有增1/减1计数功能。 当T2EX(P1.1)引脚为“1”时,T2执行增1计数功能。当不断加1计满溢 出回0时,一方面置位TF2为1,发出中断请求,另一方面,溢出信号触 发三态门,将存放在陷阱寄存器RCAP2L、RCAP2H中的计数初值自动 装载到TL2和TH2计数器中继续进行加1计数。 当T2EX(P1.1)引脚为“0”时,T2执行减1计数功能。当TL2和TH2计数 器中的值等于陷阱寄存器RCAP2L、RCAP2H中的值时,产生向下溢出 ,一方面置位TF2为1,发出中断请求,另一方面,下溢信号触发三态 门,将0FFFFH装入TL2和TH2计数器中,继续进行减1计数。 中断请求标志位TF2和EXF2位必须用软件清0。 【例7-8】利用T2实现1秒定时并控制P1.0引脚上的LED 1秒闪灭1次,晶 振频率为12MHz。编程思想:将T2设置为1/16秒的定时,定时中断16次,即为1秒,1秒时间到后,把P1.0的状态求反。 定时初值x计算:每秒中断16次,则每次溢出为=62500个机器 周期。 因此: 65536-x=62500, 初值x=3036=0BDCH。
说明:在中断函数中用到了静态变量“static uint i”。 静态变量的特点是语句执行后,其占用的的存储单元不释放,在下一次执行该语句时,该变量仍为上一次的值,它只需赋一次初值。也就是说,只有在第一次进中断 时“uint i=0”,才对i赋值,以后再进入中断时,不会再对i赋值。 7.5.3 T2的捕捉方式捕捉方式就是及时 “捕捉”住输入信号发生的跳变及有关信息。常用于 精确测量输入信号的变化如脉宽等等。捕捉方式的工作示意结构见图7-27。根据T2CON寄存器中EXEN2位的不同设置,“捕捉”方式有两种选择。(1)当EXEN2位=0时,T2是一个16位的定时器/计数器。当设置C/位为 1时,选择外部计数方式,即对T2引脚(P1.0)上的负跳变信号进行计数。计数器计满溢出时置1中断请求标志TF2,发出中断请求信号。CPU响应中断进入该中断服务程序后,必须用软件将标志位TF2清0。其他操作均与T0 和T1的工作方式1相同。(2)当EXEN2位=1时,T2除上述功能外,还可增加“捕捉”功能。当外部T2EX引脚(P1.1)上的信号发生负跳变,将选通三态门控制端(见图 7-27“捕捉”处),把计数器TH2和TL2中的当前计数值分别“捕捉”进RCAP2L和RCAP2H中,同时T2EX引脚(P1.1)上的信号负跳变将置位T2CON的的EXF2标志位,向CPU请求中断。 图7-27 T2的捕捉方式结构示意图 7.5.4 T2的波特率发生器方式及可编程时钟输出T2可工作于波特率发生器方式,还可作为可编程时钟输出。 1. 波特率发生器方式T2具有专用的“波特率发生器”(波特率发生器就是控制串行口接收/发送数字信号的时钟发生器)的工作方式。通过软件置位T2CON寄存器中的 RCLK和/或TCLK,可将T2设置为波特率发生器。需要注意的是,如果T2用 于波特率发生器和T1用于别的功能,则这个接收/发送波特率可能是不同的。 当置位RCLK和/或TCLK,T2进入波特率发生器模式,如图7-28所示。 由图7-28,当设置T2CON寄存器中的C/为0,设置RCLK和/或TCLK为1时, 输出16分频的接收/发送波特率。 图7-28T2作为串行通信波特率发生器示意图 另外通过对T2EX引脚(P1.1)跳变信号的检测,并置位EXF2中断请求标志位,向CPU请求中断。需要注意的是,图7-28中的主振频率fosc是经过 2分频,而不是12分频。T2工作在波特率发生器方式,属于16位自动重装载的定时模式。串行通信方式1和方式3(见第8章的介绍)的波特率计算公式为: 串行通信方式1和方式3的波特率 = 定时器T2的溢出率/16 T2的波特率发生器可选择定时模式或计数模式,一般都选择定时模式。 注意,在选择定时器使用时,是主振频率fosc经12分频为一个机器周期作为 加1计数信号,而作为波特率发生器使用时是以每个时钟状态S(2分频主振 频率)作为加1计数信号。因此串行通信方式1和方式3的波特率计算公式为: 方式1和方式3的波特率(b/s)=(fosc/32)×[65536-(RCAP2H RCAP2L)] (7-1) 式(7-1)中“RCAP2H RCAP2L”为T2的初值。例如“RCAP2HRCAP2L”初值为FFFFH,则=1,则式(7-1)的波特率 =(fosc/32)b/s。设主振频率fosc=12MHz, 则上述波特率=375kb/s。从式(7-1)可见,采用T2用作波特率发生器,其波特率设置范围极广。 从图7-28可见,当T2用作波特率发生器时,具有以下特点:① 必须设置T2CON寄存器中的RCLK和/或TCLK为1(有效);② 计数器溢出再装载,但不会置位TF2向CPU请求中断; ③ 如果T2EX引脚上发生负跳变将置位EXF2为1,向CPU请求中断处理,但不会将陷阱寄存器“RCAP2H RCAP2L”中预置的计数初值装入TH2和TL2中。因此,可将T2EX引脚用作额外的输入引脚或外部中断源; ④ 采用定时模式作波特率发生器时,是对fosc经2分频(时钟状态S)作为计数单位,而不是fosc经12分频的机器周期信号。 ⑤ 波特率设置范围广,精确度高。另外要注意的是,T2在波特率工作方式下作为定时器模式时(TR2为 1),不能对TH2、TL2进行读写。这时的T2是以每个时钟状态(S)进行加1计数,这时进行读写可能出错。对陷阱寄存器RCAP2可以读,但不能写,因为写RCAP2可能会覆盖重装的数据并使装入出错。处理T2或RCAP2寄存器 前不能关闭T2(即清0 TR2位)。2. 可编程时钟信号输出T2可通过软件编程在P1.0引脚输出时钟信号。P1.0除用作通用I/O引脚 外还有两个功能可供选用:用于T2的外部计数输入和频率为61Hz~4MHz的 时钟信号输出。图7-29为时钟输出和外部事件计数方式示意图。 图7-29 T2时钟输出和外部事件计数方式示意图 通过软件对T2CON.1位C/复位为0,对T2MOD.1位T2OE置1就可将T2选定为时钟信号发生器,而T2CON.2位TR2控制时钟信号输出开始或结束 (TR2为启动/停止控制位)。由主振频率fosc和T2定时、自动重装载方式的计数初值决定时钟信号的输出频率,其设置公式如下:时钟信号输出频率=(12×106)/[4×(65536-(RCAP2H RCAP2L)] (7-2) 从式(7-2)可见,在主振频率(fosc)设定后,时钟信号输出频率就取 决于计数初值。 在时钟输出模式下,计数器溢出回0不会产生中断请求。这种功能相当 于T2用作波特率发生器,同时又可用作时钟发生器。但必须注意,无论如何 波特率发生器和时钟发生器都不能单独确定各自不同的频率。原因是两者都用同一个陷阱寄存器RCAP2H、RCAP2L,不可能出现两个计数初值。
课题 名称 内容 分析 教学 目标 及要 求 重点 及措 施 难点 及措 施 教学 方式 第七章 第一节定时器/计数器的应用 计划 学时 2 课时 知识点:定时/计数...第6章 定时器与计数器作业 - 第6章 1. MCS-51 的定时器/计数器 如果晶振的频率为3MHz,定时器/计数器工作在方式0、1、2下,其最大的定时时间各 为多少?...?7 设系统时钟频率为 6MHz,请试用定时器 T0 作外部计数器,编程实现每计到 ...第11章 可编程定时器计数...
2页 5下载券 定时器计数器的定时实验 暂无评价...信息工程学院实验报告课程名称:单片机原理及接口 成 实验项目名称:实验 7 计数器/定时器 班级: 姓名: 实验时间: 指导教师(签名) : 学号: 绩: 实验...七、思考题 1. 8253 初始化编程时需要遵循的原则是什么? (1)对计数器设置...第6章单片微机的定时器计... 暂无评价 92页 免费
微机原理 第11章 可...第7章一、填空 思考题及习题 7 参考答案 1.如果采用晶振的频率为 3MHz,定时器/计数器 Tx(x=0,1)工作在方式 0、1、2 下,其方 式 0 的最大定时时间为...0章​节​(​M​C​S​-1​单​片​机...1、单片机内部定时器/计数器共有( ) 种工作方式。 A、1 B、3 C、4 2、...(7)IT1;外部中断 1 触发方式选择位。 (8)IT0:外部中断 0 触发方式选择位...第6章 定时器计数器 暂无评价 60页 2下载券
6. 定时器计数器_V1 暂无...7. MCS-51 单片机中断系统选用外部中断 1 和定时器/计数器 T1 中断为高优先...第6章 定时器计数器习题 暂无评价 41页 免费
第6章89C51的定时器与计.....定时器 计数器实验_电子/电路_工程科技_专业资料。实验全过程记录实验 名称 姓名 同实验者 ? 时间 定时器 /计数器实验地点 学号 学号 班班组组 实验目的: 学习...
All rights reserved Powered by
www.tceic.com
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 单片机定时器中断 的文章

 

随机推荐