使用51单片机实现,两位数码管实现秒计时,显示秒,能用独立按键控制开始、暂停。求单片机程序

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-10
利用51单片机,通过两位数码管显示秒,按键实现计时和停止计时 具体内容内详

ORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN: MOV TMOD,#01H MOV TH0,#HIGH(65536-10000) MOV TL0,#LOW(65536-10000) SETB ET0 SETB EA MOV R0,#0 MOV R1,#0 MOV R2,#0 MOV R3,#9 CLR 00H CLR 01HLOOP: JB P1.0,LP01 JNB P1.0,$ SETB TR0 CLR 01H SJMP LOOP0LP01: JB P1.1,LP02 JNB P1.1,$ SETB 01H SJMP LOOP0LP02: JB P1.2,LOOP0 JNB P1.1,$ CLR TR0 MOV P3,#0FDH MOV P2,#0 MOV P3,#0FEH MOV P2,#0 SJMP MAINLOOP0: JB 00H,LOOP1 MOV A,R0 SJMP LOOP2LOOP1: MOV A,R1LOOP2: MOV DPTR,#TABLE MOVC A,@A+DPTR MOV R3,A SJMP LOOPT0ISR: CLR TR0 MOV TH0,#HIGH(65536-10000) MOV TL0,#LOW(65536-10000) SETB TR0 JB 01H,T0C INC R2T0C: CPL 00H MOV A,R3 JB 00H,T001 MOV P3,#0FDH MOV P2,A SJMP T002T001: MOV P3,#0FEH MOV P2,AT002: MOV A,R2 CJNE A,#100,T0E MOV R2,#0 INC R0 CJNE R0,#10,T0E MOV R0,#0 INC R1 CJNE A,#10,T0E MOV R1,#0T0E: RETIT004: CLR TR0 RETITABLE: ; 共阴极数码管显示代码表 DB 3FH,06H,5BH,4FH,66H ;01234 DB 6DH,7DH,07H,7FH,6FH ;56789
END

其实,控制秒表的启动和停止,很简单。要做秒表,一定要用定时器吧,假如用T0,那开始初始化时,不写TR0=1,先不启动。
当按一下键,再启动,TR0=1,就开始计时了。
再 按一下键,就停止,TR0=0,就不计时了。
程序好写,先 定义一个按键
sbit key=P1^1; //具体是哪个 键,你自己改
主程序中,判断按键和启动/停止
if(key==0)
{
delay(); //具体延时时间自己定
if(key==0)
{
TR0=!TR0; //每按一次,取反 一次
while(key==0);
}
}

KEYVAL EQU 30H
DAT  EQU 33H
SCANLED EQU 39H
CLK  EQU 77H
SEC  EQU 78H
SEC1 EQU 79H
SEC2 EQU 7AH
DOT  BIT 00H
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXTINT0
ORG 000BH
LJMP T0ISR ;50ms定时
ORG 001BH
LJMP T1ISR ;扫描显示
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#11H
MOV TH0,#03CH
MOV TL0,#0B0H
MOV TH1,#0ECH
MOV TL1,#078H
MOV KEYVAL,#2
MOV 33H,#10H
MOV 34H,#10H
MOV 35H,#10H
MOV 36H,#10H
MOV CLK,#0
SETB IT0
SETB EX0
CLR TR0
CLR ET0
MOV R2,#0
SETB TR1
SETB ET1
SETB EA
LOOP:
MOV A,KEYVAL
LOOP1:
JNZ LOOP2 ;启动
SETB TR0
SETB ET0
SJMP LOOP
LOOP2:
DEC A
JNZ LOOP3 ;暂停
CLR TR0
CLR ET0
SJMP LOOP
LOOP3:
DEC A
JNZ LOOP ;清零
MOV 36H,#0
MOV 35H,#0
MOV 34H,#0
MOV 33H,#0
SJMP LOOP
EXTINT0:
PUSH ACC
INC KEYVAL
MOV A,KEYVAL
CJNE A,#3,EXT00
EXT00:
JC EXT01
MOV KEYVAL,#0
EXT01:
POP ACC
RETI
T0ISR:
PUSH ACC
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
INC CLK
MOV A,CLK
CJNE A,#2,T0ISRE
MOV CLK,#0
INC 36H
MOV A,36H
CJNE A,#10,T0ISRE
MOV 36H,#0
INC 35H
MOV A,35H
CJNE A,#10,T0ISRE
MOV 35H,#0
INC 34H
MOV A,34H
CJNE A,#6,T0ISRE
MOV 34H,#0
INC 33H
MOV A,33H
CJNE A,#10,T0ISRE
MOV 33H,#0
T0ISRE:
POP ACC
RETI
T1ISR:
PUSH ACC
CLR TR1
MOV TH1,#0ECH
MOV TL1,#78H
SETB TR1
MOV DPTR,#LEDTAB
T100:
MOV R0,#DAT
MOV A,SCANLED
ADD A,R0
MOV R0,A
MOV A,SCANLED
JNZ T101
MOV P2,#01H
SETB DOT
SJMP T1DIS
T101:
DEC A
JNZ T102
MOV P2,#02H
CLR DOT
SJMP T1DIS
T102:
DEC A
JNZ T103
MOV P2,#04H
SETB DOT
SJMP T1DIS
T103:
MOV P2,#08H
CLR DOT
T1DIS:
MOV A,@R0
MOVC A,@A+DPTR
JNB DOT,T1DIS1
ORL A,#01H
T1DIS1:
CPL A
MOV P0,A
INC SCANLED
MOV A,SCANLED
CJNE A,#4,T1END
MOV SCANLED,#0
T1END:
POP ACC
RETI
LEDTAB: 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

END



  • 51单片机 用定时器T1控制两位数码管做从0计数到60的实验,每一秒加1...
    答:通过定时器初值可以看出单片机使用的是11.0592MHz晶振 把函数void dispiay(uchar ge,uchar shi)改成void display(uchar shi,uchar ge)即可编译通过 只是函数拼写错误和变量顺序错误
  • 用AT89C51单片机控制两位8段LED数码管采用动态显示的方式显示29_百度知 ...
    答:include<reg51.h> define uchar unsigned char;uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f uchar number;void t0isr() interrupt 1 { TH0=(65536-5000)/256;TL0=(65536-5000)%256;number++;if(...
  • ...然后在两个数码管(加起来)上显示出来,C语言程序怎么写?
    答:include<reg51.h>#define uchar unsigned char;uchar LED1,LED2,LED3,LED4;uchar keyval,calflag,s_dat,d_dat;uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};unsigned int number,r_dat;void delay(unsigned int a...
  • 89c51单片机两个数码管同时工作怎么弄
    答:89c51单片机两个以上数码管同时工作,一般采用扫描显示方式,如果加上按键(矩阵扫描按键)就是如下面的仿真图,可以作为参考,有参考代码如下。include<reg51.h> define uchar unsigned char uchar temp;int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f u...
  • 51单片机怎么用一个按键控两个数码管,按一下改变两个数字的显示速度_百 ...
    答:include<reg51.h> define uchar unsigned char;uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f uchar number,dat,dattop=10,cnt=0;sbit keyu=P1^0;sbit keyd=P1^1;void t0isr() interrupt 1 { TH0...
  • 51单片机c程序用定时器控制两个数码管显示0到59,一直没弄懂段位和位选...
    答:每个数字 有 八个段 为 a b c d e f g h,(h 为小数点)数码管 有 两位一体的、三位一体的,四位一体的等,如四位一体的数码管有12个脚,分为 a b c d e f g h 八个 段码脚,四个 位码脚(四个数字位)数码管 的 显示 方法 需要 扫描显示,就是...
  • 我想用51单片机编个倒计时的c程序,要求用两位数码管显示分钟的,并用一...
    答:你这数码管的1、2口就这么悬着或者接dp一起了真的没问题吗……全局变量2个用于表示个位和十位,显示的时候可以省点力不用每次计算个位十位。然后一个全局变量代表秒 编程的话,首先是按键响应中断,控制某个全局变量flag的值,三种状态:正常、暂停、到时间。按键可以在前两种之间切换,如果已经是第...
  • 利用51单片机,通过两位数码管显示秒,按键实现计时和停止计时 具体内容...
    答:A,R2 CJNE A,#100,T0E MOV R2,#0 INC R0 CJNE R0,#10,T0E MOV R0,#0 INC R1 CJNE A,#10,T0E MOV R1,#0T0E: RETIT004: CLR TR0 RETITABLE: ; 共阴极数码管显示代码表 DB 3FH,06H,5BH,4FH,66H ;01234 DB 6DH,7DH,07H,7FH,6FH ;56789END ...
  • 单片机C51 数码管两位数不同时显示
    答:个位数显示么?主程序里没有调用显示的子程序啊,SBUF,难道是串行转并行?你十位led亮0.5ms,灭5s,能看到才怪呢。这段程序放在 if 语句外面 P1=0xbf; //选中第一个数码管 SBUF=table[shi];delay(500);P1=0x7f; //选中第二个数码管 SBUF=table[ge];...
  • 51单片机怎么用按键控两个数码管,按一下改变两个数字的显示速度,速
    答:include<reg51.h> define uchar unsigned char;uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f uchar number,dat,dattop=10,cnt=0;sbit keyu=P1^0;sbit keyd=P1^1;void t0isr() interrupt 1 { TH0...