标题: 今天跟大家聊聊我对单片机定时器的理解 针对新手 [打印本页]
作者: qw2597758qw 时间: 2023-4-27 09:32
标题: 今天跟大家聊聊我对单片机定时器的理解 针对新手
计数器的工作原理
计数器是一种基本的数字电路,可对输入的数字时钟(脉冲)进行计数,根据计数方向可分为加法计数器、减法计数器、可逆计数器等。
十进制加法计数器如下图
加法计数器在数字时钟的驱动下,如上图中,每个上升沿的到来,就使计数值加一,其数值为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;中断服务程序定时改变控制变量。
作者: qw2597758qw 时间: 2023-4-27 09:35
有些图片被吃了 可以下载这个文件更加完整
-
-
RTF 文档.7z
1.22 MB, 下载次数: 14, 下载积分: 黑币 -5
作者: nlming 时间: 2023-5-4 08:28
很详细的讲解,浅显易懂
作者: Q__Q 时间: 2023-5-13 11:46
我现在就是这个中断转不过弯来 谢谢楼主分享经验 加紧学习中
作者: Q__Q 时间: 2023-5-13 13:05
本帖最后由 Q__Q 于 2023-5-13 13:09 编辑
请问大神们,不知道提问对不对 大神们不要笑,在51系统中晶振12MHz,机器周期是1微秒,计算出来一个机器周期刚好是12个震荡脉冲,因机器周期是固定的,所以用6Mhz的晶振 一个机器周期是2微秒,我这样理解没错吧? 溢出是需要从0-65536个计数周期,那这个周期是按震荡数,还是按机器周期算,如果是按照机器周期算的话,那就是要计数到65536微秒才溢出对吧,
作者: sonique0371 时间: 2023-5-15 08:55
按机器周期算。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |