51单片机设计一个秒表,用两个数码管(任意相邻的两个)显示。
/***************************************************************************/
#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方法不好使,要用时间中断处理
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...
芮克炎琥: 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;//十位 ...