c++定时器
C语言电子教案-2.2定时器
0 1 1 0
方式1 方式2
1 1
方式3
3.控制寄存器
(2) T/C方式控制寄存器TMOD 例如:设定定时器1为定时工作方式,要求软件启动定 时器1按方式2工作。定时器0为计数方式,要求由软件启 动定时器0,按方式1工作。
定时器1 为定时工 作方式 定时器1 软件启动 D6 C/T=0 D7 GATE=0 D5D4 M1M0=10 定时器0 为计数方 式 定时器0 软件启动 D2 C/T=1 D3 GATE=0 D1D0 M1M0=01
6.T/C的综合应用 (2)计数器应用
5.T/C的中断设置
C51提供的中断函数格式:
void 函数名( ) interrupt n [using m] { 语句组; } 其中n 对应中断源的编号,以AT89S51单片机为例, 编号从0~3,分别对应外中断0、定时器0溢出中断、外中 断1和定时器1溢出中断。 当采用方式0、1、3时,只要不关闭定时/计数器,那 么每当计数器0溢出时,都需要在中断函数中重新装入计 数初值,以保证计数值不变。
4.T/C的初始化 (2) 计数初值的计算
计数器的初值计算 方式0 :13位计数器最大计数值 M=213=8192; 方式1 :16位计数器最大计数值 M=216=65536; 方式2 :8位计数器最大计数值 M=28=256; 若要求计数X个外部脉冲后计数器溢出,则计数初值C的求法: 因为 C+X=M,
TCON
D7
D6 TR1 8EH
D5 TF0 8DH
D4 TR0 8CH
D3 IE1 8BH
D2 IT1 8AH
D1 IE0 89H
D0 IT0 88H
定时计数器详解
mcs-51单片机计数器定时器详解【1】80C51单片机内部设有两个16位的可编程定时器/计数器。
可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。
在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。
:从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。
其访问地址依次为8AH-8DH。
每个寄存器均可单独访问。
这些寄存器是用于存放定时或计数初值的。
此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。
这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。
TMOD主要是用于选定定时器的工作方式;TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。
当定时器工作在计数方式时,外部事件通过引脚T0(P3.4)和T1(P3.5)输入。
定时计数器的原理:16位的定时器/计数器实质上就是一个加1计数器,其控制电路受软件控制、切换。
当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。
显然,定时器的定时时间与系统的振荡频率有关。
因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。
如果晶振为12MHz,则计数周期为:T=1/(12×106)Hz×1/12=1μs这是最短的定时周期。
若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长度(如8位、13位、16位等)。
当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。
计数器在每个机器周期的S5P2期间采样引脚输入电平。
若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。
c 标准库 定时器
c 标准库定时器C 标准库定时器。
在C语言中,定时器是一种非常重要的功能,它可以帮助我们在程序中实现定时执行某些操作的功能。
在C标准库中,定时器的使用可以通过一些函数来实现,本文将介绍C标准库中定时器的基本概念和使用方法。
首先,我们需要包含头文件<time.h>来使用C标准库中的定时器函数。
在<time.h>中,定义了一些与时间相关的函数和数据类型,其中包括了定时器的相关函数。
在使用定时器之前,我们需要了解一些与时间相关的数据类型和函数。
在C标准库中,时间的表示通常使用time_t类型来表示,它是一个长整型的数据类型,用来表示从某个固定时间点(通常是1970年1月1日)到当前时间的秒数。
而定时器的使用通常需要用到time_t类型来表示时间。
除了time_t类型之外,我们还需要了解tm结构体,它用来表示一个时间的各个组成部分,包括年、月、日、时、分、秒等。
在C标准库中,获取当前时间的函数是time(),它返回当前时间的秒数,可以用time_t类型来接收。
而将时间转换为tm结构体的函数是localtime(),它可以将time_t类型的时间转换为tm结构体类型的时间。
这些函数在使用定时器时非常重要,因为我们通常需要获取当前时间来进行定时器的设置和判断。
在C标准库中,实现定时器的函数是alarm(),它用来设置一个定时器,当定时器时间到达时,会向程序发送一个SIGALRM信号。
我们可以在程序中捕获这个信号,并在信号处理函数中实现定时器到达时需要执行的操作。
使用alarm()函数时,我们需要传入一个整数参数,表示定时器的时间间隔,单位为秒。
当程序运行到设置定时器的位置时,定时器就开始计时,当时间间隔到达时,程序就会收到SIGALRM信号。
除了alarm()函数之外,在C标准库中还提供了一些与定时器相关的函数,比如sleep()函数,它可以让程序休眠一段时间,单位也是秒。
另外,还有setitimer()函数,它可以设置一个精确的定时器,可以用来实现一些需要高精度定时的操作。
c标准库定时器函数
C标准库定时器函数==========在C标准库中,定时器函数提供了一种在特定时间间隔后触发事件或者在某个时间点执行特定任务的能力。
以下是一些主要的C标准库定时器函数及其功能:1. 创建/删除定时器-----------* `timer_create`:此函数用于创建一个新的定时器。
它需要一个`timer_t`类型的变量来存储定时器的标识符,一个`struct sigevent`结构体来指定定时器的回调函数和参数,以及一个`timer_attr_t`类型的变量来指定定时器的属性。
* `timer_delete`:此函数用于删除一个已创建的定时器。
它需要一个`timer_t`类型的变量来存储定时器的标识符。
2. 定时器控制--------* `timer_settime`:此函数用于设置定时器的运行参数,包括定时器的标识符、定时器类型(周期性或单次)、回调函数、回调函数的参数、初试时间、间隔时间等。
* `timer_gettime`:此函数用于获取定时器的当前状态,包括定时器的标识符、当前时间、剩余时间等。
3. 定时器回调--------* `timer_cb`:此函数是定时器的回调函数,它会在定时器触发时被调用。
在回调函数中,您可以执行任何需要在特定时间执行的任务。
4. 定时器状态获取----------* `timer_status`:此函数用于获取定时器的状态,包括定时器的标识符、当前时间、剩余时间、状态标志等。
这些函数的使用需要结合具体的程序设计和需求来进行。
使用这些函数时需要注意错误处理和异常情况的处理,以确保程序的稳定性和可靠性。
c语言 定时器算法
c语言定时器算法一、概述定时器算法是一种常用的计算机编程技术,用于在特定的时间间隔内执行特定的任务。
在C语言中,可以使用定时器算法来实现定时任务、倒计时、延时等功能。
本文档将介绍C语言中常用的定时器算法,包括定时器的基本概念、定时器的实现方式以及定时器的应用场景。
二、基本概念定时器是一种用于控制时间间隔的设备或技术。
在计算机编程中,定时器通常用于在特定的时间间隔内执行特定的任务。
定时器的精度和范围取决于所使用的硬件和软件实现。
三、实现方式C语言中实现定时器的方式有多种,其中常见的方法包括:1.查询式定时器:通过查询定时器标志位的方式来实现定时器功能。
这种方式简单易行,但是精度较低,不适合需要高精度的应用场景。
2.滴答定时器:操作系统通常会提供滴答定时器,可以自动计算时间间隔并执行相应的任务。
这种方式精度较高,但是需要操作系统支持。
3.循环延时:通过循环语句来实现延时功能,通过控制循环次数来控制时间间隔。
这种方式简单易行,但是延时精度和范围有限。
4.信号量+循环延时:使用信号量来控制定时器的执行次数,通过循环延时来实现定时功能。
这种方式精度较高,适用于需要精确控制时间间隔的应用场景。
四、应用场景定时器算法在许多应用场景中都有应用,例如:1.游戏计时器:在游戏中使用定时器算法可以精确控制游戏时间,实现倒计时、时间流逝等功能。
2.定时任务:通过定时器可以实现定时执行任务的功能,例如每天自动备份数据、定期清理过期文件等。
3.延时控制:在需要精确控制时间间隔的场合,如数字信号处理、通信协议等,可以使用定时器算法来实现。
4.程序调试:在调试程序时,可以使用定时器来控制程序的执行过程,观察程序的运行状态和结果。
五、代码示例以下是一个简单的C语言代码示例,使用循环延时来实现一个定时器:```c#include<stdio.h>#include<stdlib.h>#include<unistd.h>//用于循环延时函数sleep()intmain(){intcount=10;//定时时间间隔,单位为秒while(count>0){printf("Timer:%dsecondsremaining\n",count);sleep(1);//控制时间间隔为1秒的延时函数count--;}printf("Timerfinished\n");return0;}```六、总结C语言中的定时器算法是一种常用的计算机编程技术,可以用于实现定时任务、倒计时、延时等功能。
C语言使用定时器的方法控制LED灯以1S的速度闪亮
C语言使用定时器的方法控制LED灯以1S的速度闪亮最近因为赶不上提高班的进度,老师给的教程总是断断续续的,所以我打算跟11月1号通过考试的网友们一起学习,呵呵,这也是我一教训来着,在三维里学习要坚持一步一个脚印,坚持必有奇迹,但也要跟得上大家,以后再忙也要努力实现计划了,不能再像这次一样,因为所谓的考试落下了好几堂课,不过也没有关系,能够吸取点教训总是好的。
我可以先给自己点时间多学些其它的基础知识。
今天开始学单片机的计数器了,呵呵,可能是一直因为用C语言编程序我定时老是定不准的原因,当得知学会定时/计数器后可以让单片机C语言定时准确后,我感觉学它真的很有动力,虽然编一个简单的程序也花了我好长时间,但编出来的感觉却是那么的爽快,我觉得要学会定时/计数器,关键是要学会编程控制 TCOM,TMOD,及TH和TL吧。
主要是TH和TL的准确运算。
还有就是完时以后怎么样让其跟循环语句配合使用。
今天所编的程序是利用单片机定时器控制LED灯以1S 的速度闪烁,我的晶振是12MHZ的,首先是让计时器0.02S进行一次溢出,使TF1=1,其次是利用I++循环50次,加起来为1S。
程序如下: #include;sbit LED = P1^2;void main(){unsigned char i;TMOD |= 0x10;TMOD &= 0xdf;TH1 = 0xb1;TL1 = 0xdf;TCON |= 0x40;while(1){if(TF1==1){TF1 = 0;TH1 = 0xb1;TL1 = 0xdf;i++;if(i==50){i=0;LED=~LED;}}}}。
定时器中断C语言程序
方式 0 为 13 位的 T/C,由 TH 的高 8 位,TL 的低 5 位的计数值,满计数值 213,但启动前可以预置 计数初值. 若 T/C 开中断(ET=1)且 CPU 开中断(EA=1)时,则定时器/计数器溢出时,CPU 转向中断服务程序 时,且 TF 白动清 0. 2. 方式 1: 当 TMOD 中 MlM0=01 时,T/C 工作在方式 1; 方式 1 与方式 0 基本相同.唯一区别在于计数寄存器的位数是 16 位的,由 TH 和 TL 寄存器各提 供 8 位,满计数值为 216.
6 有串行接口与计算机连接; 7 设置 8 位二进制的地址,地址范围可表示为 0~255; 8 外接 EEPROM. 定时器/计数器(T/C) 8051 系列单片机至少有两个 16 位内部定时器/计数器,8052 有三个定时器/计数器,其中有两 个是基本定时器/计数器是定时器/计数器.它们既可以编程为定时器使用,也可以编程为计数 器使用. 若是计数内部晶振驱动时钟,它是定时器;若是计数,8051 的输入管脚的脉冲信号,它是计数器. 当 T/C 工作在定时器时,对振荡源 12 分频的脉冲计数,即每个机器周期计数值加 1,计数率 =1/12f osc.例当晶振为 12MHz 时,计数率=1000kHz,即每 1μs 计数值加 1. 当 T/C 工作在计数器时,计数脉冲来自外部脉冲输入管脚 T0(P3.4)或 T1(P3.5),当 T0 或 T1 脚上 负跳变时计数值加 1.识别管脚上的负跳变需两个机器周期,即 24 个振荡周期.所以 T0 或 T1 脚输入的可计数外部脉冲的最高频率为 1/24fosc,当晶振为 12MHZ 时,最高计数率为 500kHz, 高于此频率将计数出错. 一,与 T/C 有关的 SFR 1,计数寄存器 Th 和 TL T/C 是 16 位的,计数寄存器由 TH 高 8 位和 TL 低 8 位构成. 在特殊功能寄存器(SFR) 中, 对应 T/C0 为 TH0 和 TL0; 对应 T/C1 为 TH1 和 TL1. 定时器/计数器的初始值通过 TH1/TH0 和 TL1/TL0 设置. 2,定时器/计数器控制寄存器 TCON 前面已介绍. 二,与 T/C 有关的 SFR 3,T/C 的方式控制寄存器 TMOD . C/T:计数器或定时器选择位; 1→为计数器;0→为定时器. . GATE :门控信号; 1 → T/C 的启动受到双重控制,即要求 TR0/TR1 和 INT0/INT1 同时为高; 0 → T/C 的启动仅受 TR0 或 TR1 控制. GATE C/T M1 M0 GATE C/T M1 M0 D7 D6 D5 D4 D3 D2 D1 D0 T/C1 T/C0 三,四种工作方式 M1 M0 方式 功 能 0 0 0 13 位定时器/计数器,TL 是低 5 位,TH 是高 8 位 0 1 1 16 位定时器/计数器 1 0 2 常数自动重装的 8 位定时器/计数器 1 1 3 仅用于 T/C0,是两个 8 位定时器/计数器 利用定时器编写时钟程序. 四,T/C 工作方式的说明 1. 方式 0: 当 TMOD 中 MlM0=00 时,T/C 工作在方式 0;
WinCC定时器C脚本-推荐下载
2、脚本中定时器介绍
3、使用脚本实现更多定时器功能 3.1 整点归档 3.2 WinCC 项目激活时避免脚本初次执行及延迟执行脚本
1 定时器功能介绍
WinCC 中定时器的使用可以使 WinCC 按照指定的周期或者时间点去执行任务,比如周 期执行变量归档、在指定的时间点执行全局脚本或条件满足时打印报表。WinCC 已经提供 了一些简单的定时器,可以满足大部分定时功能。但是在有些情况下,WinCC 提供的定时 器不能满足我们需求,这时我们就可以通过 WinCC 提供的脚本接口通过编程的方式实现定 时的功能,因为脚本本身既可以直接 调用 WinCC 其他功能,比如报表打印,也可以通过 中间变量来控制其他功能的执行,比如通过置位/复位归档控制变量来触发变量记录的执行。 WinCC 提供了 C 脚本和 VBS 脚 本,本文主要以全局 C 脚本编程为例介绍定时功能的实 现。
软件环境:Windows 7 Professional Service Pack1 , WinCC V7.0 SP3
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电通,力1根保过据护管生高线产中0不工资仅艺料可高试以中卷解资配决料置吊试技顶卷术层要是配求指置,机不对组规电在范气进高设行中备继资进电料行保试空护卷载高问与中题带资2负料2,荷试而下卷且高总可中体保资配障料置各试时类卷,管调需路控要习试在题验最到;大位对限。设度在备内管进来路行确敷调保设整机过使组程其高1在中正资,常料要工试加况卷强下安看与全22过,22度并22工且22作尽22下可护都能1关可地于以缩管正小路常故高工障中作高资;中料对资试于料卷继试连电卷接保破管护坏口进范处行围理整,高核或中对者资定对料值某试,些卷审异弯核常扁与高度校中固对资定图料盒纸试位,卷置编工.写况保复进护杂行层设自防备动腐与处跨装理接置,地高尤线中其弯资要曲料避半试免径卷错标调误高试高等方中,案资要,料求编试技5写、卷术重电保交要气护底设设装。备备置管4高调、动线中试电作敷资高气,设料中课并技3试资件且、术卷料中拒管试试调绝路包验卷试动敷含方技作设线案术,技槽以来术、及避管系免架统不等启必多动要项方高方案中式;资,对料为整试解套卷决启突高动然中过停语程机文中。电高因气中此课资,件料电中试力管卷高壁电中薄气资、设料接备试口进卷不行保严调护等试装问工置题作调,并试合且技理进术利行,用过要管关求线运电敷行力设高保技中护术资装。料置线试做缆卷到敷技准设术确原指灵则导活:。。在对对分于于线调差盒试动处过保,程护当中装不高置同中高电资中压料资回试料路卷试交技卷叉术调时问试,题技应,术采作是用为指金调发属试电隔人机板员一进,变行需压隔要器开在组处事在理前发;掌生同握内一图部线纸故槽资障内料时,、,强设需电备要回制进路造行须厂外同家部时出电切具源断高高习中中题资资电料料源试试,卷卷线试切缆验除敷报从设告而完与采毕相用,关高要技中进术资行资料检料试查,卷和并主检且要测了保处解护理现装。场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
Schneider-Electric IHP 1C 2C 定时器控制器用户指南说明书
d d _E N 02/19IHP 1C/2CProduct information / menu descriptionCCT15440CCT15441CCT15442CCT15443d d _E N 02/19The IHP with weekly program controls lighting, air conditioning, flushing, etc.|The device must not control safety-relevant applications.G etting to know the timerDisplays and operating elementsA Time displayB Channel stateC Date displayD Programmed ON timesE Display of week daysF Display of active buttonsG OK buttonH Selection buttonsI MENU buttonOperationButton FunctionMENU button•Opens the menu•In menu mode: one step back:•In programming mode: cancel programming modeSelection buttons •Switch between menu items •Increase/decrease value OK button•In menu mode: select menu item •In programming mode: confirm settingMenu structurePROGRAM TIME/DATEMANUAL CONFIG ENDCHANNEL 1TIME CHANNEL 1LANGUAGENEW SET DATEPERM ON PIN CHECK SU-WI PERM OFF FACTORY SETTINGSMODIFY WEEK DAY OVERRI ONINFO DELETEFORM DATE HOLIDAYENDENDFORM TIMEENDd d _E N 02/19The basic settings, such as date, time, etc., must be carried out when starting for the first time or following a reset.The device starts in the settings menu with the item LANGUAGE .1Select the language.2Confirm the message FORM DATE .3Select the date format.4Set the year.5Set the month.6Set the day.7Confirm the message FORM TIME .8Select the time format.9Set the hours.0Set the minute.^Select summer time/winter time.A switching time always consists of one time at which the load is switched on and one time at which the load is switched off. Y ou can either set switching times for a specific day of the week or copy them for multiple week days. Copied week days are referred to as a block.T o set a switching time, perform the following steps once for ON and once for OFF :1Confirm message about free memory slots.2Select ON or OFF .3Set the hour.4Set the minute.5Set the day of the week.6If the switching time is only to be valid for one week day, select SAVE .The switching time is set.7If the switching time is to be copied as a block for multiple week days, select COPY .8Select further days of the week and confirm in each case.Week days contained in the block are indicated in the week days display.To remove a week day from the block, select the week day again using the selection buttons.9Once the desired week days have been set, select COPY .Initial setupSetting a switching timePROGRAMCHANNELC1CHANNELC2NEWNEWd d _E N 02/19Y ou can change the time for the switching times. In the case of switching times within a block, you can select whether the modification of the time is to apply to the whole block or only to a specific week day. This week day is then removed from the block.1Select the switching time.The display runs through all switching times in sequence. If no switching time is set for a week day, this is indicated in the display by --:--.If the selected switching time is part of a block, all days of the block are shown in the week day display. The selected week day flashes.2Set the hour.3Set the minute.4If the selected switching time is only set for one week day, only the option SAVE appears.5If the selected switching time is part of a block, select MODIFY BLOCK or MODIFY WEEK DAY .- MODIFY BLOCK changes the time for all switching times of the block.- MODIFY WEEK DAY changes the time for the selected switching time. The selected switching time is re-moved from the block.Y ou can delete switching times at any time. If a switching time is part of a block, you can delete the entire block or remove the switching time from the block. Y ou can also delete all switching times of a channel simultaneously.Deleting a switching time:1Select SINGLE .2Select the switching time.The display runs through all switching times in sequence. If no switching time is set for a week day, this is indicated in the display by --:--.If the selected switching time is part of a block, all days of the block are shown in the week day display. The selected week day flashes.3If the selected switching time is only valid for one week day, only the option DELETE WEEK DAY appears.4If the selected switching time is part of a block, select DELETE BLOCK or DELETE WEEK DAY .- DELETE BLOCK deletes all switching times of the block.- DELETE WEEK DAY removes the selected switching time from the block and deletes it.Deleting all switching times of a channel:1Select DELETE ALL .2Confirm with CONFIRM .Modifying a switching timePROGRAMCHANNELC1CHANNELC2MODIFYMODIFYDeleting a switching timePROGRAMCHANNELC1CHANNELC2DELETEDELETEd d _E N 02/19With the holiday function, you can switch a channel on or off completely for a longer period. The programmed switching times do not apply while the holiday function is active. Y ou can only set one holiday time per channel.1Select ON or OFF .2Confirm BEGIN HOLIDAY .3Set the year.4Set the month.5Set the day.6Set the hour.7Confirm END HOLIDAY .8Set the year.9Set the month.0Set the day.^Set the hour.A PIN protects against unauthorized use.If you have forgotten your PIN, contact the Customer Care centre in your country, stating the serial number of your device.1Select WITH PIN .NO PIN cancels the PIN protection function.2Confirm CURRENT PIN .3Set new PIN.|The PIN digits are set one after the other with +/- and confirmed with OK . A digit that has already been set can no longer be changed. When the last digit is confirmed with OK , the PIN is saved. If in any doubt, exit the PIN setting procedure with MENU .Setting the holiday functionMANUALCHANNELC1CHANNELC2HOLIDAYHOLIDAYSetting the PINCONFIGPINd d _E N 02/19Y ou can set override or permanent switching either via the MANUAL menu or using combinations of buttons on the device.Override switchingIf you wish to switch a channel briefly to the other switching state (e.g. from ON to OFF ), activate override. This state is only valid until the next switching time.If override is active, CHANNEL OVERRIDE appears briefly in the display.Permanent switchingIf you wish to switch a channel permanently, activate permanent switching. While permanent switching is activat-ed, switching times have no effect.If you want to select whether the channel is to be switched ON or OFF permanently, use the MANUAL menu.If you use the button combinations to activate permanent switching, the channel is switched to the other switching state (e.g. from ON to OFF ).If permanent switching is active, CHANNEL PERMANENT appears briefly in the display.Activating override and permanent switchingd d _E N 02/19Y ou can reset the basic settings, such as date, time, etc. and delete or keep all switching times.Y ou have two options: Y ou can either load the factory settings via the CONFIG menu or reset the device using combinations of buttons on the device.|Loading the factory settings will also delete all switching times. If you want to reset the basic settings and retain the switching times, use the reset function.Loading factory settings1Confirm the message LOAD FACTORY SETTINGS .2Set basic settings as described in chapter “Initial setup”.Resetting1Push all four buttons on the device simultaneously.2Select the language.3If you want to retain the switching times, select RETAIN PROGRAMS .4If you want to delete all switching times, select DELETE PROGRAMS .5Set basic settings as described in chapter “Initial setup”.If you have technical questions, please contact the Customer Care Centre in your /contactResetting basic settingsCONFIGFACTORY SET-TINGSSchneider Electric Industries SAS。
51单片机定时器c语言程序实例与详解
4 串行中断
实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址
using y 这个y是说这个中断函数使用的那个寄存器组,51里面一般有4组 r0 -- r7寄存器,一共有32个,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会谈出来节省代码和时间
unsigned int SystemTime;
void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑
{
TH0 = 0xdb;
TL0 = 0xff;
// TF0 = 0;
SystemTime++;
}
void main()
{
TMOD &= 0xF0;
TMOD |= 0x01; //TMOD的值表示定时器工作方式选择
TH0 = 0xdb; //写入初始值,初始值可以决定定时多久
TL0 = 0xff;
//根据下文的木桶比喻的话,如果TH0 = 0x00;TL0 = 0x00;则表示从桶底开始装水。
在定时器服务函数里,需要重新置入定时器的值,这样才能保证每次溢出时,都是你指定的时间。这里置入的是0x0006,还需要走 0x10000-0x0006个机器周期才溢出。换成10进制也就是每65530个机器周期中断一次。我们仿真的晶振是22118400HZ,每12个时钟一个机器周期。65530×12/22118400=0.036秒。也就是差不多28HZ的闪烁频率。
单片机的主程序是从0x0000开始运行的,单片机服务程序从哪里开始运行呢?在51里,有多个中断服务程序入口,0号入口是外中断0,地址在0x0003;1号入口是定时器0,在 0x000B;2号入口是外中断1;地址在0x0013,3号入口是定时器2;地址在0x001B,等等。当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程序,运行完之后,又跳回到原来的位置继续运行。
WinCC定时器C脚本-推荐下载
if(t1==00) { SetTagBit("startarchive",1); } if(t1==05) { SetTagBit("startarchive",0);
} return0; } 归档设置如图 2:
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电通,力1根保过据护管生高线产中0不工资仅艺料可高试以中卷解资配决料置吊试技顶卷术层要是配求指置,机不对组规电在范气进高设行中备继资进电料行保试空护卷载高问与中题带资2负料2,荷试而下卷且高总可中体保资配障料置各试时类卷,管调需路控要习试在题验最到;大位对限。设度在备内管进来路行确敷调保设整机过使组程其高1在中正资,常料要工试加况卷强下安看与全22过,22度并22工且22作尽22下可护都能1关可地于以缩管正小路常故高工障中作高资;中料对资试于料卷继试连电卷接保破管护坏口进范处行围理整,高核或中对者资定对料值某试,些卷审异弯核常扁与高度校中固对资定图料盒纸试位,卷置编工.写况保复进护杂行层设自防备动腐与处跨装理接置,地高尤线中其弯资要曲料避半试免径卷错标调误高试高等方中,案资要,料求编试技5写、卷术重电保交要气护底设设装。备备置管4高调、动线中试电作敷资高气,设料中课并技3试资件且、术卷料中拒管试试调绝路包验卷试动敷含方技作设线案术,技槽以来术、及避管系免架统不等启必多动要项方高方案中式;资,对料为整试解套卷决启突高动然中过停语程机文中。电高因气中此课资,件料电中试力管卷高壁电中薄气资、设料接备试口进卷不行保严调护等试装问工置题作调,并试合且技理进术利行,用过要管关求线运电敷行力设高保技中护术资装。料置线试做缆卷到敷技准设术确原指灵则导活:。。在对对分于于线调差盒试动处过保,程护当中装不高置同中高电资中压料资回试料路卷试交技卷叉术调时问试,题技应,术采作是用为指金调发属试电隔人机板员一进,变行需压隔要器开在组处事在理前发;掌生同握内一图部线纸故槽资障内料时,、,强设需电备要回制进路造行须厂外同家部时出电切具源断高高习中中题资资电料料源试试,卷卷线试切缆验除敷报从设告而完与采毕相用,关高要技中进术资行资料检料试查,卷和并主检且要测了保处解护理现装。场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
PLC定时器在电梯控制中的运用
45 ( 46
49
点)
设 定 范围 : 0 0 1 一 3 2 7 6 7 5 设 定 范围 : 0 0 0 1 一 3 2 7 6 7 5 设 定 范围 : 0 1 一 3 2 7 6 7 5
. . . .
.
(4 点 )
55 ( 6
点)
合 肥联 合 大学 学 报
, ,
199
年第
期
对 于 积 算定 时 器 在计 时 中途 若驱 动 元 件断 开 或 发生 断 电 定 时 器 当 前 值 保 持 ; 当驱 动元
s
,
1 ( a ) 所 示 的 梯形 图
,
中 输入点
XO
接 通 的瞬 间 定时 器
, 、
T 的当 前值计 数器对 0
,
.
开
。
0 T 的常 开 触 点 闭 合 使 输 出 ; l 接通 0 T 的 常 闭 触 点断 开 使 输 出 Y 断 开 也 即 0 Y Yl 在 X 0 接 通 后 延 时 1 2 接通 断 X O 断 开 时 无论 Y 断开 ; 常 0 T 是 否 在 计 时 其 当 前 值 计 数 器 立 即清 零 常 开 触 点 断 开 0
一般为 3 一 10 5
。
可 采 用 以 下方 式实 现 这 一 功能
。
( 见图 2 )
砰S
曰 卜洲
.i , (
州 !
叫
`
刁
l
州
l
(2 )
JH S
口
JS J -」
,
皿
I
,, 甲,
JGS
,
J 翎
f
!
,
J
卜
才
(3 )
C语言实现简单的定时器
C语⾔实现简单的定时器本⽂实例为⼤家分享了C语⾔实现简单的定时器的具体代码,供⼤家参考,具体内容如下1.代码分析2.代码#include <stdio.h>#include <time.h>#include <conio.h>#ifndef CLOCKS_PER_SEC#define CLOCKS_PER_SEC 1000#endifint main( void ){clock_t start;long count = 1;start = clock();while(1){if((clock() - start) == CLOCKS_PER_SEC){printf("%ld\n",count++);start = clock();//break;}}getch();}3. 代码抽象出⼀个定时器函数 void timer(long time)void timer(long time){clock_t start;long count = 1;start = clock();while(1){if((clock() - start) != (time*CLOCKS_PER_SEC)) {//时间没有到,啥也不做,空循环}else {//时间到了退出循环// printf("%s","hello");break;}}}完整代码#include <stdio.h>#include <time.h>#include <conio.h>#ifndef CLOCKS_PER_SEC#define CLOCKS_PER_SEC 1000#endif/*** time 的单位为s*/void timer(long time){clock_t start;long count = 1;start = clock();while(1){if((clock() - start) != (time*CLOCKS_PER_SEC)) {//时间没有到,啥也不做,空循环}else {//时间到了退出循环// printf("%s","hello");break;}}}int main( void ){for(int i=0;i<10;i++){timer(1);printf("%d\n",i);}getch();}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
C单片机的C语言程序设计解读
C单片机的C语言程序设计解读C单片机的C语言程序设计是指使用C语言编写单片机程序的过程。
C语言是一种通用编程语言,非常适合用于嵌入式系统开发,特别是单片机。
在单片机中,C语言用于控制和编程微处理器的功能,比如读写IO口、中断处理、定时器控制等。
1. 引入库函数:在C单片机程序设计中,首先需要引入相应的库函数。
库函数是封装了一系列常用功能的函数集合,通过调用库函数可以方便地实现各种功能。
例如,可以引入stdio.h库函数实现标准的输入输出功能,或者引入io.h库函数实现IO口控制功能。
2. 定义宏定义和常量:在C单片机程序中,可以使用宏定义和常量来定义一些固定的数值或者字符串。
宏定义使用#define指令,在程序中定义一个标识符,并将其替换为指定的文本。
常量使用const关键字定义,定义后数值不可更改。
宏定义和常量可以提高程序的可读性和可维护性。
3.变量的声明和定义:变量是C程序的基本组成元素之一,用于存储和表示数据。
在C单片机程序中,可以先声明变量的类型,然后再进行定义。
变量的类型可以是整型、浮点型、字符型等。
变量的作用范围和生命周期取决于其在程序中的声明位置。
4.函数的定义和调用:函数是C程序的另一个基本组成元素,用于封装一段独立的代码块,实现特定的功能。
在C单片机程序中,可以先定义函数的原型,然后再实现函数的具体功能。
函数的调用使用函数名和实参列表,可以将函数的返回值赋给一个变量或者作为一个表达式的值进行使用。
5. 控制语句:控制语句是用于控制程序执行流程的语句。
C单片机程序中常用的控制语句包括条件语句(if-else语句、switch语句)、循环语句(for循环、while循环、do-while循环)和跳转语句(break语句、continue语句、goto语句)。
通过控制语句可以根据不同的条件执行不同的操作,或者循环执行一些代码块,或者跳转到程序的其他位置。
6.中断处理:中断是单片机程序中常用的一种处理方式。
单片机(c语言版)定时器计数器..
#include<reg51.h> Char i=100;/*给变量i赋初值,定时0.5S,每次定时中断 5MS,需要中断100次*/ void main( ) { TMOD=0x01; /*设置定时器T0为方式1*/ TH0=0xee; /*向TH0写入初值的高8位*/ TL0=0x00; /*向TL0写入初值的低8位*/ P1=0x00; /*P1口8只LED点亮*/ EA=1; /*总中断允许*/ ET0=1; /*定时器T0中断允许*/ TR0=1; /*启动定时器T0*/ while(1) ; /*无穷循环,等待定时中断*/ }
定时时间:计数器溢出时间,时间常数越大,定时
时间就越短;时间常数越小,定时时间就越长。时 钟的频率越高,定时时间越短;时钟的频率越低, 定时时间越长。
设系统时钟的频率为fosc,计数器的初始值为N,定 时器工作于方式1,则定时时间: T=(216-N)×12/fosc (1) 如果定时器工作于方式2或方式3,定时时间为: T=(28-N)×12/fosc (2)
6.4 定时器/计数器的编程和应用
MCS-51单片机的定时器是可编程的,但在进行定时或计数
之前要对程序进行初始化,具体步骤如下: (1)确定工作方式字:对TMOD寄存器正确赋值; (2)确定定时初值:计算初值,直接将初值写入寄存器的TH0 、TL0或TH1、TL1; 初值计算:设计数器的最大值为M,则置入的初值X为: 计数方式:X=M-计数值 定时方式:由(M-X)T=定时值,得X=M-定时值/T T为计数周期,是单片机的机器周期。 (模式0-M为213,模式1-M为216,模式2和3-M为28) (3)根据需要,对IE置初值,开放定时器中断; (4)启动定时/计数器,对TCON寄存器中的TR0或TR1置位, 置位以后,计数器即按规定的工作模式和初值进行计数或开 始定时。
CC2530定时器1的原理与编程
1:0 MODE[1:0]
//用T1来做实验128分频;自由运行模式 T1CTL=(0x3<<2)|(0x1<<0);
10
一、定时器1 通过T1CNTH和T1CNTL读取16位的计数器值,当读取 T1CTL时,计数器高位字节被缓冲到T1CNTH中,以便高位字节可 以从T1CTLH中读出。T1CNTL必须总是在读取T1CNTH之前首先 读取。 T1CNTL定时器1计数器低位
位
7: 0
T1CC0H 定时器1通道0捕获/比较值高位 位 7: 0 名称 T1CC0[15:8] 复位 R/W 描述
T1CCTL0.MODE=1(比较模式)时写0到该 寄存器导致T1CC0[15:8]更新写入值延迟到 T1CNT=0x0000。
0x00 R/W 定时器1通道0捕获/比较值,高位字节。当
定时器溢出500次,就让灯状态取反:
0.002048 500=1.024 S
灯每隔1.024S亮一次,隔1.024S灭一次
7
一、定时器1——自由运行模式
CLKCONCMD. TICKSPD
CLKCONCMD.OSC
系统时钟源 (32M或16M)
当时钟脉冲设置 为32M
全局定时 器分频
不分频
T1CTL.DIV
定时器溢出500次,就让灯状态取反: 0.002048 500=0.032 S
18
三、PWM数字调光的原理
在P1_1上的信号如果按下面几种情况,D2亮度有什么不同呢? (1) 1
(2)
1 0
(3) 1 (4)
0
0
上面4中情况,由暗到亮的顺序为:(1)(2)(3)(4)当加在P1_1管脚上的 信号的一个周期中,低电平所持续的时间占整个周期的时间越长,则发光二极管 越亮。由此可见,我们只需要改变占空比就可以调节D2亮度。我们一般把这种占 空比可以改变的数字信号叫做PWM(Pulse Width Modulation)波。 2、通过合适的配置,CC2530的定时器1除了产生定时中断外,还可以在输出 pwm波。定时器1共有5路pwm输出通道,具体如下:
单片机C语言编程定时器计数器
6.2.4 模式3的逻辑结构及应用
1、T0模式3的结构特点
M1 M0 =11,选择模式3。逻辑结构如图 6-8和6-9所示:
结构: TL0、TH0分为两个独立的8位计数器 TL0: 8位定时器/计数器
使用T0所有的资源和控制位 TH0:8位定时器
使用T1所有的资源(中断向量、中断控制 ET1、PT1)和控制位(TR1、TF1)
第6章 MCS-51单片机定时器/计数器
目录
6.1 MCS-51定时器/计数器 的结构及原理
6.2 定时器T0、T1 6.3 定时器T2 6.4 定时器应用举例
第6章 MCS-51单片机的定时器/计数器
本章主要讨论MCS-51单片机定时器/计 数器的逻辑结构和工作原理。内容主要有 MCS-51单片机定时器T0、T1、T2的逻辑结 构,工作方式的选择和应用。
6.1.3 定时器/计数器的方式和控制寄存器
M1、M0——工作模式选择位。
如下表所示:
表6-1 定时器/计数器的工作模式
M1 M0 工作模式
功能
0 0 模式0 13位定时器/计数器
0 1 模式1 16位定时器/计数器
10 11
模式2 模式3
8位自动重置定时器/计数器
定时器0:TL0为8位定时器/计 数器,TH0为8位定时器。 定时器1:无此方式
MCS-51单片机之所以设置几乎完全一 样 的方 式0和方式1,是出于与 MCS-48单片机兼容的。
6.2.3 模式2的逻辑结构及应用
M1 M0 =10时,选择模式2。逻辑结构 如图6-7所示。
T0的结构: TL0:8位的定时器/计数器; TH0:8位预置寄存器,用于保存初值。 工作过程:当TL0计满溢出时,TF0置1, 向CPU发出中断请求;同时引起重装操作 (TH0的计数初值送到TL0),进行新一轮 计数。
c语言单片机定时器计数器程序
C语言单片机定时器计数器程序1. 简介C语言是一种被广泛应用于单片机编程的高级编程语言,它可以方便地操作单片机的各种硬件模块,包括定时器和计数器。
定时器和计数器是单片机中常用的功能模块,它们可以用来实现精确的时间控制和计数功能。
本文将介绍如何使用C语言编程实现单片机的定时器计数器程序。
2. 程序原理在单片机中,定时器和计数器通常是以寄存器的形式存在的。
通过对这些寄存器的操作,可以实现定时器的启动、停止、重载以及计数器的增加、减少等功能。
在C语言中,可以通过对这些寄存器的直接操作来实现对定时器和计数器的控制。
具体而言,可以使用C语言中的位操作和移位操作来对寄存器的各个位进行设置和清零,从而实现对定时器和计数器的控制。
3. 程序设计在编写单片机定时器计数器程序时,首先需要确定定时器的工作模式,包括定时模式和计数模式。
在定时模式下,定时器可以按照设定的时间间隔生成中断,从而实现定时功能;在计数模式下,定时器可以根据外部的脉冲信号进行计数。
根据不同的应用需求,可以选择不同的工作模式,并根据具体情况进行相应的配置。
4. 程序实现在C语言中,可以通过编写相应的函数来实现对定时器和计数器的控制。
需要定义相关的寄存器位置区域和位掩码,以便于程序对这些寄存器进行操作。
编写初始化定时器的函数、启动定时器的函数、停止定时器的函数、重载定时器的函数等。
通过这些函数的调用,可以实现对定时器的各种操作,从而实现定时和计数功能。
5. 示例代码以下是一个简单的单片机定时器计数器程序的示例代码:```c#include <reg52.h>sbit LED = P1^0; // 定义LED连接的引脚void InitTimer() // 初始化定时器{TMOD = 0x01; // 设置定时器0为工作在方式1TH0 = 0x3C; // 设置初值,定时50msTL0 = 0xAF;ET0 = 1; // 允许定时器0中断EA = 1; // 打开总中断void Timer0_ISR() interrupt 1 // 定时器0中断服务函数{LED = !LED; // 翻转LED状态TH0 = 0x3C; // 重新加载初值,定时50msTL0 = 0xAF;}void m本人n(){InitTimer(); // 初始化定时器while(1){}}```以上代码实现了一个简单的定时器中断程序,当定时器计数到50ms 时,会触发定时器中断,并翻转LED的状态。
3Keil C学习定时器定时1s解读
选择每秒中断24次,每次溢出1843200/24=76800 个机器周期,超出65536,无效。 选择每秒中断30次,每次溢出1843200/30=61440 个机器周期 选择每秒中断32次,每次溢出1843200/32=57600 个机器周期 选择每秒中断36次,每次溢出1843200/36=51200 个机器周期 选择每秒中断40次,每次溢出1843200/40=46080 个机器周期 从上面可以看到我们可以选择方式有很多,但是最佳的是 每秒中断30次,每次溢出61440个机器周期。也就是赋 定时器T2初值65536-61440=4096,换成十六进 制就是0x1000。
在定时器服务函数里,需要重新置入定时器的值, 这样才能保证每次溢出时,都是你指定的时间。 这里置入的是0x0006,还需要走0x100000x0006个机器周期才溢出。换成10进制也就 是每65530个机器周期中断一次。我们仿真的晶 振是22118400HZ,每12个时钟一个机器周 期。65530×12/22118400=0.036秒。也 就是差不多28HZ的间/机器周期)/256 (取整) TL0=(65536-定时时间/机器周期)%256(取余)
实例3-2:定时器精确定位1秒钟(使用 AT89C52的定时器2)
要精确定时,必须使用自装载方式。这里我们使 用T2定时器,让它工作在16bit自动装载方式, 这时,有另一个位置专门装着16位预装载值, T2溢出时,预装载值立即被置入。这就保证了精 确定时。 即使是16位定时器,最长的溢出时间也就几十毫 秒,要定时一秒,就需要一个变量来保存溢出的 次数,积累到了多少次之后,才执行一次操作。 这样就可以累加到1秒或者更长的时间才做一次 操作了。
如果直接读一个没有按下按键的IO,就会读到1。 如果这个按键按下了,这个IO就通过按键短路到 了地。这是就会读到0。这就是读按键的原理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定时器今天我们来讨论下c++中的定时器(SetTimer)一些基础的知识和用法:你可以通过呼叫SetTimer函数为您的Windows程序分配一个定时器。
SetTimer有一个时间间隔范围为1毫秒到4,294,967,295毫秒(将近50天)的整数型态参数,这个值指示Windows每隔多久时间给您的程序发送WM_TIMER消息。
例如,如果间隔为1000毫秒,那么Windows将每秒给程序发送一个WM_TIMER消息。
当您的程序用完定时器时,它呼叫KillTimer函数来停止定时器消息。
在处理WM_TIMER 消息时,您可以通过呼叫KillTimer函数来编写一个「限用一次」的定时器。
KillTimer呼叫清除消息队列中尚未被处理的WM_TIMER消息,从而使程序在呼叫KillTimer之后就不会再接收到WM_TIMER消息。
系统和定时器Windows定时器是PC硬件和ROM BIOS架构下之定时器一种相对简单的扩充。
回到Windows 以前的MS-DOS程序写作环境下,应用程序能够通过拦截者称为timer tick的BIOS中断来实作时钟或定时器。
一些为MS-DOS编写的程序自己拦截这个硬件中断以实作时钟和定时器。
这些中断每54.915毫秒产生一次,或者大约每秒18.2次。
这是原始的IBM PC的微处理器时脉值4.772720 MHz 被218所除而得出的结果。
Windows应用程序不拦截BIOS中断,相反地,Windows本身处理硬件中断,这样应用程序就不必进行处理。
对于目前拥有定时器的每个程序,Windows储存一个每次硬件timer tick减少的计数。
当这个计数减到0时,Windows在应用程序消息队列中放置一个WM_TIMER消息,并将计数重置为其最初值。
因为Windows应用程序从正常的消息队列中取得WM_TIMER消息,所以您的程序在进行其它处理时不必担心WM_TIMER消息会意外中断了程序。
在这方面,定时器类似于键盘和鼠标。
驱动程序处理异步硬件中断事件,Windows把这些事件翻译为规律、结构化和顺序化的消息。
在Windows 98中,定时器与其下的PC定时器一样具有55毫秒的分辨率。
在Microsoft Windows NT中,定时器的分辨率为10毫秒。
Windows应用程序不能以高于这些分辨率的频率(在Windows 98下,每秒18.2次,在Windows NT下,每秒大约100次)接收WM_TIMER消息。
在SetTimer呼叫中指定的时间间隔总是截尾后tick数的整数倍。
例如,1000毫秒的间隔除以54.925毫秒,得到18.207个tick,截尾后是18个tick,它实际上是989毫秒。
对每个小于55毫秒的间隔,每个tick都会产生一个WM_TIMER消息。
定时器消息不是异步的因为定时器使用硬件定时器中断,程序写作者有时会误解,认为他们的程序会异步地被中断来处理WM_TIMER消息。
然而,WM_TIMER消息并不是异步的。
WM_TIMER消息放在正常的消息队列之中,和其它消息排列在一起,因此,如果在SetTimer呼叫中指定间隔为1000毫秒,那么不能保证程序每1000毫秒或者989毫秒就会收到一个WM_TIMER消息。
如果其它程序的执行事件超过一秒,在此期间内,您的程序将收不到任何WM_TIMER消息。
您可以使用本章的程序来展示这一点。
事实上,Windows 对WM_TIMER消息的处理非常类似于对WM_PAINT消息的处理,这两个消息都是低优先级的,程序只有在消息队列中没有其它消息时才接收它们。
WM_TIMER还在另一方面和WM_PAINT相似:Windows不能持续向消息队列中放入多个WM_TIMER消息,而是将多余的WM_TIMER消息组合成一个消息。
因此,应用程序不会一次收到多个这样的消息,尽管可能在短时间内得到两个WM_TIMER消息。
应用程序不能确定这种处理方式所导致的WM_TIMER消息「遗漏」的数目。
这样,WM_TIMER消息仅仅在需要更新时才提示程序,程序本身不能经由统计WM_TIMER 消息的数目来计时(在本章后面,我们将编写两个每秒更新一次的时钟程序,并可以看到如何做到这一点)。
为了方便起见,下面在讨论时钟时,我将使用「每秒得到一次WM_TIMER消息」这样的叙述,但是请记住,这些消息并非精确的tick中断。
定时器的使用:三种方法如果您需要在整个程序执行期间都使用定时器,那么您将得从WinMain函数中或者在处理WM_CREATE消息时呼叫SetTimer,并在退出WinMain或响应WM_DESTROY消息时呼叫KillTimer。
根据呼叫SetTimer时使用的参数,可以下列三种方法之一使用定时器。
方法举例这是最方便的一种方法,它让Windows把WM_TIMER消息发送到应用程序的正常窗口消息处理程序中,SetTimer呼叫如下所示:SetTimer (hwnd, 1, uiMsecInterval, NULL) ;第一个参数是其窗口消息处理程序将接收WM_TIMER消息的窗口句柄。
第二个参数是定时器ID,它是一个非0数值,在整个例子中假定为1。
第三个参数是一个32位无正负号整数,以毫秒为单位指定一个时间间隔,一个60,000的值将使Windows每分钟发送一次WM_TIMER消息。
您可以通过呼叫KillTimer (hwnd, 1) ;在任何时刻停止WM_TIMER消息(即使正在处理WM_TIMER消息)。
此函数的第二个参数是SetTimer呼叫中所用的同一个定时器ID。
在终止程序之前,您应该响应WM_DESTROY消息停止任何活动的定时器。
当您的窗口消息处理程序收到一个WM_TIMER消息时,wParam参数等于定时器的ID值(上述情形为1),lParam参数为0。
如果需要设定多个定时器,那么对每个定时器都使用不同的定时器ID。
wParam的值将随传递到窗口消息处理程序的WM_TIMER消息的不同而不同。
为了使程序更具有可读性,您可以使用#define叙述定义不同的定时器ID:#define TIMER_SEC 1#define TIMER_MIN 2然后您可以使用两个SetTimer呼叫来设定两个定时器:SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;SetTimer (hwnd, TIMER_MIN, 60000, NULL) ;WM_TIMER的处理如下所示:caseWM_TIMER:switch (wParam){case TIMER_SEC://每秒一次的处理break ;case TIMER_MIN://每分钟一次的处理break ;}return 0 ;如果您想将一个已经存在的定时器设定为不同的时间间隔,您可以简单地用不同的时间值再次呼叫SetTimer。
在时钟程序里,如果显示秒或不显示秒是可以选择的,您就可以这样做,只需简单地将时间间隔在1000毫秒和60 000毫秒间切换就可以了。
程序8-1显示了一个使用定时器的简单程序,名为BEEPER1,定时器的时间间隔设定为1秒。
当它收到WM_TIMER消息时,它将显示区域的颜色由蓝色变为红色或由红色变为蓝色,并通过呼叫MessageBeep函数发出响声。
(虽然MessageBeep通常用于MessageBox,但它确实是一个全功能的鸣叫函数。
在有声卡的PC机上,一般可以使用不同的MB_ICON参数作为MessageBeep的一个参数以用于MessageBox,来播放使用者在「控制台」的「声音」程序中选择的不同声音)。
BEEPER1在窗口消息处理程序处理WM_CREATE消息时设定定时器。
在处理WM_TIMER消息处理期间,BEEPER1呼叫MessageBeep,翻转bFlipFlop的值并使窗口无效以产生WM_PAINT消息。
在处理WM_PAINT消息处理期间,BEEPER1通过呼叫GetClientRect获得窗口大小的RECT结构,并通过呼叫FillRect改变窗口的颜色。
代码#include <windows.h>#define ID_TIMER 1LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("Beeper1") ;HWND hwnd ;MSG msg ;WNDCLASS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc = WndProc ;wndclass.cbClsExtra = 0 ;wndclass.cbWndExtra = 0 ;wndclass.hInstance = hInstance ;wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;wndclass.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox ( NULL, TEXT ("Program requires Windows NT!"),szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow (szAppName, TEXT ("Beeper1 Timer Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ;ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) {static BOOL fFlipFlop = FALSE ;HBRUSH hBrush ;HDC hdc ;PAINTSTRUCT ps ;RECT rc ;switch (message){case WM_CREATE:SetTimer (hwnd, ID_TIMER, 1000, NULL) ;return 0 ;case WM_TIMER :MessageBeep (-1) ;fFlipFlop = !fFlipFlop ;InvalidateRect (hwnd, NULL, FALSE) ;return 0 ;case WM_PAINT :hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rc) ;hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ;FillRect (hdc, &rc, hBrush) ;EndPaint (hwnd, &ps) ;DeleteObject (hBrush) ;return 0 ;case WM_DESTROY :KillTimer (hwnd, ID_TIMER) ;PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}因为BEEPER1每次收到WM_TIMER消息时,都用颜色的变换显示出来,所以您可以通过呼叫BEEPER1来查看WM_TIMER消息的性质,并完成Windows内部的一些其它操作。