单片机定时器的配置方法,你们会了吗
定时器有什么用呢 ,我们又在什么时候会用到定时器,想知道这些我们一定要了解清楚定时器有什么用才行;其实不难理解,定时就是我设定一个计数值,以一个固定的频率从零开始计数,当计数到我们设定的计数值,那么单片机就会给出一个标志位提示定时时间到了,这时就可以拿这个标志位来控制单片机的IO口引脚输出高电平或低电平从而控制你想控制的电器了!
一款单片机定时器做的电子时钟
拿单片机定时器0来举例子;
CKCON |= 1<<3;//定时器0的时钟选择为系统时钟
定时器0时钟选择
TMOD &= ~(1<<3);//无论INT0的逻辑为何,当TR0为1时,开始计数
TMOD &= ~(1<<2);//定时器0随内部系统时钟而递增
TMOD &= ~(3<<0);//模式1: 16位定时器/计数器
TMOD |= 1<<0;
TMOD寄存器配置
TH0 = (65536-16000)/256;//x=1/16000000=0.0000625ms*16000=1ms
TL0 = (65536-16000)%256;
TR0 = 1;//打开定时器0
EA = 1;//打开总中断
ET0 = 1;//使能定时器0中断
void IinterruptTim0(void) interrupt 1
{
TH0 = (65536-16000)/256;//x=1/16000000=0.0000625ms*16000=1ms
TL0 = (65536-16000)%256;
}
以上代码就是配置定时器0以1ms进入一次中断的配置方法。
备注:想学习更多内容,可点击下方链接-> ,如果文章内容对你有帮助,多帮转发收藏并关注哦,相信以后会出更好的文章内容和视频教程,一起学电子。谢谢!单片机怎么做定时器矩阵,彻底解决各种定时问题?
大家好,我是无际。
定时功能非常常用,可以说是刚需,也可以说是很多人的痛点。
做LED闪烁效果要用定时、按键扫描要定时、数码管扫描要定时、滤波要定时等等。
曾经,我在产品开发的时候也被各种定时需求搞得焦头烂额。
还好,后面我自己写了一个定时器的程序架构,今天一步到位,,彻底解决各种定时的问题 。
最近无际单片机编程有几个学员在学习的时候搞不懂这个。
我借此写了这篇文章,然后基于这个文章内容来给学员们直播讲解。
一、为什么我要搞定时器矩阵
定时器矩阵这个概念是我自创的,简单来说就是很多不同定时时间的软件定时器组合。
因为产品开发这么多年,总有乱七八糟的精准定时需求,有50us的,有1ms的,有10ms的,有50ms的,有100ms的等等。
如果没有一个很好的程序架构的话,不同的精准定时需求一多,代码就会很混乱,而且也不好管理,移植性和可扩展性那些就更不用提了。
二、解决需求的思路
然后我就在想,我能不能设计一个定时器的程序架构,让它能够适应所有的精准定时需求。
我的思维雏形大概是这样的。
图左边是定时器时间源, 类似于我们的时钟源,一般我是用单片机定时器中断做个50us的定时,因为用定时器做时间比较精准。
为什么要用50us?因为我产品的RFD波形定时采集频率是50us采一次。
如果你产品没定时这么频繁的功能需求,你完全可以把定时时间源配置成10ms,甚至100ms,这个是根据不同的产品去调整的。
图右边的就是定时器矩阵, 就是各种乱七八糟的不同定时需求组合,比如LED特效定时功能的定时需求、RFD波形定时采集、RFD重复码滤波延时等等。
最终这些定时器矩阵都有一个时间单位/基准,这个时间单位/基准是由定时器时间源提供,如果我配置定时器中断是50us,那定时器矩阵的时间单位就是50us。
有了这种想法以后,剩下的就是考验你的经验和代码水平了。
三、代码设计思路
一个工程师工作越久,做过的项目越多,就要慢慢形成一个面向对象的思维 。
虽然上面雏形出来了,但是我相信很多人依然不知道怎么动手去写代码。
这个是正常的,最好的方法就是先抄后超 。
我是用面向对象的思维去做的 ,对于c语言来说,结构体是实现面向对象最好的方式 。
这里的对象不是你的男女朋友,而是世间万物皆可以当做一个对象。
比如说人是一个对象,这个对象有很多属性 ,比如说性别、年龄、身高、体重等等。
Ok,那在程序里,如何把这个对象的特征用结构体展现出来呢?
可以通过下面这个代码:
那回到我们定时器矩阵这里,我们把定时器矩阵当做一个对象 。
那这个定时器矩阵都需要具备哪些共同的特征 ?
我总结了下面几个:
需要有个变量当做开关标志控制该定时器启动/停止 需要有个变量当做当前的定时值 需要有个变量当做该定时器的定时周期。 定时时间到了以后,需要去执行相应动作,为了灵活使用,需要一个函数指针。那用结构体来表示代码如下:
这里很多人可能有点懵逼,我怎么想不到要这些东西呢?
这个是正常的,不用去纠结,我也不是一开始就把这几个成员都想到的,而是后面做功能的时候慢慢完善的,你刚开始抄我的思维就行了。
后面很多应用都是用这种套路去做的,比如说我们的任务管理、比如菜单这些,用多了自然就熟了,以后你自己也能设计别的对象了。
Ok,这样我们就把定时器矩阵这个对象的特征设计好了。
四、定时器代码实战
1.前面我们用结构体自定义了一个定时器的对象来,下面就要用这个定时器对象”生”出定时器矩阵。
我们直接用定义结构体数组的方式,T_SUM就是我们定时器矩阵的个数,也就是我产品有多少个定时器需求。
后面我们所有的操作都是围绕这个结构体来进行的。
2.配置定时器矩阵时间源,初始化定时器矩阵参数
A). 我们首先要给这个定时器矩阵一个时间源,也就是配置我们要去配置单片机定时器中断。
我们的定时频率配置的是50us,是因为我们产品有的功能最短需要50us的定时。
然后,我们需要写一个初始化函数,去调用这个定时器配置,以及初始化定时器矩阵参数。
B). 然后在这个50us定时器中断函数里,去实现给定时器矩阵定时代码。
这里,我单独写了一个函数。
然后我们在定时器中断函数里调用这个函数,实现给定时器矩阵定时。
3.附加功能
定时器矩阵时间源配置好了,但是我们还需要一些函数来操作定时器矩阵对吧?
A). 编写创建定时器
我希望定时器能像任务一样,想要的时候创建,所以就有了创建定时器函数。
我们创建定时器的时候这样调用就可以了。
B). 复位定时器
如果说我们需要循环定时的话,在定时时间到了以后就需要复位定时器,让定时器重新启动。
除了以上以外,其他功能可以自己去完善,比如说控制定时器状态、删除定时器、获取定时器时间,这里就不一一举例了。
完整的代码和视频教程,大家可以找无际单片机编程来拿。
有了这个定时器程序架构,以后开发产品再也不怕有各种定时需求啦,使用方便,移植性也强,如果加个动态分配,就更完美了。
相关问答
单片机定时器 预置数的方法?T1H=(65536-55536)/256T1L=(65536-55536)MOD256---------------------应该是“TH1”和“TL1”。他们两个,共同存放一个16位的二进制数...
51 单片机 MCS-51,如果采用的晶振的频率为3MHz, 定时器 /计数器...[最佳回答]方式0:2^13/3M*12=0.032768s;方式1:2^16/3M*12=0.262144s;方式2:2^8/3M*12=0.001024s;方式0:2^13...
51 单片机 中 定时器 的四种工作方式的各自定时范围?工作方式013位计数模式最大范围0-8191工作方式116位计数模式最大范围0-65535工作方式28位自动重装计数模式0-255工作模式3(只有T0)TL0和TH0将被分割...
51 单片机 中 定时器 计数器使用方法?先说下定时器使用方法:定时器使用方法:设置工作模式(设置特殊功能寄存器TMOD)设置计数寄存器处置设置TCON,通过TR0置1使计时器开始计数判断TCON寄存器T...
如何使用51 单片机 的 定时器 写一个精确延时1ms的延时子函数。 ...给你一个例子#includevoidInitTimer0(void){TMOD=0x01;TH0=0x0FC;TL0=0x18;EA=1;ET0=1;TR0=1...
51 单片机 用C语言或者汇编程序如何实现定时1秒?如何设定初始值?如何计算?如何输出方波?如何对外部?使用定时器实现1秒定时;初始值要看单片机配置的晶振频率了,若12M晶振,初始值为TH0=0x3c;TL0=0xb0;这才是50ms,还要一个单元做计数器,计数20次才是1秒方波...
利用51 单片机 的 定时器 1(t1)产生一个500hz的方波?t=1/ft=2ms周期为2ms利用定时器每1ms进入一次中断,中断中将p1,1输出状态改变就可以输出500hz的方波t=1/ft=2ms周期为2ms利用定时器每1ms进入一次中断,中断...
【设振荡频率为12MHz,如果用定时/计数器T0产生周期为100ms的...[回答]查询方式和中断方式都可以实现!解释如下:由于振荡频率为12MHz,如果按常规标准的12分频的51系列单片机算的话,一个机器周期就是1uS.定时器/计数器数...
单片机 定时/计数器和中断到底有什么用?定时器用来计算时间,固定时间触发中断。计数器用来对引脚输入的信号下降沿进行计数。和中断相关,但不一定要开中断。可以单独用。定时器用来计算时间,固定...
51 单片机 如何用 定时器 写呼吸灯?使用定时器来实现呼吸灯效果是一种常见的方法。以下是在51单片机上使用定时器编写呼吸灯程序的基本步骤:配置定时器:选择一个可用的定时器(如定时器0或定时器...