首页>>科技 >>内容

单片机中定时器的作用,单片机定时器中断原理图解

发布时间:2023-10-04 15:00:29编辑:温柔的背包来源:

很多朋友对单片机中定时器的作用,单片机定时器中断原理图解不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

单片机中定时器的作用,单片机定时器中断原理图解

我们经常需要使用单片机的定时器中断。下面将以51单片机为例说明单片机的定时器中断原理。80C51的定时器/计数器的结构定时器/计数器的本质是一个加一计数器(16位),由两个寄存器组成,高8位和低8位。TMOD是定时器/计数器的工作模式寄存器,决定工作模式和功能;TCON是一个控制寄存器,它控制T0和T1的开始和停止,并设置溢出标志。

中断系统简介中断系统是一套硬件电路,可以在每个机器周期查询所有外设的标志位。与前面的软件查询(if (xx==1))相比,中断系统也可以称为硬件查询。51中断系统可以查询以下六个标志。IE0(TCON.1),外部中断0中断请求标志位。IT1(TCON.2),外部中断1触发模式控制位。IE1(TCON.3),外部中断1中断请求标志位。

TF0(TCON.5),定时器/计数器T0溢出中断请求标志位。TF1(TCON.7),定时器/计数器T1溢出中断请求标志位。RI(SCON.0)或TI(SCON.1),串行端口中断请求标志。当串行端口接收到一帧串行数据时设置RI,或当串行端口发送一帧串行数据时设置TI,并向CPU申请中断。

当中断系统查询到外设的标志位变为1时,中断系统可以暂停当前主循环,将程序跳转到用户预先指定的功能。启动中断系统,需要先初始化中断,过程如下:a、是否查询外设标志(EA=0或EA=1,EA也叫CPU中断权限(总权限)位)b、是否跳过程序c和跳转的目标函数,即中断服务子函数。

所以在使用定时器中断时,我们只需要初始化中断系统,打开主中断(相当于主开关),打开定时器对应的控制位(相当于分支开关),然后初始化定时器。中断系统作为MCU的外设,只有在发生中断时才会中断主循环,相应的中断号会被引入相应的中断服务子功能中。下图显示了六个中断标志位的信息。

80C51单片机定时器中断原理这里会涉及到单片机中断的应用。在cpu按指令(主程序)一步一步运行的过程中,可能还有其他更紧急的事情要做(中断服务程序),这就需要cpu暂时停止当前程序(主程序),完成(中断服务程序)后继续运行上一个程序(主程序)。

就像你在吃饭的时候,你在往桶里放水,吃着吃着。水满了,就得关水龙头或者换个空桶,然后回来吃饭。

单片机的定时器就像一个水桶,你让它启动,就是水龙头开了;开始注水;定时每一个机器周期自动加1,最后溢出;桶里的水不断增加,最后满了;当定时器溢出时,你必须处理它;水桶满了,你去处理吧。经过处理后,单片机可以回到刚刚启动和停止的地方继续运行;水桶已经处理掉了,你可以继续做你之前在做的事情。

单片机主程序从0x0000开始运行。单片机的服务程序从哪里开始运行?在51中,有多个中断服务程序入口,入口0为外部中断0,地址为0x0003;入口1为定时器0,为0x000B;入口2是外部中断1;地址为0x0013,入口3为定时器2;地址为0x001B,依此类推。

当中断发生时,程序记录当前运行位置,跳转到相应的中断入口运行中断服务程序,运行后跳回原位置继续运行。

在C51中,你不关心中断服务程序放在哪里,如何跳转。你只需要识别一个函数作为中断服务函数的编号。当相应的中断发生时,该功能将自动运行。

定时器/计数器的工作原理加一计数器输入的计数脉冲有两个来源。一个是除以12的系统时钟振荡器的输出脉冲;一个是通过T0或T1引脚输入的外部脉冲源。计数器每增加一个脉冲,当全为1时,输入另一个脉冲使计数器归零,计数器溢出使TCON中的TF0或TF1置1,并向CPU发出中断请求(定时器/计数器中断允许时)。

如果定时器/计数器工作在计时模式,说明计时时间到了;如果工作在计数模式,则表示计数值已满。

可以看出,从溢出计数器值中减去初始计数值就是加1计数器的计数值。当设置了定时器模式时,加1计数器对内部机器周期进行计数(一个机器周期等于12个振荡周期,即计数频率为晶体振荡频率的1/12)。计数值n乘以机器周期Tcy就是计时时间t

设置计数器模式时,外部事件计数脉冲从T0或T1引脚输入计数器。T0和T1引脚的电平在每个机器周期的S5P2期间被采样。当在一个周期内对高电平输入进行采样,而在下一个周期内对低电平输入进行采样时,计数器递增1,并在下一个机器周期的S3P1期间将更新后的计数值载入计数器。由于检测从1到0的下降沿需要2个机器周期,因此要求采样电平至少保持一个机器周期。

当晶体频率为12MHz时,最高计数频率小于1/2MHz,即计数脉冲的周期大于2 Us。

单片机定时器利用中断实现延时的原理分析# define _ 1231 _ c _ # include"reg 51 . h"//sbitoe=p2 3;无符号int SystemTimeVoidtime r0 (void)中断1 using 3//中断部分代码,参见下面的解释{ TH0=0xdbTL0=0xff//TF0=0;SystemTime} void main(){ TMOD=0xf 0;TMOD |=0x 01;//值//TMOD表示定时器工作模式选择为TH0=0xdb//写初始值,可以确定多长时间定时TL0=0xff

//根据上面的桶比喻,如果TH0=0x00TL0=0x00这意味着水是从桶的底部注入的。//TH0=0x db;TL0=0xff可以理解为桶内有一定的液铅,两个值//TH0和TL0表示桶内液铅的高度,即此时桶内只能从液铅高度以上注水,//TH0=0x ff;TL0=0xff这意味着铲斗的最高位置。TF0=0;//计数时TF0为1,即TH0=0xff时;TL0=0xff再跑一步TF0=1;

TR0=1;//开始计数。此后,TH0和TL0将随着每一步操作而增加,直到TH0=0xffTL0=0xff//相当于开了水龙头。如果TR0=0,TH0和TL0将保持不变。ET0=1;//允许定时器0中断EA=1;//开启总中断//以下是无限循环。TH0和TL0将随着程序中的每一步而增加,当它们增加到TH0=0xff时;TL0=0xff//微控制器会从无限循环中退出来执行中断部分的代码,也就是用3 {}开始运行Void Time R0 (Void)中断1

//运行完中断的代码后,继续执行无限循环中的代码。//注意:当TH0=0xff时;TL0=0xff再次运行后,TF0没有从0变为1。个人猜测TF0=1。当触发一个中断,并重置为零。//如果ET0=1;且EA=1;当TH0=0xff时,注释掉;TL0=0xff再次运行,TF0会变成1,此时不会执行被中断的代码。while(1){ if((system time 0)"50)//system time除以100,余数小于50 {..........}else{………;}};}

说明:Voidtimer0()中断1使用1timer0是函数名,使用y中断xx后xx的随机值是中断号,表示这个函数对应哪个中断端口。一般在51中编译一个串行中断时,0外部中断01定时器02外部中断13定时器14就是把你这个函数的入口地址放到这个对应中断的跳转地址。

使用y这个y指的是这个中断函数使用的寄存器组。51中一般有4组r0 - r7寄存器,共32个。如果你的终端函数和其他程序用的是不同的寄存器组,那么进入中断的时候就不会把寄存器组推入堆栈,返回的时候也不会讲,节省代码和时间。

初始值算法:当总数达到FFFFH时,定时器产生中断!然后你想让它数到10000。是否使用FFFF(十六进制)减10000(十进制)作为初始值?TH0=-(10000/256);TL0=-(10000%6)等于FFFF(十六进制)减去10000(十进制)。从TH0=-(10000/256);TL0=-(10000%6)开始计数,直到10000刚好满为止。和FFFF(十六进制)减去10000(十进制)是一样的!更好写,也不用数!

看原码和补码就知道了。正数的补码是对应的二进制数,符号位为零,负数的补码是其绝对值对应的二进制数,符号位为一。无符号数不考虑符号,所以结果等同于从FFFF中减去它的绝对值。

以上知识分享希望能够帮助到大家!