51单片机设计一个秒表,用两个数码管(任意相邻的两个)显示。

作者&投稿:詹光 (若有异议请与网页底部的电邮联系)
51单片机数字秒表设计用4位数码管分别显示十秒,秒,百毫秒,十毫秒计时范围为10ms到99s~

/***************************************************************************/
#include
sbit Axs=P1^3; sbit Bxs=P1^2; sbit Cxs=P1^1; sbit Dxs=P1^0;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
void YS(char hs); void XS(int xm,int xs); void Time1(void);int n,i,m,s;
/***************************************************************************/
void main(void){Time1();while(1){XS(m,s);}}//主函数
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>1000){n=0;s++; if(s>59){s=0;m++;if(m>59){m=0;}}}
}
/***************************************************************************/
void Time1(void)//定时器初始化
{
TH0=(65536-921)/256; TL0=(65536-921)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;
}
/***************************************************************************/
void XS(int xm,int xs) //数码管显示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xm/1)%10; d4=(xm/10)%10;
P0=table[d1]; Axs=0; YS(10); Axs=1;//个位显示
P0=table[d2]; Bxs=0; YS(10); Bxs=1;//十位显示
P0=table[d3]; Cxs=0; YS(10); Cxs=1;//百位显示
P0=table[d4]; Dxs=0; YS(10); Dxs=1;//千位显示
}
/***************************************************************************/
void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延时函数
/***************************************************************************/
这是我做的利用单片机定时器中断,模拟时钟的程序

和你要的一样,无偿奉献了

数码管的端口用的可能不一样,自己改下

两位跟一位电路不一样,一位时不必位选引脚,两位则必需指明位选的两个引脚,
两位时要轮询动态刷两个位,你这个delay方法不好使,要用时间中断处理

ORG 0000H
JMP BEGIN
ORG 000BH
LJMP T0INT
ORG 001BH
LJMP T1INT
LEDD EQU 30H
LEDC EQU 36H
SECC EQU 37H
TCNT EQU 3AH
ORG 0030H
;---------------------------------------
TABLE: ; 共阴极数码管显示代码表
DB 0FCH ;"0" 00H
DB 60H ;"1" 01H
DB 0DAH ;"2" 02H
DB 0F2H ;"3" 03H
DB 66H ;"4" 04H
DB 0B6H ;"5" 05H
DB 0BEH ;"6" 06H
DB 0E0H ;"7" 07H
DB 0FEH ;"8" 08H
DB 0F6H ;"9" 09H
DB 0EEH ;"A" 0AH
DB 3EH ;"B" 0BH
DB 9CH ;"C" 0CH
DB 7AH ;"D" 0DH
DB 9EH ;"E" 0EH
DB 8EH ;"F" 0FH
DB 00H ;" " 10H
; DB 3FH,06H,5BH,4FH,66H ;12345
; DB 6DH,7DH,07H,7FH, ;6789
;---------------------------------------
DELAY:
MOV R6,#25
DLY01:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DLY01
RET
;---------------------------------------
BEGIN:
MOV SP,#5FH
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TH1,#0F4H
MOV TL1,#48H
MOV LEDC,#0
MOV R0,#LEDD
CLR A
INIT:
MOV @R0,A
INC R0
DJNZ LEDC,INIT
SETB ET1
SETB TR1
MOV P2,#0
MOV TCNT,#0
MOV SECC,#0
SETB ET0
SETB EA
MOV SECC,#60
LCALL DISSEC
SETB TR0
SETB TR1
LOOP:
SJMP $
;---------------------------------------
T1INT:
PUSH ACC
CLR TR1
MOV TH1,#0F4H
MOV TL1,#48H
SETB TR1
MOV DPTR,#TABLE
MOV R0,#LEDD
MOV A,LEDC
T1INT0:
JNZ T1INT1
MOV P2,#01H
MOV A,@R0
MOVC A,@A+DPTR
CPL A
MOV P0,A
SJMP T1INTD
T1INT1:
MOV P2,#02H
INC R0
MOV A,@R0
MOVC A,@A+DPTR
CPL A
MOV P0,A
T1INTD:
INC LEDC
MOV A,LEDC
CJNE A,#2,T1INT6
T1INT6:
JC T1INTE
MOV LEDC,#0
T1INTE:
POP ACC
RETI
;---------------------------------------
HBCD:
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
;---------------------------------------
T0INT:
PUSH ACC
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
INC TCNT
MOV A,TCNT
CJNE A,#20,T0INT1
T0INT1:
JC T0INTE
MOV TCNT,#0
INC SECC
MOV A,SECC
CJNE A,#60,T0INT2
JC T0INT2
MOV A,#60
MOV SECC,A
T0INT2:
LCALL DISSEC
T0INTE:
POP ACC
RETI
;---------------------------------------
DISSEC:
MOV A,SECC
LCALL HBCD
PUSH ACC
ANL A,#0FH
MOV 30H,A
POP ACC
SWAP A
ANL A,#0FH
MOV 31H,A
RET
;---------------------------------------
END

,?!。。。??


C51单片机定时器1以方式1定时1秒如何设置?
1、先打开我们熟悉的单片机c51编程软件——keil,先把主方法写好。2、然后,我们要定义两个变量。3、接着,设定好定时器的工作方式。4、设置中断发生的机制。5、最后,我们要加进这几行代码进行初值的重装。6、最后,把if语句补充完毕就可以了。

单片机有哪几种编写一个延时1s的程序,并说明延时值的计算过程。(单片机...
计数器初值可以通过以下公式计算:计数器初值 = 256 - 延时所需指令数 + 2。因此,计数器初 1,333,333 + 2 = 0x0F。以上程序中使用了一个8位计数器,所以最大可以延时255个机器周期(即85ms左右)。如果需要更长的延时时间,可以使用16位计数器或者多次调用延时函数来实现。

利用单片机内部定时器设计一个秒表,显示最大值为 59.99 秒。
if(k2==1)temp|=K2;if(k3==1)temp|=K3;if(temp==temp0){\/\/ 按键消抖if(++ms>=5){\/\/连续5次扫描的值一样,则认为是稳定状态key=temp;ms=0;}}else {temp0=temp;ms=0;}key_down=key_sc&(~key);\/\/下降沿扫描key_up=(~key_sc)&key;\/\/下降沿扫描key_sc=key;}u8 readPIN(u...

使用8051单片机设计实现一个秒表
这个单片机秒表应用是比较简单的,主要是计时器的控制。

急需要用单片机程序编写一个秒表的程序
GOON: DEC C100us+1 MOV A,C100us ORL A,C100us+1 JNZ EXIT MOV C100us,#HIGH(TICK) ;重置计数值 MOV C100us+1,#LOW(TICK)INC SECOND ;秒值加一 MOV A,SECOND CJNE A,#60,EXIT ;判断秒值是否为60 MOV SECOND,#0 ;秒值为60,则清0 INC MINUTE ;分值加...

单片机编写一个能延时1秒的子程序
; R7=20Hloop: DJNZ R7,$ ; 延时时间≈2×[(R5-1)×256+R6-1]×256+R7 DJNZ R6,loop ; 当R5、R6等于0,相当于256参与运算 DJNZ R5,loop ; 当R5、R6等于0,相当于256参与运算 RET

单片机程序设计,设计一个电子秒表,用2个共阳数码管,60秒清零
; P0段选 ,P2.0个位位选,P2.1十位位选 。共阳数码管 16M晶振。STRT EQU P2.5 STP EQU P2.6 CLRR EQU P2.7 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 30H MAIN: MOV R0,#20 MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H MOV DPTR...

急求一个程序:用单片机上的定时器\/计数器设计一个秒表,要求从1计数...
等待按键 LCALL DELAY JB KEY,$ MOV A,KCOUNT CJNE A,#00H,K2; 判断按键次数 SETB TR0; 第1次按键,启动定时器 MOV IE,#82H JNB KEY,$ INC KCOUNT; 按键抬起,按键次数值加1 LJMP K1K2: CJNE A,#01H,K3 ...

请帮忙在51系列单片机系统中,编写一个延时1ms的子程序。谢谢。。_百...
如下图所示。2、然后添加c文件,接下来输入代码,先输入一个头文件命令。3、然后,进行宏定义,代码如图所示。4、然后声明P1口,如下图所示。5、最后,将延时语句全部添加进去,代码按照图中所示的直接敲入即可。6、最后,点击编译,生成HEX文件就可以了,这样51单片机延时语句就完成了。

求用单片机设计一个秒表AT89C51
AJMP MAIN ORG 0003H AJMP X0_INT ORG 000BH AJMP T0_INT ORG 0013H AJMP X1_INT MAIN:MOV TMOD,#01H ;T0定时方式1 MOV TH0, #(65536-50000) \/ 256 ;50ms@12MHz MOV TL0, #(65536-50000) MOD 256;SETB TR0 SETB ET0 ;开启定时中断 SETB EX0 SETB EX1 SETB...

高县19292865640: 51单片机设计一个秒表,用两个数码管(任意相邻的两个)显示. -
芮克炎琥: ORG 0000H JMP BEGIN ORG 000BH LJMP T0INT ORG 001BH LJMP T1INT LEDD EQU 30H LEDC EQU 36H SECC EQU 37H TCNT EQU 3AH ORG 0030H;--------------------------------------- TABLE: ; 共阴极数码管显示代码表 DB 0FCH ;"0" ...

高县19292865640: 用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键分别控制暂停、加一秒、减一秒和继续 -
芮克炎琥: #include<reg51.h>#define uchar unsigned char; uchar LED1,LED2; uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar num=0;sec,key; void delay(unsigned int a) { unsigned int i,j; for(i=0;i<a;i++) for(j=0;j<120;j++); } void ...

高县19292865640: 需要设计一简单的秒表用两个数码管,共阴极或者共阳极自己选用,一个数码管显示十位数 -
芮克炎琥: 其实很简单啊,51单片机P0 P2 口分别给个位、十位送数值,数码管的公共引脚就可以固定接VCC或者接地了.用定时器0定时10ms,累加处理一下就好了啊.明天有空给你程序和仿真图.

高县19292865640: AT89c51单片机程序控制两个数码管显示00 - 59秒表的程序要怎么编啊? -
芮克炎琥: display(second)子函数与两个数码管的连接方式有关 void main(void )//主程序 { TMOD=0x01;// 定时器1工作方式一 ET0=1; EA=1; TH0=(65536-10000)/256;//定时10ms TL0=(65536-10000)%256; TR0=0;//上电先不启动 while(1) { if(key1==0)//判...

高县19292865640: 想用51单片机编个倒计时的c程序,要求用两位数码管显示分钟的,并用一个按键 -
芮克炎琥: 你这数码管的1、2口就这么悬着或者接dp一起了真的没问题吗…… 全局变量2个用于表示个位和十位,显示的时候可以省点力不用每次计算个位十位. 然后一个全局变量代表秒 编程的话,首先是按键响应中断,控制某个全局变量flag的值,三种...

高县19292865640: 51单片机秒表设计,高手请进 -
芮克炎琥: 用89C51,外接晶振,复位电路,二个数码管,二个按键,做一个电子秒表,具体要求为用按键起停电子表,可用按键设计倒计时时间(如10S,20S,60S),并启动倒计时功能.能用按键选择以上两功能之一.nbsp;三、程序代码:nbsp;A_...

高县19292865640: 设计一个电子秒表,通过软件延时方式实现秒计时通过两个数码管动态显示秒表时间,时间范围0 - 60S -
芮克炎琥: 这原本是数字钟的程序 要6位数码管显示的,给你改了一下.硬件上需要89c51最小系统+74Hc573两片+数码管两位#includesbit dula = P2^6; sbit wela = P2^7; sbit led1 = P1^3; #define uint unsigned int #define uchar unsigned char uint a,c,g; uint ...

高县19292865640: 单片机设计,两位秒表 -
芮克炎琥: 这个也太简单了吧,一点难度都没有,不想写代码了.我的百度空间里有电子钟的程序,是4位LED的,有图有代码.你可以参考一下. 需要修改的就是把时和分去掉,把秒最大值改到99,再加一个按键就可以. 至于按键次数的处理,设一个变量来计算按下次数就可以.

高县19292865640: 单片机程序设计,设计一个电子秒表,用2个共阳数码管,60秒清零 -
芮克炎琥: ; P0段选 ,P2.0个位位选,P2.1十位位选 .共阳数码管 16M晶振. STRT EQU P2.5 STP EQU P2.6 CLRR EQU P2.7 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 30H MAIN: MOV R0,#20 MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#...

高县19292865640: 基于AT89C51单片机,利用定时器设计一个两位数码 管显示电路.求详细的设计过程. -
芮克炎琥: 硬件很简单,我就不画图了,简单描述一下吧.在单片机最小系统的基础上,P0口接数码管的数据端,P2.6,P2.7接数码管的控制端. 程序如下: #include #define uint unsigned int #define uchar unsigned char sbit s1=P2^6;//十位 ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网