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语言程序、用单片机的汇编语言编写一个(十秒秒表 的编程)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)