新鲜出炉(51单片机定时器的四种工作方式51单片机定时器设计思路)关于51单片机“定时器”的理解与应用

admin 2023-10-26 13:45:09 浏览量:0
问题描述:
最佳经验

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

博主福利: 电子设计资料包(免费下载)​mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8

在 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 口这样,程序的执行效率会更高

资讯来源:http://www.xxyiy.cn/news/show-263.html

sdfsdf
举报收藏 0打赏 0评论 0