秒表C语言程序
99.9s秒表代码c语言

#include <reg51.h>#include <intrins.h>sbit DG1 = P0^0;sbit DG2 = P0^1;sbit DG3 = P0^2;sbit START_KEY = P1^0;sbit SUSPEND_KEY = P1^1;sbit RESET_KEY = P1^2;sbit LED1 = P1^4;sbit LED2 = P1^5;sbit LED3 = P1^6;sbit LED4 = P1^7;unsigned char WorkMode = 0;#define STANDBY_MODE 0#define RECORD_MODE 1#define SUSPEND_MODE 2#define RECORDOUT_MODE 3unsigned int display_num = 0;unsigned char timeoutnum = 0;unsigned char duanxuan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void delay2ms(void);void dev_init(void);void Timer0_init(void);void Timer0_start(void);void Timer0_stop(void);void standby_mode(void);void record_mode(void);void suspend_mode(void);void recordout_mode(void);void display(unsigned int value);void main(){dev_init();Timer0_init();while(1){switch(WorkMode){case STANDBY_MODE:standby_mode();break;case RECORD_MODE:record_mode();break;case SUSPEND_MODE:suspend_mode();break;case RECORDOUT_MODE:recordout_mode();break;default:break;}display(display_num);}}void delay2ms(void) //误差0us{unsigned char a,b;for(b=4;b>0;b--)for(a=248;a>0;a--);_nop_(); //if Keil,require use intrins.h }void dev_init(void){DG1 = 0;DG2 = 0;DG3 = 0;LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 1;}void Timer0_init(void){TMOD = 0x01;TH0 = 0x3C;TL0 = 0xB0;EA = 1;}void Timer0_start(void){ET0 = 1;TR0 = 1;}void Timer0_stop(void){ET0 = 0;TR0 = 0;}void standby_mode(void){LED1 = 0;LED2 = 1;LED3 = 1;LED4 = 1;if(START_KEY == 0){timeoutnum = 0;display_num = 0;Timer0_init();Timer0_start();WorkMode = RECORD_MODE;}if(RESET_KEY == 0){Timer0_stop();timeoutnum = 0;display_num = 0;WorkMode = STANDBY_MODE;}}void record_mode(void){LED1 = 1;LED2 = 0;LED3 = 1;LED4 = 1;if(SUSPEND_KEY == 0){Timer0_stop();WorkMode = SUSPEND_MODE;}if(RESET_KEY == 0){Timer0_stop();timeoutnum = 0;display_num = 0;WorkMode = STANDBY_MODE;}}void suspend_mode(void){LED1 = 1;LED2 = 1;LED3 = 0;LED4 = 1;if(START_KEY == 0){Timer0_start();WorkMode = RECORD_MODE;}if(RESET_KEY == 0){Timer0_stop();timeoutnum = 0;display_num = 0;WorkMode = STANDBY_MODE;}}void recordout_mode(void){LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 0;if(RESET_KEY == 0){Timer0_stop();timeoutnum = 0;display_num = 0;WorkMode = STANDBY_MODE;}}void display(unsigned int value){P2 = duanxuan[value/100];DG1 = 1;delay2ms();DG1 = 0;P2 = duanxuan[(value%100)/10]+0x80;DG2 = 1;delay2ms();DG2 = 0;P2 = duanxuan[value%10];DG3 = 1;delay2ms();DG3 = 0;}void Timer0Interrupt(void) interrupt 1{TH0 = 0x3C;TL0 = 0xB0;timeoutnum++;if(timeoutnum == 2)//100ms{timeoutnum = 0;display_num++;if(display_num>=999){Timer0_stop();WorkMode = RECORDOUT_MODE;}}}#include <reg51.h>#include <intrins.h>sbit DG1 = P0^0; //位选1,数码管第一位sbit DG2 = P0^1; //位选2,数码管第二位sbit DG3 = P0^2; //位选3,数码管第三位sbit START_KEY = P1^0; //开始按键sbit SUSPEND_KEY = P1^1; //暂停按键sbit RESET_KEY = P1^2; //重置按键sbit LED1 = P1^4; //LED灯第一个sbit LED2 = P1^5; ////LED灯第二个sbit LED3 = P1^6; //LED灯第三个sbit LED4 = P1^7; //LED灯第四个unsigned char WorkMode = 0; //工作模式#define STANDBY_MODE 0 //宏定义,待机模式#define RECORD_MODE 1 //宏定义,计时模式#define SUSPEND_MODE 2 //宏定义,暂停模式#define RECORDOUT_MODE 3 //宏定义,计时超出99.9秒模式unsigned int display_num = 0; //显示的数据,如99.9秒为999unsigned char timeoutnum = 0; //定时器超时次数unsigned char duanxuan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段选void delay2ms(void); //延时函数,2msvoid dev_init(void); //设备初始化void Timer0_init(void); //定时器0初始化void Timer0_start(void); //开始定时器0void Timer0_stop(void); //停止定时器0void standby_mode(void); //待机模式void record_mode(void); //计时模式void suspend_mode(void); //暂停模式void recordout_mode(void); //计时超出99.9s模式void display(unsigned int value); //数码管显示函数void main(){dev_init(); //设备初始化Timer0_init(); //定时器0初始化while(1){switch(WorkMode) //工作模式判断{case STANDBY_MODE: //待机模式standby_mode(); //待机模式工作break;case RECORD_MODE: //计时模式record_mode(); //计时模式工作break;case SUSPEND_MODE: //暂停模式suspend_mode(); //暂停模式工作break;case RECORDOUT_MODE: //计时超出99.9s模式recordout_mode(); //计时超出99.9s模式工作break;default:break;}display(display_num); //数码管显示}}void delay2ms(void) //误差0us{unsigned char a,b;for(b=4;b>0;b--)for(a=248;a>0;a--);_nop_(); //if Keil,require use intrins.h}void dev_init(void){DG1 = 0; //第一位数码管位选为0 即第一个数字不亮,下同DG2 = 0; //第二位数码管位选为0 即第一个数字不亮,下同DG3 = 0; //第三位数码管位选为0 即第一个数字不亮LED1 = 1; //第一个LED灯灭LED2 = 1; //第二个LED灯灭LED3 = 1; //第三个LED灯灭LED4 = 1; //第四个LED灯灭}void Timer0_init(void){TMOD = 0x01; //模式1TH0 = 0x3C; //TH0,TL0 定时0 装值TL0 = 0xB0;EA = 1; //使能中断}void Timer0_start(void){ET0 = 1; //开启定时器0中断TR0 = 1; //定时器0开始计时}void Timer0_stop(void){ET0 = 0; //禁止定时器0中断TR0 = 0; //停止计时器0计时}void standby_mode(void)LED1 = 0; //第一个LED灯亮,下面三句都为灭LED2 = 1;LED3 = 1;LED4 = 1;if(START_KEY == 0) //开始计时按键按下{timeoutnum = 0; //定时器溢出次数清0display_num = 0; //显示数据清0Timer0_init(); //定时器0初始化Timer0_start(); //开始计时WorkMode = RECORD_MODE; //模式切换至计时模式}if(RESET_KEY == 0) //重置按键按下{Timer0_stop(); //停止定时器0timeoutnum = 0; //定时器0溢出次数清0display_num = 0; //显示数据清0WorkMode = STANDBY_MODE; //工作模式切换至待机模式}}void record_mode(void){LED1 = 1;LED2 = 0; //第2个LED灯亮,其他三句都为灭LED3 = 1;LED4 = 1;if(SUSPEND_KEY == 0) //暂停按键按下{Timer0_stop(); //停止定时器0WorkMode = SUSPEND_MODE; //工作模式切换至暂停模式}if(RESET_KEY == 0) //重置按键按下{Timer0_stop(); //停止定时器0timeoutnum = 0; //定时器0溢出次数清0display_num = 0; //显示数据清0WorkMode = STANDBY_MODE; //工作模式切换至待机模式}}void suspend_mode(void)LED1 = 1;LED2 = 1;LED3 = 0; //第3个LED灯亮,其他三句都为灭LED4 = 1;if(START_KEY == 0) //开始计时按键按下{Timer0_start(); //开始定时器0WorkMode = RECORD_MODE; //工作模式切换至计时模式}if(RESET_KEY == 0) //重置按键按下{Timer0_stop(); //停止定时器0timeoutnum = 0; //定时器溢出次数清0display_num = 0; //显示数据清0WorkMode = STANDBY_MODE; //工作模式切换至待机模式}}void recordout_mode(void){LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 0; //第4个LED灯亮,其他三句都为灭if(RESET_KEY == 0) //重置按键按下{Timer0_stop(); //停止定时器0timeoutnum = 0; //定时器溢出次数清0display_num = 0; //显示数据清0WorkMode = STANDBY_MODE; //工作模式切换至待机模式}}void display(unsigned int value){P2 = duanxuan[value/100]; //第一个数码管段选DG1 = 1; //开位选delay2ms(); //延时2msDG1 = 0; //关位选P2 = duanxuan[(value%100)/10]+0x80; //第二个数码管段选,+0x80是为了显示小数点DG2 = 1; //开位选delay2ms(); //延时2msDG2 = 0; //关位选P2 = duanxuan[value%10]; //第三个数码管段选DG3 = 1; //开位选delay2ms(); //延时2msDG3 = 0; //关位选}//定时器0中断处理函数void Timer0Interrupt(void) interrupt 1{TH0 = 0x3C; //TH0,TL0 定时0 装值TL0 = 0xB0;timeoutnum++; //超时次数加1if(timeoutnum == 2)//100ms{timeoutnum = 0; //定时器溢出次数清0display_num++; //显示数据加1if(display_num>=999) //如果显示数据大于999,即99.9s{Timer0_stop(); //停止定时器0WorkMode = RECORDOUT_MODE; //工作模式切换至计时溢出模式}}}。
pic单片机C语言程序例程之stopwatch

//此程序实现计时秒表功能,时钟显示范围00.00~99.99秒,分辨度:0.01秒#include "p18f458.h"unsigned char s[4]; //定义0.01 秒、0.1 秒、1秒、10秒计时器unsigned char k,data,sreg;unsigned int i;const table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};//不带小数点的显示段码表const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};//带小数点的显示段码表void clkint(void);//TMR0初始化子程序void tmint(){T0CON=0XCF; //设定TMR0L工作于8位定时器方式//内部时钟,TMR0不用分频INTCON=0X20; //总中断禁止,TMR0中断允许,清除TMR0的中断标志INTCON2bits.TMR0IP=1; //TMR0中断高优先级RCONbits.IPEN=1; //使能中断优先级}//系统其它部分初始化子程序void initial(){TRISA=0x00; //A口设置为输出TRISB=0XF0; //RB1输出,RB4输入TRISC=0x00; //SDO引脚为输出,SCK引脚为输出TRISE=0x00; //E口设置为输出SSPCON1=0x30; //SSPEN=1;CKP=1,FOSC/4SSPSTA T=0xC0; //时钟下降沿发送数据PIR1=0; //清除SSPIF标志data=0X00; //待显示的寄存器赋初值PORTBbits.RB1=0;PORTAbits.RA3=0;PORTE=0; //将K1,K2,K3,K4四条列线置0//SPI传输数据子程序void SPILED(char data){SSPBUF=data; //启动发送do{;}while(PIR1bits.SSPIF==0);PIR1bits.SSPIF=0;}//显示子程序,显示4位数void dispaly(){PORTAbits.RA5=0; //准备锁存for(k=0;k<4;k++){data=s[k];if(k==2) data=table0[data]; //个位需要显示小数点else data=table[data];SPILED(data); //发送显示段码}for(k=0;k<4;k++){data=0xFF;SPILED(data); //连续发送4个DARK,使显示好看一些}PORTAbits.RA5=1; //最后给锁存信号,代表显示任务完成}//软件延时子程序void DELA Y(){for(i = 3553; --i ;)continue;}//键扫描子程序void KEYSCAN(){while(1){dispaly(); //调用一次显示子程序while(PORTBbits.RB4==0){DELA Y(); //若有键按下,则软件延时break;}if (PORTBbits.RB4==0) break; //若还有键按下,则终止循环扫描,返回}}//等键松开子程序void keyrelax(){while(1){dispaly(); //调用一次显示子程序if (PORTBbits.RB4==1) break; //为防止按键过于灵敏,每次等键松开才返回}}/*高优先级中断向量*/#pragma code InterruptV ectorHigh=0x08void InterruptV ectorHigh (void){_asmgoto clkint //跳到中断程序_endasm}//中断服务程序#pragma code#pragma interrupt clkintvoid clkint(){TMR0=0X13; //对TMR0写入一个调整值。
单片机秒表设计程序及原理图

单片机秒表系统设计引言:中国使用单片机的历史只有短短的30年,在初始的短短五年时间里发展极为迅速。
纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。
以前没有单片机时,这些东西也能做,但是只能使用复杂的模拟电路,然而这样做出来的产品不仅体积大,而且成本高,并且由于长期使用,元器件不断老化,控制的精度自然也会达不到标准。
在单片机产生后,我们就将控制这些东西变为智能化了,我们只需要在单片机外围接一点简单的接口电路,核心部分只是由人为的写入程序来完成。
这样产品的体积变小了,成本也降低了,长期使用也不会担心精度达不到了。
所以,它的魔力不仅是在现在,在将来将会有更多的人来接受它、使用它。
据统计,我国的单片机年容量已达3亿片,且每年以大约20%的速度增长,但相对于世界市场我国的占有率还不到1%。
特别是沿海地区的玩具厂等生产产品多数用到单片机,并不断地辐射向内地。
所以,学习单片机在我国是有着广阔前景的。
一、单片机秒表系统设计目的及内容1、利用单片机定时器/计数器中断设计秒表,从而实现秒、十分之一秒的计时。
2、综合运用所学的《单片机原理与应用》理论知识,通过实践加强对所学知识的理解,具备设计单片机应用系统的能力。
3、通过本次系统设计加深对单片机掌握定时器、外部中断的设置和编程原理的全面认识复习和掌握,对单片机实际的应用作进一步的了解。
4、通过本次系统设计,增强自己的动手能力。
认识单片机在日常生活中的应用的广泛性,实用性。
本系统利用单片机的定时器/计数器定时和记数的原理,通过采用proteus仿真软件来模拟实现。
模拟利用AT89C51单片机、LED数码管以及控件来控制秒表的计数以及计数的开启/暂停/继续与复位!其中有两个数码管用来显示数据,一个数码管显示秒(两位),另一个数码管显示十分之一秒,十分之一秒的数码管计数从0~9,满十进一后显示秒的数码管的数字加一,并且十分之一秒显示清零重新从零计数。
C语言实现秒表

源代码如下(作者:中南大学通信工程1602肖涛,qq:2391527690)#include<stdio.h>#include<conio.h>//_kbhit#include<windows.h>#include<stdlib.h>struct t{intho,mi,se;}ti;struct t carry(struct t sj){ sj.se++;if(sj.se==60){sj.se=0;sj.mi++;}if(sj.mi==60){sj.mi=0;sj.ho++;}if(sj.ho==24)sj.ho=0;return(sj);}void showtime(struct t sj){system("cls");printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t");printf("秒表显示器:");if(sj.se<10&&sj.ho<10&&sj.mi<10)//控制计时时时间显示格式printf("0%d:0%d:0%d\n",sj.ho,sj.mi,sj.se);if(sj.se>=10&&sj.ho<10&&sj.mi<10)printf("0%d:0%d:%d\n",sj.ho,sj.mi,sj.se);if(sj.se<10&&sj.mi>=10&&sj.se<10)printf("0%d:%d:0%d\n",sj.ho,sj.mi,sj.se);if(sj.se<10&&sj.mi<10&&sj.ho>=10)printf("0%d:0%d:%d\n",sj.ho,sj.mi,sj.se);if(sj.se>=10&&sj.mi>=10&&sj.ho<10)printf("0%d:%d:%d\n",sj.ho,sj.mi,sj.se);if(sj.se>=10&&sj.mi<10&&sj.ho>=10)printf("%d:0%d:%d\n",sj.ho,sj.mi,sj.se);if(sj.se<10&&sj.mi>=10&&sj.ho>=10)printf("%d:%d:0%d\n",sj.ho,sj.mi,sj.se);if(sj.ho>=10&&sj.mi>=10&&sj.se>=10)printf("%d:%d:%d\n",sj.ho,sj.mi,sj.se);}void main (){char m,n;ti.ho=ti.mi=ti.se=0;printf("\t*************************************************\n");printf("\t\t 欢迎使用秒表功能\n");printf("\t\t操作提示:第一次按回车开始计时!\n");printf("\t\t按z暂停,第二次按回车结束秒表程序\n");while(1){m=getch();if(m!='\r')//读入一个输入,如果是回车,跳出while printf("\t\t输入错误,仅能输入回车!\n");elsebreak;}printf("\t\t已经开始计时,但你可以输入'z'来暂停计时\n");while(1){if(_kbhit())//判断是否键入字符{m=getch();if(m=='\r')break;if(m!='\r'&&m!='z')printf("\n输入错误,仅支持回车或'z'\n");if(m=='z'){system("cls");printf("当前时间:");if(ti.se<10&&ti.mi<10&&ti.ho<10)printf("0%d:0%d:0%d\n",ti.ho,ti.mi,ti.se);if(ti.se>=10&&ti.ho<10&&ti.mi<10)//控制暂停时时间显示格式printf("0%d:0%d:%d\n",ti.ho,ti.mi,ti.se);if(ti.se<10&&ti.mi>=10&&ti.se<10)printf("0%d:%d:0%d\n",ti.ho,ti.mi,ti.se);if(ti.se<10&&ti.mi<10&&ti.ho>=10)printf("0%d:0%d:%d\n",ti.ho,ti.mi,ti.se);if(ti.se>=10&&ti.mi>=10&&ti.ho<10)printf("0%d:%d:%d\n",ti.ho,ti.mi,ti.se);if(ti.se>=10&&ti.mi<10&&ti.ho>=10)printf("%d:0%d:%d\n",ti.ho,ti.mi,ti.se);if(ti.se<10&&ti.mi>=10&&ti.ho>=10)printf("%d:%d:0%d\n",ti.ho,ti.mi,ti.se);if(ti.ho>=10&&ti.mi>=10&&ti.se>=10)printf("%d:%d:%d\n",ti.ho,ti.mi,ti.se);printf("\n按任意键继续\n");while(1){Sleep(500);if(_kbhit())//如果有输入会连续判断两个kbhit(),并把输入赋给ch,所以找个替罪羔羊n{n=getch();break;}}}}Sleep(1000);ti=carry(ti);showtime(ti);}system("cls"); }。
c统计时间的函数

c统计时间的函数C语言是一种广泛应用于计算机编程的高级语言,它具有较高的执行效率和灵活性。
在编写程序时,我们常常需要对时间进行计算。
本文将介绍C语言中常用的计算时间的函数及其使用方法。
1. time函数time函数是C语言中用于获取当前系统时间的函数,它的原型定义为:time_t time(time_t *timer);其中,参数timer是一个指向time_t类型的指针,用于存储从UTC时间1970年1月1日0时0分0秒到当前时间的秒数。
下面是一个简单的示例代码,使用time函数输出当前系统时间的秒数:#include <stdio.h>#include <time.h>int main(){time_t now = time(NULL); //获取当前系统时间printf("Current time: %ld seconds since 1970-01-0100:00:00 UTC\n", now);return 0;}2. clock函数clock函数是C语言中用于计算程序运行时间的函数,它的原型定义为:clock_t clock(void);其中,返回值为clock_t类型,表示程序运行的CPU时间。
下面是一个示例代码,使用clock函数计算程序运行时间:#include <stdio.h>#include <time.h>int main(){clock_t start, end;double cpu_time_used;start = clock(); //记录程序开始时间//程序运行end = clock(); //记录程序结束时间cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; //计算CPU时间printf("CPU time used: %f seconds\n", cpu_time_used);return 0;}3. difftime函数difftime函数是C语言中用于计算两个时间之间的时间差的函数,它的原型定义为:double difftime(time_t time1, time_t time2);其中,参数time1和time2分别为两个时间,返回值为double类型,表示两个时间之间的差值(以秒为单位)。
单片机秒表程序代码

TR0=1;ET0=1;EA=1;
while(1)
{
KeyHandle();
CountToLeds();
CountsToLed();
}}
if (isLock) c=0x40;
if (isQuery) c=0x00;
v=Counts[Countp2];
Leds[4]=v/1000+c;
Leds[5]=v/100%10+c;
Leds[6]=v/10%10+0x10+c;
Leds[7]=v%10+c;
}
void Lock()
{
Counts[Countp]=Count;
{
if (isStart) Lock();
isStart=1;
isQuery=0;
}
if (key==0x0d) isStart=0;
if (key==0x0b)
{ isStart=0;
isLock=0;
isQuery=0;
Count=0;}
if (key==0x07)
{
Countp2=(MAXC+Countp2-1)%MAXC;
if (v&0x10) c|=0x80;
if (v&0x80) c=0x00;
if ((v&0x40) && (bGlink)) c=0x00;
P2=c;P3=Ledc;
Ledc++;
if (Ledc>=8) Ledc=0;}
void readkey()
{ char c;
c=P1;
c&=0x0f;
c语言课程设计秒表

c语言课程设计秒表一、教学目标本课程的教学目标是使学生掌握C语言编程的基本知识,能够使用C语言编写简单的程序,并通过编写秒表程序,使学生了解程序的基本结构和编程思想。
知识目标:使学生掌握C语言的基本语法、数据类型、运算符、控制结构等基本知识。
技能目标:使学生能够使用C语言编写简单的程序,并能够通过编程解决实际问题。
情感态度价值观目标:培养学生对计算机编程的兴趣和热情,使学生认识到编程在现代社会的重要性。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构等基本知识,并通过编写秒表程序,使学生了解程序的基本结构和编程思想。
具体的教学内容安排如下:1.第一章:C语言概述,介绍C语言的历史和发展,以及C语言的基本语法和特点。
2.第二章:数据类型和运算符,介绍C语言的基本数据类型和运算符,以及如何使用它们进行数据的计算和操作。
3.第三章:控制结构,介绍C语言的控制结构,包括条件语句和循环语句,以及如何使用它们控制程序的执行流程。
4.第四章:函数,介绍C语言的函数,包括函数的定义、声明和调用,以及如何使用函数进行代码的模块化和复用。
5.第五章:秒表程序,通过编写秒表程序,使学生了解程序的基本结构和编程思想,并巩固前面所学的知识。
三、教学方法本课程的教学方法主要包括讲授法、案例分析法和实验法。
1.讲授法:通过教师的讲解,使学生掌握C语言的基本语法、数据类型、运算符、控制结构等基本知识。
2.案例分析法:通过分析实际的编程案例,使学生了解编程的实际应用,并巩固所学的知识。
3.实验法:通过编写实际的程序,使学生掌握C语言的编程技巧,并培养学生的编程能力和解决问题的能力。
四、教学资源本课程的教学资源主要包括教材、参考书、多媒体资料和实验设备。
1.教材:选用《C程序设计语言》作为主要教材,使学生掌握C语言的基本语法、数据类型、运算符、控制结构等基本知识。
2.参考书:提供《C语言编程实践》等参考书,供学生进行深入学习。
C语言Windows程序设计——使用计时器

C语⾔Windows程序设计——使⽤计时器传统意义上的计时器是指利⽤特定的原理来测量时间的装置, 在古代, 常⽤沙漏、点燃⼀炷⾹等⽅式进⾏粗略的计时, 在现代科技的带动下, 计时⽔平越来越⾼, 也越来越精确, 之所以需要进⾏计时是在很多情况下我们需要知道时间已经过去了多少, 举例说, 上课下课的打铃、考试时的计时、车站按时间间隔进⾏发车等。
不仅在⽇常⽣活中会应⽤到计时, 在⼀些电⼦设备中计时的普遍存在, 如⼿机⾥的闹钟、电⼦秒表、电⼦设备的定时关机等, 这些计时的⽬的都是相同的, 当达到⼀定时间后执⾏某件事, 计时器相当于提醒作⽤, 当达到某个时间后提醒⼈们或者机器该做某件事了。
在Windows系统中, 计时器作为⼀种输⼊设备存在于系统中, 当每到⼀个设定的时间间隔后它都会向应⽤程序发出⼀个 WM_TIMER 的消息, 以提醒程序规定的间隔时间已经过去了, 计时器在程序中的应⽤⼗分⼴泛, 举些我们容易想到的⽰例:1>. 游戏这控制物体的移动速度, ⽐如说某个物体每100毫秒移动某个单位距离;2>. ⽂件的⾃动保存, 当⽤户编辑某些⽂件时5分钟⾃动保存⼀次, 避免因意外情况造成编辑的成果全部丢失;3>. 实现程序的⾃动退出, 当程序达到某个设定的时间后程序⾃动退出;⼀、使⽤计时器计时器的使⽤主要分为创建、处理、销毁三个部分。
①. 创建: 创建⼀个计时器并设定其定计时器的任务周期, 例如每5秒向程序发送⼀条 WM_TIMER 消息 ;②. 处理: 根据接收到的 WM_TIMER 消息让程序作出响应的处理 ;③. 销毁: Windows的计时器属于系统资源, 在使⽤完毕后应及时销毁。
1>. 计时器的创建要创建⼀个计时器可以使⽤ SetTimer 函数, SetTimer函数的原型: UINT_PTR SetTimer( HWND hWnd, //窗⼝句柄 UINT_PTR nIDEvent, //定时器的ID UINT uElapse, //间隔时间, 单位为毫秒 TIMERPROC lpTimerFunc //所使⽤的回调函数 ); 参数说明:参数⼀窗⼝句柄即为接收 WM_TIMER 消息的窗⼝句柄;参数⼆为设置该计时器的ID, ⽤于与其他的计时器进⾏区分;参数三为计时器发送 WM_TIMER 消息的时间间隔, 单位为毫秒, 最⼤可设置的时间间隔为⼀个 unsigned long int 型所能容下的数据⼤⼩,为 4 294 967 295 毫秒(约合49.7天), 当设定的时间间隔到了后Windows就会向应⽤程序的消息队列放⼊⼀个 WM_TIMER 消息 ;参数四为定时器所使⽤的回调函数, 当使⽤回调函数时, 所产⽣的 WM_TIMER 消息⾃动调⽤回调函数进⾏处理。