找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1284|回复: 5
打印 上一主题 下一主题
收起左侧

今天跟大家聊聊我对单片机定时器的理解 针对新手

[复制链接]
跳转到指定楼层
楼主
计数器的工作原理
      计数器是一种基本的数字电路,可对输入的数字时钟(脉冲)进行计数,根据计数方向可分为加法计数器、减法计数器、可逆计数器等。
      十进制加法计数器如下图

加法计数器在数字时钟的驱动下,如上图中,每个上升沿的到来,就使计数值加一,其数值为0-->9,每次数值满时就会产生一个进位(溢出)信号。
定时器的本质
      定时器的本质就是已知频率(周期)的数字时钟(脉冲)驱动下的计数器。比如上面的计数器,如果已知驱动时钟为1MHz,那么每个时钟周期为1us,十个计数周期就是10us,其溢出周期为10us,也可视为定时10us。如果想定时5us,则计数5个周期即可。8051的基本定时器有Timer0和Timer1,STC15F2K61S的定时器有T0、T1、T2。其T0的基本结构如下图所示(其他定时器基本类似)

定时器T0的核心是一个16位、可置数的加法计数器。配置寄存器包括:时钟源选择、方式控制、加载(初值)、中断允许等。
定时器的软件编程
以定时器T0为例,定时器编程的步骤为:
(1) 确定定时器/计数器的工作方式----初始化:TMOD
(2) 定时器0/1工作频率1T还是12T:AUXR
(3) 定时器0/1的时钟输出是否:AUXR2
(4) 计算定时器/计数器的计数初值,装载TH和TL寄存器。
(5) 中断设置(特殊功能寄存器IE、IP):EA
(6) 启动定时/计数器(TCON):TR0/TR1


相关寄存器:

定时初值的计算:
      前面讲了,定时器是一个16位的加法计数器,对输入脉冲进行计数,从0计到65535 (2^16-1),然后进位溢出。软件通过溢出标志位TF0进行定时的判断,因此计数器计了多少个脉冲,是从初值开始到65535溢出,这个脉冲计数值才是其定时器的定时周数。比如工作时钟12MHz,默认12分频,即加法计数器的计数脉冲是1MHz,即计数周期1us,如果要定时1ms,则需要计数1ms/1us=1000个计数周期。先设置初值为(65536-1000),那么计数器溢出的时候它总共计数了65536-(65536-1000)=1000个周期。
      因此定时器初值x的计算公式是:
            
其中fosc为工作频率,t为所需的定时时间。
基本定时器实验
      运用定时器进行“延时”是最基本的应用。与前面的“软件延时”对应,采用定时器延时的方式,我们成为“硬件延时”。
  LED灯的硬件电路如附件

LED灯L1闪烁
      设定50ms亮灭1次(延时太短,人眼不能分辨出LED灯闪烁)。以STC-ISP下载界面中默认的11.0592MHz时钟频率计算,12分频,则计数器的初值应为65536-50ms*11.0592MHz/12=65536-46080=19456
       定时器初始化代码为:
       TMOD=0;
       AUXR=0;
       TH0=19456/256;   //整除取整,得高8位
       TL0=19456%256;  //取余,得低8位
       ET0=1;EA=1;   //中断使能,不采用中断,应清零
       TR0=1;      //开启定时器,相当于开关
   (1) 采用轮询的方式      

(2) 采用中断的方式
         定时器T0的中断号为1

LED灯单盏灯从左到右流水
设计分析:这里采用定时中断的方式,设定一个LED灯显示变量x(8bit分别对应8盏LED灯,主程序中根据这个显示变量x去控制LED灯的亮灭;而定时中断服务程序“定时到,就移位1次”。这样就变成两个进程:主程序不停地输出控制LED;中断服务程序定时改变控制变量。


仿真给大家,代码大家可以自己写: 附件内只有仿真 不含代码.7z (34.6 KB, 下载次数: 10)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:261183 发表于 2023-4-27 09:35 | 只看该作者
有些图片被吃了 可以下载这个文件更加完整

RTF 文档.7z

1.22 MB, 下载次数: 14, 下载积分: 黑币 -5

回复

使用道具 举报

板凳
ID:689425 发表于 2023-5-4 08:28 | 只看该作者
很详细的讲解,浅显易懂
回复

使用道具 举报

地板
ID:641483 发表于 2023-5-13 11:46 | 只看该作者
我现在就是这个中断转不过弯来 谢谢楼主分享经验  加紧学习中
回复

使用道具 举报

5#
ID:641483 发表于 2023-5-13 13:05 | 只看该作者
本帖最后由 Q__Q 于 2023-5-13 13:09 编辑

请问大神们,不知道提问对不对 大神们不要笑,在51系统中晶振12MHz,机器周期是1微秒,计算出来一个机器周期刚好是12个震荡脉冲,因机器周期是固定的,所以用6Mhz的晶振 一个机器周期是2微秒,我这样理解没错吧? 溢出是需要从0-65536个计数周期,那这个周期是按震荡数,还是按机器周期算,如果是按照机器周期算的话,那就是要计数到65536微秒才溢出对吧,
回复

使用道具 举报

6#
ID:863362 发表于 2023-5-15 08:55 | 只看该作者
Q__Q 发表于 2023-5-13 13:05
请问大神们,不知道提问对不对 大神们不要笑,在51系统中晶振12MHz,机器周期是1微秒,计算出来一个机器周 ...

按机器周期算。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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