
;延时子程序区
//
;延时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 0000HJMP 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仿真~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)