搜索
查看: 1324|回复: 0

[分享] 单片机计数器工作原理及讲解

[复制链接]

132

主题

160

帖子

683

积分

高级会员

Rank: 4

积分
683
发表于 2022-10-28 14:14:23 | 显示全部楼层 |阅读模式
常用的单片机中大多数都配备了计数器,随着科技水平的提升,人们对于计数产品的功能需求越来越高,计数器也经过不断的更新升级,现如今已经可以达到精准计数的程度了。计数器给人们工作计数工作带来了很大的便利,大大提高了工作效率,今天这篇文章就为大家讲解一下 单片机计数器的工作原理。
图片 1.png
单片机定时器
一、单片机计数器定义
计数是一种简单的基本运算,单片机计数器就是通过单片机实现这种运算的逻辑电路,计数器在数字系统中主要是针对脉冲的个数进行计数,可以实现测量、计数和控制等功能,同时兼有分频功能。计数器用来计数并指示在任意间隔内输入信号(事件)的个数,用来指示经历的时间计数器可以用来显示产品的工作状态,一般来说主要是用来表示产品已经完成了多少份的折页配页工作。它主要的指标在于计数器的位数,常见的有3位和4位的。
二、单片机计数器的结构极工作原理
1、单片机计数器结构图
在上图中,我们设有两个可编程的16位的定时/计数器:T0和T1,它们既可以用于定时,也可以用来对外部脉冲计数。
定时功能:对机器周期进行加1计数即机器周期X计数值。
计数功能:对外部事件产生的脉冲进行加1计数。
从结构图中,可以看出T0与T1分别由高8位和低8位两个特殊功能寄存器组成,即T0由TH0和TL0组成,T1由TH1和TL1组成。定时/计数器的控制是通过两个特殊功能寄存器来实现的,其中,TMOD是定时/计数器的工作方式寄存器.由它确定定时/计数器的工作方式和功能,TCON是定时/计数器的控制寄存器,用于管理T0和T1的启停,溢出和中断。
现在再次梳理一下:定时器依赖计数器达到我们所需的定时,定时满了溢出之后不停止就有了循环模式。有没有发现一个问题,如果任着闹钟自行运作的话,就只能每间隔12小时响一次,如果想6小时响一次怎么办呢?两种办法,一个是让闹钟一圈就转6个小时,不过也太麻烦了,还有就是响铃之后马上调成12点,不过也需要一直等着闹铃响。
        当然了上述的情况基本上是用不到的,我们还有更灵活的单片机定时器,单片机的定时器同样是依托计数器实现的,闹钟数60秒变0从1开始,计数器数到65536变0从1开始,至于为什么是这么大,16位二进制最大就是这么大,2^16,就好像为什么只有2、4、8、16、32和64位的处理器一样,同样的数到65536的时候溢出变成0,触发更新中断,这时候你定时的时间就到了,不关闭它它就一直这么重复定时,又双叒叕触发中断。
        计数器不让它计到那么大不就行了嘛,是的,计数器作为寄存器它允许你修改,可以让它计数到32768就变成0然后从1重新开始,这时候你定时的时间就是之前的一半了,同样它将重复的一次次产生中断告诉你你定时的时间到了。
        不过细想一下,计数器本来不就是一直在变的嘛,那红红火火恍恍惚惚中修改的貌似不是计数器值,而是限制计数器的值吧,是的,这玩意叫预装值,它限制了计数器所能数到的最大值,而更新中断一方面是告诉你定时的时间到了,另外还会把预装值生效,就比如上次你修改了最大计数是32768,那么在这次数到65536的时候就把32768装载上了,所以接下来这次只需要数到32768就会变成0,然后再把预装放进去。这样你就可以随时随地想定时多久就定时多久。
        不过有没有发现一个问题,即使你最大预装65536,可是时间还是不够怎么办?比如时基是1ms,那你最大才能定时65.536s,我想定时五分钟怎么办,这里引入另一个东西,叫预分频器,什么意思呢,就是把时基给它放慢,跟预装值一样,可设定0~65535,也就是可以放慢1~65536倍,比如你想要五分钟,那我直接把时基放慢10倍,就是把预分频器设置成9,这样最大计时就可以达到655.35s了,你想要的五分钟就是300s,预装载设置成30000-1=29999不就行了嘛。这样一来可定时范围瞬间放大65536倍。
        值得注意的是,如果为什么预装值要下一次生效,比如现在计数器已经数到200了,你想要它数到100就从0开始,这时候显然就是错误的了,所以要按照上一次值就行比较,然后等下一次从头开始的时候再按照新修改的值,就像播放视频的时候把源文件删掉一样,要不播放器自己备份一份,要不直接文件加锁不给删。回到定时器,既然现在的预装还在生效、用户设置的新预装也有,所以这就有了影子寄存器的概念,我们直接修改的预分频和预装值都有影子寄存器,在计时器溢出更新的时候他们的值复制进影子寄存器起效,因此计数器与之比较的影子寄存器,也就是上一次的预装值或者预分频值。
        现在还差点什么呢?我们一直强调的时基,也就是定义时间的基准。比如1us的脉冲信号作为时基的话(也就是1MHz时钟),所能定时的最小值就是1us,最大值就是65536*65536us,看到这里大家应该发现了,定时器定时的精度取决于时基,输入时钟频率越高,定时器精度越高。不过相应的定时的时间也就变短了。所以还是却决于时钟输入和寄存器位数。不过当前的数值也满足绝大多数的应用了。

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

Archiver|手机版|小黑屋|RF技术社区

GMT+8, 2024-4-28 01:39 , Processed in 0.081302 second(s), 9 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表