用单片机实现30秒定时,显示在两位数码显示管上,并且到00的时候使音乐芯片自动报警
发布网友
发布时间:2022-05-23 18:21
我来回答
共2个回答
热心网友
时间:2023-11-05 15:55
SHOWNUMEQU 30H
TIME BIT 20H.0 ;延时1S满标志位
DISPLAYBIT 20H.1 ;显示标志位,DISPLAY=1为跑马灯;否则为霓虹灯;
ORG 0000H
RESET:LJMP MAIN
ORG 0003H
LJMP XINT0
ORG 000BH ;定时器0入口地址
LJMP TMR0
;===================主程序============================
ORG 0033H
MAIN:MOV SP, #40H
MOV TMOD,#01H ;定时器计时方式设置
MOV TH0, #3CH
MOV TL0, #0B0H
MOV R7, #04h
MOVTCON,#11H ;沿触发,开定时器
MOVIE,#83H
CLR TIME ;标志位初始化
CLR DISPLAY
_DIS:JNB DISPLAY, _RSLT
LCALL HORSE ;数字累加器显示调用
AJMP _DIS
_RSLT:LCALL SHINE ;环形显示调用
;==========DISPLAY=1 数字累加显示==================
HORSE:MOVR4,#0 ;R4储存当前显示的数字
_H: LCALLSHOW_H
JB TIME,_HOUT
JNBDISPLAY,SHINE
SJMP_H
_HOUT:CLR TIME
INC R4
CJNER4,#60,_X
MOVR4,#0
_X: SJMP_H
RET
;==========DISPLAY=0 环形旋转显示=================
SHINE:MOV R2,#10 ;R2储存段码,R3位码
MOV R3,#2
_S:LCALLSHOWONE
JB TIME,_sout
JBDISPLAY,HORSE
SJMP_S
_SOUT: CLR TIME
INC R2
INC R3
CJNE R3,#10,_END
MOV R2,#10
MOV R3,#2
_END:SJMP_S
RET
;=================段码表(接阳极)============================
DUAN:DB 3FH,06H,5BH,4FH,66H;对应字符0,1,2,3,4
DB 6DH,7DH,07H,7FH,67H
DB 01H,01H,02H,04H;(以下用于旋转显示)
DB08H,08H,10H,20H
;=================位码表(接阴极)============================
WEI:DB 0FEH,0FDH;分别选通0和1(用于累加数字显示)
DB 0FEH,0FDH,0FDH,0FDH; (以下用于旋转显示)
DB 0FDH,0FEH,0FEH,0FEH
;=================扫描数字显示==========================
SHOW_H:MOVR3,#0
MOVA,R4
MOVB,#10
DIVAB
MOV R2,A
_SWH:
CALL SHOWONE
LCALL DELAY
MOVR2,B
INCR3
CJNE R3,#2,_SWH
RET
;=================显示一位==========================
SHOWONE:MOV A,R3 ;送位码
MOV DPTR,#WEI
MOVC A,@A+DPTR
MOV P1,A
MOV A,R2 ;送段码
MOV DPTR,#DUAN
MOVC A,@A+DPTR
MOV P0,A
RET
;==============按键中断切换显示=====================
XINT0:
CPL DISPLAY
RETI
;==============定时器中断服务=====================
TMR0:clr TR0
DJNZ R7, LOOP
JNB DISPLAY, LOP
MOV R7,#14H
JMP LOP0
LOP:
MOV R7, #04H
LOP0:
SETB TIME
LOOP: MOV TH0, #3CH
MOV TL0, #0B0H
SETB TR0
RETI
;================延时=======================
DELAY:MOV R6,#10
_D:MOV R5,#30
DJNZ R5,$
DJNZ R6,_D
RET
END
这是以前写的程序,你可以看看,里面没有蜂鸣器报警的,不过你可以加进去,那个应该简单,还有我写的定时应该是1秒,数码管从0加到99 自动跳0,还有个环形跑马灯,就是数码管的外围段,都是一秒的,希望对你有帮助
热心网友
时间:2023-11-05 15:56
首先要有个可以产生1秒的时钟电路,可以通过CD4040加32768HZ的晶镇分频,分频后是2HZ,还要在分一次可以用CD4013之类的双D触发器实现,但我一般1秒的记时喜欢使用家庭的石英钟的电路.他的脉冲的0.5HZ也就是2秒发一次,但需要通过二极管来整出来,因为他的0.5HZ是分别发的然后对地是1赫兹.
然后就是记时电路,可以用2 个CD4028是带有正负记时的十进制记数电路,有进位和借位(在减记数时用到借位)BCD码输出,通过CD4511或CD4543(我比较喜欢CD4543,因为他的6和9显示的比较人性化,而4511显示的6没有最上面的横,和b的样子差不多,9没有下面的一横和q差不多)来进行数码管驱动,而4543的好处是他可以选择共阳极还是共阴数码管.然后把4028设定到负计时方式(通过引脚的电平来控制)然后可以用个电子开关比如CD4066来控制设定的时间这个可以定时到99秒,但要是显示30秒,需要预先设定到3和0十位的3需要先自己做个小脉冲发生器,来进行设定,这个自己就可以设计出电路来了吧~