用C语言设计秒表程序

用C语言设计秒表程序,第1张

int main()

{ char m;

struct tm time;

timehours=timeminutes=timeseconds=0;

printf("Now, press 's' key to begin the clock\n");

m=getch();

if(m=='s'||m=='S')

while(1)

{

while(!kbhit()) {

update(&time);

display(&time);}

m=getch();

if(m=='s'||m=='S')break;

else{ printf("Only 's' or 'S' can be inputed!!");}

}

}

把main函数改成这样看看行不行

我写了个六位数码管的程序,放到这里让你参考一下,希望对你有用!

/

数码管时钟秒表

功能简介:该程序有两个功能:时钟,秒表。key1,key2和key3键用来调节

时钟,根据LED的亮闪状态调节时钟(当八个LED全亮时为时钟显示状态,第一

个LED亮时为调节小时状态,第二个LED亮时为调节分钟状态,第三个LED亮时为

调节秒钟状态),key4键为秒表功能键。

实施步骤:第一步:开启定时器,完成数码管时钟走动功能;第二步:完成

数码管时钟调节功能;第三步:完成数码管秒表显示功能。

*** 作提示:功能键有四个,第二行第以列按键为调节键,第二行第二列按键

为增加数据键,第二行第三列按键为减少键,第二行第四列按键为秒表功能键。

/

#include <reg52h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit beep=P2^3;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table1[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //数码管位选编码

uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,

0x79,0x71,0x00};

uchar temp; //temp为按键变量

int light,flag; //flag用来控制数码管显示的状态(显示时钟或者显示秒表),light用来控制时钟和秒表的led显示

uchar shi2,ge2,shi1,ge1; //这四个变量用来分离出实参的十位和个位

uchar num,num1,num2,num3; //num,num1用来计数,num2用来控制调节的时分秒,num3用来改变秒表状态下的显示状态

int miao,fen,shi; //时钟变量

uchar mfen,mmiao,mmmiao; //秒表变量

void delay(uint z)

{

uint i,j;

for(i=0;i<z;i++)

for(j=0;j<110;j++);

}

void timeinit()

{

TMOD=0x11;

TH0=(65536-46080)/256;

TL0=(65536-46080)%256;

TH1=(65536-4608)/256;

TL1=(65536-4608)%256;

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=0;

}

void timedisplay0() interrupt 1

{

TH0=(65536-46080)/256;

TL0=(65536-46080)%256;

num++;

if(num==20)

{

num=0;

miao++; //开启时钟功能

if(miao==60)

{

miao=0;

fen++;

if(fen==60)

{

fen=0;

shi++;

if(shi==24)

shi=0;

}

}

}

}

void timedisplay1() interrupt 3

{

TH1=(65536-4608)/256;

TL1=(65536-4608)%256;

num1++;

if(num1==2)

{

num1=0;

mmmiao++;

if(mmmiao==100) //开启秒表功能

{

mmmiao=0;

mmiao++;

if(mmiao==60)

{

mmiao=0;

mfen++;

if(mfen==60)

mfen=0;

}

}

}

}

void display(uchar add,uchar date) //数码管显示信息函数(带有小数点)

{

shi2=date/10;

ge2=date%10;

P0=0xff;

wela=1;

P0=table1[add];

wela=0;

P0=0;

dula=1;

P0=table2[shi2];

dula=0;

delay(1);

P0=0xff;

wela=1;

P0=table1[add+1];

wela=0;

P0=0;

dula=1;

P0=table2[ge2]|0x80;

dula=0;

delay(1);

}

void display1(uchar add,uchar date) //数码管显示数据(不带有小数点)

{

shi1=date/10;

ge1=date%10;

P0=0xff;

wela=1;

P0=table1[add];

wela=0;

P0=0;

dula=1;

P0=table2[shi1];

dula=0;

delay(1);

P0=0xff;

wela=1;

P0=table1[add+1];

wela=0;

P0=0;

dula=1;

P0=table2[ge1];

dula=0;

delay(1);

}

void keyscan()

{

P3=0xfd;

temp=P3; //第二行功能键

if(temp!=0xfd)

{

delay(5);

if(temp!=0xfd)

{

beep=0;

switch(temp)

{

case 0xed: num2++; //第一个按键用来控制调节时,分,秒

TR0=0;

light=1;

if(num2==4)

{

num2=0;

light=0;

TR0=1;

}

break;

case 0xdd: if(num2==1) //第二键用来增加数据

{

shi++;

if(shi==24)

shi=0;

}

if(num2==2)

{

fen++;

if(fen==60)

fen=0;

}

if(num2==3)

{

miao++;

if(miao==60)

miao=0;

}

break;

case 0xbd: if(num2==1) //第三个键用来减小数据

{

shi--;

if(shi==-1)

shi=23;

}

if(num2==2)

{

fen--;

if(fen==-1)

fen=59;

}

if(num2==3)

{

miao--;

if(miao==-1)

miao=59;

}

break;

case 0x7d: flag=1; //第四个键用来开启秒表

num3++;

TR1=1;

if(num3==1)

mfen=mmiao=mmiao=0; //清除上次残留数据

if(num3==2)

TR1=0; //暂停秒表

if(num3==3)

{

mfen=mmiao=mmmiao=0; //秒表清零

TR1=0;

}

if(num3==4) //重新开启秒表

TR1=1;

if(num3==5) //暂停秒表

TR1=0;

if(num3==6) //切换为显示时钟状态

{

flag=0;

num3=0;

}

break;

}

while(temp!=0xfd)

{

temp=P3;

}

beep=1;

}

}

}

int main()

{

timeinit();

beep=1;

while(1)

{

keyscan();

if(light==0)

{

if(miao%2==0) //当数码管显示时钟状态时,八个led将以亮一秒灭一秒的状态循环下去

P1=0;

else

P1=0xff;

}

else

{

if(num2==1)

P1=0xfe;

if(num2==2)

P1=0xfd;

if(num2==3)

P1=0xfb;

}

if(flag==0) //显示时钟

{

display(1,shi);

display(3,fen);

display1(5,miao);

}

else //显示秒表

{

display(1,mfen);

display(3,mmiao);

display1(5,mmmiao);

}

}

return 0;

}

这是一个秒表,有按键实现 启动、暂停核清零功能。

#include <reg51H>

sbit P3_5 =P3^5;

unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00};

unsigned char second;

unsigned char keycnt;

unsigned int tcnt;

void main(void)

{

unsigned char i,j;

TMOD=0x02;

ET0=1;

EA=1;

second=0;

P1=dispcode[second/10];

P2=dispcode[second%10];

while(1)

{

if(P3_5==0)

{

for(i=20;i>0;i--)

for(j=248;j>0;j--);

if(P3_5==0)

{

keycnt++;

switch(keycnt)

{

case 1:

TH0=0x06;

TL0=0x06;

TR0=1;

break;

case 2:

TR0=0;

break;

case 3:

keycnt=0;

second=0;

P1=dispcode[second/10];

P2=dispcode[second%10];

break;

}

while(P3_5==0);

}

}

}

}

void t0(void) interrupt 1 using 0

{

tcnt++;

if(tcnt==4000)

{

tcnt=0;

second++;

if(second==100)

{

second=0;

}

P1=dispcode[second/10];

P2=dispcode[second%10];

}

}

S_SEG SEGMENT STACK

DB 256 DUP()

S_SEG ENDS

D_SEG SEGMENT

COUNT DB 0 ;计时单元,初值为0

TENM DB ‘ 0’ ;10分计时单元,初值为0

MINUTE DB ‘0:’ ;分计时单元,初值为0

TENS DB ‘0’ ;10秒计时单元,初值为0

SECOND DB ‘0’ ;秒计时单元,初值为0

HAOM DB ‘0’ ;10毫秒计时单元,初值为0

HAO DB ’8’,’$’ ;毫秒计时单元,初值为8

D_SEG ENDS

C_SEG SEGMENT

ASSUME CS:C_SEG ,SS:S_SEG

START: MOV AX,D_SEG

MOV DS,AX

CLI ;先关中断,以获得INT1CH

MOV AX,351CH ;调用35H号系统功能

INT 21H ;返回ES:BX=中断向量(段:偏移)

PUSH BX ;栈中保存INT1CH原中断向量

PUSH ES

STI ;开中断,以使键盘工作

MOV AH,1 ;等待键按下

INT 16H

CLI ;关中断

MOV DX,SEG TIMER ;置新中断向量

MOV DS,DX

MOV DX,OFFSET TIMER ;DS:DX=新中断向量(段:偏移)

MOV AX,251CH

INT 21H

STI ;再开中断,以使键盘和INT1CH工作

CHECK: MOV AH ,1 ;检查有无键代码

INT 16H

JZ DISPLAY1 ;无码可读,就跳转显示(DISPLAY系统保留)]

MOV AH ,0 ;无码可读,就要读取它

INT 16H

CMP AL ,51H ;是’Q’吗

JE OVER ;是,返回DOS

DISPLAY1: MOV AX,D_SEG ;不是,就显示

MOV DS ,AX

ASSUME DS:D_SEG

LEA DX ,TENM ;DS:DX=显示字符串地址

MOV AH ,9 ;显示 mm :ssmsms

INT 21H

JMP CHECK ;返回CHECK,循环继续

OVER: CLI

POP DS ;由栈中取回INT1CH原向量

POP DX

MOV AX ,251CH ;设置INT1CH,恢复原向量

INT 21H

STI ;开中断

MOV AX ,4C00H ;返回DOS

INT 21H

;以下为使用INT 1CH的中断服务子程序

TIMER PROC FAR

PUSH AX

MOV AX , D_SEG

MOV DS , AX

ASSUME DS :D_SEG

INC COUNT ;计时单元增1

CMP COUNT , ‘2’ ;到110毫秒否

JL EXIT ;不到,则返回

MOV COUNT , ‘0’ ;到,则计时单元清0

INC HAOM ;10毫秒计时单元增1

CMP HAOM ,’9’ ;到1秒否

JLE EXIT ;不到,则返回

INC SECOND ;到,则秒计时单元增1

MOV HAOM , ‘0’ ;10毫秒计时单元清0

CMP SECOND ,‘9’ ;到10秒否

JLE EXIT ;不到,则返回

MOV SECOND ,‘0’ ;到,则秒计时单元清0

INC TENS ;10秒计时单元增1

CMP TENS ,‘6’ ;到60秒否

JL EXIT ;不到,则返回

MOV TENS ,‘0’ ;到 ,则10秒计时单元清0

INC MINUTE ;分计时单元清0

CMP MINUTE ,‘9’ ;到10分 否

JLE EXIT ;不到,则返回

MOV MINUTE ,‘0’ ;到,则分计时单元清0

INC TENM ;10分计时单元增1

CMP TENM ,‘6’ ;到60分否

JL EXIT ;不到,则返回

MOV TENM ,‘0’ ;到,则10分计时单元清0,重新开始计时

EXIT: POP AX

IRET

TIMER ENDP

C_SEG ENDS

END START

;================================================================

;功能:本程序实现P0口的对数码管动态显示秒表的分、秒、1/100秒;

; 计时程序由中断服务程序实现,采用定时计数器T0工作方式1;

; P2口实现对数码管的片选功能

;================================================================

;==========================初始化================================

SHUCHU EQU P2 ;定义P0口为输出口

PIANXUAN EQU P1 ;定义P2口为片选口

MIAO EQU 30H

FEN EQU 31H

MIAO0 EQU 32H

SHUZI EQU 33H

C_0 BIT 20H0

;======================系统程序开始==============================

ORG 00H

LJMP START

ORG 03H

LJMP ON_OFF

ORG 0BH

LJMP T0_1

ORG 13H

LJMP RESET

ORG 30H

START:

CALL INIT

SETB C_0

MOV MIAO,#00

MOV MIAO0,#00

MOV FEN,#00

MOV DPTR,#TAB

MOV R2,#5

MAIN:

JNB C_0,$

CLR C_0

LL: CALL DISPLAY

CALL SHIJIAN

JMP MAIN

;========================时间子程序=============================

;输入:"30H、31H、32H"

;输出:无

;实现的功能:分、秒、百分之秒的计算。

;===============================================================

SHIJIAN:

DJNZ R2,TIAOCHU

MOV R2,#5

INC MIAO0

MOV R3,MIAO0

CJNE R3,#100,TIAOCHU

MOV MIAO0,#00

INC MIAO

MOV R3,MIAO

CJNE R3,#60,TIAOCHU

MOV MIAO,#00

INC FEN

MOV R3,FEN

CJNE R3,#60,TIAOCHU

MOV FEN,#00

TIAOCHU:RET

;========================显示子程序=============================

;输入:"A"

;输出:"P2口"

;实现的功能:显示秒、分、百分之妙

;===============================================================

DISPLAY:MOV SHUZI,MIAO0

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示十位

MOV PIANXUAN,#10H ;片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示个位

MOV PIANXUAN,#20H ;片选

CALL DELAY ;延时

MOV PIANXUAN,#00H

MOV SHUZI,MIAO

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示十位

MOV PIANXUAN,#04H ;片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示个位

MOV PIANXUAN,#08H ;片选

CALL DELAY ;延时

MOV PIANXUAN,#00H

MOV SHUZI,FEN

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示十位

MOV PIANXUAN,#01H ;片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示个位

MOV PIANXUAN,#02H ;片选

CALL DELAY ;延时

MOV PIANXUAN,#00H

RET

;========================计算子程序=============================

;输入:30H

;输出:"A和B"

;实现的功能:把33H中的数据十位和个位分离出来

;===============================================================

JISUAN:MOV A,SHUZI ;数据放在A中

MOV B,#10 ;除数放在B中

DIV AB ;商放在A中,余数放在B中

RET

;====================复位中断服务程序============================

;输入;无

;输出: 无

;实现的功能:把30H、31H、32H中的数据清零。

;================================================================

RESET:PUSH ACC

MOV 30H,#00H

MOV 3H,#00H

MOV 32H,#00H

CALL DELAY

POP ACC

RETI

;====================启停中断服务程序============================

;输入;无

;输出: 无

;实现的功能:关闭定时器

;================================================================

ON_OFF:CPL TR0

CALL DELAY

RETI

;====================定时中断0服务子程序========================

;输入:无

;输出:无

;实现的功能:实现定时20MS,影响标中断志位C_0

;===============================================================

T0_1:MOV TL0,50H ;设置定时初值

MOV TH0,51H

SETB C_0 ;定时标志位清0

RETI

;========================中断设置子程序=========================

;输入:无

;输出:无

;实现的功能:初始化设置定时器,设置初值,开中断0、中断1,定时器0

;===============================================================

INIT:MOV TMOD,#01H ;定时器0工作方式1

MOV DPTR,#65536-20000

MOV 50H,DPL

MOV 51H,DPH

MOV TL0,50H ;设置定时初值

MOV TH0,51H

MOV IE,#87H ;开定时器中断0

MOV TCON,#15H

RET

;======================延时程序==================================

;输入;无

;输出: 无

;实现的功能:延时一段时间

;================================================================

DELAY:MOV R6,#80

L7:MOV R5,#60

L8:DJNZ R5,$

DJNZ R6,L7

RET

;======================共阳查表数据==============================

TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

;===========================结束=================================

END

Option Explicit

Dim MinSec As Integer

Dim Sec As Integer

Dim Minute As Integer

Dim Hour As Integer

Private Sub Command1_Click() '开始按钮

Timer1Enabled = True

End SubPrivate Sub Command2_Click() '停止

Timer1Enabled = False

End SubPrivate Sub Command3_Click() '清除

Timer1Enabled = False

Hour = 0

Minute = 0

MinSec = 0

Sec = 0

Label1Caption = Format(Hour, "00") & "时" & Format(Minute, "00") & "分" & Format(Sec, "00") & "秒" & Format(MinSec, "00")

End SubPrivate Sub Form_Load()

Timer1Enabled = False

Timer1Interval = 10

Form1Caption = "秒表"

Command1Caption = "开始"

Command2Caption = "停止"

Command3Caption = "清除"

End SubPrivate Sub Timer1_Timer()

MinSec = MinSec + 1

If MinSec = 100 Then

MinSec = 0

Sec = Sec + 1

If Sec = 60 Then

Sec = 0

Minute = Minute + 1

If Minute = 60 Then

Minute = 0

Hour = Hour + 1

Else

End If

Else

End If

Else

End If

Label1Caption = Format(Hour, "00") & "时" & Format(Minute, "00") & "分" & Format(Sec, "00") & "秒" & Format(MinSec, "00")

End Sub

新建一个EXE标准工程,

在FORM1里添加控件

命令按钮Command1(Caption属性为"开始")

命令按钮Command2(Caption属性为"停止")

文本框Text1

计时器Timer1(Interval属性为100,Enabled属性为False)

打开代码窗口,输入代码

Private

SS

As

Long,

S

As

Long,

M

As

Long,

H

As

Long

'S=秒,M=分,H=时

Private

Sub

Command1_Click()

S

=

0

M

=

0

H

=

0

SS

=

0

Text1Text

=

H

&

":"

&

M

&

":"

&

S

Timer1Enabled

=

True

End

Sub

Private

Sub

Command2_Click()

S

=

0

M

=

0

H

=

0

SS

=

0

Timer1Enabled

=

False

End

Sub

Private

Sub

Form_Load()

Timer1Interval

=

100

Timer1Enabled

=

False

End

Sub

Private

Sub

Timer1_Timer()

If

SS

<

9

Then

SS

=

SS

+

1

Else

SS

=

0

If

S

<

59

Then

S

=

S

+

1

Else

S

=

0

If

M

<

59

Then

M

=

M

+

1

Else

M

=

0

H

=

H

+

1

End

If

End

If

End

If

Text1Text

=

H

&

":"

&

M

&

":"

&

S

&

""

&

SS

End

Sub

以上就是关于用C语言设计秒表程序全部的内容,包括:用C语言设计秒表程序、51单片机的4位数码管做简易秒表C语言程序、用单片机的汇编语言编写一个(十秒秒表 的编程)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存