优酷网王树声征战豫西:成功做一只DS1302电子钟(走时飞快)
来源:百度文库 编辑:中财网 时间:2024/05/08 17:56:40
新手啊,费了好多天时间,这个加上软件修正,初步完成的作品,不过走时很快,一小时快1分钟,,电路板布线不好干扰大,1302好像不太稳定,,,以后再完善,想要时间日期交替显示不知怎么做
32768晶振是从电子表上拆下来的,是没问题的,1小时快一分钟太离谱了,是哪里出了问题?布线到底要怎么样,1302和晶振后面并无多余布线啊
urrsu新上图
;6位数码管显示
;P0 为段码口、P2 为位码口
;晶振 11.0592M
;时钟芯片:DS1302
;************** DS1302 端口位定义 **************
SCLK BIT P1.0 ; 数据传送总线
IO BIT P1.1 ; 时钟控制总线
RST BIT P1.2 ; 复位总线
K2 EQU P3.4 ;减1
K1 EQU P3.5 ;+1
K3 EQU P3.6 ;功能
BEEP EQU P3.7 ;蜂鸣器
T_CONU EQU 22H ;中断计数
SSZZ EQU 32H ;校时变量
TIME EQU 50H ;显示时间单元首地址
DATE EQU 56H ;显示日期单元首地址
;------------------------------------------------
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INT_T0
ORG 0100H
;------------------------------------------------
MAIN:
BIJIAO DATA 30H ;分钟比较变量,用于判断分钟不等相等时计数器加1
JISHUQI DATA 31H ;校时计数变量,用于校时时间计数
MOV SSZZ,#3;快多少秒?
MOV BIJIAO,#0
MOV JISHUQI,#0
MOV TMOD,#01H ;T0,方式1
MOV T_CONU,#0 ;中断次数
MOV IE,#82H ;EA=1,ET0=1
MOV A,#00H
MOV R0,#40H ;从40H单元开始
MOV R1,#40H ;清64个单元
M_CLEAR: MOV @R0,A
INC R0
DJNZ R1,M_CLEAR
MOV 7FH,#0AH ;送熄灭符
SETB BEEP
LCALL TIME_DELAY ;调显示延时
LCALL GET_TIME;比较年份小于10年就初始化
mov a,#10
cjne a,45H,BD
ajmp MAIN1 ;10=45H
BD: jc MAIN1 ;10<45H
LCALL SETDS1302 ;DS1302初始化
MAIN1:
LCALL GET_TIME ;从DS1302读数据程序
LCALL AUTOJS;自动校时子程序
XD: LCALL CHULI ;实时时间数据处理
MOV R0,#TIME ;显示时、分、秒
LCALL DISP
MOV R0,#TIME
LCALL DISPLAY
LCALL SET_KEY ;键功能程序
JB K1,MAIN1
ACALL BEEP_BL
MAIN2:
LCALL CHULI ;日期数据处理
MOV R0,#DATE
LCALL DISP ;显示年、月、日
MOV R0,#DATE
LCALL DISPLAY
JB K1,MAIN2
ACALL BEEP_BL
AJMP MAIN1
; LCALL DS_CHULI ;定时时间数据处理
; MOV R0,#DS_DATA
; LCALL DS_SP ;显示定时时间
; MOV R0,#DS_DATA
; LCALL DS_DISPLAY
; JB K1,MAIN3
; ACALL BEEP_BL
;AJMP MAIN1
;--------------------------------------------
;中断服务子程序
;500MS对闪动标记取反一次
;--------------------------------------------
INT_T0:
PUSH ACC
PUSH PSW
MOV TL0,#0
MOV TH0,#4CH
INC T_CONU
MOV A,T_CONU
CJNE A,#10,INT_END
MOV T_CONU,#0
CPL 0AH ;取反0AH位
INT_END:
POP PSW
POP ACC
RETI
;--------------------------------------------
;DS1302 初始化子程序
; (R0)=数据 (R1)=地址
;--------------------------------------------
SETDS1302:
;初始化时间 -10年23:59:55
MOV 40H,#52H ;秒赋初值
MOV 41H,#59H ;分赋初值
MOV 42H,#23H ;时赋初值
MOV 43H,#21H ;日赋初值
MOV 44H,#03H ;月赋初值
MOV 46H,#01H ;星期赋初值
MOV 45H,#10H ;年赋初值
CLR RST ;DS1302复位
CLR SCLK
NOP
NOP
SETB RST
MOV R1,#8EH ;写保护控制命令字
MOV R0,#00H ;允许写入
LCALL WRITE
MOV R1,#80H ;写秒寄存器
MOV R0,40H ;启动振荡器
LCALL WRITE
MOV R1,#82H ;写分寄存器
MOV R0,41H
LCALL WRITE
MOV R1,#84H ;写时寄存器
MOV R0,42H
LCALL WRITE
MOV R1,#86H ;写日寄存器
MOV R0,43H
LCALL WRITE
MOV R1,#88H ;写月寄存器
MOV R0,44H
LCALL WRITE
MOV R1,#8AH ;写周寄存器
MOV R0,46H
LCALL WRITE
MOV R1,#8CH ;写年寄存器
MOV R0,45H
LCALL WRITE
MOV R1,#90H ;写充电寄存器
MOV R0,#10100110B;一个二极管,4K电阻
LCALL WRITE
MOV R1,#8EH ;写保护控制命令字
MOV R0,#80H;禁示写入
LCALL WRITE
RET
;===============================================
;读时间、日期数据子程序
;存放单元 40H - 46H
;===============================================
GET_TIME:
MOV R1,#81H ;读秒
LCALL READ
MOV 40H,R0
MOV R1,#83H ;读分
LCALL READ
MOV 41H,R0
MOV R1,#85H ;读时
LCALL READ
MOV 42H,R0
MOV R1,#87H ;读出日期
LCALL READ
MOV 43H,R0
MOV R1,#89H ;读出月份
LCALL READ
MOV 44H,R0
MOV R1,#8BH ;读出星期
LCALL READ
MOV 46H,R0
MOV R1,#8DH ;读出年
LCALL READ
MOV 45H,R0
RET
;================================================
;写 DS1302 子程序
;================================================
WRITE:
CLR SCLK
NOP
NOP
SETB RST
NOP
MOV A,R1
MOV R2,#08H
WRI_01:
RRC A ;传输地址到DS1302
NOP
NOP
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R2,WRI_01
CLR SCLK
NOP
NOP
MOV A,R0
MOV R2,#08H
WRI_02:
RRC A ;传输数据到DS1302
NOP
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R2,WRI_02
CLR SCLK
NOP
NOP
CLR RST
NOP
NOP
RET
;=================================================
;读 DS1302 子程序
;=================================================
READ:
CLR SCLK
NOP
NOP
SETB RST
NOP
NOP
MOV A,R1
MOV R2,#08H
READ_01:
RRC A
NOP ;先传输地址到DS1302
MOV IO,C
NOP
NOP
SETB SCLK
NOP
NOP
CLR SCLK
NOP
NOP
DJNZ R2,READ_01
NOP
NOP
SETB IO
CLR A
CLR C
MOV R2,#08H
READ_02:
CLR SCLK
NOP
NOP
MOV C,IO
NOP
NOP
RRC A ;再从DS1302接收数据
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R2,READ_02
MOV R0,A
CLR RST
RET
;==============================================
;实时时间、日期数据处理子程序,40H-50~51H 70H~~
;==============================================
CHULI:
MOV A,40H ;处理秒数据
ANL A,#0FH
MOV 50H,A
MOV 70H,A
MOV A,40H
ANL A,#0F0H
SWAP A
MOV 51H,A
MOV 71H,A
;---------------------------------------------
MOV A,41H ;处理分数据
ANL A,#0FH
MOV 52H,A
MOV 72H,A
MOV A,41H
ANL A,#0F0H
SWAP A
MOV 53H,A
MOV 73H,A
;---------------------------------------------
MOV A,42H ;处理时数据
ANL A,#0FH
MOV 54H,A
MOV 74H,A
MOV A,42H
ANL A,#0F0H
SWAP A
MOV 55H,A
MOV 75H,A
;----------------------------------------------
MOV A,43H ;处理日数据
ANL A,#0FH
MOV 56H,A
MOV 76H,A
MOV A,43H
ANL A,#0F0H
SWAP A
MOV 57H,A
MOV 77H,A
;---------------------------------------------
MOV A,44H ;处理月数据
ANL A,#0FH
MOV 58H,A
MOV 78H,A
MOV A,44H
ANL A,#0F0H
SWAP A
MOV 59H,A
MOV 79H,A
;---------------------------------------------
MOV A,45H ;处理年数据
ANL A,#0FH
MOV 5AH,A
MOV 7AH,A
MOV A,45H
ANL A,#0F0H
SWAP A
MOV 5BH,A
MOV 7BH,A
;----------------------------------------------
MOV A,46H ;处理周数据
MOV 5CH,A
MOV 7CH,A
RET
; MOV R5,#6 ;6个地址放年月日时分秒
; MOV R0,#50H;拆放在首 50H
; MOV R1,#40H ;实时数据首在40H
;******
; MOV A,@R1
; ANL A,#0FH;秒位
; MOV @R0,A
; MOV A,@R1
;ANL A,#0F0H;10秒位
;SWAP A
;inc R0
; MOV @R0,A
; inc R0
; inc R1
;*****
;djnz R5,CHAN
; MOV A,46H ;处理周数据
; MOV 5CH,A
; MOV 7CH,A
;*********
;---------------------------------------------
;
;=============================================
;实时时间、日期查表取数子程序
;=============================================
DISP: ;MOV R0,#TIME; MOV R0,#DATA
MOV R3,#06H
DISP1: MOV A,@R0
MOV DPTR,#TAB_NU
MOVC A,@A+DPTR
MOV @R0,A
INC R0
DJNZ R3,DISP1
RET
;====================================================
;时间、日期显示子程序
;====================================================
DISPLAY:
;**********************
; 显示数据在#TIME单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2
口作扫描控制,每个LED数码管亮1MS时间再逐位循环。
;**********************
;
MOV R5,#0FEH ;扫描控制字初值
PLAY:
MOV P0,@R0 ;扫描字放入p0
MOV A,R5
MOV P2,A ;数码显示
LCALL DELAY;显示1MS
INC R0 ;指向下一地址
JNB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP PLAY ;跳回PLAY循环
ENDOUT: SETB P2.5 ;一次显示结束,P2口复位
MOV P0,#0FFH ;P0口复位
RET ;子程序返回
DELAY:
MOV R4,#0AH
L15: MOV R5,#64H
L16: DJNZ R5,L16
DJNZ R4,L15
RET
;***************************
DISP11:
MOV DPTR,#TAB_NU
MOVC A,@A+DPTR
mov p0,a
clr p2.0
Lcall DELAY1ms
setb p2.0
RET
;******************************************************
SET_KEY: ;按键程序
SETB K1 ;增加键
SETB K2 ;减少键
SETB K3 ;选择键
;******************************************************
NOP
KEY01: JB K3,KEY02
LCALL BEEP_BL
JMP SET_TIME ;进入时间设定子程序
KEY02: JB K2,KEY03
LCALL BEEP_BL
LCALL SET_DAY;进入DAY设定程序
KEY03: RET
;***************************************
;======================================
;实时时间设定子程序
;K1为加键、K2为减键、K3为选择键
;======================================
SET_TIME:
MOV R1,#8EH ;写保护寄存器
MOV R0,#00H ;允许写入
LCALL WRITE
SETB TR0 ;中断启动
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
K00H: ACALL TIME_DELAY ;校时
JNB K3,K00H ;K3为位移键
K0H0:
LCALL GET_TIME
ACALL CHULI
JNB 0AH,KH01
MOV 54H,7FH ;送入熄灭符
MOV 55H,7FH
JMP KH02
KH01: MOV 54H,74H ;送实时值
MOV 55H,75H ;送实时值
KH02: MOV R0,#TIME
ACALL DISP
MOV R0,#TIME
ACALL DISPLAY
JNB K1,K0H1A;+
JNB K2,K0H1B;-
JNB K3,K00F
JMP K0H0
K0H1A:;加1
MOV A,42H
ADD A,#01H
DA A
MOV 42H,A
XRL A,#24H
JNZ K0H2A
MOV 42H,#00H
K0H2A: MOV R1,#84H ;写时寄存器
MOV R0,42H
LCALL WRITE
ACALL TIME_DELAY
JMP K0H0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
K0H1B:;减1
MOV A,42H
XRL A,#00H
JZ K0H2B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,42H ;加被减数
DA A ;十进制调整
MOV 42H,A ;
XRL A,#00H
JNZ K0H2C
K0H2B: MOV 42H,#23H
K0H2C: MOV R1,#84H ;写时寄存器
MOV R0,42H
LCALL WRITE
ACALL TIME_DELAY
JMP K0H0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
K00F: ACALL TIME_DELAY ;校分
JNB K3,K00F ;K3为位移键
K0F0:
LCALL GET_TIME
ACALL CHULI
JNB 0AH,KM01
MOV 52H,7FH ;送入熄灭符
MOV 53H,7FH
JMP KM02
KM01: MOV 52H,72H ;送实时值
MOV 53H,73H ;送实时值
KM02: MOV R0,#TIME
ACALL DISP
MOV R0,#TIME
ACALL DISPLAY
JNB K1,K0F1A
JNB K2,K0F1B
JNB K3,K002
JMP K0F0
K0F1A: ;加1
MOV A,41H
ADD A,#01H
DA A
MOV 41H,A
XRL A,#60H
JNZ K0F2A
MOV 41H,#00H
K0F2A: MOV R1,#82H ;写分寄存器
MOV R0,41H
LCALL WRITE
ACALL TIME_DELAY
JMP K0F0
;---------------------------------------------------
K0F1B:;减1
MOV A,41H
XRL A,#00H
JZ K0F2B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,41H ;加被减数
DA A ;十进制调整
MOV 41H,A ;
XRL A,#00H
JNZ K0F2C
K0F2B: MOV 41H,#59H
K0F2C: MOV R1,#82H ;写分寄存器
MOV R0,41H
LCALL WRITE
ACALL TIME_DELAY
JMP K0F0
;---------------------------------------------------
K002: ACALL TIME_DELAY ;校秒
JNB K3,K002 ;K3为位移键
K020:
LCALL GET_TIME
ACALL CHULI
JNB 0AH,KS01
MOV 50H,7FH ;送入熄灭符
MOV 51H,7FH
JMP KS02
KS01: MOV 50H,70H ;送实时值
MOV 51H,71H ;送实时值
KS02: MOV R0,#TIME
ACALL DISP
MOV R0,#TIME
ACALL DISPLAY
JNB K1,K021A
JNB K2,K021B
JNB K3,END_SJ
JMP K020
K021A: ;加1
MOV A,40H
ADD A,#01H
DA A
MOV 40H,A
XRL A,#60H
JNZ K022A
MOV 40H,#00H
K022A: MOV R1,#80H ;写秒寄存器
MOV R0,40H
LCALL WRITE
ACALL TIME_DELAY
JMP K020
;---------------------------------------------------
K021B: ;减1
MOV A,40H
XRL A,#00H
JZ K022B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,40H ;加被减数
DA A ;十进制调整
MOV 40H,A ;
XRL A,#00H
JNZ K022C
K022B: MOV 40H,#59H
K022C: MOV R1,#80H ;写秒寄存器
MOV R0,40H
LCALL WRITE
ACALL TIME_DELAY
JMP K020
END_SJ: LCALL KXBH;写保护
CLR 0AH
CLR TR0
ACALL BEEP_BL
RET
;-------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET_DAY:;进入DAY设定程序;;;;;;;;;;;;;;;;;;;;;
MOV R1,#8EH ;写保护寄存器
MOV R0,#00H ;允许写入
LCALL WRITE
SETB TR0
K003: ACALL DATE_DELAY ;校日
JNB K2,K003 ;K2为位移键
K030: ACALL CHULI
JNB 0AH,KR01
MOV 56H,7FH ;送入熄灭符
MOV 57H,7FH
JMP KR02
KR01: MOV 56H,76H ;送实时值
MOV 57H,77H ;送实时值
KR02: MOV R0,#DATE
ACALL DISP
MOV R0,#DATE
ACALL DISPLAY
JNB K3,K031A
JNB K1,K031B
JNB K2,K004
JMP K030
K031A:
MOV A,43H
ADD A,#01H
DA A
MOV 43H,A
XRL A,#32H
JNZ K032A
MOV 43H,#00H
K032A: MOV R1,#86H ;写日寄存器
MOV R0,43H
LCALL WRITE
ACALL DATE_DELAY
JMP K030
K031B:
MOV A,43H
XRL A,#00H
JZ K032B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,43H ;加被减数
DA A ;十进制调整
MOV 43H,A
XRL A,#00H
JNZ K032C
K032B: MOV 43H,#31H
K032C: MOV R1,#86H ;写日寄存器
MOV R0,43H
LCALL WRITE
ACALL DATE_DELAY
JMP K030
;------------------------------------------------
K004: ACALL DATE_DELAY ;校月
JNB K2,K004 ;K3为位移键
K040: ACALL CHULI
JNB 0AH,KC01
MOV 58H,7FH ;送入熄灭符
MOV 59H,7FH
JMP KC02
KC01: MOV 58H,78H ;送实时值
MOV 59H,79H ;送实时值
KC02: MOV R0,#DATE
ACALL DISP
MOV R0,#DATE
ACALL DISPLAY
JNB K3,K041A
JNB K1,K041B
JNB K2,K005
JMP K040
K041A:
MOV A,44H
ADD A,#01H
DA A
MOV 44H,A
XRL A,#13H
JNZ K042A
MOV 44H,#00H
K042A: MOV R1,#88H ;写月寄存器
MOV R0,44H
LCALL WRITE
ACALL DATE_DELAY
JMP K040
K041B:
MOV A,44H
XRL A,#00H
JZ K042B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,44H ;加被减数
DA A ;十进制调整
MOV 44H,A ;
XRL A,#00H
JNZ K042C
K042B: MOV 44H,#12H
K042C: MOV R1,#88H ;写月寄存器
MOV R0,44H
LCALL WRITE
ACALL DATE_DELAY
JMP K040
;-----------------------------------------------
K005: ACALL DATE_DELAY ;校年
JNB K2,K005 ;K3为位移键
K050: ACALL CHULI
JNB 0AH,KY01
MOV 5AH,7FH ;送入熄灭符
MOV 5BH,7FH
JMP KY02
KY01: MOV 5AH,7AH ;送实时值
MOV 5BH,7BH ;送实时值
KY02: MOV R0,#DATE
ACALL DISP
MOV R0,#DATE
ACALL DISPLAY
JNB K3,K051A
JNB K1,K051B
JNB K2,K006
JMP K050
K051A:
MOV A,45H
ADD A,#01H
DA A
MOV 45H,A
XRL A,#9AH
JNZ K052A
MOV 45H,#00H
K052A: MOV R1,#8CH ;写年寄存器
MOV R0,45H
LCALL WRITE
ACALL DATE_DELAY
JMP K050
K051B:
MOV A,45H
XRL A,#00H
JZ K052B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,45H ;加被减数
DA A ;十进制调整
MOV 45H,A ;
XRL A,#00H
JNZ K052C
K052B: MOV 45H,#99H
K052C: MOV R1,#8CH ;写年寄存器
MOV R0,45H
LCALL WRITE
ACALL DATE_DELAY
JMP K050
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
K006: ACALL DATE_DELAY ;校误差
JNB K2,K006 ;K3为位移键
K060:
MOV A,#SSZZ
ACALL DISP11
JNB K3,K061A
JNB K1,K061B
JNB K2,END_RQ
JMP K060
K061A:
MOV A,sszz
add a,#1
mov sszz,a
jmp K060
K061B:
MOV A,sszz
subb a,#1
clr c
MOV sszz, A
JMP K060
END_RQ: LCALL KXBH ;写保护
CLR 0AH
CLR TR0
ACALL BEEP_BL
RET
;-------------------------------------------------
KXBH: JNB K3,KXBH;开写保护
MOV R1,#8EH ;写保护寄存器
MOV R0,#80H ;禁止写入
LCALL WRITE
SETB SCLK
CLR RST
ACALL DATE_DELAY
RET
;===================================================
;====================================================
;====================================================
;键延时子程序
;多次调用显示程序做键延时
;====================================================
TIME_DELAY: ;设定时间,键延时用
MOV R6,#0AH
TIME_KK:
LCALL CHULI
MOV R0,#TIME
LCALL DISP
MOV R0,#TIME
ACALL DISPLAY
DJNZ R6,TIME_KK
RET
DATE_DELAY: ;设定日期,键延时用
MOV R6,#0AH
DATE_KK:
LCALL CHULI
MOV R0,#DATE
LCALL DISP
MOV R0,#DATE
ACALL DISPLAY
DJNZ R6,DATE_KK
RET
;====================================================
;蜂鸣器响一声子程序
;====================================================
BEEP_BL:
MOV R6,#100
BL2: ACALL DEX1
CPL BEEP
DJNZ R6,BL2
MOV R5,#10
ACALL DELAY_BL
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
DELAY_BL: ;(R5)*延时10MS
MOV R6,#50
DL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL1
DJNZ R5,DELAY_BL
RET
DELAY1ms: ;误差 -0.651041666667us
MOV R6,#66H
DL00:
MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL00
RET
;*************************************************************
TAB_NU: DB 81H,0BDH,49H,19H,35H,13H,03H,0B9H,01H,11H ;0-9
DB 0FFH ;灭
;《 共阳数码管 》
;*************************************************************
;自动校时子程序,用来修正时间误差
AUTOJS:
MOV A,41H;分钟放入A
CJNE A,BIJIAO,AU_1;比较分是否相同
JMP AU_2
AU_1: MOV BIJIAO,A;不同则放入比较器
MOV A,JISHUQI;计数器加1
INC A
MOV JISHUQI,A
AU_2: MOV A,JISHUQI;相同则比较计数器
CJNE A,#2,OUT;计数是否到1?
MOV A,40H;到了
CJNE A,sszz,OUT;是否到了sz秒等于sz 校回到0秒
CLR RST
CLR SCLK
SETB RST
MOV R1,#8EH ;写控制命令字
MOV R0,#00H ;允许写入
LCALL WRITE
MOV R1,#80H ;写秒寄存器
MOV R0,#00H ;设回0秒
LCALL WRITE
MOV R1,#8EH ;写控制命令字
MOV R0,#80H ;禁止写入
LCALL WRITE
SETB SCLK
CLR RST
MOV JISHUQI,#0 ;计数器清0
OUT: RET
end
[ 此帖被fang3在2010-03-24 16:35重新编辑 ]图片:照片 002.jpg
图片:照片 003.jpg
图片:照片 004.jpg
图片:ww.jpg
32768晶振是从电子表上拆下来的,是没问题的,1小时快一分钟太离谱了,是哪里出了问题?布线到底要怎么样,1302和晶振后面并无多余布线啊
urrsu新上图
;6位数码管显示
;P0 为段码口、P2 为位码口
;晶振 11.0592M
;时钟芯片:DS1302
;************** DS1302 端口位定义 **************
SCLK BIT P1.0 ; 数据传送总线
IO BIT P1.1 ; 时钟控制总线
RST BIT P1.2 ; 复位总线
K2 EQU P3.4 ;减1
K1 EQU P3.5 ;+1
K3 EQU P3.6 ;功能
BEEP EQU P3.7 ;蜂鸣器
T_CONU EQU 22H ;中断计数
SSZZ EQU 32H ;校时变量
TIME EQU 50H ;显示时间单元首地址
DATE EQU 56H ;显示日期单元首地址
;------------------------------------------------
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INT_T0
ORG 0100H
;------------------------------------------------
MAIN:
BIJIAO DATA 30H ;分钟比较变量,用于判断分钟不等相等时计数器加1
JISHUQI DATA 31H ;校时计数变量,用于校时时间计数
MOV SSZZ,#3;快多少秒?
MOV BIJIAO,#0
MOV JISHUQI,#0
MOV TMOD,#01H ;T0,方式1
MOV T_CONU,#0 ;中断次数
MOV IE,#82H ;EA=1,ET0=1
MOV A,#00H
MOV R0,#40H ;从40H单元开始
MOV R1,#40H ;清64个单元
M_CLEAR: MOV @R0,A
INC R0
DJNZ R1,M_CLEAR
MOV 7FH,#0AH ;送熄灭符
SETB BEEP
LCALL TIME_DELAY ;调显示延时
LCALL GET_TIME;比较年份小于10年就初始化
mov a,#10
cjne a,45H,BD
ajmp MAIN1 ;10=45H
BD: jc MAIN1 ;10<45H
LCALL SETDS1302 ;DS1302初始化
MAIN1:
LCALL GET_TIME ;从DS1302读数据程序
LCALL AUTOJS;自动校时子程序
XD: LCALL CHULI ;实时时间数据处理
MOV R0,#TIME ;显示时、分、秒
LCALL DISP
MOV R0,#TIME
LCALL DISPLAY
LCALL SET_KEY ;键功能程序
JB K1,MAIN1
ACALL BEEP_BL
MAIN2:
LCALL CHULI ;日期数据处理
MOV R0,#DATE
LCALL DISP ;显示年、月、日
MOV R0,#DATE
LCALL DISPLAY
JB K1,MAIN2
ACALL BEEP_BL
AJMP MAIN1
; LCALL DS_CHULI ;定时时间数据处理
; MOV R0,#DS_DATA
; LCALL DS_SP ;显示定时时间
; MOV R0,#DS_DATA
; LCALL DS_DISPLAY
; JB K1,MAIN3
; ACALL BEEP_BL
;AJMP MAIN1
;--------------------------------------------
;中断服务子程序
;500MS对闪动标记取反一次
;--------------------------------------------
INT_T0:
PUSH ACC
PUSH PSW
MOV TL0,#0
MOV TH0,#4CH
INC T_CONU
MOV A,T_CONU
CJNE A,#10,INT_END
MOV T_CONU,#0
CPL 0AH ;取反0AH位
INT_END:
POP PSW
POP ACC
RETI
;--------------------------------------------
;DS1302 初始化子程序
; (R0)=数据 (R1)=地址
;--------------------------------------------
SETDS1302:
;初始化时间 -10年23:59:55
MOV 40H,#52H ;秒赋初值
MOV 41H,#59H ;分赋初值
MOV 42H,#23H ;时赋初值
MOV 43H,#21H ;日赋初值
MOV 44H,#03H ;月赋初值
MOV 46H,#01H ;星期赋初值
MOV 45H,#10H ;年赋初值
CLR RST ;DS1302复位
CLR SCLK
NOP
NOP
SETB RST
MOV R1,#8EH ;写保护控制命令字
MOV R0,#00H ;允许写入
LCALL WRITE
MOV R1,#80H ;写秒寄存器
MOV R0,40H ;启动振荡器
LCALL WRITE
MOV R1,#82H ;写分寄存器
MOV R0,41H
LCALL WRITE
MOV R1,#84H ;写时寄存器
MOV R0,42H
LCALL WRITE
MOV R1,#86H ;写日寄存器
MOV R0,43H
LCALL WRITE
MOV R1,#88H ;写月寄存器
MOV R0,44H
LCALL WRITE
MOV R1,#8AH ;写周寄存器
MOV R0,46H
LCALL WRITE
MOV R1,#8CH ;写年寄存器
MOV R0,45H
LCALL WRITE
MOV R1,#90H ;写充电寄存器
MOV R0,#10100110B;一个二极管,4K电阻
LCALL WRITE
MOV R1,#8EH ;写保护控制命令字
MOV R0,#80H;禁示写入
LCALL WRITE
RET
;===============================================
;读时间、日期数据子程序
;存放单元 40H - 46H
;===============================================
GET_TIME:
MOV R1,#81H ;读秒
LCALL READ
MOV 40H,R0
MOV R1,#83H ;读分
LCALL READ
MOV 41H,R0
MOV R1,#85H ;读时
LCALL READ
MOV 42H,R0
MOV R1,#87H ;读出日期
LCALL READ
MOV 43H,R0
MOV R1,#89H ;读出月份
LCALL READ
MOV 44H,R0
MOV R1,#8BH ;读出星期
LCALL READ
MOV 46H,R0
MOV R1,#8DH ;读出年
LCALL READ
MOV 45H,R0
RET
;================================================
;写 DS1302 子程序
;================================================
WRITE:
CLR SCLK
NOP
NOP
SETB RST
NOP
MOV A,R1
MOV R2,#08H
WRI_01:
RRC A ;传输地址到DS1302
NOP
NOP
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R2,WRI_01
CLR SCLK
NOP
NOP
MOV A,R0
MOV R2,#08H
WRI_02:
RRC A ;传输数据到DS1302
NOP
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R2,WRI_02
CLR SCLK
NOP
NOP
CLR RST
NOP
NOP
RET
;=================================================
;读 DS1302 子程序
;=================================================
READ:
CLR SCLK
NOP
NOP
SETB RST
NOP
NOP
MOV A,R1
MOV R2,#08H
READ_01:
RRC A
NOP ;先传输地址到DS1302
MOV IO,C
NOP
NOP
SETB SCLK
NOP
NOP
CLR SCLK
NOP
NOP
DJNZ R2,READ_01
NOP
NOP
SETB IO
CLR A
CLR C
MOV R2,#08H
READ_02:
CLR SCLK
NOP
NOP
MOV C,IO
NOP
NOP
RRC A ;再从DS1302接收数据
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R2,READ_02
MOV R0,A
CLR RST
RET
;==============================================
;实时时间、日期数据处理子程序,40H-50~51H 70H~~
;==============================================
CHULI:
MOV A,40H ;处理秒数据
ANL A,#0FH
MOV 50H,A
MOV 70H,A
MOV A,40H
ANL A,#0F0H
SWAP A
MOV 51H,A
MOV 71H,A
;---------------------------------------------
MOV A,41H ;处理分数据
ANL A,#0FH
MOV 52H,A
MOV 72H,A
MOV A,41H
ANL A,#0F0H
SWAP A
MOV 53H,A
MOV 73H,A
;---------------------------------------------
MOV A,42H ;处理时数据
ANL A,#0FH
MOV 54H,A
MOV 74H,A
MOV A,42H
ANL A,#0F0H
SWAP A
MOV 55H,A
MOV 75H,A
;----------------------------------------------
MOV A,43H ;处理日数据
ANL A,#0FH
MOV 56H,A
MOV 76H,A
MOV A,43H
ANL A,#0F0H
SWAP A
MOV 57H,A
MOV 77H,A
;---------------------------------------------
MOV A,44H ;处理月数据
ANL A,#0FH
MOV 58H,A
MOV 78H,A
MOV A,44H
ANL A,#0F0H
SWAP A
MOV 59H,A
MOV 79H,A
;---------------------------------------------
MOV A,45H ;处理年数据
ANL A,#0FH
MOV 5AH,A
MOV 7AH,A
MOV A,45H
ANL A,#0F0H
SWAP A
MOV 5BH,A
MOV 7BH,A
;----------------------------------------------
MOV A,46H ;处理周数据
MOV 5CH,A
MOV 7CH,A
RET
; MOV R5,#6 ;6个地址放年月日时分秒
; MOV R0,#50H;拆放在首 50H
; MOV R1,#40H ;实时数据首在40H
;******
; MOV A,@R1
; ANL A,#0FH;秒位
; MOV @R0,A
; MOV A,@R1
;ANL A,#0F0H;10秒位
;SWAP A
;inc R0
; MOV @R0,A
; inc R0
; inc R1
;*****
;djnz R5,CHAN
; MOV A,46H ;处理周数据
; MOV 5CH,A
; MOV 7CH,A
;*********
;---------------------------------------------
;
;=============================================
;实时时间、日期查表取数子程序
;=============================================
DISP: ;MOV R0,#TIME; MOV R0,#DATA
MOV R3,#06H
DISP1: MOV A,@R0
MOV DPTR,#TAB_NU
MOVC A,@A+DPTR
MOV @R0,A
INC R0
DJNZ R3,DISP1
RET
;====================================================
;时间、日期显示子程序
;====================================================
DISPLAY:
;**********************
; 显示数据在#TIME单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2
口作扫描控制,每个LED数码管亮1MS时间再逐位循环。
;**********************
;
MOV R5,#0FEH ;扫描控制字初值
PLAY:
MOV P0,@R0 ;扫描字放入p0
MOV A,R5
MOV P2,A ;数码显示
LCALL DELAY;显示1MS
INC R0 ;指向下一地址
JNB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP PLAY ;跳回PLAY循环
ENDOUT: SETB P2.5 ;一次显示结束,P2口复位
MOV P0,#0FFH ;P0口复位
RET ;子程序返回
DELAY:
MOV R4,#0AH
L15: MOV R5,#64H
L16: DJNZ R5,L16
DJNZ R4,L15
RET
;***************************
DISP11:
MOV DPTR,#TAB_NU
MOVC A,@A+DPTR
mov p0,a
clr p2.0
Lcall DELAY1ms
setb p2.0
RET
;******************************************************
SET_KEY: ;按键程序
SETB K1 ;增加键
SETB K2 ;减少键
SETB K3 ;选择键
;******************************************************
NOP
KEY01: JB K3,KEY02
LCALL BEEP_BL
JMP SET_TIME ;进入时间设定子程序
KEY02: JB K2,KEY03
LCALL BEEP_BL
LCALL SET_DAY;进入DAY设定程序
KEY03: RET
;***************************************
;======================================
;实时时间设定子程序
;K1为加键、K2为减键、K3为选择键
;======================================
SET_TIME:
MOV R1,#8EH ;写保护寄存器
MOV R0,#00H ;允许写入
LCALL WRITE
SETB TR0 ;中断启动
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
K00H: ACALL TIME_DELAY ;校时
JNB K3,K00H ;K3为位移键
K0H0:
LCALL GET_TIME
ACALL CHULI
JNB 0AH,KH01
MOV 54H,7FH ;送入熄灭符
MOV 55H,7FH
JMP KH02
KH01: MOV 54H,74H ;送实时值
MOV 55H,75H ;送实时值
KH02: MOV R0,#TIME
ACALL DISP
MOV R0,#TIME
ACALL DISPLAY
JNB K1,K0H1A;+
JNB K2,K0H1B;-
JNB K3,K00F
JMP K0H0
K0H1A:;加1
MOV A,42H
ADD A,#01H
DA A
MOV 42H,A
XRL A,#24H
JNZ K0H2A
MOV 42H,#00H
K0H2A: MOV R1,#84H ;写时寄存器
MOV R0,42H
LCALL WRITE
ACALL TIME_DELAY
JMP K0H0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
K0H1B:;减1
MOV A,42H
XRL A,#00H
JZ K0H2B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,42H ;加被减数
DA A ;十进制调整
MOV 42H,A ;
XRL A,#00H
JNZ K0H2C
K0H2B: MOV 42H,#23H
K0H2C: MOV R1,#84H ;写时寄存器
MOV R0,42H
LCALL WRITE
ACALL TIME_DELAY
JMP K0H0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
K00F: ACALL TIME_DELAY ;校分
JNB K3,K00F ;K3为位移键
K0F0:
LCALL GET_TIME
ACALL CHULI
JNB 0AH,KM01
MOV 52H,7FH ;送入熄灭符
MOV 53H,7FH
JMP KM02
KM01: MOV 52H,72H ;送实时值
MOV 53H,73H ;送实时值
KM02: MOV R0,#TIME
ACALL DISP
MOV R0,#TIME
ACALL DISPLAY
JNB K1,K0F1A
JNB K2,K0F1B
JNB K3,K002
JMP K0F0
K0F1A: ;加1
MOV A,41H
ADD A,#01H
DA A
MOV 41H,A
XRL A,#60H
JNZ K0F2A
MOV 41H,#00H
K0F2A: MOV R1,#82H ;写分寄存器
MOV R0,41H
LCALL WRITE
ACALL TIME_DELAY
JMP K0F0
;---------------------------------------------------
K0F1B:;减1
MOV A,41H
XRL A,#00H
JZ K0F2B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,41H ;加被减数
DA A ;十进制调整
MOV 41H,A ;
XRL A,#00H
JNZ K0F2C
K0F2B: MOV 41H,#59H
K0F2C: MOV R1,#82H ;写分寄存器
MOV R0,41H
LCALL WRITE
ACALL TIME_DELAY
JMP K0F0
;---------------------------------------------------
K002: ACALL TIME_DELAY ;校秒
JNB K3,K002 ;K3为位移键
K020:
LCALL GET_TIME
ACALL CHULI
JNB 0AH,KS01
MOV 50H,7FH ;送入熄灭符
MOV 51H,7FH
JMP KS02
KS01: MOV 50H,70H ;送实时值
MOV 51H,71H ;送实时值
KS02: MOV R0,#TIME
ACALL DISP
MOV R0,#TIME
ACALL DISPLAY
JNB K1,K021A
JNB K2,K021B
JNB K3,END_SJ
JMP K020
K021A: ;加1
MOV A,40H
ADD A,#01H
DA A
MOV 40H,A
XRL A,#60H
JNZ K022A
MOV 40H,#00H
K022A: MOV R1,#80H ;写秒寄存器
MOV R0,40H
LCALL WRITE
ACALL TIME_DELAY
JMP K020
;---------------------------------------------------
K021B: ;减1
MOV A,40H
XRL A,#00H
JZ K022B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,40H ;加被减数
DA A ;十进制调整
MOV 40H,A ;
XRL A,#00H
JNZ K022C
K022B: MOV 40H,#59H
K022C: MOV R1,#80H ;写秒寄存器
MOV R0,40H
LCALL WRITE
ACALL TIME_DELAY
JMP K020
END_SJ: LCALL KXBH;写保护
CLR 0AH
CLR TR0
ACALL BEEP_BL
RET
;-------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET_DAY:;进入DAY设定程序;;;;;;;;;;;;;;;;;;;;;
MOV R1,#8EH ;写保护寄存器
MOV R0,#00H ;允许写入
LCALL WRITE
SETB TR0
K003: ACALL DATE_DELAY ;校日
JNB K2,K003 ;K2为位移键
K030: ACALL CHULI
JNB 0AH,KR01
MOV 56H,7FH ;送入熄灭符
MOV 57H,7FH
JMP KR02
KR01: MOV 56H,76H ;送实时值
MOV 57H,77H ;送实时值
KR02: MOV R0,#DATE
ACALL DISP
MOV R0,#DATE
ACALL DISPLAY
JNB K3,K031A
JNB K1,K031B
JNB K2,K004
JMP K030
K031A:
MOV A,43H
ADD A,#01H
DA A
MOV 43H,A
XRL A,#32H
JNZ K032A
MOV 43H,#00H
K032A: MOV R1,#86H ;写日寄存器
MOV R0,43H
LCALL WRITE
ACALL DATE_DELAY
JMP K030
K031B:
MOV A,43H
XRL A,#00H
JZ K032B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,43H ;加被减数
DA A ;十进制调整
MOV 43H,A
XRL A,#00H
JNZ K032C
K032B: MOV 43H,#31H
K032C: MOV R1,#86H ;写日寄存器
MOV R0,43H
LCALL WRITE
ACALL DATE_DELAY
JMP K030
;------------------------------------------------
K004: ACALL DATE_DELAY ;校月
JNB K2,K004 ;K3为位移键
K040: ACALL CHULI
JNB 0AH,KC01
MOV 58H,7FH ;送入熄灭符
MOV 59H,7FH
JMP KC02
KC01: MOV 58H,78H ;送实时值
MOV 59H,79H ;送实时值
KC02: MOV R0,#DATE
ACALL DISP
MOV R0,#DATE
ACALL DISPLAY
JNB K3,K041A
JNB K1,K041B
JNB K2,K005
JMP K040
K041A:
MOV A,44H
ADD A,#01H
DA A
MOV 44H,A
XRL A,#13H
JNZ K042A
MOV 44H,#00H
K042A: MOV R1,#88H ;写月寄存器
MOV R0,44H
LCALL WRITE
ACALL DATE_DELAY
JMP K040
K041B:
MOV A,44H
XRL A,#00H
JZ K042B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,44H ;加被减数
DA A ;十进制调整
MOV 44H,A ;
XRL A,#00H
JNZ K042C
K042B: MOV 44H,#12H
K042C: MOV R1,#88H ;写月寄存器
MOV R0,44H
LCALL WRITE
ACALL DATE_DELAY
JMP K040
;-----------------------------------------------
K005: ACALL DATE_DELAY ;校年
JNB K2,K005 ;K3为位移键
K050: ACALL CHULI
JNB 0AH,KY01
MOV 5AH,7FH ;送入熄灭符
MOV 5BH,7FH
JMP KY02
KY01: MOV 5AH,7AH ;送实时值
MOV 5BH,7BH ;送实时值
KY02: MOV R0,#DATE
ACALL DISP
MOV R0,#DATE
ACALL DISPLAY
JNB K3,K051A
JNB K1,K051B
JNB K2,K006
JMP K050
K051A:
MOV A,45H
ADD A,#01H
DA A
MOV 45H,A
XRL A,#9AH
JNZ K052A
MOV 45H,#00H
K052A: MOV R1,#8CH ;写年寄存器
MOV R0,45H
LCALL WRITE
ACALL DATE_DELAY
JMP K050
K051B:
MOV A,45H
XRL A,#00H
JZ K052B
SETB C ;求补运算
CLR A
ADDC A,#99H ;加99
SUBB A,#01H ;减去减数
ADD A,45H ;加被减数
DA A ;十进制调整
MOV 45H,A ;
XRL A,#00H
JNZ K052C
K052B: MOV 45H,#99H
K052C: MOV R1,#8CH ;写年寄存器
MOV R0,45H
LCALL WRITE
ACALL DATE_DELAY
JMP K050
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
K006: ACALL DATE_DELAY ;校误差
JNB K2,K006 ;K3为位移键
K060:
MOV A,#SSZZ
ACALL DISP11
JNB K3,K061A
JNB K1,K061B
JNB K2,END_RQ
JMP K060
K061A:
MOV A,sszz
add a,#1
mov sszz,a
jmp K060
K061B:
MOV A,sszz
subb a,#1
clr c
MOV sszz, A
JMP K060
END_RQ: LCALL KXBH ;写保护
CLR 0AH
CLR TR0
ACALL BEEP_BL
RET
;-------------------------------------------------
KXBH: JNB K3,KXBH;开写保护
MOV R1,#8EH ;写保护寄存器
MOV R0,#80H ;禁止写入
LCALL WRITE
SETB SCLK
CLR RST
ACALL DATE_DELAY
RET
;===================================================
;====================================================
;====================================================
;键延时子程序
;多次调用显示程序做键延时
;====================================================
TIME_DELAY: ;设定时间,键延时用
MOV R6,#0AH
TIME_KK:
LCALL CHULI
MOV R0,#TIME
LCALL DISP
MOV R0,#TIME
ACALL DISPLAY
DJNZ R6,TIME_KK
RET
DATE_DELAY: ;设定日期,键延时用
MOV R6,#0AH
DATE_KK:
LCALL CHULI
MOV R0,#DATE
LCALL DISP
MOV R0,#DATE
ACALL DISPLAY
DJNZ R6,DATE_KK
RET
;====================================================
;蜂鸣器响一声子程序
;====================================================
BEEP_BL:
MOV R6,#100
BL2: ACALL DEX1
CPL BEEP
DJNZ R6,BL2
MOV R5,#10
ACALL DELAY_BL
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
DELAY_BL: ;(R5)*延时10MS
MOV R6,#50
DL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL1
DJNZ R5,DELAY_BL
RET
DELAY1ms: ;误差 -0.651041666667us
MOV R6,#66H
DL00:
MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL00
RET
;*************************************************************
TAB_NU: DB 81H,0BDH,49H,19H,35H,13H,03H,0B9H,01H,11H ;0-9
DB 0FFH ;灭
;《 共阳数码管 》
;*************************************************************
;自动校时子程序,用来修正时间误差
AUTOJS:
MOV A,41H;分钟放入A
CJNE A,BIJIAO,AU_1;比较分是否相同
JMP AU_2
AU_1: MOV BIJIAO,A;不同则放入比较器
MOV A,JISHUQI;计数器加1
INC A
MOV JISHUQI,A
AU_2: MOV A,JISHUQI;相同则比较计数器
CJNE A,#2,OUT;计数是否到1?
MOV A,40H;到了
CJNE A,sszz,OUT;是否到了sz秒等于sz 校回到0秒
CLR RST
CLR SCLK
SETB RST
MOV R1,#8EH ;写控制命令字
MOV R0,#00H ;允许写入
LCALL WRITE
MOV R1,#80H ;写秒寄存器
MOV R0,#00H ;设回0秒
LCALL WRITE
MOV R1,#8EH ;写控制命令字
MOV R0,#80H ;禁止写入
LCALL WRITE
SETB SCLK
CLR RST
MOV JISHUQI,#0 ;计数器清0
OUT: RET
end
[ 此帖被fang3在2010-03-24 16:35重新编辑 ]图片:照片 002.jpg
图片:照片 003.jpg
图片:照片 004.jpg
图片:ww.jpg