问,单片机如何利用延时子程序,将抢答器的倒计时从30秒变成60秒

问,单片机如何利用延时子程序,将抢答器的倒计时从30秒变成60秒,第1张

;延时子程序

//

;延时1ms子程序(晶振频率12MHz)DL

DELAY1: MOV R7, #02H

DL1: MOV R6, #0FFH

DL2: DJNZ R6, DL2

DJNZ R7, DL1

RET

//

;延时10ms子程序(晶振频率12MHz)DL

DELAY2: MOV R7, #14H

DL3: MOV R6, #0FFH

DL4: DJNZ R6, DL2

DJNZ R7, DL1

RET

//

;延时1s子程序(晶振频率12MHz)DL

DELAY1S:

MOV R5,#100

DELAY1S1:

LCALL DELAY2

DJNZ R5,DELAY1S1

DJNZ R4,DELAY1S

RET

//

这样延时30S的延时如下:

MOV R4,#30

LCALL DELAY1S

这样延时60S的延时如下:

MOV R4,#60

LCALL DELAY1S

//

//

END

30秒倒计时程序如下:

     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,#30

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

MOV A,SECC

DEC A

MOV SECC,A

JNZ T0INT2

MOV SECC,#30

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

;可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时

;倒计时时间由四位拨码开关的1/2/3位来控制,

;第2位表示5分钟,第3位表示15分钟,第4位表示30分钟,

;通过不同的组合可以产生5/15/20/30/35/45/50分钟倒计时

;P10口的外接的发光二极管为状态LED,定时未开始时LED常亮,定时过程中LED闪烁

;K1为开始按钮,K2为停止按钮

a_bit equ 20h ;数码管个位数存放内存位置

b_bit equ 21h ;数码管十位数存放内存位置

temp equ 22h ;计数器数值存放内存位置

;开机初始化

MOV P3,#0FFH ;对P3口初始化,设置为高电平,用于按键输入

MOV P0,#0FFH ;使显示时间数码管熄灭

CLR P10 ;点亮LED指示灯

;等待键盘输入

START:JB P36,$ ;循环判断开始按钮K1是否按下

ACALL DELAY10 ;延时10毫秒触点消抖

JB P36,START ;如果是干扰就返回

JNB P36,$ ;等待按键松开

;读拨码开关的状态,获得倒计时时间

SET1:

MOV A,#0 ;首先对A清零

JB P20,A1 ;判断拨码开关的第2位是否接通,接通就对A加5

ADD A,#5

A1: JB P21,A2 ;判断拨码开关的第3位是否接通,接通就对A加15

ADD A,#15

A2: JB P22,A3 ;判断拨码开关的第4位是否接通,接通就对A加30

ADD A,#30

A3: MOV TEMP,A

;这时TEMP中的值就是倒计时时间

;数码管显示定时时间的程序

display:

CLR P24 ;使继电器1释放,开始定时(开机时继电器处于吸合状态)

CLR P23 ;使继电器2释放,开始定时(开机时继电器处于吸合状态)

MOV R2,#120

AB1: MOV R3,#250

TIME1: mov a,temp ;将temp中的十六进制数转换成10进制

mov b,#10 ;10进制/10=10进制

div ab

mov b_bit,a ;十位在a

mov a_bit,b ;个位在b

mov dptr,#numtab ;指定查表启始地址

mov r0,#4

dpl1: mov r1,#250 ;

dplop: mov a,a_bit ;取个位数

MOVC A,@A+DPTR ;查个位数的7段代码

mov p0,a ;送出个位的7段代码

clr p27 ;开个位显示

ACALL DELY1 ;显示1毫秒

setb p27 ;关闭个位显示,防止鬼影

mov a,b_bit ;取十位数

MOVC A,@A+DPTR ;查十位数的7段代码

mov p0,a ;送出十位的7段代码

clr p26 ;开十位显示

ACALL DELY1 ;显示1毫秒

setb p26 ;关闭十位显示,防止鬼影

;插入一段判断定时过程中是否有按键输入的程序段

C1: JB P36,B1

ACALL DELAY10 ;延时10毫秒消抖

JB P36,C1

JNB P36,$ ;等待按键松开

AJMP SET1

B1: JB P37,M33

ACALL DELAY10 ;延时10毫秒消抖

JB P37,B1

JNB P37,$ ;等待按键松开

AJMP OVER

M33: djnz r3,TIME1 ;2毫秒循环执行250次,时间约05秒

CPL P10 ;使LED每1秒闪烁一次

djnz r2,AB1 ;循环执行120次,时间为1分钟

DEC TEMP ;满一分钟对定时时间减1

MOV A,TEMP

JNZ DISPLAY

;判断TEMP的数值是否为0不为0循环

;结束定时

OVER:CLR P10 ;LED指示灯常亮

SETB P24 ;继电器1吸合,定时结束,退回到开机时的状态

SETB P23 ;继电器2吸合,定时结束,退回到开机时的状态

AJMP START ;退到开机初始化状态

;1毫秒延时子程序

DELY1: MOV R4,#2

D1: MOV R5,#248

DJNZ R5,$

DJNZ R4,D1

RET

;10毫秒延时子程序

DELAY10:MOV R4,#20

D2: MOV R5,#248

DJNZ R5,$

DJNZ R4,D2

RET

;实验板上的7段数码管0~9数字的共阴显示代码

NUMTAB:DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH

end

从60秒到30秒再到90秒并循环倒计时显示。

----

有点不好理解。

从60秒到30秒,看来,是倒计时。

到了30之后,怎么办?是立即改为90吗?

到了90之后,再怎么办?是立即改为60吗?

以上就是关于问,单片机如何利用延时子程序,将抢答器的倒计时从30秒变成60秒全部的内容,包括:问,单片机如何利用延时子程序,将抢答器的倒计时从30秒变成60秒、求用单片机程序编写30秒倒计时投票器,要求AT89c51,部分模块也可以 比如:30秒倒计时程序、单片机30秒倒计时程序加电路图, 可用Proteus仿真~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9501821.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存