Java Web定时器使用(转载)

Java Web定时器使用(转载)
Java Web定时器使用(转载)

这个类最终功能是每天某个时间点(如每晚22点)执行某一功能.

首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000);

schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期.

要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,以下是类设计:

public class TimerListener implements ServletContextListener { private Timer timer = null;

private SampleTask sampleTask;

@Override

public void contextDestroyed(ServletContextEvent event) { timer.cancel();

event.getServletContext().log("定时器销毁");

}

@Override

public void contextInitialized(ServletContextEvent event) { timer = new Timer(true);

sampleTask = new SampleTask(event.getServletContext()); event.getServletContext().log("定时器已启动");

timer.schedule(sampleTask, 0, 60 * 60 * 1000);

event.getServletContext().log ("已经添加任务调度表");

}

}

public class SampleTask extends TimerTask {

private ServletContext context;

private static boolean isRunning = false;

private static boolean flag = true;

private static final int C_SCHEDULE_HOUR = 15;

public SampleTask(ServletContext context){

this.context = context;

}

@Override

public void run() {

Calendar cal = Calendar.getInstance();

if (!isRunning) {

if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY) && flag) {

isRunning = true;

context.log("开始执行指定任务");

//需要执行的代码

isRunning = false;

flag = false;

context.log("指定任务执行结束");

}

} else {

context.log("上一次任务执行还未结束");

}

if(C_SCHEDULE_HOUR != cal.get(Calendar.HOUR_OF_DAY)){

flag = true;

}

}

}

要使用此监听器需要在web.xml中配置,如下:

包路径.TimerListener

这样在web工程启动时,就会自动启动此监听器.

JAVA中Timer定时器调度方法

java timer中的时间调度方法主要有:

schedule(TimerTask task, Date firstTime, long period)

Schedules the specified task for repeated fixed-delay execution, beginning at the specified time.

但是如果此时的firstTime小于(时间落后于)当前时间,那么

task会立即执行,在调试的时候不方便,因为程序一启动就开始执行了,或许还没有到任务的触发点。

schedule(TimerTask task, long delay, long period)

Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.

如果采用设置delay时间的方法,则可以进行处理。

比如:设置执行时间为每天的13:50,如果启动的时候时间已经过了13:35,那么应该在明天的13:35进行执行。此时可以这样处理:

Calendar cal = Calendar.getInstance();

cal.set(Calendar.HOUR_OF_DAY, 13);

cal.set(Calendar.MINUTE, 35);

//cal.add(Calendar.DAY_OF_MONTH, 1);

Date date = new Date();

date = cal.getTime();

Date now = new Date();

long interval = date.getTime() - now.getTime();

//should exec in next day

if (interval < 0) {

cal.add(Calendar.DAY_OF_MONTH, 1);

date = cal.getTime();

interval = date.getTime() - now.getTime();

}

System.out.println("the interval time is: " + interval); //the exec time interval is 2 secs.

timer.schedule(echoTask, interval, 2 * 1000);

如果delay的时间为负数,会报异常,因此,Calendar添加一天。

JAVA WEB程序中添加定时器

//这是我的定时器类,用来定时执行某段任务;

package com.my.time;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Timer;

public class BugXmlTimer {

public Timer timer;

public void timerStart(){

timer = new Timer();

Date datetime=new Date();

Date midnightDate=new Date();

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");

SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {

midnightDate = sdf2.parse(sdf1.format(datetime)+" 23:00:00");

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

long in=midnightDate.getTime()-datetime.getTime(); System.out.println("before task");

//立刻执行,然后每隔30s执行一次

timer.schedule(new BugXmlTimerTask(), 0,30000);

}

public void timerStop(){

if(timer!=null)

timer.cancel();

}

public static void main(String[] args){ BugXmlTimer myTimer=new BugXmlTimer();

// TODO Auto-generated method stub

myTimer.timerStart();

}

}

//这是执行任务的类,即每隔一段时间要做的事情在这里package com.my.time;

import java.util.TimerTask;

public class BugXmlTimerTask extends TimerTask { @Override

public void run() {

System.out.print("run task");

}

}

//以下是出发定时操作的类,该类实现了ServletContextListener

public class MyTimerListener implements ServletContextListener {

private BugXmlTimer mytimer = new BugXmlTimer ();

public void contextInitialized(ServletContextEvent event) {

mytimer.timerStart();

}

public void contextDestroyed(ServletContextEvent event) {

mytimer.timerStop();

}

}

然后在web.xml里部署一下,即可在程序启动后运行定时器了!

com.my.time.MyTimerListener

Java 定时器退出解决方案

项目中用到了Timer每隔一段时间进行一些操作,现在发现有时候莫名其妙地挂在这个计时器上的操作都不做了,用“JConsole”查看其中的线程以后,发现这个定时器线程也不在了(定时器创建的时候带了名字Timer timer = new Timer("MyTimer"),所以直接能看到),由于日志太多,之前的日志已经找不到了,所以没有办法看是否是有异常发生以及发生在哪里。初步估计,是不是由于TimerTask中有异常抛出,如果定时器中没有处理的话,可能就会出问题。所以看了一下java.util.Timer的代码:

1.// 在 TimerThread 中执行任务

2.Timer.java:101:TimerThread

3.// TimerThread 的入口

4.// 这里只有一个 try/finally,如果 mainloop 中有异常抛出的话,肯

定就结束运行。

5.Timer.java:503:TimerThread.run()

6.// 主循环体,其中只抓住了 InterruptedException 异常,其他的仍然

往外抛。

7.Timer.java:518:TimerThread.mainloop()

从上面的代码可以看出,如果执行的任务中有其他任何运行时异常(RuntimeException)抛出,就必然导致定时器取消,也就是说挂在这个定时器上所有的人物都要被取消。明白了其内部处理机制,就要将其应用于实践,看如下例子:

1.WrongTimerTask.java:

2.

3.package org.supermmx.example.timer;

4.

5.import java.util.Timer;

6.import java.util.TimerTask;

7.

8./**

9.* Wrong timer task.

10.*

11.* @author SuperMMX

12.*/

13.public class WrongTimerTask extends TimerTask {

14.private int count = 0;

15.

16.public void run() {

17.System.out.println(count);

18.count ++;

19.if (count == 3) {

20.throw new NullPointerException("Test Exception");

21.}

22.}

23.

24.public static void main(String[] args) {

25.try {

26.WrongTimerTask task = new WrongTimerTask();

27.Timer timer = new Timer("TestTimer");

28.timer.scheduleAtFixedRate(task, 0, 1000);

29.} catch (Exception e) {

30.e.printStackTrace();

31.}

32.}

33.}

上述代码中,每隔一秒钟打印一个递增的数值,等于 3 的时候抛一个空指针异常,结果怎么样呢?整个程序全部就退出了,就因为其中唯一的线程“TestTimer”退出了。跟前面所说的问题一模一样,只不过项目中还有很多别的线程,所以主程序并未退出。

解决方法是什么呢?其实很简单,将TimerTask中整个run()方法 try 起来就可以了,保证它不再往外抛异常,代码如下:

1.RightTimerTask.java:

2.

3.package org.supermmx.example.timer;

4.

5.import java.util.Timer;

6.import java.util.TimerTask;

7.

8./**

9.* Wrong timer task.

10.*

11.* @author SuperMMX

12.*/

13.public class RightTimerTask extends TimerTask {

14.private int count = 0;

15.

16.public void run() {

17.try {

18.System.out.println(count);

19.count ++;

20.if (count == 3) {

21.throw new NullPointerException("Test Exception");

22.}

23.} catch (Exception e) {

24.e.printStackTrace();

25.}

26.}

27.

28.public static void main(String[] args) {

29.try {

30.RightTimerTask task = new RightTimerTask();

31.Timer timer = new Timer("TestTimer");

32.timer.scheduleAtFixedRate(task, 0, 1000);

33.} catch (Exception e) {

34.e.printStackTrace();

35.}

36.}

37.}

结果就是:异常也仍然抓住了,定时器也仍然可以继续工作,达到我们本来的目

的。

结论:使用java.util.Timer时候,在java.util.TimerTask的run()方法

中实现具体操作的时候,必须要抓住所有异常,尤其是RuntimeException,必

须要保证不能往外抛异常,才能保证跟预想的运行情况一致。

java定时器的应用举例。JAVA版本定时关机程序

这个程序写的很简单,前段时间一个小MM说:从网上下载很多定时关机器都不好用,让我推荐一个。我下载了一些,觉得是不太好。当时也无聊就应承说我帮你写一个吧,功能很简单。

于是java版的、粗糙的连界面都没有的定时关机器问世了。关机是利用java调用cmd 来实现的,其实如果可以采用添加计划任务的方式来实现更好。不废话,上代码

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

MyClock.java

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Scanner;

import java.util.Timer;

public class MyClock {

public String checkTime() throws ParseException{

System.out.println("请输入您要关机的时间,格式为mmddhhmm。例:

01271010 >>>.............");

Scanner sca=new Scanner(System.in);

String time=sca.next();

DateFormat df=new SimpleDateFormat("yyyyMMddHHmm");

Date date=df.parse("2010"+time);

//当输入时间在此刻之前或者是输入字符数不对的时候再次提醒输入

while(date.before(new Date())||!time.matches("\\d{8}")){

date=df.parse("2010"+time);

System.out.println("时间输入错误,请重新输入正确时间!");

time=sca.next();

}

return "2010"+time;

}

public static void main(String[] args) throws ParseException{

Timer timer=new Timer();

Date date=null;

DateFormat df=new SimpleDateFormat("yyyyMMddHHmmss");

MyClock m=new MyClock();

String str=m.checkTime()+"00";

date=df.parse(str);

System.out.println("关机时间输入成功,程序已经启动。请勿关闭窗口。"); timer.schedule(new MyTask(),date);

}

}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。MyTask.java 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

import java.io.*;

import java.util.TimerTask;

public class MyTask extends TimerTask {

@Override

public void run() {

try {

Process pro = Runtime.getRuntime().exec("cmd /c tsshutdn");

BufferedReader br = new BufferedReader(new InputStreamReader(pro .getInputStream()));

String msg = null;

while ((msg = br.readLine()) != null) {

System.out.println(msg);

}

} catch (IOException exception) {

}

this.cancel();

System.exit(0);

}

java定时器

好多朋友用过Windows的任务计划,也有不少程序迷自己曾写过时钟报警、系统自动关机等趣味程序,可却很少有朋友在Web工程中实现过类似功能。

当Web工程启动时,定时器能自动开始计时,在整个Web工程的生命期里,定时器能在每晚深夜触发一次任务。因此定时器的存放位置也值得考查,不能简单的存在于单个Servlet或JavaBean中,必须能让定时器宿主的存活期为整个Web

工程生命期,在工程启动时能自动加载运行。结合这两点,跟 Servlet上下文

有关的侦听器就最合适不过了,通过在工程的配置文件中加以合理配置,会在工程启动时自动运行,并在整个工程生命期中处于监听状态。

下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet

侦听器需要实现 javax.servlet.ServletContextListener接口,同时实现它的contextInitialized (ServletContextEvent event)和

contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。

我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器,示例代码如下所示:

import java.util.Timer;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServlet;

public class ContextListener

extends HttpServlet

implements ServletContextListener {

public ContextListener() {

}

private java.util.Timer timer = null;

public void contextInitialized(ServletContextEvent event) {

timer = new java.util.Timer(true);

event.getServletContext().log("定时器已启动");

timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000); event.getServletContext().log("已经添加任务调度表");

}

public void contextDestroyed(ServletContextEvent event) {

timer.cancel();

event.getServletContext().log("定时器销毁");

}

}

以上代码中, timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000)这一行为定时器调度语句,其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口),从

java.util.TimerTask继承,下面会重点讲述,第三个参数表示每小时(即

60*60*1000毫秒)被触发一次,中间参数0表示无延迟。其它代码相当简单,不再详细说明。

下面介绍MyTask的实现,上面的代码中看到了在构造MyTask时,传入了javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入,因此需要重载MyTask的构造函数(其父类java.util.TimerTask原构造函数是没有参数的)。在timer.schedule()的调度中,设置了每小时调度一次,因此如果想实现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量

C_SCHEDULE_HOUR表示(晚上12点,也即0点)。同时为防止24小时执行下来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置了当前是否正在执行的状态标志isRunning。示例代码如下所示:

import java.util.*;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServlet;

import javax.servlet.*;

public class MyTask extends TimerTask {

private static final int C_SCHEDULE_HOUR = 0;

private static boolean isRunning = false;

private ServletContext context = null;

public MyTask() {

}

public MyTask(ServletContext context) {

this.context = context;

}

public void run() {

Calendar cal = Calendar.getInstance();

if (!isRunning) {

if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {

isRunning = true;

context.log("开始执行指定任务");

//TODO 添加自定义的详细任务,以下只是示例

//系统定时接收邮件

Email email=new Email();

email.recieve();

isRunning = false;

context.log("指定任务执行结束");

}

}

else {

context.log("上一次任务执行还未结束");

}

}

}

到这儿,ServletContextListener和MyTask的代码都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中加入如下三行:

com.test.ContextListener

当然,上面的com.test得换成您自己的包名了。保存web.xml文件后,把工程打包部署到Tomcat中即可。任务会在每晚12点至凌晨1点之间被执行。

JAVA定时器使用

【1】Java 定时器(java.util.Timer)有定时触发计划任务的功能,通过配置定时器的间隔时间,在某一间隔时间段之后会自动有规律的调用预先所安排的计划任务(java.util.TimerTask)。与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。另外,由于我们希望当Web工程启动时,定时器能自动开始计时,在整个Web工程的生命期里,定时器能在每晚深夜触发一次报表计算引擎天等。因此定时器的存放位置也值得考查,不能简单的存在于单个Servlet或JavaBean中,必须能让定时器宿主的存活期为整个Web工程生命期,在工程启动时能自动加载运行。结合这两点,跟Servlet上下文有关的监听器就最合适不过了,通过在工程的配置文件中加以合理配置,会在工程启动时自动运行,并在整个工程生命期中处于监听状态。

下面就Servlet监听器结合Java 定时器来讲述整个实现过程。要运用

Servlet监听器需要实现javax.servlet.ServletContextListener接口,同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。

package com.korby.servlet;

import javax.servlet.*;

import javax.servlet.http.*;

import com.korby.pub.TimerManager;

/**

* 启动定时器的监听器

* @author korby

* @version 1.0

*/

public class TimerListener implements ServletContextListener {

private TimerManager tm = null;

public void contextInitialized(ServletContextEvent sce) {

int day,hour,min,sec;

day = 26; hour = 16; min = 42; sec = 0;

tm = new TimerManager(day,hour,min,sec);

}

public void contextDestroyed(ServletContextEvent sce) {

tm.destoryTimer();

}

}

package com.korby.pub;

import java.util.Timer;

import java.util.Date;

import java.util.Calendar;

/**

* 定时器

* @author korby

* @version 1.0

*/

public class TimerManager {

Timer t = null;

public TimerManager(int day,int hour,int min,int sec) {

time(day,hour,min,sec);

}

public void time(int day,int hour,int min,int sec){

Calendar c = Calendar.getInstance();

c.set(Calendar.DAY_OF_MONTH,day);

c.set(Calendar.HOUR_OF_DAY,hour);

c.set(Calendar.MINUTE,min);

c.set(Calendar.SECOND,sec);

Date date = c.getTime();

System.out.println(c.getTime());

t= new Timer();

MyTask mt = new MyTask();

t.schedule(mt, date);

}

public void destoryTimer(){

t.cancel();

}

}

package com.korby.pub;

import java.util.TimerTask;

/**

* 计划任务代码

* @author korby

* @version 1.0

*/

public class MyTask extends TimerTask{

public MyTask() { }

/**

* 任务块

*/

public void run() {

System.out.println("定时器RUN"); }

}

在web.xml中设置一个监听器:

com.korby.servlet.TimerListener

【2】 java.util.Timer

void cancel() 终止此计时器,丢弃所有当前已安排的任务。

int purge() 从此计时器的任务队列中移除所有已取消的任务。

void schedule(TimerTask task,Date time) 安排在指定的时间执行指定的任务。

void schedule(TimerTask task,Date firstTime, long period)安排指定的任务在指定的时间开始进行重复的固定延迟执行。

void schedule(TimerTask task,long delay) 安排在指定延迟后执行指定的任务。

void schedule(TimerTask task,long delay, long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。

void schedule(TimerTask task,long delay, long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。

void scheduleAtFixedRate(TimerTask task,long delay, long period)安排指定的任务在指定的延迟后开始进行重复的固定速率执行。

【3】java.util.TimerTask由 Timer 安排为一次执行或重复执行的任务。

boolean cancel() 取消此计时器任务。

abstract void run() 此计时器任务要执行的操作。

long scheduledExecutionTime() 返回此任务最近实际执行的已安排执行时间。

Java定时器状态错误:【https://www.360docs.net/doc/b410268732.html,ng.IllegalStateException: Timer already

cancelled.】

[10-3-5 13:14:41:729 CST] 1dd900b SystemErr R https://www.360docs.net/doc/b410268732.html,ng.IllegalStateException: Ti [10-3-5 13:14:41:731 CST] 1dd900b SystemErr R at java.util.Timer.sched(Timer.java [10-3-5 13:14:41:731 CST] 1dd900b SystemErr R at java.util.Timer.schedule(Timer.j [10-3-5 13:14:41:731 CST] 1dd900b SystemErr R at

com.yourcompany.businesscomponent.utils.TimerRetrieveDb2Data.main(TimerRetrieveDb2Dat [10-3-5 13:14:41:731 CST] 1dd900b SystemErr R at

com.yourcompany.businesscomponent.service.YourBusinessNameFromDb2Service.controlTimer [10-3-5 13:14:41:731 CST] 1dd900b SystemErr R at

com.yourcompany.businesscomponent.action.YourBusinessNameAction.controlInManual(YourB [10-3-5 13:14:41:731 CST] 1dd900b SystemErr R at sun.reflect.NativeMethodAccessor [10-3-5 13:14:41:731 CST] 1dd900b SystemErr R at sun.reflect.NativeMethodAccessor [10-3-5 13:14:41:732 CST] 1dd900b SystemErr R at

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [10-3-5 13:14:41:732 CST] 1dd900b SystemErr R at https://www.360docs.net/doc/b410268732.html,ng.reflect.Method.invoke( [10-3-5 13:14:41:732 CST] 1dd900b SystemErr R at org.apache.struts.actions.Dispat [10-3-5 13:14:41:732 CST] 1dd900b SystemErr R at org.apache.struts.actions.Dispat [10-3-5 13:14:41:732 CST] 1dd900b SystemErr R at

org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java: [10-3-5 13:14:41:732 CST] 1dd900b SystemErr R at org.apache.struts.action.Request [10-3-5 13:14:41:732 CST] 1dd900b SystemErr R at org.apache.struts.action.ActionS [10-3-5 13:14:41:733 CST] 1dd900b SystemErr R at org.apache.struts.action.ActionS [10-3-5 13:14:41:733 CST] 1dd900b SystemErr R at javax.servlet.http.HttpServlet.s [10-3-5 13:14:41:733 CST] 1dd900b SystemErr R at javax.servlet.http.HttpServlet.s [10-3-5 13:14:41:733 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance [10-3-5 13:14:41:733 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServle [10-3-5 13:14:41:733 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java: [10-3-5 13:14:41:733 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet [10-3-5 13:14:41:733 CST] 1dd900b SystemErr R at com.ibm.ws.webcontainer.servlet. [10-3-5 13:14:41:734 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletRefer [10-3-5 13:14:41:734 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceRefe [10-3-5 13:14:41:734 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppReq [10-3-5 13:14:41:734 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatch [10-3-5 13:14:41:734 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatche

[10-3-5 13:14:41:734 CST] 1dd900b SystemErr R at com.ibm.ws.webcontainer.srt.WebA [10-3-5 13:14:41:734 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:332 [10-3-5 13:14:41:734 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvo [10-3-5 13:14:41:734 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProce [10-3-5 13:14:41:735 CST] 1dd900b SystemErr R at

com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java:33 [10-3-5 13:14:41:735 CST] 1dd900b SystemErr R at com.ibm.ws.webcontainer.http.Htt [10-3-5 13:14:41:736 CST] 1dd900b SystemErr R at com.ibm.ws.http.HttpConnection.r [10-3-5 13:14:41:736 CST] 1dd900b SystemErr R at com.ibm.ws.http.HttpConnection.r [10-3-5 13:14:41:736 CST] 1dd900b SystemErr R at com.ibm.ws.util.ThreadPool$Worke ******************************

【问题分析】

如果定时器被执行cancel方法停止之后,再执行schedule()方法的话,会报此异常:【https://www.360docs.net/doc/b410268732.html, 【解决方案】

请检查生成Timer的对象的方式,如果要调用schedule()方法的话,Timer对象需要new一个出来在Timer的构造器中才会调用线程的start()方法。所以:如果你在Timer对象调用cancel()之后保证Timer的对象是new出来的。

WinCC 中定时器使用方法介绍

1、定时器功能介绍 2、脚本中定时器介绍 3、使用脚本实现更多定时器功能 3.1 整点归档 3.2 WinCC 项目激活时避免脚本初次执行及延迟执行脚本1 定时器功能介绍 WinCC 中定时器的使用可以使 WinCC按照指定的周期或者时间点去执行任务,比如周期执行变量归档、在指定的时间点执行全局脚本或条件满足时打印报表。WinCC 已经提供了一些简单的定时器,可以满足大部分定时功能。但是在有些情况下,WinCC 提供的定时器不能满足我们需求,这时我们就可以通过 WinCC 提供的脚本接口通过编程的方式实现定时的功能,因为脚本本身既可以直接调用 WinCC其他功能,比如报表打印,也可以通过中间变量来控制其他功能的执行,比如通过置位/复位归档控制变量来触发变量记录的执行。WinCC 提供了 C 脚本和 VBS 脚本,本文主要以全局 C 脚本编程为例介绍定时功能的实现。 2 脚本中定时器介绍既然在全局脚本中可以编程控制其他功能的执行,那么首先看看全局脚本的触发: 图1 脚本触发器分类如图1所示:脚本触发器分为使用定

时器和使用变量,定时器又分为周期执行和非周期执行一次,比如每分钟执行一次脚本属于周期执行,指定2012年10月1日执行一次属于非周期执行。使用变量触发脚本,即在变量发生变化时,脚本就执行一次,而变量的采集可以根据指定周期循环采集,或者根据变化采集,根据变化实际是1秒钟采集变量一次。 3使用脚本实现更多定时器功能 利用脚本自身的定时器,可以通过在脚本中编程的方式实现更多其它定时功能。 3.1整点归档 WinCC提供了变量归档,变量归档分为周期归档和非周期归档,不管是周期归档或非周期的归档,都又可以通过一些变量或脚本返回值来控制归档,比如:整点归档。下面的设置结合WinCC脚本,实现了在整点开始归档,归档五分种后停止归档,即每个小时仅归档前五分钟的数据。 软件环境:Windows 7 Professional Service Pack1 , WinCC V7.0 SP3 归档名称:ProcessValueArchive 归档变量:NewTag 归档周期:1 分钟 归档控制变量 startarchive C脚本触发周期:10秒 脚本代码: #include"apdefap.h" int gscAction( void ) { #pragma option(mbcs) #pragma code ("kernel32.dll");

555定时器的基本应用及使用方法

555定时器的基本应用及使用方法 我们知道,555电路在应用和工作方式上一般可归纳为3类。每类工作方式又有很多个不同的电路。在实际应用中,除了单一品种的电路外,还可组合出很多不同电路,如:多个单稳、多个双稳、单稳和无稳,双稳和无稳的组合等。这样一来,电路变的更加复杂。为了便于我们分析和识别电路,更好的理解555电路,这里我们这里按555电路的结构特点进行分类和归纳,把555电路分为3大类、8种、共18个单元电路。每个电路除画出它的标准图型,指出他们的结构特点或识别方法外,还给出了计算公式和他们的用途。方便大家识别、分析555电路。下面将分别 介绍这3类电路。 单稳类电路 单稳工作方式,它可分为3种。见图示。 第1种(图1)是人工启动单稳,又因为定时电阻定时电容位置不同而分为2个不同的单元,并分别以1.1.1 和1.1.2为代号。他们的输入端的形式,也就是电路的结构特点是: “RT-6.2-CT”和“CT-6.2-RT”。

第2种(图2)是脉冲启动型单稳,也可以分为2个不同的单元。他们的输入特点都是“RT-7.6-CT”,都是从2端输入。1.2.1电路的2端不带任何元件,具有最简单的形式;1.2.2电路则带 有一个RC微分电路。 第3种(图3)是压控振荡器。单稳型压控振荡器电路有很多,都比较复杂。为简单起见,我们只把它分为2个不同单元。不带任何辅助器件的电路为1.3.1;使用晶体管、运放放大器等辅助器件的电路为1.3.2。图中列出了2个常用电路。

双稳类电路 这里我们将对555双稳电路工作方式进行总结、归纳。 555双稳电路可分成2种。 第一种(见图1)是触发电路,有双端输入(2.1.1)和单端输入(2.1.2)2个单元。单端比较器(2.1.2)可以是6端固定,2段输入;也可是2端固定,6端输入。 第2种(见图2)是施密特触发电路,有最简单形式的(2.2.1)和输入端电阻调整偏置或在控制端(5)加控制电压VCT以改变阀值电压的(2.2.2)共2个单元电路。

定时器产品使用说明书

定时器产品使用说明书 定时设置: 1、先检查时钟是否与当前时间一致,如需重新校准,在按住“时钟”键的同时,分别按住“星期”、“小时”、“分钟”键,将时钟调到当前准确时间。 2、按一下“设定”键,显示屏左下方出现“1开”字样(表示第一次开启的时间)。然后按“星期”调整本次设定的星期组合模式,再按“小时”、“分钟”键,输入所需开启的时间。 3、再按一下“设定”键,显示屏左下方出现“1关”字样(表示第一次关闭时间),再按“星期”、“小时”、“分钟”键,输入所需关闭的日期和时间。 4、继续按动“设定”键,显示屏左下方将依次显示“2开、2关、3开、3关……16开、16关”,参考步骤2、3设置以后各次开关时间。设置完成后,按一下“时钟”键返回。 5、如果每天不需设置16组开关,则必须按“清除”键,将多余各组消除,使其显示屏上显示“—:—”图样(不是00:00)。 6、按“模式”键,可以变换工作模式。总共有四种工作模式:A、液晶显示开(代表进入常开模式);B、液晶显示关(代表进入常关模式);C、由开进入自动(表示目前状态为开,等到下一组时间到后开始自动运行);D、由关进入自动(表示目前状态为关,等到下一组定时时间到后开始自动运行)。 当出现以下情况时: 1、定时器没有根据设定的程序开启或关闭,请检查设置程序是否正确或重新调整。 2、定时器长时间不用,显示模糊时,请将定时器接通电源充足,10分钟后无显示,按“复位”键,2-3秒。 3、如以上步骤均不能排除问题,请与公司或经销商联系维修。 注意事项: 1、对于那些因定时开关出错而可能发生的生命相关事故或者对社会产生重大影响的设备(如医疗设备等),请不要使用定时开关。 2、对于那些因定时开关出错而发生重大财产损失的设备(大型加热器或冷库),在使用本定时开关时,请务必是特性和性能的数值有足够的余量,并采取二重电路等安全对策。 3、请勿自行修理、分解或改造。 4、接通电源后请勿接触端子部分。本开关工作在无潮湿、腐蚀及高金属含量气体环境中。请勿沾染油或水。

可编程定时器使用说明

可编程定时器使用说明 每天最多设定10组开关机,最少时间段为1分钟,最大(电流10A,可正常控制2200W电器工作,是现代家庭和办公的理想产品。 二:使用说明:(如果显示屏字迹不清晰,请先充电2小时以上) 1、键盘开锁:在时钟界面下,长按[取消/恢复]键3秒中以上。键盘开锁。在非时钟界面下,若30秒内未按任何键,会自动回到时钟界面,同时启动键盘锁。上锁后显示屏会有“”符号,解开后“”符号消失。 2、当前时间设定:键盘锁解除后,按住[时钟]键不放,同时按[星期]、[小时]、[分钟]键可调整星期和时钟; 3、程序设定:键盘锁解除后,按[定时]键进入定时状态。每按两次[定时]键时会进入下一组定时界面;若连续按[定时]键;1开、1关、2开、2关、、、、、、、10开、10关、时钟界面、1开、1关、2开、2关、、、、、、反复循环在定时设定界面,按[分钟]键可调整当次定时的分钟;在定时设定界面,按[小时]键可调整当次定时的小时;在定时设定界面,按[星期]键可调整当次定时的星期;在每一“开”或“关”设定界面时都有15种星期组合模式供选择,连续按[星期]键,显示如下 一二三四五六日、一、二、三、四、五、六、日、一三五、二四六、六日、一二三、四五六、一二三四五、一二三四五六、一二三四五六日、、、、、、反复循环; 用户根据控制需要可进行星期组合的选择。 在定时设定界面,按[取消/恢复]键时会将该组定时取消或恢复出来;在定时设定界面,按[时钟]键盘、时返回时钟状态; 4、开/自动/关:若连续[开/自动/关]键:

开、自动、关、自动、开、自动、、、、、、反复循环;有输出时,显示屏有灯符号和绿灯亮,无输出时,显示屏的灯符号消失和绿灯暗。只有“自动”状态时,程序内容才有效,红灯亮表示智能保姆插脚接通电源。 5、复位键:显示有任何异常,按一下背面的复位键,即可得到解决。

跑步计时器使用方法

随着人们越来越重视生活品质,对健康的要求也越来越高,现在很流行通过跑步来加强身体锻炼,因此跑步计时器开始在人们的生活中发挥着不可或缺的作用,或者说是扮演着重要的角色。在学生体育跑步考试,大型比赛等也离不开计时器。目前使用的计时器种类主要有跑步手表、跑步APP及跑步计时系统系统。 一、跑步手表 适用人群:个人日常锻练 使用方法:直接戴在手腕即可 跑步手表是跑步者一个常用的辅助工具,一般专业跑步表可以显示跑步的速度,距离,消耗卡路里,秒表,配合无线心率带还可以显示心率等信息帮助跑步者在运动中掌握自己的速度和体力分配达到最佳的练习目的。 跑步手表可以按照其运动传感器的类型分为三大类:计步手表,GPS 手表,心率手表。也有多种传感器结合的比如计步心率表, GPS 心率表, GPS 计步表。 二、跑步APP

适用人群:个人日常锻练 使用方法:下载到手机安装,锻炼时带上手机即可 运动类App是靠获取手机GPS定位信息之后,在App的地图上画出轨迹并计算出相关数据,计步是用一个传感器来感受你身体重心的变化,然后把它计作一步,再根据你设计的步长来换算成距离:距离=步数X步长 通过重力加速计感应,重力变化的方向,大小。与正常走路或跑步时的重力变化比对,达到一定相似度时认为是在走路或跑步。手机抖动达到比对,也会被认为是在走路或跑步,手机的重力感应不是那么的准确,计步也有偏差,个人对自己的步长知道的也不准确,导致这种计算距离的方式不是很准,这准方法的优点是不受环境限制,随时随地都能用。 三、跑步计时系统 适用人群:学校体育考试、大型跑步比赛

使用方法:安装在跑到上即可 电子发令器运动员起跑,令声响起时同步启动计时系统计时,通过RPSS激光检测系统,采用802.11WLAN规范和RF数据传输技术,通过WIFI 传输接收各跑道信息,记录实时成绩并将信息同步到显示器上,可使用有线或无线的方式从其他设备将姓名、组别等信息拷贝到平板电脑上。全自动智能短跑计时系统迈佳步由铝合金龙门架、激光感应器、高清显示器、中央控制主机、电子发令器、信息处理平板电脑六个部分组成,采用舞台钢架结构设计,安装于在道之上。 主要作用有1.统计运动员成绩:比赛结束后,计算机即统计出各运动员的起讫时刻、名次以及成绩,并打印成绩单;2.显示比赛实况:经过计算机处理后的信息,可以通过高清显示器、实时显示比赛成绩;3.储存比赛记录:由计算机记载的全部比赛记录。

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自动生成 }

科德定时器使用说明

科德定时器使用说明 [日期:2012-08-14] 来源:网络作者:林永菁[字体:大中小] 定时器可用于定时充电、定时热水器、定时煮饭、定时开关电热毯、定时饮水机、定时各种设备等,方便生活和工作。下面介绍科德定时器的功能及使用说明: 一、调整当前时间 使用定时器时,须先将定时器的显示时间调整到当前时间。 (一)按住“时钟”键的同时,分别按“星期”、“小时”、“分钟”键,调整到当前的时间。(每按一次增加一小时,长按可快速调整。) (二)按“时钟”键3秒后,当前时间增加1小时,同时液晶屏显示“夏令时”字样,进入夏令时功能,再按“时钟”键3秒,取消夏令时功能,时间自动减少1小时。 二、设置程序 (一)按“设定”键,即可进入定时模式设置,屏幕上显示“1开”。

(二)按“小时”、“分钟”和“星期”,即第一组定时开始工作的时间,其中,按“星期”键,可选择不同星期组合模式。可根据需求,定时器只在设定的星期数中工作。 (三)再按“设定”键,屏幕上显示“1关”,即第一组定时关闭时间,时间设置参考“1开”设置方法。以此类推,最多可设置20组开与关。 (四)设置完成后按“时钟”键返回当前时间。 注: 1. 如果每天不需要设定20组,而其他组已经设定,必须按“清除”键,将多余各组的时间程序清除。 2. 定时器设置完成后,应按“设定”键检查多次定时设定情况是否与实际情况一致。如有异,请按时间需要进行调整或重新设定。 三、定时器工作模式选择 (一)在当前时间状况下,连续按“模式”键,显示屏的左侧将循环显示“自动关”、“开”、“自动开”、“关”四种模式,你根据需要进行模式选择。 (二)四种模式释意:“开”:定时器一直有电源输出,没有定时功能;“关”:定时器无电源输出,呈关闭状态;“自动开”:定时器接通电源时有电源输出,之后按设定的程序工作;“自动关”:定时器接通电源时无电源输出,之后按设定的程序工作。 注: 1. 以当前的时间为标准,当前时间处在设定时间段中间,选择“自动开”的模式;当前时间处在设定时间段之前或之后,选择“自动关”的模式。

定时器说明书

科德定时器的功能及使用说明 一、调整当前时间 使用定时器时,须先将定时器的显示时间调整到当前时间。 1、按住“时钟”键的同时,分别按“星期”、“小时”、“分钟”键,调整到当前的时间。(每按一次增加一小时,长按可快速调整)。 2、按“时钟”键3秒后,当前时间增加1小时,同时液晶屏显示“夏令时”字样,进入夏令时功能,再按“时钟”键3秒,取消夏令时功能,时间自动减少1小时。 二、设置程序 1、按“设定”键,即可进入定时模式设置,屏幕上显示“1开”。 2、按“小时”、“分钟”和“星期”,即第一组定时开始工作的时间,其中,按“星期”键,可选择不同星期组合模式。可根据需求,定时器只在设定的星期数中工作。 3、再按“设定”键,屏幕上显示“1关”,即第一组定时关闭时间,时间设置参考“1开”设置方法。以此类推,最多可设置20组开与关。 4、设置完成后按“时钟”键返回当前时间。 注:(1)如果每天不需要设定20组,而其他组已经设定,必须按“清除”键,将多余各组的时间程序清除。 (2)定时器设置完成后,应按“设定”键检查多次定时设定情况是否与实际情况一致。如有异,请按时间需要进行调整或重新设定。 三、定时器工作模式选择 1、在当前时间状况下,连续按“模式”键,显示屏的左侧将循环显示“自动关”、“开”、“自动开”、“关”四种模式,你根据需要进行模式选择。 2、四种模式释意:“开”:定时器一直有电源输出,没有定时功能;“关”:定时器无电源输出,呈关闭状态;“自动开”:定时器接通电源时有电源输出,之后按设定的程序工作;“自动关”:定时器接通电源时无电源输出,之后按设定的程序工作。 注:(1)以当前的时间为标准,当前时间处在设定时间段中间,选择“自动开”的模式;当前时间处在设定时间段之前或之后,选择“自动关”的模式。 (2)程序设定后即使断电也不会丢失,因为定时器本身就有一个可充电电池在里面,具有保存数据的功能。

定时器说明书

定时器-NHR-2100系列数显定时器 使用说明书 一、产品介绍 定时器-NHR-2100系列数显定时器采用全自动贴片封装工艺,具有很强的抗干扰能力。六位LED数码显示,显示范围宽。带多种输出功能:定时报警控制、计时报警控制、485/232通讯、200mS脉宽输出等,计时功能可带按键启动、停止、清零功能,并可选外接按钮。功能强大,适用于各种场合。 三、仪表面板 1)面板指示: PV:显示测量值;在参数设定状态下,显示参数 符号和参数值 A/T:定时功能时PV显示当前时间时分秒, 指示灯亮;计时功能时PV显示累计时间时分秒, 指示灯亮。 B/D:定时功能时PV显示年月日,指示灯亮 AL1:报警指示灯 AL2:备用 Hz:备用 C:备用 T:计时器、定时器指示灯亮 注:外形尺寸为96*48mm时,无Hz、C、T指示灯。

四、参数设置 1)菜单设置 ★注: 选择计时功能时,参数“T1”和“T2”、“T3”无效,并且进入菜单设置时不显示“T1”和“T2”、“T3”。 选择定时功能时,参数“A-MODE”,并且进入菜单设置时不显示“A-MODE”。 2)参数设置(以更改通讯地址为例)

3)参数说明 A 、通讯设置参数说明: B、功能设置参数说明:

注:选择计时功能时,参数“T1”和“T2”、“T3”无效,并且进入菜单设置时不显示“T1”和“T2”、“T3”。选择定时功能时,参数“A-MODE ”无效,并且进入菜单设置时不显示“A-MODE ” ,默认定时时间到就报警。 五、仪表接线图 注:不同外型仪表后盖接线端子的方向不一样,见示意图 六、仪表选型 NHR-2100□-□ X /□1/□/□X -□ 定时器① ②③ ④⑤ ⑥

WinCC中定时器使用方法介绍

WinCC中定时器使用方法介绍 1定时器功能介绍 WinCC中定时器的使用可以使WinCC按照指定的周期或者时间点去执行任务,比如周期执行变量归档、在指定的时间点执行全局脚本或条件满足时打印报表。WinCC已经提供了一些简单的定时器,可以满足大部分定时功能。但是在有些情况下,WinCC 提供的定时器不能满足我们需求,这时我们就可以通过 WinCC 提供的脚本接口通过编程的方式实现定时的功能,因为脚本本身既可以直接调用WinCC其他功能,比如报表打印,也可以通过中间变量来控制其他功能的执行,比如通过置位/复位归档控制变量来触发变量记录的执行。WinCC 提供了C 脚本和VBS脚本,本文主要以全局 C 脚本编程为例介绍定时功能的实现。 2脚本中定时器介绍 既然在全局脚本中可以编程控制其他功能的执行,那么首先看看全局脚本的触发: 图1 脚本触发器分类 如图1所示:脚本触发器分为使用定时器和使用变量,定时器又分为周期执行和非周期执行一次,比如每分钟执行一次脚本属于周期执行,指定2012年10月1日执行一次属于非周期执行。使用变量触发脚本,即在变量发生变化时,脚本就执行一次,而变量的采集可以根据指定周期循环采集,或者根据变化采集,根据变化实际是1秒钟采集变量一次。

3使用脚本实现更多定时器功能 利用脚本自身的定时器,可以通过在脚本中编程的方式实现更多其它定时功能。 整点归档 WinCC提供了变量归档,变量归档分为周期归档和非周期归档,不管是周期归档或非周期的归档,都又可以通过一些变量或脚本返回值来控制归档,比如:整点归档。下面的设置结合WinCC脚本,实现了在整点开始归档,归档五分种后停止归档,即每个小时仅归档前五分钟的数据。 软件环境:Windows 7 Professional Service Pack1 , WinCC SP3 归档名称:ProcessValueArchive 归档变量:NewTag 归档周期:1 分钟 归档控制变量 startarchive C脚本触发周期:10秒 脚本代码: #include "" int gscAction( void ) { #pragma option(mbcs) #pragma code (""); void GetLocalTime (SYSTEMTIME* lpst); #pragma code(); SYSTEMTIME time; int t1; GetLocalTime(&time); t1=; if(t1==00) { SetTagBit("startarchive",1); }

【学习心得】关于定时器中断的使用

【学习心得】关于定时器中断的使用 看了这么久,第一次发帖,做点贡献。 最近了解了一下Arduino 的中断,除了外部中断外,还有定时器中断,前面已经有大神介绍过中断的概念,这里就不详细介绍了。 下面的程序是用定时器中断让13引脚led灯每500ms变化一次。(使用的库在帖子底端)ARDUINO 代码 // led灯接UNO的13管脚 #include //定时器库的头文件 void flash() //中断处理函数,改变灯的状态 { static boolean output = HIGH; digitalWrite(13, output); output = !output; } void setup() { pinMode(13, OUTPUT); MsTimer2::set(500, flash); // 中断设置函数,每500ms 进入一次中断 MsTimer2::start(); //开始计时 } void loop() { } 再提供一种方法,利用mills()同样函数可以实现中断的功能。mills()函数功能是获取系统运行的时间长度,单位ms。最大为9小时22分,如果超出时间将从0开始。函数的返回值为unsigned long型。 下面程序的功能让led灯亮灭各500ms : ARDUINO 代码 unsigned long ledOn=500,ledOff=500; //定义led灯变化的时间长度,每500ms变化一次 int ledStatus; //定义LED灯的状态,HIGH or LOWm void setup() { pinMode(13,OUTPUT); digitalWrite(13,HIGH); ledStatus=HIGH; } void loop()

51单片机定时器设置

51单片机定时器设置入门(STC89C52RC) STC单片机定时器设置 STC单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个: 1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文缩写的原形。 2. 尽量用形像的方法记忆 比如TCON和TMOD两个寄存器各位上的功能,教程一般有个图表,你就在学习中不断回忆那个图表的形像 TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) 定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 其格式为: 其中低四位定义定时器/计数器C/T0,高四位定义定时器/计数器C/T1,各位的说明: GA TE——门控制。 GA TE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。 当INT0引脚为高电平时TR0置位,启动定时器T0; 当INT1引脚为高电平时TR1置位,启动定时器T1。 GA TE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。 C/T——功能选择位 C/T=0时为定时功能,C/T=1时为计数功能。 置位时选择计数功能,清零时选择定时功能。

M0、M1——方式选择功能 由于有2位,因此有4种工作方式: M1M0 工作方式计数器模式TMOD(设置定时器模式) 0 0 方式0 13位计数器TMOD=0x00 0 1 方式1 16位计数器TMOD=0x01 1 0 方式 2 自动重装8位计数器TMOD=0x02 1 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器TMOD=0x03 单片机定时器0设置为工作方式1为TMOD=0x01 这里我们一定要知道,TMOD的T是TIMER/COUNTER的意思,MOD是MODE的意思。至于每位上的功能,你只要记住图表,并知道每个英文缩写的原型就可以了。 在程序中用到TMOD时,先立即回忆图表,并根据缩写的单词原形理出每位的意义,如果意义不是很清楚,就查下手册,几次下来,TMOD的图表就已经在脑子里了。 8位GA TE位,本身是门的意思。 7位C/T Counter/Timer 6位M1 Mode 1 5位M0 Mode 0 TCON: 定时器/计数器控制寄存器(TIMER/COUNTER CONTROL REGISTER) TMOD分成2段,TCON控制更加精细,分成四段,在本文中只要用到高四段。 TF0(TF1)——计数溢出标志位,当计数器计数溢出时,该位置1。 TR0(TR1)——定时器运行控制位 当TR0(TR1)=0 停止定时器/计数器工作 当TR0(TR1)=1 启动定时器/计数器工作 IE0(IE1)——外中断请求标志位 当CPU采样到P3.2(P3.3)出现有效中断请求时,此位由硬件置1。在中断响应完成后转向中断服务时,再由硬件自动清0。 IT0(IT1)——外中断请求信号方式控制位 当IT0(IT1)=1 脉冲方式(后沿负跳有效) 当IT0(IT1)=0 电平方式(低电平有效)此位由软件置1或清0。 TF0(TF1)——计数溢出标志位

定时器工作原理及应用引脚图

555定时器 摘要:555定时器是一种多用途的数字——模拟混合集成电路,利用它能极方便地构成施密特触发器、单稳态触发器和多谐振荡器。由于使用灵活、方便,所以555定时器在波形的产生与交换、测量与控制、家用电器、电子玩具等许多领域中都得到了广泛应用。本文主要介绍了555定时器的工作原理及其在单稳态触发器、多谐振荡器方面的应用。 关键词:数字——模拟混合集成电路;施密特触发器;波形的产生与交换 555芯片引脚图及引脚描述 555的8脚是集成电路工作电压输入端,电压为5~18V,以UCC表示;从分压器上看出,上比较器A1的5脚接在R1和R2之间,所以5脚的电压固定在2UCC/3上;下比较器A2接在R2与R3之间,A2的同相输入端电位被固定在UCC/3上。 1脚为地。2脚为触发输入端;3脚为输出端,输出的电平状态受触发器控制,而触发器受上比较器6脚和下比较器2脚的控制。 当触发器接受上比较器A1从R脚输入的高电平时,触发器被置于复位状态,3脚输出低电平; 2脚和6脚是互补的,2脚只对低电平起作用,高电平对它不起作用,即电压小于1Ucc/3,此时3脚输出高电平。6脚为阈值端,只对高电平起作用,低电平对它不起作用,即输入电压大于2 Ucc/3,称高触发端,3脚输出低电平,但有一个先决条件,即2脚电位必须大于1Ucc/3时才有效。3脚在高电位接近电源电压Ucc,输出电流最大可打200mA。 4脚是复位端,当4脚电位小于0.4V时,不管2、6脚状态如何,输出端3脚都输出低电平。 5脚是控制端。 7脚称放电端,与3脚输出同步,输出电平一致,但7脚并不输出电流,所以3脚称为实高(或低)、7脚称为虚高。

定时器使用说明

1、检查时钟显示是否与当前时间一致。 操作方法:手动按“时钟”按键,液晶显示屏显示当前时间(星期、时、分、秒)。若显示时间与实际不一致时,则需要重新设置。 设置方法: (1)手动按“校星期”按键,显示屏显示星期位置会依次出现一、二、三、…、一二三四五六日等多种选项,用户可根据自身需要选择时控器星期几动作。设置完成后手动按“时钟”按键,回到时钟显示界面。 (2)手动按“校时”按键可对时钟小时进行设置,时钟设置为24时制。设置完成后手动按“时钟”按键,回到时钟显示界面。 (3)手动按“校分”按键可对时钟分钟进行设置。设置完成后手动按“时钟”按键,回到时钟显示界面。 2、定时设置 (1)开启时间设置:手动按“定时”键,显示屏左下方出现“1开”

字样(表示第一次开启时间)。再分别按“校时”、“校分”键,输入所需照明开启的时间。 (2)关闭时间设置:手动按“定时”键,显示屏左下方出现“1关”字样(表示第一关闭时间) 。再分别按“校时”、“校分”键,输入所 需照明关闭的时间。 (3)定时开、关的时间设置完成后,在时钟显示状态下按“定时设置自动/手动”键,将显示下方的“”符号调到“自动”位置。此时,时控开关才能根据所设定的时间自动开、关电路。如在使用过程中需要临时开、关电路,则只需按“自动/手动”键将“”符号调 到相应的“开”或“关”的位置,立即可实现照明的开启和关闭操作。(4)连续按下“定时”键,显示屏左下方将依次显示“2开、2关、3开、3关、……、16开、16关”(型号不同控制点数也不一样,但操作方法相同),具体可参考上述两步骤进行设置(注:实际只用一对控制点数,即1开、1关。如不需所有的控制点数,则需要将其它不用控制点数的显示界面按“取消/恢复”键,将多余各组的时间消除,使其在显示屏上显示为“- -:- -”状态;不是显示为00:00)。设置完成后手动按“时钟”按键,回到时钟显示界面。

24小时程控定时器使用说明书

24小时程控定时器使用说明书 1概述 24小时程控定时器是一种能定时。带有程序控制电源通断的装置。能在24小时内,预先设定控制时间范围,从而有效地控制用电器具的开启和关闭。 2技术数据 电源AC220V50HZ 最大负载电流:10A 定时范围;15min-23h45min 最小设定单位:15mim 开关控制数最大48次工作方式:连续工作制 3工作原理与特点 程控器系用同步电机驱动齿轮减速,实现24小时转一圈,由定时插片处于上,下的不同位置,控制定时器内微动开关的接通或断开,从而达到控制用电器具的电源自动开启和关闭。与一般的定时器不一样了!对家用电器的使用有极大的安全性,本产品体积小,使用方便。 4控制开关功能 控制开关"ON"和"T"二个位置,当往上拨时,置于"ON"位置时,指示灯常亮,此时定时功能丧失,电器用具不受控制。当控制开关往下拨时置于"T"位置时,定时器的功能恢复了。 5使用方法 1设定定时范围,根据你的需要,何时接通被控电器就将此时此刻的刻度圈下方的定时插片按下,按下一个定时插片,定时范围为15min;按下二个插片,定时范围为30min;依次类推。 2插上电源往顺时针方向旋转把现在的时间对准当箭头上。就OK了 注:1定时插片必须上下按到位。 2用电器具的功l率不得超过规定值。 3每次插上定时器需对好现在时间。 例如:现在是上午9:00钟,我想在下午16:00钟煮饭大约煮30分钟。我在16:00—16:30之间的定时插片按下两片.插上电源往顺时针方向旋转,箭头对准9:00钟就好了。

程序控制定时器(以下简称:程控定时器)由北京多维精控计算机技术开发中心研制成功,具有多项专利技术。本产品是通用的程序控制定时器,具有多路设置灵活的定时器。设置时无需编程,也不需要类似可编程控制器(PLC)那样设计梯形图,而是采用填表设置的方法代替繁琐的编程工作,操作使用非常方便,被称为:无需编程的“PLC”。在实际应用中只要知道所控制设备的工作原理、需要达到的功能、如何让设备动作或运行,而进行简单的填表设置操作,即可快速实现所需的应用功能,达到程序控制设备或电器自动运行的目的。具有操作便捷、简单易用的特点,显著降低应用过程的难度及周期。 一、主要特点: 1、表格设置、无需编程,人人都会使用。 2、操作便捷、简单实用,易于普及推广应用。 3、提供为用户编制专用程序的服务。 4、安装方便,具有安装固定孔和导轨固定两种方式。 5、多路I/O输入输出,基本型8路输入/8路输出。

单片机定时器实验

实验三单片机内部定时器应用实验目的 1、理解单片机内部定时器的工作原理及使用方法 2、了解单片机定时中断程序的编写和调试方法 3、掌握定时器的基本使用方法 实验仪器 单片机开发板、万利仿真机、稳压电源、计算机 实验原理 1、单片机定时器的工原理 MCS-51 单片机内部有两个16 位可编程的定时器/计数器T0 和T1。它们即可用作定时器方式,又可用作计数器方式。其中T0 由TH0 和TL0 计数器构成;T1 由TH1 和TL1 计数器构成。 工作于定时器方式时,通过对机器周期(新型51单片机可以对振荡周期计数)的计数,即每一个机器周期定时器加1,来实现定时。故系统晶振频率直接影响定时时间。如果晶振频率为12MHZ,则定时器每隔(1/12MHZ)×12=1us 加1。 工作于计数器方式时,对或管脚的负跳变(1→0)计数。它在每个机器周期的S5P2 时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,计数器加1。因此需要两个机器周期来识别一个有效跳变,故最高计数频率为晶振频率的1/24。 特殊功能寄存器TMOD 用于定时器/计数器的方式控制。高4 位用于设置T1,低4 位用于设置T0。如图4-7所示。 图4-7 定时器模式控制字格式

TCON 寄存器用于定时器的计数控制和中断标志。如图4-8所示。 图4-8 定时控制寄存器数据格式 编写程序控制这两个寄存器就可以控制定时器的运行方式。 单片机内部定时器/计数器的使用,简而概之:(1)如需用中断,则将EA和相关中断控制位置1;(2)根据需要设置工作方式,即对TMOD设置;(3)然后启动计数,即对TR0或TR1置1。(4)如使用中断,则计数溢出后硬件会自动转入中断入口地址;如使用查询,则必须对溢出中断标志位TF0或TF1进行判断。 2、用定时器编写一个秒计时器 假设系统使用的晶振频率为12MH Z ,即每个机器周期为1us。如使用方式1,则定时时间最长是216×1us=65536us=,小于1s。故必须设置一个软件计数单元,即假设定时器定时中断时间为50ms,则必须定时中断20次才达到1s并对秒计时单元加1,20即为软件计数次数。最后再把秒计时单元的值转成显示数码送显示缓冲区。 图4-9 dispbuf: ds 8;显示缓冲区timetick: ds 1

定时器使用说明

定时器使用说明 一、各功能键作用 校星期――调整星期 校时――调整小时 校分――调整分钟 定时――设置定时开关键 时钟――设置正常时间 复位――清除所有设置 清除――只起到清除定时设置不动作的功能,指删除1-14组中所设置的任一组(一组包括开和关,例:第二组设置为11:02开、11:03关,如果清除11:02,同时也会将11:03清除,恢复刚才清除,再按一下清除键即可,恢复后这一组定时会执行动作) 随机――设置的定时开关由电脑决定动作与不动作 开/关――切换接通状态(直接按该键即可切换):MANUAL ON为常开; AUTO为自动;即定时设定起作用; MANUAL OFF为常关 指示灯:电源――电源状态指示灯 接通――定时开关状态指示灯 二、星期设置――按“时钟”键不放开,再按“星期”键可切换星期一至星期日。 三、北京时间设置――按“时钟”键不放开,再按“校时”设定小时;按“校分”设定分钟。每次分钟更改后,秒钟重新从0开始计时。(注意:北京时间设置应在星期设置好后再设置)。 四、定时设置――按“定时”键进入定时模式,如图1所示,再按“校星期”键设定星期,共有10组不同的星期设定(如下所示)①一、二、三、四、五、六、日,单独一天即每一星期只执行一天;②一、二、三、四、五、六、日;③一、二、三、四、五;④六、日;⑤一、 二、三、四、五、六;⑥一、三、五;⑦二、四、六;⑧一、二、三;⑨四、五、六;⑩一、 三、五、日。例1:如设定在24小时内开关并且以此设定为每天循环,那么选择星期组第②(也就是每天都重复循环执行所设定开关);例2:如设定只须在星期六和星期日起作用,则选择第④;例3:如只选择星期一执行所设定开关,那么每一星期就只执行这一天,则选择第①组。星期设置好后,按“校时”键设定小时,按“校分”键设定分钟。总共有14组定时开关,即28个开(ON)和关(OFF),第一组中的开(ON)设定好后继续按“定时”键进入第一组的关(OFF)如图2所示,设定好后,再按“定时”键进入第二组进行设置,以此类推,重复以上操作进行设置。(注意:北京时间及定时设定后,若要定时设定起作用需按“开/关”键选择“AUTO”按一下“开/关”键,显示将从“AUTO”跳到“MANUAL OFF”,再按一下“开/关”键,则重新跳回“AUTO”,这时接通指示灯应不亮,这样设置的定时便起作用。如果再按一下“开/关”键则会跳到“MANUAL ON”状态,而再按一下回到“AUTO”,这时接通指示灯正常点亮,则电脑会默认为常开状态,只起到定时关作用)。 五、 12小时、24小时、夏令制设定 AM和PM均为12小时制:按“时钟”键不放开,再按“定时”键可选择AM或PM,不设定12小时制则为24小时制。 夏令制设定(SUMMER):按“时钟”键不放,再按“开/关”键(夏令制时间快北京时间1小时)。 注意:后壳两粒在断电时供储存显示时间的小电池安装均为负极向上,中间有一小弹簧是起到接地作用(接负极),切不可不装(在拆装时应多加注意勿失)。 注意:显示出现错乱或无显示不能操作,按复位键即可。 注意:定时器尽量插在电源上,如确实需要拔下来,请将“开/关”切换到“MANUAL OFF”。

相关文档
最新文档