单片机原理及接口技术(C51编程)第7章定时器计数器课件.ppt

上传人:小飞机 文档编号:1321655 上传时间:2022-11-09 格式:PPT 页数:91 大小:1.46MB
返回 下载 相关 举报
单片机原理及接口技术(C51编程)第7章定时器计数器课件.ppt_第1页
第1页 / 共91页
单片机原理及接口技术(C51编程)第7章定时器计数器课件.ppt_第2页
第2页 / 共91页
单片机原理及接口技术(C51编程)第7章定时器计数器课件.ppt_第3页
第3页 / 共91页
单片机原理及接口技术(C51编程)第7章定时器计数器课件.ppt_第4页
第4页 / 共91页
单片机原理及接口技术(C51编程)第7章定时器计数器课件.ppt_第5页
第5页 / 共91页
点击查看更多>>
资源描述

《单片机原理及接口技术(C51编程)第7章定时器计数器课件.ppt》由会员分享,可在线阅读,更多相关《单片机原理及接口技术(C51编程)第7章定时器计数器课件.ppt(91页珍藏版)》请在三一办公上搜索。

1、第7章 定时器/计数器的工 作原理及应用,1,第7章 定时器/计数器的,7.1 定时器/计数器的结构 AT89S51定时器/计数器结构见图7-1,定时器/计数器T0由特殊功能寄存器TH0、TL0构成,T1由特殊功能寄存器TH1、TL1构成。,2,图7-1 定时器/计数器结构框图,7.1 定时器/计数器的结构2图7-1 定时器/计数器,T0、T1都有定时器和计数器两种工作模式,两种模式实质都是对脉冲信号进行计数,只不过计数信号来源不同。 计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数(见图7-1); 定时器模式是对系统时钟信号经12分频后的内部脉冲信号(机器周期

2、)计数。由于系统时钟频率是定值,可根据计数值计算出定时时间。两个定时器/计数器属于增1计数器,即每计一个脉冲,计数器增1。 T0、T1具有4种工作方式(方式0、1、2和3)。,T0、T1都有定时器和计数器两种工作模式,两种模,单片机原理及接口技术(C51编程)第7章-定时器计数器课件,单片机原理及接口技术(C51编程)第7章-定时器计数器课件,GATE=1,定时器是否计数,由外中断引脚INTx* 上的电平与运行控制位TRx共同控制。(2)M1、M0工作方式选择位 M1、M0 4种编码,对应于4种工作方式的选择,见表7-1。表7-1M1、M0工作方式选择,6,GATE=1,定时器是否计数,由外中

3、断引脚INT,(3)C/T* 计数器模式和定时器模式选择位 C/T*=0,定时器模式,对系统时钟12分频后的脉冲进行计数。 C/T*=1,计数器模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。7.1.2 定时器/计数器控制寄存器TCON TCON字节地址88H,位地址为88H8FH。格式见图7-3。,7,图7-3 TCON格式,(3)C/T* 计数器模式和定时器模式选择位7图7-3,第6章已介绍与外中断有关的低4位。这里仅介绍高4位功能。(1)TF1、TF0计数溢出标志位 当计数器计数溢出时,该位置“1”。使用查询方式时,此位可供CPU查询,但应注意查询后

4、,用软件及时将该位清“0”。使用中断方式时,作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。(2)TR1、TR0计数运行控制位 TR1位(或TR0)=1,启动计数器计数的必要条件。 TR1位(或TR0)=0,停止计数器计数。该位可由软件置“1”或清“0”。7.2 定时器/计数器的4种工作方式 4种工作方式,分别介绍如下。,8,第6章已介绍与外中断有关的低4位。这里仅介绍高4位功能。8,7.2.1 方式0 当M1、M0=00,设置为方式0,定时器/计数器等效逻辑结构见图7-4(以T1为例,TMOD.5、TMOD.4=00)。,9,图7-4 定时器/计数器方式0的逻辑结构框图,7.2.1

5、 方式09图7-4 定时器/计数器方式0的逻辑,方式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一个条件,还是取

6、决于TRx和INTx*引脚状态两个条件。,10,方式0为13位计数器,由TLx(x=0,1),(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、M

7、0=01时,工作于方式1,等效电路逻辑结构见图7-5。,(1) GATE=0时,A点(见图7-4)电位恒为1,B点电,12,图7-5 方式1的逻辑结构框图,方式1和方式0差别仅仅在于计数器的位数不同,方式1为16位计数器,由THx高8位和TLx低8位构成(x=0,1),方式0则为13位计数器,有关控制状态位含义(GATE、C/T* 、TFx、TRx)与方式0相同。,12图7-5 方式1的逻辑结构框图方式1和方式0差,7.2.3 方式2 方式0和方式1最大特点是计数溢出后,计数器为全0。因此在循环定时或循环计数应用时就存在用指令反复装入计数初值的问题,这会影响定时精度,方式2就是为解决此问题而设

8、置的。 当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.2.3 方式213,14,图7-6 方式2逻辑结构框图,14图7-6 方式2逻辑结构框图,15,图7-7 方式2工作过程,方式2可省去用户软件中重装初值的指令执行时间,简化定时初值的计算方法,可相当精确地定时。,15图7-7 方式2工作过程方式2

9、可省去用户软件中重装初值,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

10、,7.2.4 方式316,2T0工作在方式3时T1的各种工作方式 一般情况下,当T1用作串口波特率发生器时,T0才工作在方式3。T0方式3时,T1可为方式0、1、2,作为串口波特率发生器,或不需要中断的场合。,17,2T0工作在方式3时T1的各种工作方式17,图7-8 T0方式3的逻辑结构框图,图7-8 T0方式3的逻辑结构框图,(1)T1工作在方式0 T1的控制字中M1、M0=00时,T1工作在方式0,工作示意图如图7-9所示。(2)T1工作在方式1 当T1的控制字中M1、M0=01时,T1工作在方式1,工作示意见图7-10。,19,图7-9 T0方式3时T1为方式0工作示意图,(1)T1工

11、作在方式019图7-9 T0方式3时T1为,(3)T1工作在方式2 当T1控制字中M1、M0=10时,T1为方式2,工作示意如图7-11所示。,20,图7-10 T0方式3时T1为方式1工作示意图,图7-11 T0方式3时T1为方式2工作示意图,20图7-10 T0方式3时T1为方式1工作示意图,(4)T1设置在方式3 T0方式3时,再把T1也设置成方式3,此时T1停止计数。7.3 对外部输入的计数信号的要求 计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数值增1。每个机器周期S5P2期间,都对外部输入引脚T0或T1进行采样。如在第1个机器周期中采得值为1,而在下

12、一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率1/24。,21,(4)T1设置在方式321,如选用6MHz晶体,允许输入脉冲频率最高为250kHz。如选用12MHz频率晶体,则可输入最高频率500kHz外部脉冲。对外输入信号占空比没有限制,但为确保某一给定电平在变化前能被采样1次,则该电平至少保持1个机器周期。故对外部输入信号要求见图7-12,图中Tcy为机器周期。,图7-12 对外部计数输入信号的要求,如选用6MHz晶体,允许输入脉冲频率最高为250k,2

13、3,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闪亮一次。,237.4 定时器/计数器的编程和应用,24,图7-13 方式1定时中断控制LED闪亮,24图7-13 方式1定时中断控制LED闪亮,(1)设置TMOD寄存器 T0

14、工作在方式1,应使TMOD寄存器的M1、M0=01;应设置C/T*=0,为定时器模式;对T0的运行控制仅由TR0来控制,应使相应的GATE位为0。定时器T1不使用,各相关位均设为0。所以,TMOD寄存器应初始化为0 x01。(2)计算定时器T0的计数初值 设定时时间5ms(即5000s),设T0计数初值为X,假设晶振的频率为11.0592MHz,则定时时间为:,25,(1)设置TMOD寄存器25,定时时间=(216X)12/晶振频率 则 5000=(216X) 12/11.0592 得 X = 60928 转换成十六进制:0 xee00,其中0 xee装入TH0,0 x00装入TL0。(3)设

15、置IE寄存器 本例由于采用定时器T0中断,因此需将IE寄存器中的EA、ET0位置1。,定时时间=(216X)12/晶振频率,(4)启动和停止定时器T0 将定时器控制寄存器TCON中的TR0=1,则启动定时器T0;TR0=0,则停止定时器T0定时。参考程序:#includechar i=100;void main ()TMOD=0 x01;/定时器T0为方式1TH0=0 xee;/设置定时器初值TL0=0 x00;,27,(4)启动和停止定时器T027,P1=0 x00;/P1口8个LED点亮EA=1;/总中断开ET0=1;/开T0中断TR0=1;/启动T0while(1);/循环等待;void

16、 timer0() interrupt 1/T0中断程序TH0=0 xee;/重新赋初值TL0=0 x00;,P1=0 x00;/P1口8个LED点亮,i-;/循环次数减1if(i=0)P1=P1;/P1口按位取反i=100;/重置循环次数7.4.2 计数器的应用【例7-2】如图7-14,T1采用计数模式,方式1中断,计数输入引脚T1(P3.5)上外接按钮开关,作为计数信号输入。按4次按钮开关后,P1口的8只LED闪烁不停。(1)设置TMOD寄存器,29,i-;/循环次数减129,T1工作在方式1,应使TMOD的M1、M0=01;设置C/T*=1,为计数器模式;对T0运行控制仅由TR0来控制,

17、应使GATE0=0。定时器T0不使用,各相关位均设为0。所以,TMOD寄存器应初始化为0 x50。(2)计算定时器T1的计数初值由于每按1次按钮开关,计数1次,按4次后,P1口的8只LED闪烁不停。因此计数器初值为655364=65532,将其转换成十六进制后为0 xfffc,所以,TH0=0 xff,TL0=0 xfc。,30,T1工作在方式1,应使TMOD的M1、M0=01;设置C/T,图7-14 由外部计数输入信号控制LED的闪烁,图7-14 由外部计数输入信号控制LED的闪烁,(3)设置IE寄存器 本例由于采用T1中断,因此需将IE寄存器的EA、ET1位置1。(4)启动和停止定时器T1

18、 将寄存器TCON中TR1=1,则启动T1计数;TR1=0,则停止T1计数。参考程序如下: #include void Delay(unsigned int i)/定义延时函数Delay( ),i是形 /式参数,不能赋初值,(3)设置IE寄存器,unsigned int j;for(;i0;i-)/变量i由实际参数传入一个值/因此i不能赋初值for(j=0;j125;j+);/空函数 void main( )/主函数 TMOD=0 x50;/设置定时器T1为方式1计数TH1=0 xff;/向TH1写入初值的高8位TL1=0 xfc;/向TL1写入初值的低8位EA=1; /总中断允许,33,33

19、,34,ET1=1; /定时器T1中断允许 TR1=1; /启动定时器T1 while(1) ; /无穷循环,等待计数中断 void T1_int(void) interrupt 3 /T1中断函数for(;)/无限循环 P1=0 xff;/8位LED全灭 Delay(500) ;/延时500ms P1=0;/8位LED全亮 Delay(500); /延时500ms ,34ET1=1; /定时器T1中断允许,35,7.4.3 控制P1.0产生周期为2ms的方波 【例7-3】假设系统时钟为12MHz,设计电路并编写程序实现从P1.0引脚上输出一个周期为2ms的方波,见图7-15。 要在P1.0上

20、产生周期为2ms的方波,定时器应产生1ms的定时中断,定时时间到则在中断服务程序中对P1.0求反。使用定时器T0,方式1定时中断,GATE不起作用。 本例的原理电路见图7-16。其中在P1.0引脚接有虚拟示波器,用来观察产生的周期2ms的方波。,357.4.3 控制P1.0产生周期为2ms的方波,图7-15 定时器控制P1.0输出一个周期2ms方波,图7-15 定时器控制P1.0输出一个周期2ms方波,37,图7-16 定时器控制P1.0输出周期2ms的方波的原理电路,37图7-16 定时器控制P1.0输出周期2ms的方波的原,38,下面来计算T0初值X :设T0的初值为X,有 (216X )

21、1106=1103即 65536X=1000 得X=64 536,化为16进制数就是0 xfc18。将高8位0 xfc装入TH0,低8位0 x18装入TL0。参考程序如下:#include /头文件reg51.hsbit P1_0=P10;/定义特殊功能寄存器P1的位变量P1_0void main(void)/主程序TMOD=0 x01;/设置T0为方式1TR0=1;/接通T0while(1)/无限循环,38下面来计算T0初值X :,39,TH0=0 xfc;/置T0高8位初值TL0=0 x18;/置T0低8位初值dowhile(!TF0); /TF0为0原地循环,为1则T0溢出,往下执行P1

22、_0=!P1_0;/ P1.0状态求反TF0=0;/TF0标志清零仿真时,右键单击虚拟数字示波器,出现下拉菜单,点击“Digital oscilloscope”选项,就会在数字示波器上显示P1.0引脚输出周期为2ms方波,如图7-17所示。,39TH0=0 xfc;/置T0高8位初值,40,图7-17 虚拟数字示波器显示的2ms的方波波形,40图7-17 虚拟数字示波器显示的2ms的方波波形,7.4.4 利用T1控制发出1kHz的音频信号 【例7-4】利用T1的中断控制P1.7引脚输出频率为1kHz方波音频信号,驱动蜂鸣器发声。系统时钟为12MHz。方波音频信号周期1ms,因此T1的定时中断时

23、间为0.5 ms,进入中断服务程序后,对P1.7求反。电路见图7-18。 先计算T1初值,系统时钟为12MHz,则机器周期为1s。1kHz音频信号周期为1ms,要定时计数的脉冲数为a。则T1初值: TH1=(65536a)/256; TL1=(65536a)%256,41,7.4.4 利用T1控制发出1kHz的音频信号41,42,图7-18 控制蜂鸣器发出1kHz的音频信号,42图7-18 控制蜂鸣器发出1kHz的音频信号,参考程序如下:#include /包含头文件sbit sound=P17; /将sound位定义为P1.7脚#define f1(a) (65536-a)/256/定义装入

24、定时器高8位时间常数#define f2(a) (65536-a)%256 /定义装入定时器低8位时间常数unsigned int i=500; unsigned int j=0; void main(void) EA=1; /开总中断. ET1=1; /允许定时器T1中断 . TMOD=0 x10; /TMOD=0001 000B,使用T1的方式1定时 TH1=f1(i); /给T1高8位赋初值. TL1=f2(i); /给T1低8位赋初值. TR1=1; /启动T1 while(1),参考程序如下:,44, /循环等待 i=460; while(j2000); j=0; i=360; wh

25、ile(j2000); j=0; void T1(void) interrupt 3 using 0/定时器T1中断函数 TR1= 0; /关闭T1 sound=sound; /P1.7输出求反 TH1=f1(i); /T1的高8位重新赋初值. TL1=f2(i); /T1的低8位重新赋初值.,44 /循环等待,45,j+; TR1=1; /启动定时器T17.4.5 LED数码管秒表的制作 【例7-5】用2位数码管显示计时时间,最小计时单位为“百毫秒”,计时范围0.19.9s。当第1次按一下计时功能键时,秒表开始计时并显示;第2次按一下计时功能键时,停止计时,将计时的时间值送到数码管显示;如果

26、计时到9.9s,将重新开始从0计时;第3次按一下计时功能键,秒表清0。再次按一下计时功能键,则重复上述计时过程。 本秒表应用定时器模式,计时范围0.19.9s。此外还涉及如何编写控制LED数码管显示的程序。 原理电路见图7-19。,45j+;,46,图7-19 LED数码管显示的秒表原理电路及仿真,46图7-19 LED数码管显示的秒表原理电路及仿真,47,参考程序如下:#include /头文件unsigned char code discode1= 0 xbf,0 x86,0 xdb,0 xcf,0 xe6,0 xed,0 xfd,0 x87,0 xff,0 xef; /数码管显示09的段

27、码表, 带小数点unsigned char code discode2=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f; /数码管显示09的段码表,不带小数点unsigned char timer=0;/timer记录中断次数unsigned char second; /second储存秒unsigned char key=0;/key记录按键次数main()/主函数 TMOD=0 x01;/定时器T0方式1定时 ET0=1; /允许定时器T0中断,47参考程序如下:,48,EA=1; /总中断允许second=0; /设

28、初始值P0=discode1second/10; /显示秒位0P2=discode2second%10; /显示0.1s位0while(1) /循环if(P3 /向TH0写入初值的高8位,48EA=1; /,49,TL0=0 x00; /向TL0写入初值的低8位,定时5msTR0=1; /启动定时器T0break;case 2: /按下两次暂定秒表TR0=0; /关闭定时器T0break;case 3: /按下3次秒表清0key=0; /按键次数清second=0; /秒表清0P0=discode1second/10; /显示秒位0 P2=discode2second%10; /显示0.1s位

29、0break;while(P3 /如果按键时间过长在此循环,49TL0=0 x00; /向TL0写入初值的低8,void int_T0() interrupt 1 using 0 /定时器T0中断函数TR0=0; /停止计时,执行以下操作(会带来计时误差)TH0=0 xee; /向TH0写入初值的高8位TL0=0 x00; /向TL0写入初值的低8位,定时5mstimer+; /记录中断次数if (timer=20) /中断20次,共计时20*5ms=100ms=0.1stimer=0; /中断次数清0second+; /加0.1sP0=discode1second/10; /根据计时,即时显

30、示秒位P2=discode2second%10; /根据计时,即时显示0.1s位 ,50,50,51,if(second=99) /当计时到9.9s时TR0=0;/停止计时second=0;/秒数清0key=2; /按键数置2,当再次按下按键时,/key+,即key=3,秒表清0复原 else/计时不到9.9s时TR0=1;/启动定时器继续计时,51if(second=99) /当计时到9.9s,7.4.6 测量脉冲宽度门控位GATEx的应用 介绍门控位GATE应用。利用GATE测量INT1*脚上正脉冲宽度。 【例7-6】门控位GATE1可使T1启动计数受INT1*控制,当GATE1=1,TR

31、1=1时,只有INT1*引脚输入高电平时,T1才被允许计数。利用该功能,可测量INT1*脚正脉冲宽度,方法见图7-20。 原理电路见图7-21,图中省略复位电路和时钟电路。利用门控位GATE1来测量INT1*脚上正脉冲宽度,并在6位数码管上以机器周期数显示。对被测量脉冲信号宽度,要求能通过旋转信号源旋钮可调。,52,7.4.6 测量脉冲宽度门控位GATEx的应用52,图7-20 利用GATE位测量正脉冲的宽度,图7-20 利用GATE位测量正脉冲的宽度,54,图7-21 利用GATE位测量 INT1*引脚上正脉冲的宽度的原理电路,54图7-21 利用GATE位测量 INT1*引脚上正脉冲,参考

32、程序如下:#include#define uint unsigned int#define uchar unsigned charsbit P3_3=P33;/位变量定义uchar count_high; /定义计数变量,用来读取TH0uchar count_low;/定义计数变量,用来读取TL0uint num;uchar shiwan, wan, qian, bai, shi, ge;uchar flag;uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f; /共阴极数码管段码表void

33、delay(uint z)/延时函数,55,参考程序如下:55,uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void display(uint a,uint b,uint c,uint d,uint e,uint f) /数码管显示函数P2=0 xfe; P0=tablef;delay(2);P2=0 xfd;P0=tablee;delay(2);P2=0 xfb;P0=tabled;,56,56,delay(2);P2=0 xf7;P0=tablec;delay(2);P2=0 xef;P0=tableb;delay(2);P2=0 xdf;P0=tabl

34、ea;delay(2);void read_count() /读取计数寄存器的内容,57,delay(2);57,58,do count_high=TH1; /读高字节 count_low=TL1;/读低字节 while (count_high!=TH1);num=count_high*256+count_low; /*可将两字节的机器周期数进行显示处理*/void main( )while(1)flag=0; TMOD=0 x90;/设置定时器T1为方式1定时,58,TH1=0;/向定时器T1写入计数初值 TL1=0;while(P3_3=1); /等待INT1*变低TR1=1;/如果INT

35、1*为低,启动T1(未真正开始计数)while(P3_3=0); /等待INT1* 变高,变高后T1真正开始计数while(P3_3=1); /等待INT1*变低,变低后T1停止计数TR1=0;read_count(); /读计数寄存器内容的函数shiwan=num/100000;wan=num%100000/10000;qian=num%10000/1000;bai=num%1000/100;shi=num%100/10;,59,TH1=0;/向定时器T1写入计数初值59,ge=num%10;while(flag!=100) /减小刷新频率flag+;display(ge,shi,bai,q

36、ian,wan,shiwan); 执行上述程序仿真,把INT1*引脚上出现的正脉冲宽度显示在LED数码管显示器上。晶振频率为12MHz,如果默认信号源输出频率为1kHz的方波,则数码管显示为500。 注意:在仿真时,偶尔显示501是因为信号源的问题,若将信号源换成频率固定的激励源则不会出现此问题。,60,ge=num%10;60,61,7.4.7 LCD时钟的设计 【例7-7】使用定时器实现一个LCD显示时钟。采用LCD 1602,具体见第5章的绍。LCD时钟的原理电路见图7-22。 最小计时单位是秒,如何获得1s的定时?可将T0定时时间定为50ms,采用中断方式进行溢出次数累计,满20次,则

37、秒计数变量second加1;若秒计满60,则分计数变量minute加1,同时将秒计数变量second清0;若分钟计满60,则小时计数变量hour加1;若小时计数变量满24,则将小时计数变量hour清0。,617.4.7 LCD时钟的设计,图7-22 LCD时钟的原理电路,图7-22 LCD时钟的原理电路,先将定时器以及各计数变量设定完毕,然后调用时间显示子程序。秒计时由T0中断服务子程序来实现。参考程序如下:#include#include#define uchar unsigned char#define uint unsigned intuchar int_time;/定义中断次数计数变量

38、uchar second;/秒计数变量,63,先将定时器以及各计数变量设定完毕,然后调用时间显示子程序。秒,uchar minute;/分钟计数变量uchar hour;/小时计数变量uchar code date= H.I.T. CHINA ;/LCD第1行显示的内容uchar code time= TIME 23:59:55 ;/LCD第2行显示的内容uchar second=55,minute=59,hour=23;void clock_init()uchar i,j;for(i=0;i16;i+)write_data(datei);write_com(0 x80+0 x40);,uch

39、ar minute;/分钟计数变量,for(j=0;j16;j+)write_data(timej);void clock_write( uint s, uint m, uint h)write_sfm(0 x47,h);write_sfm(0 x4a,m);write_sfm(0 x4d,s);void main()init1602();/LCD初始化clock_init();/时钟初始化,for(j=0;j16;j+),TMOD=0 x01; /设置定时器T0为方式1定时EA=1; / 总中断开 ET0=1; / 允许T0中断 TH0=(65536-46483)/256;/给T0装初值TL

40、0=(65536-46483)%256;TR0=1;int_time=0;/中断次数、秒、分、时单元清0second=55;minute=59;hour=23;while(1)clock_write(second ,minute, hour);,TMOD=0 x01; /设置定时器T0为方式1定时,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

41、=60)/若计满60s second=0; /秒计数变量清0 minute +;/分计数变量加 1 ,void T0_interserve(void) int,if(minute=60)/若计满60分 minute=0;/分计数变量清0hour +;/小时计数变量加1if(hour=24) hour=0;/小时计数计满24,将小时计数变量清0TH0=(65536-46083)/256;/定时器T0重新赋值TL0=(65536-46083)%256;执行上述程序仿真运行,就会在LCD上显示实时时间。,if(minute=60)/若计满60分,7.5 AT89S52新增定时器/计数器T2简介 AT

42、89S52与AT89S51单片机相比,新增加了一个16位定时器/计数器T2(可简写为T2)。 与T2相关的特殊功能寄存器共有2个:T2CON和T2MOD。7.5.1 T2的特殊功能寄存器T2CON和T2MOD1. 特殊功能寄存器T2CON T2有3种工作方式:自动重装载(递增或递减计数)、捕捉和波特率发生器,由特殊功能寄存器中的控制寄存器T2CON 中的相关位来进行选择。T2CON的字节地址为C8H,可位寻址,位地址为C8HCFH,格式见图7-23。,7.5 AT89S52新增定时器/计数器T2简介,图7-23 TCON格式,图7-23 TCON格式,T2CON寄存器各位的定义如下:TF2(D

43、7):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):串行发送时钟标志位。当TCL

44、K位为1时,串行通信端使用T2的溢出信号作为串行通信方式1和方式3的发送时钟;当TCLK位为0时,串行通信端使用T1的溢出信号作为串行通信方式1和方式3的发送时钟;,T2CON寄存器各位的定义如下:,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

45、):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进行自动重装载操作。,EXEN2(D3):T2外部采样允许标志位。当EXEN2位=,通过软件编程对T2CON 中的相关位进行设置来选择T2 的3种工作方式

46、:16位自动重装载(递增或递减计数)、捕捉和波特率发生器,如表7-2所示。,通过软件编程对T2CON 中的相关位进行设置来选择T2 的3,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计数。,

47、图7-24 T2MOD的格式,2. 特殊功能寄存器T2MOD图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(或上

48、电复位为0)时,T2为增1型自动重新装载方式,此时根据T2CON寄存器中的EXEN2位的状态,可选择两种操作方式:,7.5.2 T2的16位自动重装载方式,图7-25 T2的自动重装载方式的工作示意图,图7-25 T2的自动重装载方式的工作示意图, 当EXEN2标志位清0,T2计满溢出回0,一方面使中断请求标志位TF2置1,同时又将陷阱寄存器RCAP2L、RCAP2H中预置的16位计数初值自动重装入计数器TL2、TH2中,自动进行下一轮的计数操作,其功能与T0、T1的方式2(自动装载)相同,只是本计数方式为16位,计数范围大。RCAP2L、RCAP2H寄存器的计数初值由软件预置。 当设置EXE

49、N2标志位为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计数方式的结构示意图。, 当EXEN2标志位清0,T2计满溢出回0,一方面使中断请,图7-26 T2的增1/减1计数的工作示意图,图7-26 T2的增1/减1计数的工作示意图,由图7-26可见,当

50、设置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计数。中断请

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号