编程实现60秒的倒计时器程序,到最后10秒的时候数码管开始闪烁递减知道为0!请教这个闪烁子程序怎么编呢

编程实现60秒的倒计时器程序,到最后10秒的时候数码管开始闪烁递减知道为0!请教这个闪烁子程序怎么编呢,第1张

void display_shanshuo(uchar shi, uchar ge)//闪烁子程序

{

wei = 1; P0 = 0xff; wei = 0;//关闭显示

}

void main()

{

init();

while(1) {

if(time == 20) {

time = 0;

temp--;

if(temp == 0) temp = 20;

shi = temp / 10;

ge = temp % 10;

}

if(temp > 10) display(shi, ge); //正常显示

else { //否则闪烁

if (time / 10) display(shi, ge); //后半秒正常显示

else display_shanshuo(shi, ge); //前半秒关闭显示

}

}

}

tdioh>

#include <conioh>

#include <windowsh>

#include <stdlibh>

struct tm //定义时间结构体,包括时分秒和10毫秒

{

int hours,minutes,seconds;

int hscd;

}time,tmp,total; //time用以计时显示,tmp用以存储上一阶段时间,total记总时间

int cnt;

FILE fout;

//每次调用update函数,相当于时间过了10ms

void update(struct tm t)

{

(t)hscd++; //10ms单位时间加1

cnt++;

if ((t)hscd==100) //计时满1s,进位

{

(t)hscd=0;

(t)seconds++;

}

if ((t)seconds==60) //计时满一分,进位

{

(t)seconds=0;

(t)minutes++;

}

if ((t)minutes==60) //计时满一小时,进位

{

(t)minutes=0;

(t)hours++;

}

if((t)hours==24) (t)hours=0;

//delay();

Sleep(10); //Sleep是windows提供的函数,作用是暂停程序,单位毫秒,所以此处暂停10ms

}

void display(struct tm t)

{

//此处输出计时结果,\r为回车不换行,既一直在同一行更新时间

printf("%d:",(t)hours);

printf("%d:",(t)minutes);

printf("%d:",(t)seconds);

printf("%d\r",(t)hscd);

//printf("Now, press ‘e’ key to stop the clock…");

}

void time_init() //初始化时间

{

timehours=timeminutes=timeseconds=timehscd=0;

}

void get_total() //计算总时间

{

totalhscd = cnt % 100;

cnt /= 100;

totalseconds = cnt % 60;

cnt /= 60;

totalminutes = cnt % 60;

cnt /= 60;

totalhours = cnt;

}

int main()

{

char m;

time_init();

cnt = 0;

fout = fopen("timeouttxt","w");

printf("按回车键开始计时!\n");

while(1)

{

m = getch();

if(m != ‘\r’) //读入一个输入,如果是回车,那么跳出次循环

printf("输入错误,仅能输入回车键!\n");

else

break;

}

printf("已经开始计时,但是你可以按回车键以分段计时!\n");

while(1)

{

if(kbhit()) //此处检查是否有键盘输入

{

m=getch();

if(m == ‘\r’) //如果等于回车,那么计时结束,跳出循环

break;

else if(m == ‘ ‘) //如果等于空格,显示此次计时,初始化计时器

{

tmp = time; //记录上一段计时器结果

fprintf(fout,"%d:%d:%d:%d\n",tmphours,tmpminutes,tmpseconds,tmphscd); //写入文件

time_init();

printf("\n");

}

else

{

printf("输入错误,仅支持输入回车键或者空格键!\n");

}

}

update(&time); //更新计时器

display(&time); //显示计时器时间

}

tmp = time; //输出最后一次即使结果,写入文件

fprintf(fout,"%d:%d:%d:%d\n",tmphours,tmpminutes,tmpseconds,tmphscd);

get_total(); //计算总的时间,显示,并写入文件

printf("\n总时间:%d:%d:%d:%d\n",totalhours,totalminutes,totalseconds,totalhscd);

fprintf(fout,"统计时间:%d:%d:%d:%d\n",totalhours,totalminutes,totalseconds,totalhscd);

fclose(fout);

printf("已经保存到当前目录下的timeouttxt文件中按任意键结束!");

getch();

}

另外,站长团上有产品团购,便宜有保证

ORG     00H  ;

          SJMP    STAR   ;

          ORG     1BH;

          SJMP    TIS;              转T1中断服务程序

          ORG     30H;

   STAR:  MOV     R2,#60H;       倒计时初值

          MOV     R4,#20H;       定时中断溢出计数器

          MOV     IE,#88H;      开中断

          MOV     TMOD,#10H;      

          MOV     TH1,#3CH;       定时初值

          MOV     TL1,#0B0H;     定时初值

          SETB    TR1;       启动

          ACALL   DIS;       调用显示子程序

          SJMP    $;

   TIS:   MOV     TH1,#3CH;

          MOV     TL1,#0B0H;

          DJNZ    R4,T1S1;          定时1S到否

          MOV     R4,#20;       到1S,重置R4=20

          DJNZ    R2,T1S0;       倒计时递减

          CLR     TR1;          倒计时结束,关定时器

   T1S0:  ACALL   DIS;      调显示

   T1S1:  RETI           ;         中断返回

   SEG7:  INC     A;             A的值加一

          MOVC    A,@A+PC;         取显示断段

       RET;   ;

       DB  0C0H,0F9H,0A4H,0B0H; ;    0至3的共阳型显示码

       DB  99H,92H,82H,0F8H;;     4至7的共阳型显示码

       DB  80H,90H,88H,83H;     8至B的共阳型显示码

       DB  0C6H,0A1H,86H,8EH;;     C至F的共阳型显示码

  DIS: MOV     A,R2;       ;     单字节十六进制数转为十进制数

       MOV     B,#10   ;

       DIV     AB ;

       ACALL   SEG7 ;

       MOV     P1,A;     ;        显示十位

       MOV     A,B;;

       ACALL   SEG7;;

       MOV     P2,A; ;          显示个位

       RET;      ;          子程序返回

       END ;

1、C语言中实现精确计时,参考代码如下:

ANSIC: ftime()

struct timeb {

time_t time;

unsigned short millitm;

short timezone;

short dstflag;

};

2、另外,还有就是更精确定计时,需要CPU的支持,具体情况,可以参考MSDN。

LARGE_INTEGER frequency = {0};

LARGE_INTEGER now = {0};

LARGE_INTEGER end = {0};

QueryPerformanceFrequency(&frequency);

while (QueryPerformanceCounter(&now) && ((nowQuadPart - endQuadPart) < 0))

{

Sleep(0);

}

以上就是关于编程实现60秒的倒计时器程序,到最后10秒的时候数码管开始闪烁递减知道为0!请教这个闪烁子程序怎么编呢全部的内容,包括:编程实现60秒的倒计时器程序,到最后10秒的时候数码管开始闪烁递减知道为0!请教这个闪烁子程序怎么编呢、这么用C语言做倒计时器、51单片机如何使外部中断显示60秒倒计时求程序,谢谢。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9286252.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存