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秒倒计时求程序,谢谢。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)