51单片机 定时器

51单片机定时器

对定时器 计数模式和计时模式的理解:

计时模式是指定时器向定时时间进行倒计时并在定时时间到达后触发中断或者产生输出信号。在计时模式下,定时器的工作方式类似于一个计时器,可以用来进行定时任务。常见的应用场景包括脉冲计数、延时控制等。

计数模式是指定时器对外部信号进行计数并在计数到一定数值后触发中断或者产生输出信号。在计数模式下,定时器的工作方式类似于一个计数器,可以用来计数外部事件的数量。常见的应用场景包括测量脉冲数、计数器、频率计等。

说白了就是一个是计时  一个计数

不太理解也没关系,这里主要用计时模式多一些

 

硬件清0就是单片机自动清零,硬件清零指的是通过特定的硬件电路将某个寄存器或者状态清零

就比如在外部中断中是硬件清零

但在定时器中如果不使用中断一般用软件清零:软件清零是指通过编写程序的方式,对特定寄存器或变量进行清零操作。

if(TF0 == 1)//判断是否溢出   通过程序查询

{

TF0 = 0;//软件清零溢出标志位

定时器工作模式的配置

 

所以说在配置的时候,不管TMOD.7还是TMOD.3都是直接置0,再由TR1和TR0来控制定时器的开关,因为如果TMOD.7和TMOD.3置1的话,还需要对INT0和INT1进行配置,INT0和INT1看起来眼熟吧,是不是外部中断的标志位

 

再看那什么是可位寻,什么是不可位寻的那:

可位寻(bit-addressable)指的是可以单独访问到一个数据的每一位,即可以像访问一个单独的变量一样访问一个字节中的任意一位。在51单片机中,有些特殊功能寄存器(如P0、P1、P2、P3等)可以进行可位寻的操作,也就是可以直接读写一个特定引脚的状态。

不可位寻(not bit-addressable)指的是不能单独访问到一个数据的每一位,而是需要将整个字节读出或写入。在51单片机中,一些寄存器(如定时器控制寄存器)只能进行不可位寻的操作,需要通过读取或写入整个寄存器来对其进行操作。

这是笼统的说法;

在我看来就是,以上面的TCON寄存器为例,它是可位寻的,就是可以直接写TF0=1,TR0=1,

TF1=1,TR1=1,就是可以直接对某位直接进行置0或置1

再看TMOD寄存器 ,不可位寻,就不能直接进行置0或置1,也就是不能直接写成TMOD.7=0,TMOD.3=0,M0=0,M1=0,需要按16进制来对TMOD寄存器进行配置,需要写成TMOD=0x__;的形式。

定时器配置步骤:

  1. 启动定时器0或定时器1   由于说过后面的TMOD.7和TMOD.3是配置成0的,所以这里直接 TR1=1或TR0=1 就直接打开定时器了
  2. 配置定时器0或定时器1 的工作模式,大多数都是用计时模式,和16位定时器所以我就以这种模式举例,比如配置定时器0为16位定时器计时模式

 

即TMOD =0x01;

 

 

如果是定时器1的话,就是TMOD=0x10;

  1. 由于是16位定时器,所以需要配置,低8位TL0和高8位TH0,来确定定时时间

机械周期为1.085微秒,先把定时时间由毫秒化为微秒,除以1.085得到需要计数多少次才到规定时间,初值为65535—计数次数得到初值,得到得初值可以用电脑计算器,化为16进制。

就以50ms为例,50000/1.085=46082,65535-46082=19453,这里19453就是初值,化为16进制0x4bfd,所以TH0=0x4b,TL0=0xfd;

 

由于16位计数,所以计时完成后要重放初值

 

void timer0Init()  //定时器0的初始化

{

TR0 = 1;  //启动定时器0

TMOD = 0X01; //定时器工作模式1,16位定时器计数模式

TH0 = 0x4b;

TL0 = 0xfd; //定时50ms

}

下面再来看定时器中断:

只需要再把中断打开即可,计时模式下每次计时到就产生中断

 

EA = 1; //打开总中断

ET0 = 1;//打开定时器0中断

TR0 = 1;  //启动定时器0

TMOD = 0X01; //定时器工作模式1,16位定时模式

TH0 = 0xED;

TL0 = 0xFF; //定时5ms

搞懂定时器后这后面得定时器中断就比较好理解了

就是到5ms到了就产生中断,这里就是硬件清零,自动检测

 

一样的这里要注意关键字和对应的入口号

每次都要重新放初值

在使用8位单片机定时器功能设置一个周期为50毫秒的定时器时,通常涉及以下几个步骤: 1. **初始化定时器**: 确定你需要计数脉冲的频率,如单片机内部晶振频率的一半(若晶体管工作于模式下),然后根据这个频率计算出50ms对应的有效计数值。比如,如果晶振频率为1MHz,那么每秒钟有1,000,000个时钟周期,半个周期就是500,000。 2. **选择定时器模式**: 根据你的单片机型号,选择适合的定时器模式。有些8位定时器可以设置工作模式,例如C语言里的TCCRnA寄存器配置。 3. **设定计数初值**: 如果是向上计数模式,你可能需要将定时器计数器清零,并设置一个初始值使其达到大约50%的总周期。如果是向下计数模式,则可能需要设置一个溢出次数。 4. **设定中断或查询机制**: 定时器到达预设值时,如果没有外部中断需求,可以选择通过查询比较寄存器来检查是否溢出;如果有中断需求,需要配置定时器溢出中断。 5. **启动定时器**: 启动定时器开始计数。 具体的代码会依赖于所使用的单片机及其库函数,例如在Arduino中可能是这样的: ```c++ // 假设我们有一个8位定时器T1 OCR1AH = (50 * F_CPU) / 2; // OCR1AH设置高8位,OCR1AL设置低8位 OCR1AL = (OCR1AH << 8) & 0xFF; TIMSK1 |= (1 << OCIE1A); // 开启OCIE1A中断 TCCR1B |= (1 << CS11) | (1 << CS10); // 设置分频器,这里可能需要调整CS11和CS10的组合 sei(); // 开启全局中断 TCCR1A |= (1 << WGM11); // 设定为CCT(模式1)并开启计数 // 中断服务函数(ISR) ISR(TIMER1_COMPA_vect) { // 当OCR1A溢出时,执行这里的代码,表示50ms已过 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值