您当前的位置:首页 > 互联网教程

如何在c语言程序中插入一个倒计时命令

发布时间:2025-05-14 09:08:15    发布人:远客网络

如何在c语言程序中插入一个倒计时命令

一、如何在c语言程序中插入一个倒计时命令

C语言中提供了许多库函数来实现计时功能,下面是一些常用的计时函数:

函数原型:time_t time(time_t* timer)

功能:返回以格林尼治时间(GMT)为标准,从1970年1月1日00:00:00到现在的时此刻所经过的秒数

用time()函数结合其他函数(如:localtime、gmtime、asctime、ctime)可以获得当前系统时间或是标准时间。

用difftime函数可以计算两个time_t类型的时间的差值,可以用于计时。用difftime(t2,t1)要比t2-t1更准确,因为C标准中并没有规定time_t的单位一定是秒,而difftime会根据机器进行转换,更可靠。

说明:C标准库中的函数,可移植性最好,性能也很稳定,但精度太低,只能精确到秒,对于一般的事件计时还算够用,而对运算时间的计时就明显不够用了。

函数原型:clock_t clock(void);

功能:该函数返回值是硬件滴答数,要换算成秒,需要除以CLK_TCK或者 CLK_TCKCLOCKS_PER_SEC。比如,在VC++6.0下,这两个量的值都是1000。

说明:可以精确到毫秒,适合一般场合的使用。

头文件:Mmsystem.h引用库: Winmm.lib

函数原型:DWORD timeGetTime(VOID);

功能:返回系统时间,以毫秒为单位。系统时间是从系统启动到调用函数时所经过的毫秒数。注意,这个值是32位的,会在0到2^32之间循环,约49.71天。

说明:该函数的时间精度是五毫秒或更大一些,这取决于机器的性能。可用timeBeginPeriod和timeEndPeriod函数提高timeGetTime函数的精度。如果使用了,连续调用timeGetTime函数,一系列返回值的差异由timeBeginPeriod和timeEndPeriod决定。

函数原型:DWORD WINAPI GetTickCount(void);

功能:返回自设备启动后的毫秒数(不含系统暂停时间)。

说明:精确到毫秒。对于一般的实时控制,使用GetTickCount()函数就可以满足精度要求。

5、QueryPerformanceCounter()、QueryPerformanceFrequency()

函数原型:BOOLQueryPerformanceCounter(LARGE_INTEGER*lpPerformanceCount);

BOOLQueryPerformanceFrequency(LARGE_INTEGER*lpFrequency);

功能:前者获得的是CPU从开机以来执行的时钟周期数。后者用于获得你的机器一秒钟执行多少次,就是你的时钟周期。

补充:LARGE_INTEGER既可以是一个8字节长的整型数,也可以是两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定:

在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率,然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。

说明:这种方法的定时误差不超过1微秒,精度与CPU等机器配置有关,一般认为精度为透微秒级。在Windows平台下进行高精度计时的时候可以考虑这种方法。

函数原型:int gettimeofday(struct timeval*tv,struct timezone*tz);

说明:其参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果(若不使用则传入NULL即可)。

二、c语言里在scanf等待时怎么弄出倒计时的效果

看样子只能使用多线程,但因为是控制台程序,在处屏幕上可能输入和输出有些冲突,原理大概应该是要使用到多线程,在主线程里处理输入,创建一线单独的线程来运行定义器并进行倒记数,并且输出。如果scanf函数需要输入的数据包含多个字符,可能会在屏幕上和倒数输出的数字想混乱,如果非要这么实现,建议使用getch函数,一个按键一个按键的接受输入,并且自定义回显。这样效果可能会好些。

三、c51单片机c语言交通灯的程序

uchar data sec_dx=20;//东西数默认

uchar data sec_nb=30;//南北默认值

sbit Yellow_nb=P2^5;//南北黄灯标志

sbit Yellow_dx=P2^2;//东西黄灯标志

bit set=1;//调时方向切换键标志

uchar code table[11]={//共阴极字型码

void delay(int ms);//延时子程序

P2=0Xc3;//开始默认状态,东西绿灯,南北黄灯

sec_nb=set_timenb;//从中断回复,仍显示设置过的数值

else{ P2=0xC3;sec_dx=sec_nb+5;}

buf[1]=sec_dx/10;//第1位东西秒十位

buf[2]=sec_dx%10;//第2位东西秒个位

buf[3]=sec_nb/10;//第3位南北秒十位

buf[0]=sec_nb%10;//第4位南北秒个位

void time0(void) interrupt 1 using 1//定时中断子程序

if(sec_nb<=5&&time==0)//东西黄灯闪

{ Green_dx=0;Yellow_dx=!Yellow_dx;}

if(sec_dx<=5&&time==1)//南北黄灯闪

{ Green_nb=0;Yellow_nb=!Yellow_nb;}

if(sec_dx==0&&sec_nb==5)

if(sec_nb==0&&sec_dx==5)

if(time==0&&sec_nb==0)

{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}

if(time==1&&sec_dx==0)

{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}

void key_to1()//键盘处理子程序之+

sec_nb=set_timenb;//设置的数值赋给东西南北

void key_to2()//键盘处理子程序之-

sec_nb=set_timenb;//设置的数值赋给东西南北

void key_to3()//键盘处理之紧急车通行

void int0(void) interrupt 0 using 1//只允许东西通行

void int1(void) interrupt 2 using 1//只允许南北通行

void delay(int ms)//延时子程序