⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.asm

📁 一个基于51单片机的时钟电路设计源代码,还包括了电路图.PCB.源程序
💻 ASM
字号:
;DESCRIPION:时钟程序:00H--05H 作为计时数据存储区,06H作为输出数据实际数据存储区,07H作为扫描信号扫描位
                              ;置信息存储区,13H作为读数据的指针信息,09H,10H用作延时计数存储区,11H用
                              ;作中断计数器;R0作为转存

;AUTHORS:   WEIHONGLIN

;DATE:      2003.8.6

;VER:       1.0


			                ;程序入口
ORG	0000H
LJMP	MAIN
ORG	000bH
LJMP	INT
ORG	030H
LJMP	MAIN

MAIN:
;*************************初始化程序**********************************
;********定义数据存储区***********
					;定义时间存储区
STATE EQU 20H
THH0 EQU 04H
THH1 EQU 05H
TM0  EQU 02H
TM1  EQU 03H
TS0  EQU 00H
TS1  EQU 01H
					;输出缓冲,实际值
OUTPUT EQU 06H
					;扫描信号
POSITION EQU 07H
					;数据指针,指示所要读的数据区
PIN EQU 13H
					;中断次数计数
INTIME EQU 11H
SHOW EQU 12H
FEN  EQU  20H
SHI  EQU  21H
;********初始化程序***************
					;初始化栈堆
MOV 	SP,#50H
					;初始化数据存储区
MOV 	THH0,#2
MOV 	THH1,#1
MOV 	TM0,#9
MOV 	TM1,#5
MOV 	TS0,#0
MOV 	TS1,#5
MOV 	DPTR,#TAB
MOV 	POSITION,#01B
MOV     PIN,#0
					;初始化定时器及定时中断
MOV	TMOD,#01H
SETB	EA
SETB	ET0
MOV	TH0,#3CH
MOV	TL0,#0B0H
SETB	TR0
                                        ;默认使用第二组通用寄存器组
SETB    RS0
CLR     RS1

MOV     FEN,#00001100B
MOV     SHI,#00110000B
MOV     STATE,#0FFH
LJMP   DISPLAY



;*********************延时子程序****************************
					;延时3毫秒
DELAY:
	MOV 	10H,#5H
S1:
	MOV	09H,#250
S2:
	DJNZ	09H,S2
	DJNZ	10H,S1
	RET


;*********************正常显示模式**************************
DISPLAY:

					;关闭显示
	MOV	P0,#0FFH

					;传递新的扫描显示位置
	MOV 	P1,POSITION
                                        ;灭零
        MOV     A,THH1
        CJNE    A,#0,SS
        ANL     P1,#11011111B
                                        ;再把显示值传给显示输入端P0,显示
SS:
        MOV     R0,PIN
 	MOV 	OUTPUT,@R0
        MOV     R0,OUTPUT
	MOV 	A,R0
	MOVC 	A,@A+DPTR
        MOV     P0,A
	LCALL 	DELAY
					;得到下一扫描位置
	MOV 	A,POSITION
	RL  	A
					;判断显示扫描是否到了最高位
	CJNE 	A,#1000000B,CONTINU1
                                	;是则回复到最低位
	MOV 	POSITION,#01H
	MOV	PIN,#00H
        LJMP    DISPLAY
CONTINU1:
                                        ;否则给下一次用
	MOV     POSITION,A
	INC	PIN
        LCALL   KEY
        LJMP    DISPLAY

;*******************调整显示模式***************************


;*****去时显示模式**********
DISPHOUR:
 					;关闭显示
	MOV	P0,#0FFH
					;传递新的扫描显示位置
	MOV 	P1,POSITION
 					;再把显示值传给显示输入端P0,显示
        MOV     R0,PIN
 	MOV 	OUTPUT,@R0
        MOV     R0,OUTPUT
	MOV 	A,R0
	MOVC 	A,@A+DPTR
        ANL     A,SHI
        MOV     P0,A
	LCALL 	DELAY
 					;得到下一扫描位置
	MOV 	A,POSITION
	RL  	A
 					;判断显示扫描是否到了最高位
	CJNE 	A,#1000000B,CONTINU2
                                	;是则回复到最低位
	MOV 	POSITION,#01H
	MOV	PIN,#00H
        LJMP    DISPLAY
 CONTINU2:
                                        ;否则给下一次用
	MOV     POSITION,A
	INC	PIN
        LJMP    DISPHOUR

;*****去分显示模式**********
DISMINUT:
 					;关闭显示
	MOV	P0,#0FFH
					;传递新的扫描显示位置
	MOV 	P1,POSITION
 					;再把显示值传给显示输入端P0,显示
        MOV     R0,PIN
 	MOV 	OUTPUT,@R0
        MOV     R0,OUTPUT
	MOV 	A,R0
	MOVC 	A,@A+DPTR
        ANL     A,FEN
        MOV     P0,A
	LCALL 	DELAY
					;得到下一扫描位置
	MOV 	A,POSITION
	RL  	A
					;判断显示扫描是否到了最高位
	CJNE 	A,#1000000B,CONTINU3
                                	;是则回复到最低位
	MOV 	POSITION,#01H
	MOV	PIN,#00H
        LJMP    DISPLAY
CONTINU3:
                                        ;否则给下一次用
	MOV     POSITION,A
	INC	PIN
        LJMP    DISMINUT

;*****去秒显示模式**********
DISPSEC:
         					;关闭显示
	MOV	P0,#0FFH
					;传递新的扫描显示位置
	MOV 	P1,POSITION
 					;再把显示值传给显示输入端P0,显示
        MOV     R0,PIN
 	MOV 	OUTPUT,@R0
        MOV     R0,OUTPUT
	MOV 	A,R0
	MOVC 	A,@A+DPTR
        ANL     A,FEN
        MOV     P0,A
	LCALL 	DELAY
					;得到下一扫描位置
	MOV 	A,POSITION
	RL  	A
					;判断显示扫描是否到了最高位
	CJNE 	A,#1000000B,CONTINU4
                                	;是则回复到最低位
	MOV 	POSITION,#01H
	MOV	PIN,#00H
        LJMP    DISPLAY
CONTINU4:
                                        ;否则给下一次用
	MOV     POSITION,A
	INC	PIN
        LJMP    DISPSEC

TAB: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
;七段码:**0****1****2****3***4***5***6****7***8***9***
INT:
	PUSH 	PSW			;保护现声
        PUSH	ACC
					;由于入栈及置数用去8微秒时间故应3CB0H+8H
	MOV	TH0,#3CH
	MOV	TL0,#0B8H
 					;判断中断次数,当达时,秒个位增一,中断计数区清零
        INC	INTIME
	MOV	A,INTIME
        CJNE	A,#20,LS1
	MOV	INTIME,#0
	INC	TS0
        CPL     P3.0
					;秒个位达10则清零且十位加一
	MOV	A,TS0
	CJNE	A,#10,LS1
	MOV	TS0,#0
	INC	TS1
					;秒计数满60则分加一,秒清零
	MOV	A,TS1
	CJNE	A,#6,LS1
	MOV	TS1,#0
	INC	TM0
					;分个位满10则分十位加一且分个位清零
	MOV	A,TM0
	CJNE	A,#10,LS1
	MOV	TM0,#0
	INC	TM1
					;分计数满,分计数清零,时计数加一
	MOV	A,TM1
	CJNE	A,#6,LS1
	MOV	TM1,#0
	INC	THH0
					;因有显示12之后加一进位的情况出现,所以这里要先判断TH1
	MOV	A,THH1
	CJNE	A,#1,LS
	MOV	A,THH0
	CJNE 	A,#3,LS1
	MOV	THH0,#1
	MOV	THH1,#0
	LJMP    LS1
					;在时计数高位为零的情况下才执行此代码
LS:	MOV	A,THH0
	CJNE	A,#10,LS1
	MOV	THH0,#0
	INC	THH1
LS1:
        POP     ACC
        POP     PSW
	RETI



KEY:
                            ;判断是否有效
        MOV      A,STATE
        CJNE     A,#0FFH,NEXT
        MOV      STATE,P2
        MOV      P2,#0FFH
        RET
NEXT:
        CJNE     A,P2,DO
        RET
DO:
        JNB      STATE.1,CLRSEC
        JNB      STATE.2,INCM
        JNB      STATE.3,INCH
        RET
CLRSEC:
        MOV     TS0,#00H
        MOV     TS1,#00H
        MOV     STATE,#0FFH
        RET
INCM:
        INC	TM0
					;分个位满10则分十位加一且分个位清零
	MOV	A,TM0
	CJNE	A,#10,LX1
	MOV	TM0,#0
	INC	TM1
					;分计数满,分计数清零,时计数加一
	MOV	A,TM1
	CJNE	A,#6,LX1
	MOV	TM1,#0
        MOV     STATE,#0FFH
        RET
INCH:
        INC	THH0
					;因有显示12之后加一进位的情况出现,所以这里要先判断TH1
	MOV	A,THH1
	CJNE	A,#1,LX
	MOV	A,THH0
	CJNE 	A,#3,LX1
	MOV	THH0,#1
	MOV	THH1,#0
	LJMP    LX1
					;在时计数高位为零的情况下才执行此代码
LX:	MOV	A,THH0
	CJNE	A,#10,LX1
	MOV	THH0,#0
	INC	THH1
LX1:
        MOV     STATE,#0FFH
        RET
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -