如何在c语言程序中插入一个倒计时命令
发布时间:2025-05-14 09:08:15 发布人:远客网络
一、如何在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)//延时子程序