历史上的今天
返回首页

历史上的今天

今天是:2025年12月12日(星期五)

正在发生

2022年12月12日 | 关于51单片机“定时器”的理解与应用

2022-12-12 来源:zhihu

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


推荐阅读

史海拾趣

FTDI公司的发展小趣事

FTDI公司(Future Technology Devices International)在电子行业中的发展充满了多个关键节点和故事,以下是五个相关故事,每个故事均基于事实描述:

1. 创立与早期发展

FTDI公司成立于1992年3月13日,由弗雷德·达特(Fred Dart)创立。起初,公司专注于为个人电脑市场提供服务,其首发产品是针对主板芯片组的解决方案。这些产品被成功应用于IBM的AMBRA和PS/2系列个人电脑上,为当时的计算机技术发展做出了贡献。这一时期的成功为FTDI奠定了坚实的基础,并展示了其在芯片设计领域的初步实力。

2. USB桥接芯片领域的崛起

随着计算机技术的快速发展,FTDI敏锐地捕捉到了USB接口技术的潜力。公司开始专注于USB桥接芯片的研发与生产,并逐渐在这一领域崭露头角。其MM232R和USB-COM232-PLUS1等接口产品因其出色的连接性和兼容性而广受好评。FTDI的USB桥接芯片广泛应用于汽车电子、IOT互联网、工业产品、医疗设备、新能源以及高端消费电子等多个领域,逐步确立了其在全球USB桥接芯片市场的领先地位。

3. 全球化布局与业务拓展

为了进一步扩大市场份额,FTDI积极实施全球化战略。公司在新加坡设立了业务运营总部,并在全球范围内建立了完善的销售和服务网络。这一布局不仅提升了FTDI在全球市场的竞争力,还为其带来了更多的商业机会。同时,FTDI不断拓展产品线,满足不同领域客户的需求,进一步巩固了其在USB桥接芯片领域的市场地位。

4. 并购与合作

在发展过程中,FTDI也通过并购与合作的方式不断壮大自身实力。例如,在2022年,FTDI被电连技术通过发行股份及支付现金的方式收购,成为电连技术的控股子公司。这次并购不仅为FTDI带来了更多的资金和资源支持,还为其未来的发展注入了新的动力。同时,FTDI也与其他行业巨头建立了广泛的合作关系,共同推动电子行业的发展。

5. 技术创新与市场引领

FTDI始终将技术创新作为公司发展的核心驱动力。公司不断投入研发资源,推出具有自主知识产权的新产品和技术解决方案。这些创新成果不仅提升了FTDI的产品竞争力,还为其在全球市场树立了良好的品牌形象。同时,FTDI还积极参与行业标准的制定和推广工作,致力于推动整个电子行业的技术进步和发展。

以上五个故事展示了FTDI公司在电子行业中的发展历程和关键节点。从创立初期的默默无闻到如今的全球领先企业,FTDI凭借其敏锐的市场洞察力、强大的技术实力和不懈的创新精神,在电子行业中书写了属于自己的辉煌篇章。

Advanced Thermal Products Inc公司的发展小趣事

ATP公司深知品质是企业生存和发展的基石。因此,他们建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司注重品牌建设,通过广告宣传、参加展会等方式提升品牌知名度和美誉度。这些举措使得ATP公司在市场上逐渐树立了良好的品牌形象。

厦门法拉(faratronic)公司的发展小趣事

FMI公司始终坚持以客户为中心的发展理念,致力于为客户提供定制化的频率控制解决方案。公司拥有一支专业的研发团队和完善的生产流程,能够根据客户的具体需求进行产品设计和生产。无论是标准产品还是定制产品,FMI都能确保高质量和快速交付。这种灵活的服务模式使得FMI在客户中树立了良好的口碑,并为公司赢得了更多的商业合作机会。

Ethertronics公司的发展小趣事

FMI公司成立于1971年,作为标准通信公司的受控供应商,公司自成立之初便专注于为通信市场提供快速交货和严格公差的石英晶体及晶体振荡器。在成立初期,FMI面临着市场竞争激烈和技术挑战的双重压力,但公司凭借其卓越的产品质量和快速响应客户需求的能力,逐渐在行业中站稳脚跟。通过不断的技术创新和产品优化,FMI逐渐扩大了其市场份额,为后续的快速发展奠定了坚实基础。

广芯电子(BROADCHIP)公司的发展小趣事

FMI公司始终坚持以客户为中心的发展理念,致力于为客户提供定制化的频率控制解决方案。公司拥有一支专业的研发团队和完善的生产流程,能够根据客户的具体需求进行产品设计和生产。无论是标准产品还是定制产品,FMI都能确保高质量和快速交付。这种灵活的服务模式使得FMI在客户中树立了良好的口碑,并为公司赢得了更多的商业合作机会。

Echelon公司的发展小趣事

进入21世纪后,Echelon在智能楼宇领域取得了重大突破。公司凭借其先进的LonWorks技术和能源管理服务方案,成功为多个大型楼宇提供了智能化的能源管理解决方案。这些解决方案不仅提高了楼宇的能源利用效率,还降低了运行成本,赢得了客户的广泛赞誉。Echelon在智能楼宇领域的成功,进一步巩固了其在能源管理市场的领先地位。

问答坊 | AI 解惑

TFT液晶显示原理

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 [;)][ip]TFT液晶显示原理TFT型的液晶显示器较为复杂,主要的构成包括了,萤光管、导光板、偏光板、滤光板、玻璃基板、配向膜、液晶材料、薄模式晶体管等等。首先液晶显示器必须先利用背光源, ...…

查看全部问答>

=[分享]-FSC仙童小信号二三极管选用手册=

仙童小信号二三极管选用手册,不错的东东,有需要的来下哦。…

查看全部问答>

现在新出了一种单片机来替代AT89C51,它们最大的区别在哪?

现在单片机让人眼花缭乱的,究竟哪种性价比较好?…

查看全部问答>

未来中国安防市场IP产品的增长成为热点

IMSResearch最近发布了一份名为《中国安防产业IP趋势》的研究,目的是希望了解IP相关技术如何在安防领域应用以及发展前景等问题。该研究针对中国本土提供电子物理安防产品的系统集成商和工程商,根据他们对IP安防产品的经验,对市场进行了分析。这 ...…

查看全部问答>

malloc频繁申请大内存会导致异常吗

我在程序中 { ...... malloc 400K字节的缓冲区   ...... free ~ } 请问如果频繁的反复以上操作会导致异常或者死机吗 我的程序 疯狂进行30次会出现异常  不知道是不是这个原因引起的…

查看全部问答>

200分求助 有用过SQLCE的吗? 会的请进.

我就是想用VS2005做一个小程序 在PDA上运行. 能用RDA方式操作SQL2000里的表就行. 原来用SQLite库了.但是中文乱码 那里我处理不好.所以,改回用SQLCE. 请用过的朋友教一下. 分没问题. 可以另开帖.... 我的QQ:49440483…

查看全部问答>

别扭的1640

这两天,板子焊好了,一点一点在翻阅此前做的各种笔记,想起当时没太仔细考虑 充电程式的问题。   于是开始想MAX1640充电程式的设置问题。   做一个高质量点的 锂电池充电器 自然希望能实现典型的三段式充电程式CCCV。 然而,在这方 ...…

查看全部问答>

请教版主关于VBAT后备电池的问题。急

现象描述 1、板子焊接好后安装上电池3v(纽扣电池),非充电的。 2、用万用表量量电池电压 3v没问题,但VBAT端电压则只有1点多v 3、将目标板上电(没有下载任何程序),再断电,则VBAT端电压正常。 4、试验我n多板子,结论同上。 5、不安 ...…

查看全部问答>

怎么测量大的交流信号微小的幅值变化

目前做一谐振电路,通过调节电感,来改变信号幅值,但现在想把这个幅值测出来,不知道哪位大虾能帮忙下!…

查看全部问答>