专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

一个自己写的51单片机时钟程序

作者:huliedp   来源:本站原创   点击数:  更新时间:2010年08月29日   【字体:

这是一个自己独立完成的时钟程序,已经测试成功,用数码管来显示.

HOUR  EQU 030H

MINUTE EQU 031H

SECOND EQU 032H

COUNT1	equ 033H;总计数到4000:拆分成40*100

COUNT2	equ 034H

SPL	EQU 020H;闪烁判断的依据

SET_BTN EQU 021H;

ORG 0000H

	AJMP MAIN




ORG 001BH

 	AJMP IT_1




ORG 040H










MAIN: 	

	MOV SPL,#00H

	CLR SPL.0

	CLR SPL.1

	CLR SPL.2

	MOV DPTR,#TABLE

	MOV HOUR,#00H

	MOV MINUTE,#00H

	MOV SECOND,#00H

	MOV COUNT1,#00H

	MOV COUNT2,#00H

	MOV TMOD,#20H

	MOV TH1,#06H

	MOV TL1,#06H

	MOV IE,#10001000B;设置允许中断,并且打开两个定时器

	SETB TR1

	 

	 

LOOP:	




	JNB P0.0,JUST_TIME

	JB SET_BTN.0,JUST_TIME




	JNB P0.1, SUBB_TIME

	JB SET_BTN.1,SUBB_TIME




	JNB P0.2, ADD_TIME

	JB SET_BTN.2,ADD_TIME




TIME:	ACALL HOUR_SHOW

	ACALL MINUTE_SHOW

	AJMP LOOP

SUBB_TIME:

	JB SET_BTN.1,WAIT_BTN2_UP

	ACALL DELAY2;

	JB P0.1, TIME

	SETB SET_BTN.1

	JB SPL.1,SUBB_HOUR

	JB SPL.2,SUBB_MIN

	AJMP TIME

SUBB_MIN:

	MOV R1,MINUTE 

	CJNE R1,#00H,SUBB_MIN_OPT

	AJMP TIME

SUBB_MIN_OPT:

	DEC MINUTE

	AJMP TIME




SUBB_HOUR:

	MOV R1,HOUR 

	CJNE R1,#00H,SUBB_HOUR_OPT

	AJMP TIME

SUBB_HOUR_OPT:

	DEC HOUR

	AJMP TIME

WAIT_BTN2_UP:

	JNB P0.1,TIME

	CLR SET_BTN.1

	AJMP TIME







ADD_TIME:

	JB SET_BTN.2,WAIT_BTN3_UP

	ACALL DELAY2;

	JB P0.2, TIME

	SETB SET_BTN.2

	JB SPL.1,ADD_HOUR

	JB SPL.2,ADD_MIN

	AJMP TIME

ADD_MIN:

	MOV R1,MINUTE 

	CJNE R1,#3BH,ADD_MIN_OPT

	AJMP TIME

ADD_MIN_OPT:

	INC MINUTE

	AJMP TIME




ADD_HOUR:

	MOV R1,HOUR 

	CJNE R1,#17H,ADD_HOUR_OPT

	AJMP TIME

ADD_HOUR_OPT:

	INC HOUR

	AJMP TIME

WAIT_BTN3_UP:

	JNB P0.2,TIME

	CLR SET_BTN.2

	AJMP TIME







JUST_TIME:

	JB SET_BTN.0,WAIT_UP

	ACALL DELAY2;防抖

	JB P0.0, TIME

	SETB SET_BTN.0 

	JB SPL.2, CLR_M

	JNB SPL.1, SET_H




	CLR SPL.1

SET_M:	SETB SPL.2;分钟位置

	AJMP TIME




SET_H:   SETB SPL.1;小时位置

CLR_M:	CLR SPL.2

	AJMP TIME

LJUMP_TIME:LJMP TIME

WAIT_UP: JNB P0.0,LJUMP_TIME

	CLR SET_BTN.0

	AJMP TIME







WAIT2_DL1:

	ACALL DELAY1

	ACALL DELAY1

	RET




HOUR_SHOW:

	JNB SPL.1, HOUR_SHOW_HRER

	JB SPL.0, HOUR_SHOW_HRER

	ACALL WAIT2_DL1

	RET

HOUR_SHOW_HRER:

	SETB P2.0

	SETB P2.1

	CLR A

	MOV A,HOUR

	MOV B,#0AH

	DIV AB




	MOVC A,@A+DPTR

	MOV P1,#00H

	MOV P1,A

	CLR P2.0

	;延时

	ACALL DELAY1

	SETB P2.0

	MOV P1,#00H

	 




	MOV A,B

	MOVC A,@A+DPTR

	MOV P1,A

	CLR P2.1

	;延时

	ACALL DELAY1

	SETB P2.1  




	MOV P1,#00H

	RET




MINUTE_SHOW:

	JNB SPL.2, MINUTE_SHOW_HERE

	JB SPL.0, MINUTE_SHOW_HERE

	ACALL WAIT2_DL1

	RET

MINUTE_SHOW_HERE:

	SETB P2.2

	SETB P2.3

	CLR A

	MOV A,MINUTE

	MOV B,#0AH

	DIV AB




	MOVC A,@A+DPTR

	MOV P1,#00H

	MOV P1,A

	CLR P2.2

	;延时

	ACALL DELAY1

	SETB P2.2

	MOV P1,#00H

	 




	MOV A,B

	MOVC A,@A+DPTR

	MOV P1,A

	CLR P2.3

	;延时

	ACALL DELAY1

	SETB P2.3




	MOV P1,#00H

	RET




DELAY1:	;短延时

	MOV R6,#03H

DL1:	MOV R7,08H

DL2:	DJNZ R7,DL2

	DJNZ R6,DL1

	RET

DELAY2:	;按键延时

	MOV R6,#0AH

DL21:	MOV R7,0AH

DL22:	DJNZ R7,DL22

	DJNZ R6,DL21

	RET

IT_1:    

	PUSH ACC

	PUSH B

	PUSH PSW

	INC COUNT1

	MOV A,COUNT1

 	CJNE A,#28H,RETI_LABLE

  

	INC COUNT2

	MOV COUNT1,#00H




	MOV A,COUNT2

	MOV B,#32H

	DIV AB

	MOV A,B

	JNZ  C2_OPT

	CPL P3.7;秒的闪烁

	CPL SPL.0

	;INC SPL;给闪烁设置值

C2_OPT:	MOV A,COUNT2

	CJNE A,#64H,RETI_LABLE




	INC SECOND

	MOV COUNT2,#00H

	MOV A,SECOND

	CJNE A,#3CH,RETI_LABLE;




	INC MINUTE

	MOV SECOND,#00H

	MOV A,MINUTE

	CJNE A,#3CH,RETI_LABLE;

 

	INC HOUR

	MOV MINUTE,#00H

	MOV A,HOUR

	CJNE A,#18H,RETI_LABLE




	MOV HOUR,#00H

RETI_LABLE:

	 POP PSW

	 POP B

	 POP ACC

	 RETI

TABLE: DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H

 END 
关闭窗口

相关文章