关于51单片机“定时器”的理解与应用

发布时间:2022-12-12  

在 cpu 的一步步按照指令运行的过程中(主程序),可能会有其它的更紧急的需要做的事情(中断服务程序), 需要 cpu 暂时停止当前的程序(主程序),做完了(中断服务程序)之后,又可以继续去运行先前的程序(主程序)。


就像你正在吃饭,一边又在给水桶里放水,吃着吃着,水满了,你就得赶快去把水龙头关掉或者换一个空的水桶,再回来吃饭。


单片机的定时器就像是一个水桶

你让它启动了,也就是水龙头打开放水

定时器在每个机器周期自动加 1

水桶的水不断增加,最后就满出来了

定时器溢出时,你就要去做处理了

水桶的水满了,你应该处理一下了

处理完后,单片机又回到刚停止地方继续运行

水桶处理完,你也可以去做原来的事了


单片机的主程序是从 0x0000 开始运行的,

单片机服务程序从哪里开始运行呢?

在 51里,有多个中断服务程序入口,

0号入口是外中断 0,地址在 0x0003;

1号入口是定时器 0,地址在 0x000B;

2号入口是外中断 1,地址在 0x0013,

3号入口是定时器 2,地址在 0x001B。


当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程序,运行完之后,又跳回到原来的位置继续运行。

在 C51 中,你不用理会中断服务程序放在哪里,会怎么跳转。你只要把某个函数标识为几号中断服务函数就可以了。在发生了对应的中断时,就会自动的运行这个函数。

我们将学习如何精确定时 1 秒钟闪灯。这里我们使用 T2 定时器,让它工作在 16bit 自动装载方式,这时,有另一个位置专门装着 16 位预装载值, T2 溢出时,预装载值立即被置入。这就保证了精确定时。

但是,即使是 16 位定时器,最长的溢出时间也就几十毫秒,要定时一秒,就需要一个变量来保存溢出的次数,积累到了多少次之后,才执行一次操作。这样就可以累加到 1 秒或者更长的时间才做一次操作了。T2 定时器有个特殊的地方,它进入中断后,需要自己清除溢出标记,而 51 的其他定时器是自动清除的。请参考 51 单片机相关书籍。


如果使用 T2 定时器实现 1 秒精确定时?


仿真器的晶振是 22118400 Hz,

每秒钟可以执行 1843200 个机器周期。

T2 每次溢出最多 65536 个机器周期。

我们尽量应该让溢出中断的次数最少,

这样对主程序的干扰也就最小。

选择每秒中断24次

每次溢出1843200/24=76800个周期

(超出 65536,无效)

选择每秒中断30次

每次溢出1843200/30=61440个周期

选择每秒中断32次

每次溢出1843200/32=57600个周期

选择每秒中断36次

每次溢出1843200/36=51200个周期

选择每秒中断40次

每次溢出1843200/40=46080个周期


从上面可以看到我们可以选择方式有很多,

但是最佳的是每秒中断 30 次,

每次溢出 61440 个机器周期。

也就是赋定时器T2初值

65536-61440=4096

换成十六进制就是 0x1000


从上面的计算也可以看出晶振 2118400Hz 的好处,它可以整除的倍数多,要准确定时非常方便。更常见的应用是在串口波特率上,使用 22118400HZ 可以输出最多准确的标准波特率。



我们在定时器服务函数里,设置了一个静态变量t,静态变量的值在进入函数时是不会被初始化的,而是保持上次的值。它用来计数定时器的溢出次数,也就是 T2 中断函数进入的次数,每溢出 30 次,就控制一次 LED 的反转显示。这时的时间就正好是 1 秒,而且是精确的 1 秒!只与晶振的精度有关。

一个编程经验是,

所有的中断都要尽快的运行和退出,

中断服务程序越短越好,

这样才不至于干扰主程序的工作,

以及其他中断的运行

也就是,我们应该尽量把程序代码从中断服务函数里搬出来。对于定时器的中断的工作方式,我们可以建立一个全局的标记,在中断里置这个标记,然后就退出。在主程序里检查到这个标记之后,就运行相关的程序。


对于 CPU 任务比较多的项目来说,这种工作方式可以获得最佳的工作效率。当然,对于非常实时的应用要求,比如时钟,还是建议在中断里做完,因为使用标记的方式时,主程序可能太忙而造成错过标记信号,就是这个标记还没有开始处理呢,下一个又来了。熟练的程序员还是可以避开这些异常的情况的。


在我们的这个例程中,前面的 1 秒钟输出信号,被换成了一个全局标记。在主程序中去检查这个标记,再清 0 标记和处理相应的工作。这一课的跑马灯输出方式也改变了,我们采用查表的方式,将要点亮的灯预先设置好,到了时间,就一起送到 P1 口。这样,程序的执行效率会更高。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    ++;   } 80C51单片机定时器工作方式  定时/计数器用于外部中断扩展   扩展方法是,将定时/计数器设置为计数器方式,计数初值设定为满程,将待扩展的外部中断源接到定时/计数器的外部计数引脚。从该......
    结构及实现原理 51定时器/计数器内部结构 上图中的 T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚。51 单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD 是定时/计数器的工作方式......
    ”。 IT0:外部中断源0触发方式控制位。此位为1设置为底电平触发,为0设置为下降沿触发。 51单片机定时器4种工作模式 工作模式0: 由TL0的低5位和TH0的全部8位共同构成一个13位的定时器/计数......
    ,在定时器模式0中,计时器的高8位初值是不可改变的,因此不适合需要更灵活的计时范围的应用场景。   定时器模式1是51单片机定时器的一种工作模式,也被称为16位定时器模式。在这种模式下,定时器......
    51单片机定时器中断基础;一、中断概念 中断是为使单片机具有对外部或者内部随机发生的事件实时处理而设置的。 把自己想象成单片机的CPU,你正在洗衣服,但是突然快递小哥给你打电话让你去拿快递,于是......
    /758372.html 6.STC89C52RC单片机定时器示例代码2:   问:在中断函数里为什么要重新赋初值呢?TH0 = XX,TL0 =XX? 因为进入中断,其值减为0,如果不重装初值......
    是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。 2.2.2定时器装入初值的问题。 装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值......
    数运算会占用大量的机器周期,应在中断外完成运算。 2.2.2定时器装入初值的问题。 装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器......
    是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。2.2.2定时器装入初值的问题。 装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值......
    STC89C52RC定时器的应用基本实例;51单片机的定时/计数器是一种可编程部件。它的工作方式、计数初值以及启停操作均应在定时/计数器工作前进行初始化,即向相应的寄存器写入相应的控制字。 标准......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>