首页 > 编程知识 正文

51单片机定时器怎么设置时间(定时器有几个51单片机)

时间:2023-05-06 14:27:44 阅读:91430 作者:4880

51单片机有两个16位可编程的计时器/计数器:计时器T0和计时器T1。 有计时器功能和计数功能,通过设定相关的特殊功能寄存器,可以选择启用哪个功能。 计时器系统是单片机内部的独立硬件部分,通过内部几条控制线连接在CPU与晶体振子之间并相互作用。 CPU启动计时器功能后,计时器会通过石英振动自动计时,如果计时器计数器满了,就会发生中断,通知CPU接下来要做什么。

或者计数器实质上是加上计数器(16比特),其输入脉冲有两个源,一个是将从系统时钟振荡器输出的脉冲进行十二分频后发送过来。 另外,输入T0或T1端子的外部脉冲源,1个脉冲计数器加1,计数器加1,则在输入1个脉冲时可以使计数器归零。 计数器的溢出在TCON寄存器中设置TF0或TF1,向CPU发出中断请求,如果定时或计数器在定时模式下动作,则表示定时时间已到,如果是计数,则表示计数值已满(高位8位和低位8位2个

TMOD :决定计时器/计数器模式控制寄存器(timer/countermodecontrolregister )、动作方式和功能

TCON :控制寄存器,控制T0、T1的启动停止和溢出标志的设定。

计时器/计数器模式控制寄存器TMOD是按位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 其格式为,其中的后4位定义计时器/计数器C/T0,前4位定义计时器/计数器C/T1,各位的说明:

GATE——车门控制。

GATE=1时,从外部中断端子INT0、INT1启动计时器T0、T1。 INT0端子为高电平时,TR0被设置,启动计时器T0; INT1端子为高电平时,TR1被设定,计时器T1启动。 GATE=0时,只通过TR0、TR1组分别启动计时器T0、T1。

C/T——功能选择位

C/T=0时为计时器功能,C/T=1时为计数功能。 设置时选择计数功能,清除时选择计时器功能。

M0、M1——方式选择功能

因为有两位数,所以有四种工作方法:

M1M0动作模式计数器模式TMOD (计时器模式的设定) ) ) ) ) ) ) ) ) ) ) ) )。

方式0 13位计数器TMOD=0x00

0方式1 16位计数器TMOD=0x01

1方式2自动重新加载8位计数器TMOD=0x02

方式3 T0分为两个8位独立计数器,T1为无中断重载8位计数器TMOD=0x03单片机定时器0为动作方式1设为TMOD=0x01

TCON:定时器/计数器控制寄存器(timer/counter控制寄存器) )。

TMOD分为2段,TCON控制更精细,分为4段,本文使用到高4段。 TF0(TF1 ) ——对溢出标志的位进行计数,在计数器溢出的情况下,其位置为1。

tr0(tr1 ) ——定时器运行控制位tr0(tr1 )=0停止定时器/计数器动作tr0 ) tr1 )=1启动定时器/计数器动作

ie0(ie1 ) ——外部中断请求标志位

it0(it1 ) ——外部中断请求信号方式控制位为it0 ) it1 )=1脉冲方式(后端负跳有效)

it0(it1 )=0电平方式;启用行电平)时,该位被软件设置为1或0。

TF0(TF1 ) ——计数溢出标志

如果计数器发生计数溢出,则该位由硬件设置为1。 中断服务时,硬件会自动清除为0。 计数超出的标志位的使用分为采用中断方式、作为中断请求标志位使用和采用中断方式两种。 采用查询方式时,作为查询的状态位使用。 只要注意记忆方法,理解单词的原形,就绝对不会把TF和TR混淆。 TF的f是溢出溢出的f。 TR的r是执行运行。 默认值为0,不执行。 当然请设为1之后再执行

在编写单片机定时器程序时,需要在程序开始运行时对定时器和中断寄存器进行初始化,通常的初始化过程如下。

给TMOD赋值,以确定T0和T1的工作方式

计算初始值,将初始值写入TH0、TL0或TH1、TL1;

中断方式时,给IE分配值,释放中断

设置TR0或TR1,开始计时器/计数器的定时或计数。

实现//led灯的1秒闪烁

void主() )

{

TMOD=0x01; //将计时器0设为动作模式m1m0为01 )。

th0=(65536-45872 )/256; //初始值11.0582水晶振动时间50ms数为45872

TL0=(65536-45872 ) 6;

EA=1; //总中断

ET0=1; //接通定时器0中断

TR0=1; //开始计时器0

wile(1; //程序在此停止,等待发生中断

}

voidt 0时间(中断1

{

TMOD=0x01; //重新加载初始值

th0=(65536-45872 )/256;

数字; //num每加1次判断是否达到20次

到了if(num==20 )//20次,就是1秒钟就到了

{

num=0; //num清0重新计数

led=~led1;

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。