C语言定时器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言定时器相关的知识,希望对你有一定的参考价值。
如何用C语言制作一个定时器,比如说我要做一个智力问答程序,时间限制60秒,如果60秒之后就执行某个函数或某段代码,要怎么实现?
这个程序用多线程比较好解决.#include <windows.h>
#include <iostream>
#include <conio.h>
using namespace std;
const int MAX_SECOND = 1000 * 60;
DWORD WINAPI MyThread(PVOID pParam)
int nSum = 0;
DWORD dwFirstTime = GetTickCount();
cout<<"做题开始,请在"<<MAX_SECOND / 1000 <<"秒内回答."<<endl;
do
cout<<"1 + 2 = ? 请回答:"<<endl;
nSum = getch();
cout<<char(nSum)<<endl;
if(nSum == 3 + '0')
cout<<"答案正确"<<endl;
return 0;
while(GetTickCount() - dwFirstTime <= MAX_SECOND);
return 0;
int main()
HANDLE hThread = CreateThread(NULL, 0, MyThread, 0, NULL, NULL);
WaitForSingleObject(hThread, MAX_SECOND);
CloseHandle(hThread);
return 0;
参考技术A #include<time.h>
time_t t;
struct tm *timer;
time(&t);//t返回系统当前时间
timer=localtime(&t);//返回tm结构时间,
这样取得系统时间,再跟已定时间比较,相等则触发
结构tm定义如下:
struct tm
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;; 参考技术B 我手头没编译器,所以没调试,你试试看先
#include <stdio>
#include <windows.h>
main()
int ms;
long start = GetTickCount();
scanf("%d",&ms);
printf("wait for %d second...",ms);
while(GetTickCount() < start + ms * 1000);
//your code here
参考技术C #include<conio.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>
#define N 10
void fun()
printf("OK,now fun() start!!");
getch();
void main()
clock_t start,end;
int i=0;
start=end=clock();
for(i=0;i<N;i++)
Sleep(1000);
end=clock();
fun();
本回答被提问者采纳 参考技术D #include "stdio.h"
#include "time.h"
main()
开始做题;
clock_t start,end;
int n = 60;
start=end=clock();
while((n-(int)(end-start)/19)>=0)
sleep(1);
end=clock();
提交试卷;
分别用汇编语言和C语言设计: 采用中断方式,利用定时器进行0-9秒表计数器的设计,并用数码
分别用汇编语言和C语言设计:
采用中断方式,利用定时器进行0-9秒表计数器的设计,并用数码管显示。
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW((65536-50000)
SETB TR0
SETB ET0
SETB EA
MOV R0,#0
MOV R2,#0
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW((65536-50000)
SETB TR0
INC R0
CJNE R0,#20,T0E
INC R2
CJNE R2,#10,T001
MOV R2,#0
T001:
MOV A,R2
MOV DPTR,#TABLE
MOV A,@A+DPTR
MOV P0,A
T0E:
RETI
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6fh ;56789
END
#include<reg51.h>
#define uchar unsigned char
uchar table[]=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f;
uchar num,dat;
void t0isr() interrupt 1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num>=20)
num=0;
dat++;
dat%=10;
P0=table[dat];
main()
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
num=0;
dat=0;
while(1);
追问谢谢
追答呵呵,希望可以帮到你。
追问谢谢 能再帮我回答这个问题吗?简述中断系统的工作流程。
参考技术A ORG 00HAJMP MAINORG 0BHAJMP T0INTORG 30H ;主程序开始地址MAIN: MOV R4,#20MOV DPTR,#TABMOV TMOD,#01HMOV TH0,#03CH ;12M晶振时定时初值取#3CB0H MOV TL0,#0B0H SETB ET0SETB EASETB TR0DISP:MOV A,R0MOVC A,@A+DPTRMOV P0,AAJMP DISP T0INT: MOV TH0,#03CH;定时中断子程序。重装定时常数MOV TL0,#0B0H;DJNZ R4,RTI ;50msX20=1S,未满20次,跳出中断子程序MOV R4,#20INC R0CJNE R0,#10,RTIMOV R0,#0 RTI: RETITAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;显示码表,共阴
END
#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar time,num;uchar code tab[ ]= 0x3F,/*0*/ 0x06,/*1*/ 0x5B,/*2*/ 0x4F,/*3*/ 0x66,/*4*/ 0x6D,/*5*/ 0x7D,/*6*/ 0x07,/*7*/ 0x7F,/*8*/ 0x6F,/*9*/ ; void display();
void T0intinit( ) //定时器T0初始化 TMOD=0x01; TH0=(65536-50000)/256; //50ms定时 TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1;
void main() T0intinit( ); while(1) display( );
void display( ) P0=tab[num];
void T0int( ) interrupt 1 //定时器T0中断 方式1 TH0=(65536-50000)/256; //重装10ms定时常数 TL0=(65536-50000)%256; time++; if(time==20) time=0; num++; if(num==10) num=0; 追问
中文需要写上去吗?
追答中文没事,前面有个分号。分号后面的是注释,不影响程序的。
参考技术B 秒表是秒表,计数器是计数器。你到底需要什么呢?
一般不会是两个的。。。
以上是关于C语言定时器的主要内容,如果未能解决你的问题,请参考以下文章