当前位置:文档之家› 定时器Timer实时修改时间间隔(周期)

定时器Timer实时修改时间间隔(周期)

定时器Timer实时修改时间间隔(周期)
定时器Timer实时修改时间间隔(周期)

1.定时器Timer当时间间隔(周期)变化时,实时去修改

我项目中主要是实现在某个时间段上午8:00-12:00,下午

2:00(Pm_Start)-19:00 (Pm_end),每隔3分钟(pm_time)(可

以手动设置)自动上传当前的位置(google的定位)

//执行定时任务

PriVatebooIean bool = true ; // true表示服务器与本地数据相同,

false表示服务器与本地数据不相同

PriVateVOid Start_SChedUIe_pm() {

final Timer timer = new Timer();

timerTask = n ewTimerTask() {

@OVerride

PUbIiCVOid run() {

if (!bool) {

if (timer != nUIl ) {

Log. e("%%%%", bool + "");

timerTask.ca ncel();

timer.ca ncel();

Start_SChedUIe_pm();

bool = true

return

if ((getCurrentTime() - 12) >=

Double. Valueof ( Pm_end)) {

timerTask .cancel();

timer.ca ncel();

ZZ我的是在an droid SerViCe 里跑的程序,所以关闭了SerViCe

StOPSelf();

return

}

if

(!AppUtiIs. CheCkNet (getApplicationContext())) {

Log. d("data","网络未连接");

return ;

}

Log. d( "data","新任务开始");

if ( IoCatiOn != nUIl ) {

if ((getCurrentTime()-

12) >Double. Valueof ( Pm_Start )) {

// 这里需要handler 来实现,否则报Can't Create handler inSide thread that has not called Looper .prepare()

mHa ndler.se ndEmptyMessage(1);

mHa ndler.se ndEmptyMessage(2);

}

};

timer.schedule( timerTask , 0, Long. VaIUeOf ( Pm_time ) 60 * 1000);

}

Han dler mHan dler = n ewHa ndler() {

PUbIiCVOid han dleMessage(Message msg) {

SUPer .handleMessage(msg);

SWitCh (msg. What) {

CaSe 1:

//google 定位服务

onLocationChanged(location);

// getSqlData();

// 获取服务器数据并与本地数据相比较,如果不相同据库,bool=false

getSetTime();

break ;

case 2:

locationManager .requestLocationUpdates(

* 1000, 0,

LocationService. this );

break ;

default :

break ;

}

}

};

//google 定位服务即获取当前的location 需要implements LocationListener

locationManager = (LocationManager) update 本地数provider , 30

getSystemService( LOCATION_SERVIC)E;

Criteria criteria = newCriteria();

provider =

locationManager .getBestProvider(criteria, true );

location

locationManager .getLastKnownLocation( provider );

publicvoid onLocationChanged(Location location) { // 获得当前位置的纬度

latitude = location.getLatitude();

// 获得当前位置的经度

longitude = location.getLongitude();

Log. e( " 经纬度分别为:",

Calendar. getInstance ().getTime() + "longitude="

+ longitude + "latitude" + latitude );

// 获取当时的时间(24 小时制)

SimPIeDateFormatSDateFormat =

n ewSimpIeDateFormat(

"yyyy-MM-ddHH:mm:ss"

time = SDateFormat.format(

new Date()); ZZ把数据上传到服务器

isPositi On AVaiIable();

}

两个定时器蜂鸣器,一个控制频率,另一个控制时间

//同时利用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同一个频率持续的时间,间隔300ms依次输出 1、"1 0、" // 50、" 100、" 200、" 400、"800HZ的方波 #include//52单片机头文件 #include //包含有左右循环移位子函数的库 #define uint unsigned int//宏定义 #define uchar unsigned char sbit Waveout=P1^0; uchar tt; uint fre,flag; uint Freq[]={1,10,50,100,200,400,800,1000} void main()//主函数{fre=500; TMOD=0x11;//设置定时器0,定时器1为工作方式1 TH0=(65536-fre)/256;

TL0=(65536-fre)%256; TH1=(65536-500)/256; TL1=(65536-500)%256; EA=1;//开总中断 ET0=1;//开定时器0中断 ET1=1; TR1=1; TR0=1;//启动定时器0 while (1) //等待中断产生{if(tt=a){tt=0; Waveout=~Waveout;}}}void timer0() interrupt 1//定时器0中断{TR0=0;//进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失TH0=(65536-fre)/256; TL0=(65536-fre)%256; tt++;}void timer1() interrupt 3//定时器1中断用来产生300微秒时间定时{TH1=(65536-500)/256; TL1=(65536-500)%256; flag++; if(flag==6){flag=0; freq=Freq[i];}}

linux内核定时器详解及实例

Linux内核定时器详解 80X86体系结构上,常用的定时器电路 实时时钟(RTC) RTC内核通过IRQ8上发出周期性的中断,频率在2-8192HZ之间,掉电后依然工作,内核通过访问0x70和0x71 I/O端口访问RTC。 时间戳计时器(TSC) 利用CLK输入引线,接收外部振荡器的时钟信号,该计算器是利用64位的时间戳计时器寄存器来实现额,与可编程间隔定时器传递来的时间测量相比,更为精确。 可编程间隔定时器(PIT) PIT的作用类似于微波炉的闹钟,PIT永远以内核确定的固定频率发出中断,但频率不算高。 CPU本地定时器 利用PIC或者APIC总线的时钟计算。 高精度时间定时器(HPET) 功能比较强大,家机很少用,也不去记了。 ACPI电源管理定时器 它的时钟信号拥有大约为3.58MHZ的固定频率,该设备实际上是一个简单的计数器,为了读取计算器的值,内核需要访问某个I/O端口,需要初始化 定时器的数据结构 利用timer_opts描述定时器 Timer_opts的数据结构 Name :标志定时器员的一个字符串 Mark_offset :记录上一个节拍开始所经过的时间,由时钟中断处理程序调用 Get_offset 返回自上一个节拍开始所经过的时间

Monotonic_clock :返回自内核初始化开始所经过的纳秒数 Delay:等待制定数目的“循环” 定时插补 就好像我们要为1小时35分34秒进行定时,我们不可能用秒表去统计,肯定先使用计算时的表,再用计算分的,最后才用秒表,在80x86架构的定时器也会使用各种定时器去进行定时插补,我们可以通过cur_timer指针来实现。 单处理器系统上的计时体系结构 所有与定时有关的活动都是由IRQ线0上的可编程间隔定时器的中断触发。 初始化阶段 1. 初始化间,time_init()函数被调用来建立计时体系结构 2. 初始化xtime变量(xtime变量存放当前时间和日期,它是一个timespec 类型的数据结构) 3. 初始化wall_to_monotonic变量,它跟xtime是同一类型的,但它存放将加在xtime上的描述和纳秒数,这样即使突发改变xtime也不会受到影响。 4. 看是否支持高精度计时器HPET 5. 调用select_timer()挑选系统中可利用的最好的定时资源,并让 cur_timer变量指向该定时器 6. 调用setup_irq(0,&irq0)来创建与IRQ相应的中断门。 时钟中断处理程序 1. 在xtime_lock顺序锁产生一个write_seqlock()来保护与定时相关的内核变量,这样防止中断让该进程被阻止。 2. 执行cur_timer定时器对象的mark_offset方法(记录上一个节拍开始所经过的时间,由时钟中断处理程序调用) 3. 调用do_timer_interrupt函数,步骤为 a) 使jiffies_64值增1 b) 调用updata_times()函数来更新系统日期和时间。

定时器Timer实时修改时间间隔(周期)

1.定时器Timer当时间间隔(周期)变化时,实时去修改 我项目中主要是实现在某个时间段上午8:00-12:00,下午 2:00(pm_start)-19:00(pm_end),每隔3分钟(pm_time)(可以手动设置)自动上传当前的位置(google的定位) // 执行定时任务 privateboolean bool= true;// true表示服务器与本地数据相同,false表示服务器与本地数据不相同 privatevoid start_schedule_pm() { final Timer timer = new Timer(); timerTask = new TimerTask() { @Override publicvoid run() { //当不相同时取消timer重新new一个timer if (!bool) { if (timer != null) { Log.e("%%%%", bool + ""); timerTask.cancel(); timer.cancel(); start_schedule_pm(); bool = true;

return; } } if ((getCurrentTime() - 12) >= Double.valueOf(pm_end)) { timerTask.cancel(); timer.cancel(); //我的是在android service里跑的程序,所以关闭了service stopSelf(); return; } if (!AppUtils.checkNet(getApplicationContext())) { Log.d("data", "网络未连接"); return; } Log.d("data", "新任务开始");

VC中使用定时器的方法

1.启用一个定时器直接调用函数: SetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms 可以在按钮按下时启用定时器: void CTimeDlg::OnButton1() { // TODO: Add your control notification handler code here SetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms } 2.关闭定时器:可以在按钮中调用如下函数关闭某定时器: void CTimeDlg::OnButton2() { // TODO: Add your control notification handler code here KillTimer(1); //关闭1号定时器 KillTimer(2); //关闭2号定时器 } 3.添加定时器时间到的处理代码: 1)在开发界面中Ctrl+W 进入MFCclass wizard页面2)选择Message Maps选项卡 3)在Project中选择你的工程 4)在object Ids:中选择C…..Dlg

5)在Messages:中选择WM_TIMER,此时,Member functions中自动定位到: W OnTimer ON_WM_TIMER, 6) 单击EDIT code(或双击W OnTimer ON_WM_TIMER)自动进入如下函数:void CTimeDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default switch(nIDEvent) { case 1: //1号定时器应该处理的事情 //….. break; case 2: //2号定时器应该处理的事情 //….. break; } CDialog::OnTimer(nIDEvent); //此句VC自动生成 }

如何设定plc定时时间

如何设定PIc定时时间

作者: 日期: 2

如何设定pic定时时间 S7中定时时间由时基和定时值组成,定时时间为时基和定时时间设 定值的乘积。时基也称为定时器的计时单位,是定时器可以控制的最高精度(时间间隔)。定时时间也称为计时范围,是定时器的有效控制时间。 在定时器开始工作后,定时值不断递减,递减到零时,表示时间已到,定时器会有相应的动作。 所谓的时基是时间基准的简称。定时时间设值是以3位BCD码格式存放,位于定时器字的第0~11位。使用范围是0?999。表给出时基与相应的定时范围。 表时基与相应的定时范围

定时时间有两种表达方式: ①十六进制数。定时器使用的时间值为BCD码,给定时器赋值可以 带有时基格式。 格式为:W#16#vxyz。其中,w是时间基准,xyz是BCD码格式的时间值。设定值范围为1~999。这里,时基越小,贝y分辨率越高;时基越大,则分辨率越低,但定时时间越长。例如, 匱#1砾4?刖00 二0010001 IfHKMOKX) .1 0 0 时延I' 表示时基为1s,定时时间为300X 1 s的定时时间值,即300 s =5 min。 ②S5时间格式。也可以直接使用S5中的时间表示装入时间设定值, 其格式为: S5T#aH bM cS dMS 其中,a表示小时,b表示分钟,c表示秒,d表示毫秒。定时范围为 1MS-2H?46M H30S(1 ms~9990 s)。例如,S5T# 1H_13M_8S表示时 间为1 h13 min8 s。这里时基是由CPU自行选定的,原则是在满足

定时范围的要求下,时基单位根据设定时间值自动选择满足定时范围的最小时基。 ③设定时间的装载。S7-300/400的定时时间设定需要通过S7的装 载指令L进行。可以用两种方法设定时间与选择时间单位。允许设定的最大时间值为9990 s(2小时46分30秒)

STM32定时器定时时间的计算

STM32 定时器定时时间的计算 假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由PCLK1 得到 关键是设定时钟预分频数,自动重装载寄存器周期的值 /*每1秒发生一次更新事件(进入中断服务程序)。 RCC_Configuration()的SystemInit()的 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明 TIM3CLK为72MHz。因此,每次进入中 断服务程序间隔时间为 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72 M)*(1+9999)=1秒*/ 定时器的基本设置 1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时 钟频率=72/(时钟预分频+1) 2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时 时间) 累计0xFFFF个频率后产生个更新或者中断(也是说定时时间到)

3、TIM_TimeBaseStructure.TIM_CounterMode = TIM1_CounterMode_Up; //定时器 模式向上计数 4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; // 时间分割值 5、TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器 2 6、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断 7、TIM_Cmd(TIM2, ENABLE);//打开定时器 或者: TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999 72M/ (35999+1)/2=1Hz 1秒中断溢出一次 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72 M)*(1+2000)=1秒*/

定时器的使用

一、PLC定时器的使用 实际上有多种多样的定时器, 这也是它们有趣的地方. 通常, 不同生产商都提供不同类型的定时器. 下面是最常用的一些定时器: ·延时ON定时器(On-Delay Timer) --这种类型的定时器为"延时后变为ON". 换句话说, 当我们的传感器(输入)变为ON以后, 等待x秒后, 才激励一个电磁阀(输出). 这是最常见的定时器. 它通常叫做TON(timer on-delay, 延时ON定时器), TIM(timer, 定时器)或TMR(timer). ·延时OFF定时器(Off-Delay Timer) --这种定时器与上面提到的延时ON定时器刚好相反. 这种定时器仅仅"延时OFF". 我们的传感器(输入)检测到目标后, 激励电磁线圈(输出). 当传感器检测不到目标时, 电磁线圈将保持被激励的状态x秒后才变为OFF. 这种定时器叫做TOF(延时OFF定时器), 它较上面提到的延时ON定时器少见.(例如, 很少生产商在其PLC中装入这种定时器). ·保持或累积定时器--这种定时器需要两个输入端. 一个输入端启动定时器(即时钟开始计时), 另一个输入端将定时器复位.如果输入传感器在整个定时时间内没有ON/OFF, 则上面提到的延时ON或OFF传感器将被复位.而当传感器中途断开时, 这种定时器将保持当前状态, 直到将其复位为止. 例如, 我们想知道在1个小时内传感器为ON的时间有多长. 如果我们用上面提到的那些定时器, 当传感器变为OFF或ON时, 它们将保持复位. 而保持或累积定时器, 将给我们一个总的或累积的时间. 我们通常把它叫做RTO(Retentive Timer, 保持定时器)或TMRA(Accumulating Timer, 累积定时器). 下面我们来看一下怎样使用它们. 典型地, 我们需要知道两件事情: 1. 用什么启动定时器. 典型情况下为一输入. (例如连接到输入0000的一个传感器) 2. 在做出反应前, 我们要延时多长时间. 例如, 我们在使一个电磁阀打开前要等待5秒钟. 当定时器符号前面的指令为真(True)时, 定时器开始计数. 当定时时间到达时, 定时器将自动关闭它的触点. 当程序在PLC上运行时, 将显示逝去的或"累积的"时间, 便于我们观察当前值. 典型定时器的定时范围为0到9999或0到65535次. 为什么是这么怪异的数字呢? 这是因为大多数的PLC使用的是16位定时器. 我们将在以后学习这是什么意思, 现在我们只要知道0-9999是16位BCD(Binary Coded Decimal, 二进制编码的十进制数), 0到65535是16位二进制数就行. 时钟每计一次为X秒. 典型地, 每个生产商提供几种不同的计数单位. 大多数厂家提供10和100ms的增量. 一"ms"是一毫秒或1/1000秒. 一些生产商也提供1ms或1秒的增量. 这些不同增量的计数器工作起来和上面讲的一样, 只是有时为了表明它们的时基不同,它们的名称不一样. 有的叫做TMH(High speed Timer, 高速定时器), TMS(Super high speed Timer, 超高速定时器), 或TMRAF(Accumulating Fast Timer, 累积式快速定时器). 下面是一个典型的定时器指令符号, 我们该怎样使用它呢? 记住一点, 当它们外表看起来不同时, 它们的基本用法都是相同的. 如果我们会设置一个, 我们就会设置所有的定时器.

采用定时器0产生多个时间间隔

采用定时器0产生多个时间间隔 采用单片机定时器0 产生多个时间间隔。程序中使用定时器0 每50ms 中 断一次,然后用全局变量tt,t1,t2,t3,t4,t5 对中断次数计数,获得 100ms,1s,2s,4s,8s,16s 间隔,在各个定时间隔内,分别使LED 灯亮灭一 次。源程序如下:#include AT89X51.H unsigned char tt,t1,t2,t3,t4,t5; //全局时 间隔变量unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92, 0x82,0xF8,0x80,0x90}; //七段数码管译码表void main(void) //主函数{ TMOD=0x01; //定时器0 运行在工作模式1,GATE=0,C/T=0 TH0=(65536- 15536)/256; //设置定时器0 高8 位初值TL0=(65536-15536)%256; //设置定时器 0 低8 位初值//若是机器周期为1μs,则计数50000,相当于50ms。TR0=1; //启动定时器ET0=1; //允许定时器0 中断EA=1; //允许总中断while(1) //无限 循环{ if(t15) P2_0=0; else P2_0=1; //根据时间间隔变量值闪烁LED 灯if(t210) P2_1=0; else P2_1=1; if(t320) P2_2=0; else P2_2=1; if(t440) P2_3=0; else P2_3=1; if(t580) P2_4=0; else P2_4=1; P1=dispcode[t4/10]; //显示间隔变量t4 的十位 P0=dispcode[t4%10]; //显示间隔变量t4 的个位}} void t0(void) interrupt 1 //定时 器0 中断服务程序{ TH0=(65536-15536)/256; //设置定时器0 高8 位初值 (3CH)TL0=(65536-15536)%256; //设置定时器0 低8 位初值(B0H)tt++; // 每中断一次,tt 加1 if(tt==2) //如果tt 等于2,相当于100ms,执行如下语句{ tt=0; //将tt 清0,所以tt 的计数值为0---1---2(0),每个间隔为50ms t1++; if(t1==10){t1=0;} t2++; if(t2==20){t2=0;} t3++; if(t3==40){t3=0;} t4++; if(t4==80){t4=0;} t5++; if(t5==160){t5=0;} P2_6=~P2_6; //每100ms,P2_6 连接 的LED 灯闪烁一次} } tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

如何设定plc定时时间

如何设定plc定时时间

————————————————————————————————作者:————————————————————————————————日期:

如何设定plc定时时间 S7中定时时间由时基和定时值组成,定时时间为时基和定时时间设定值的乘积。时基也称为定时器的计时单位,是定时器可以控制的最高精度(时间间隔)。定时时间也称为计时范围,是定时器的有效控制时间。 在定时器开始工作后,定时值不断递减,递减到零时,表示时间已到,定时器会有相应的动作。 所谓的时基是时间基准的简称。定时时间设值是以3位BCD码格式存放,位于定时器字的第0~11位。使用范围是0~999。表给出时基与相应的定时范围。 表时基与相应的定时范围

定时时间有两种表达方式: ①十六进制数。定时器使用的时间值为BCD码,给定时器赋值可以带有时基格式。 格式为:W#16# wxyz。其中,w是时间基准,xyz是BCD码格式的时间值。设定值范围为1~999。这里,时基越小,则分辨率越高;时基越大,则分辨率越低,但定时时间越长。例如, 表示时基为1s,定时时间为300×1 s的定时时间值,即300 s =5 min。 ②S5时间格式。也可以直接使用S5中的时间表示装入时间设定值,其格式为: S5T#aH_bM_cS_dMS 其中,a表示小时,b表示分钟,c表示秒,d表示毫秒。定时范围为1MS~2H~46M~30S(1 ms~9990 s)。例如,S5T# 1H_13M_8S表示时间为1 h13 min8 s。这里时基是由CPU自行选定的,原则是在满足

定时范围的要求下,时基单位根据设定时间值自动选择满足定时范围的最小时基。 ③设定时间的装载。S7-300/400的定时时间设定需要通过S7的装载指令L进行。可以用两种方法设定时间与选择时间单位。允许设定的最大时间值为9990 s(2小时46分30秒)

S7-200 SMART定时器指令概述及应用举例

S7-200 SMART定时器指令概述及应用举例定时器 S7-200 SMART指令提供了下述三种类型的定时器。 ●接通延时定时器(TON):用于定时单个时间间隔。 ●有记忆的接通延时定时器(TONR):用于累积多个定时时间间隔的时间值。 ●断开延时定时器(TOF):用于在 OFF(或 FALSE)条件之后延长一定时 间间隔,例如冷却电机的延时。 定时器号和分辨率 定时器对时间间隔计数。定时器的分辨率(时基)决定了每个时间间隔的长短。 S7-200 SMART提供了256个可供使用的定时器,即用户可用的定时器号为T0-T255。TON、TONR 和 TOF 定时器提供三种分辨率:1ms、10ms和100ms。(当前值的每个单位均为时基的倍数。例如,使用 10 ms 定时器时,计数 50 表示经过的时间为 500 ms )。 定时器号的分辨率(时基)及最大计数时间,如下表:

表1. 定时器号和分辨率 定时器号决定了定时器的分辨率(时基),并且分辨率在指令块上标出。 注意:同一个定时器编号不能同时用于 TON 和 TOF 定时器。例如,不能同时使用 TON T32和 TOF T32。 不同分辨率的定时器按以下规律刷新: 1ms:1ms分辨率的定时器,定时器位和当前值的更新不与扫描周期同步。对于大于1ms的程序扫描周期,在一个扫描周期内,定时器位和当前值刷新多次。 10ms:10ms分辨率的定时器,定时器位和当前值在每个程序扫描周期的开始刷新。 定时器位和当前值在整个扫描周期过程中为常数。在每个扫描周期的开始会将一个扫描累计的时间间隔加到定时器的当前值上。 100ms:100ms分辨率的定时器,定时器位和当前值在指令执行时刷新。因此为了保证正确的定时值,要确保在一个程序扫描周期中,只执行一次100ms定时器指令。 注意:要确保最小时间间隔,请将预设值 (PV) 增大 1。例如:使用 100 ms 定时器时,为确保最小时间间隔至少为 2100 ms,则将 PV 设置为22。 定时器指令的有效操作数如下表所示: 表2. 定时器指令的有效操作数 不同定时器的功能 TON 和 TONR 定时器操作: 在使能输入 IN 接通时开始计时。当前值等于或大于预设时间时,定时器位置为接通。 使能输入置为断开时,清除 TON 定时器的当前值。 使能输入置为断开时,保持 TONR 定时器的当前值。输入 IN 置为接通时,可以

定时器的原理及应用

定时器的原理及应用 摘要:定时器,作为一种人们最熟知的设备,被广泛应用于时间测量、时间定时等方面。本文通过介绍定时器的工作原理,进而进出定时器在各个领域的应用,旨在提醒我们时刻提高自己,让自己在这个日新月异的时代找到属于自己的方位,活出自己的精彩。 1.引言 定时器,一种极为常见的外部设备,可以用来测量时间间隔,用于在特定时间产生事件或确定两个事件之间的时间间隔。 定时器使相当多需要人控制时间的工作变得简单了许多。甚至被应用在了军事方面,制成了定时炸弹,定时雷管。 2.定时器简介 2.1分类 接通延时型定时器:最常见的定时器,又称SD型定时器;断开延时型定时器:只有在输入条件00000为OFF时产生延时作用,又称SF型定时器;保持型接通延时定时器:当输入条件00000为ON后,即产生锁存功能,又称SS 型定时器;脉冲型定时器:当输入条件00000为ON后,定时器即时动作,但经过定时器所设定的时间后,即使输入条件00000仍为ON,定时器却变为OFF 状态,又称SP型定时器;扩张型脉冲定时器:只要输入条件00000出现了ON 状态,不管其持续时间多长,均可使定时器为ON的维持的时间与定时器的设定值一致,又称SE型定时器。 2.2工作原理 定时器通过对已知输入时钟信号的脉冲个数进行计数来测量时间,以下以51单片机为例,详细介绍定时器的工作原理。 定时器系统由两个可编程的16位的定时器T0和T1,以及他们的工作方式寄存器TMOD和控制寄存器TCON等组成,内部通过总线与CPU相连。其中定时器T0和T1各由两个8位特殊功能寄存器TH0、TL0、TH1、TL1构成。每个定时器内部结构实际上就是一个可编程的加法计数器,由编程来设置它工作在定时状态还是计数状态。当工作在定时状态时,计数脉冲来自内部时钟脉冲,每个机器周期计数值增1,每个机器周期=12个振荡周期,因此计数频率为振荡频率的1/12。所以定时时间=计数值×机器周期。 定时器共有四种工作方式: (1)当TMOD中MlM0=00时,工作方式0,为13位的定时器,由TH的高8位、TL的低5位的计数值,满计数值213,但启动前可以预置计数初值。若定时器开中断(ET=1)且CPU开中断(EA=1)时,则定时器溢出时,CPU转向中断服务程序,

单片机两个定时器同时作用

//////////经多次试验,没毛病 ///////////////////同时用两个定时器控制蜂鸣器发声,定时器0控制频率,//////////////////// /// ///// //////////////////定时器1控制同个频率持续的时间,间隔300ms依次输出,///////////// //////////////////////////////////////1,10,50,100,200,400,800,1k(hz)的方波。// #include #define uchar unsigned char #define uint unsigned int void init(); sbit beep=P1^5; uint code pin[]={500,100,50,25,13,7,5};// T/2=1/2f, 以0.1ms为单位,则T/2=5000/f,其中1HZ 的应为5000,这时中断中变成了500000,超出了寄存器的范围 uint n,tt,aa,num; void main() { init(); //初始化 while(1) { if(tt>0) //中断求反 { //TR0=0; tt=0; beep=~beep; } //TR0=1; } } void time0() interrupt 1 { TR0=0; ///进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失 tt++; TH0=(65536-100*pin[n])/256; TL0=(65536-pin[n]*100)%256; TR0=1; //重新开中断 } void time1() interrupt 3 { aa++; TH1=(65536-50000)/256;

S7-200 定时器 指令

定时器指令 1定时器概述 定时器指令用来规定定时器的功能,S7-200 CPU提供了256个定时器,共有3种类型:接通延时定时器(TON)、有记忆接通延时定时器(TONR) 和断开延时定时器(TOF)。 定时器对时间间隔计数,时间间隔称为分辨率,又称为时基。S7-200定时器有3种分辨率:1ms、10ms和100ms. 定时器分类及特征

定时器的定时时间计算公式如下: 例:TON 指令使用T97的定时器,设定值为100,则时间时间为 T=100*10ms=1000ms 定时器指令的有效操作数表如下: 定时器的工作规律

2接通延时定时器TON 接通延时定时器TON用于单一间隔的定时。 1)首次扫描时,定时器位为OFF,当前值为0 2)当使能输入(IN)接通时,定时器位为TON从0开始计时 3)当前值≥设定值时,定时器被置位,即定时器状态位为ON,定时器动合触点闭合,动断触点断开 4)定时器累计值达到设定值后继续计数,一直达到最大值32767 5)当使能输入(IN)断开时,定时器复位,即定时器状态位为OFF,当前值为0。也可用复位指令对计数器复位 6)用于单一时间间隔的定时 接通延时定时器指令的有效操作数表如下:

例子分析

3有记忆接通延时定时器TONR 有记忆接通延时定时器TONR用于累计多个时间间隔。 1)首次扫描时,定时器位为OFF,当前值保持在断电前的值 2)当IN接通时,定时器为为OFF,TONR从0开始计时 3)当前值≥设定值时,定时器位为ON 4)定时器累计值达到设定值后继续计时,一直达到最大值32767 5)当使能输入(IN)断开时,定时器的当前值被保持,定时器状态位不变 6)当IN再次接通时,定时器的当前值从原保持值开始向上计时,因此可 累计多次输入信号的接通时间 7)此定时器必须用复位(R)指令清除当前值 8)用于许多间隔的累计定时

相关主题
文本预览
相关文档 最新文档