时钟芯片DS1302.docx
《时钟芯片DS1302.docx》由会员分享,可在线阅读,更多相关《时钟芯片DS1302.docx(31页珍藏版)》请在冰豆网上搜索。
时钟芯片DS1302
;8位数码管显示
;P0为段码口、P2为位码口
;时钟芯片:
DS1302
;**************DS1302端口位定义**************
IO_DATABITP1.1;数据传送总线
SCLKBITP1.0;时钟控制总线
RSTBITP1.2;复位总线
K1EQUP1.4;独立键
K2EQUP1.5
K3EQUP1.6
K4EQUP1.7
BEEPEQUP3.3;蜂鸣器
RELAYEQUP3.5;继电器
T_CONUEQU22H;中断计数
TIME_LEQU23H;定时初值
TIME_HEQU24H
TIME_DATAEQU50H;显示时间单元首地址
DATE_DATAEQU60H;显示日期单元首地址
DS_DATAEQU58H;显示定时时间单元首地址
;------------------------------------------------
ORG0000H
AJMPMAIN
ORG000BH
AJMPINT_T0
ORG0080H
;------------------------------------------------
MAIN:
MOVTMOD,#01H;T0,方式1
MOVTIME_L,#00H;50MS定时值
MOVTIME_H,#4CH
MOVT_CONU,#00H;中断次数
MOVIE,#82H;EA=1,ET0=1
MOVA,#00H
MOVR0,#40H;从40H单元开始
MOVR1,#40H;清64个单元
M_CLEAR:
MOV@R0,A
INCR0
DJNZR1,M_CLEAR
MOV7FH,#0AH;送熄灭符
SETBBEEP
LCALLTIME_DELAY;调显示延时
LCALLPROSET;DS1302初始化
MAIN1:
LCALLGET_TIME;从DS1302读数据程序
LCALLCHULI;实时时间数据处理
MOVR0,#TIME_DATA;显示时、分、秒
LCALLDISP
MOVR0,#TIME_DATA
LCALLTIME_DISPLAY
LCALLSET_KEY;键功能程序
LCALLCOMP;实时时间与定时时间比较
JBK1,MAIN1
CALLBEEP_BL
MAIN2:
LCALLCHULI;日期数据处理
MOVR0,#DATE_DATA
LCALLDISP;显示年、月、日
MOVR0,#DATE_DATA
LCALLTIME_DISPLAY
JBK1,MAIN2
CALLBEEP_BL
MAIN3:
LCALLDS_CHULI;定时时间数据处理
MOVR0,#DS_DATA
LCALLDS_SP;显示定时时间
MOVR0,#DS_DATA
LCALLDS_DISPLAY
JBK1,MAIN3
CALLBEEP_BL
AJMPMAIN1
;--------------------------------------------
;中断服务子程序
;300MS对闪动标记取反一次
;--------------------------------------------
INT_T0:
PUSHACC
PUSHPSW
MOVTL0,TIME_L
MOVTH0,TIME_H
INCT_CONU
MOVA,T_CONU
CJNEA,#06H,INT_END
MOVT_CONU,#00H
CPL0AH
INT_END:
POPPSW
POPACC
RETI
;--------------------------------------------
;DS1302初始化子程序
;(R0)=数据(R1)=地址
;--------------------------------------------
PROSET:
CLRRST;DS1302复位
CLRSCLK
NOP
NOP
SETBRST
;MOVR1,#80H;写秒寄存器
;MOVR0,#00H;启动振荡器
;LCALLWRITE
;MOVR1,#82H;写分寄存器
;MOVR0,#58H
;LCALLWRITE
;MOVR1,#84H;写时寄存器
;MOVR0,#80H
;LCALLWRITE
MOVR1,#90H;写充电寄存器
MOVR0,#0ABH
LCALLWRITE
RET
;===============================================
;读时间、日期数据子程序
;存放单元40H-46H
;===============================================
GET_TIME:
MOVR1,#81H;读秒
LCALLREAD
MOV40H,R0
MOVR1,#83H;读分
LCALLREAD
MOV41H,R0
MOVR1,#85H;读时
LCALLREAD
MOV42H,R0
MOVR1,#87H;读出日期
LCALLREAD
MOV43H,R0
MOVR1,#89H;读出月份
LCALLREAD
MOV44H,R0
MOVR1,#8BH;读出星期
LCALLREAD
MOV46H,R0
MOVR1,#8DH;读出年
LCALLREAD
MOV45H,R0
RET
;================================================
;写DS1302子程序
;================================================
WRITE:
CLRSCLK
NOP
NOP
SETBRST
NOP
MOVA,R1
MOVR2,#08H
WRI_01:
RRCA;传输地址到DS1302
NOP
NOP
CLRSCLK
NOP
NOP
MOVIO_DATA,C
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR2,WRI_01
CLRSCLK
NOP
NOP
MOVA,R0
MOVR2,#08H
WRI_02:
RRCA;传输数据到DS1302
NOP
CLRSCLK
NOP
NOP
MOVIO_DATA,C
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR2,WRI_02
CLRSCLK
NOP
NOP
CLRRST
NOP
NOP
RET
;=================================================
;读DS1302子程序
;=================================================
READ:
CLRSCLK
NOP
NOP
SETBRST
NOP
NOP
MOVA,R1
MOVR2,#08H
READ_01:
RRCA
NOP;先传输地址到DS1302
MOVIO_DATA,C
NOP
NOP
SETBSCLK
NOP
NOP
CLRSCLK
NOP
NOP
DJNZR2,READ_01
NOP
NOP
SETBIO_DATA
CLRA
CLRC
MOVR2,#08H
READ_02:
CLRSCLK
NOP
NOP
MOVC,IO_DATA
NOP
NOP
RRCA;再从DS1302接收数据
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR2,READ_02
MOVR0,A
CLRRST
RET
;==============================================
;实时时间、日期数据处理子程序
;==============================================
CHULI:
MOVA,40H;处理秒数据
ANLA,#0FH
MOV50H,A
MOV70H,A
MOVA,40H
ANLA,#11110000B
SWAPA
MOV51H,A
MOV71H,A
;---------------------------------------------
MOVA,41H;处理分数据
ANLA,#0FH
MOV52H,A
MOV72H,A
MOVA,41H
ANLA,#11110000B
SWAPA
MOV53H,A
MOV73H,A
;---------------------------------------------
MOVA,42H;处理时数据
ANLA,#0FH
MOV54H,A
MOV74H,A
MOVA,42H
ANLA,#11110000B
SWAPA
MOV55H,A
MOV75H,A
;----------------------------------------------
MOVA,43H;处理日数据
ANLA,#0FH
MOV60H,A
MOV76H,A
MOVA,43H
ANLA,#11110000B
SWAPA
MOV61H,A
MOV77H,A
;---------------------------------------------
MOVA,44H;处理月数据
ANLA,#0FH
MOV62H,A
MOV78H,A
MOVA,44H
ANLA,#11110000B
SWAPA
MOV63H,A
MOV79H,A
;---------------------------------------------
MOVA,45H;处理年数据
ANLA,#0FH
MOV64H,A
MOV7AH,A
MOVA,45H
ANLA,#11110000B
SWAPA
MOV65H,A
MOV7BH,A
;----------------------------------------------
MOVA,46H;处理周数据
MOV66H,A
MOV7CH,A
RET
;=============================================
;实时时间、日期查表取数子程序
;=============================================
DISP:
;MOVR0,#TIME_DATA
MOVR3,#06H
DISP1:
MOVA,@R0
MOVDPTR,#TAB_NU
MOVCA,@A+DPTR
MOV@R0,A
INCR0
DJNZR3,DISP1
RET
;====================================================
;时间、日期显示子程序
;====================================================
TIME_DISPLAY:
;MOVR0,#TIME_DATA;取得显示单元首地址
MOVR1,#07FH;从第一个数码管开始
MOVR2,#08H;共8个数码管
DISLP:
MOVP0,@R0;获得当前单元数据
MOVA,R1
MOVP2,A;数码显示
JBACC.5,DISLP1;第三位数码管显示-
MOVP0,#0f7H
JMPDISLP3
DISLP1:
JBACC.2,DISLP2;第六位数码管显示-
MOVP0,#0f7H
JMPDISLP3
DISLP2:
INCR0
DISLP3:
MOVA,R1;为下一个数准备
RRA;下一个单元
MOVR1,A;保存
LCALLDELAY;为了保证数码管亮度,延时
DJNZR2,DISLP;重复显示,直到全部数据刷新过
RET;返回
DELAY:
MOVR4,#0AH
L15:
MOVR5,#64H
L16:
DJNZR5,L16
DJNZR4,L15
RET
;******************************************************
SET_KEY:
SETBK1;增加键
SETBK2;减少键
SETBK3;选择键
SETBK4;定时设定功能键
NOP
JBK4,KEY01
LCALLBEEP_BL
JMPDS_KEY;进入定时值设定子程序
KEY01:
JBK2,KEY02
LCALLBEEP_BL
JMPSET_TIME;进入时间设定子程序
KEY02:
JBK3,KEY03
LCALLBEEP_BL
CPL20H.0;止闹标记取反
KEY03:
RET
;-----------------------------------------------------
DS_KEY:
CALLDS_DELAY
JNBK4,$
LCALLDSSET
CALLDS_DELAY
RET
;==============================================
;实时时间设定子程序
;K1为加键、K2为减键、K3为选择键
;==============================================
SET_TIME:
MOVR1,#8EH;写保护寄存器
MOVR0,#00H;允许写入
LCALLWRITE
MOVR1,#80H;写秒寄存器
MOVR0,#80H;停止振荡器工作
LCALLWRITE
SETBTR0
K001:
CALLTIME_DELAY;校时
JNBK3,K001;K3为位移键
K010:
CALLCHULI
JNB0AH,KH01
MOV54H,7FH;送入熄灭符
MOV55H,7FH
JMPKH02
KH01:
MOV54H,74H;送实时值
MOV55H,75H;送实时值
KH02:
MOVR0,#TIME_DATA
CALLDISP
MOVR0,#TIME_DATA
CALLTIME_DISPLAY
JNBK1,K011A
JNBK2,K011B
JNBK3,K002
JMPK010
K011A:
MOVA,42H
ADDA,#01H
DAA
MOV42H,A
XRLA,#24H
JNZK012A
MOV42H,#00H
K012A:
MOVR1,#84H;写时寄存器
MOVR0,42H
LCALLWRITE
CALLTIME_DELAY
JMPK010
K011B:
MOVA,42H
XRLA,#00H
JZK012B
SETBC;求补运算
CLRA
ADDCA,#99H;加99
SUBBA,#01H;减去减数
ADDA,42H;加被减数
DAA;十进制调整
MOV42H,A;
XRLA,#00H
JNZK012C
K012B:
MOV42H,#23H
K012C:
MOVR1,#84H;写时寄存器
MOVR0,42H
LCALLWRITE
CALLTIME_DELAY
JMPK010
;-------------------------------------------------
K002:
CALLTIME_DELAY;校分
JNBK3,K002;K3为位移键
K020:
CALLCHULI
JNB0AH,KM01
MOV52H,7FH;送入熄灭符
MOV53H,7FH
JMPKM02
KM01:
MOV52H,72H;送实时值
MOV53H,73H;送实时值
KM02:
MOVR0,#TIME_DATA
CALLDISP
MOVR0,#TIME_DATA
CALLTIME_DISPLAY
JNBK1,K021A
JNBK2,K021B
JNBK3,K003
JMPK020
K021A:
MOVA,41H
ADDA,#01H
DAA
MOV41H,A
XRLA,#60H
JNZK022A
MOV41H,#00H
K022A:
MOVR1,#82H;写分寄存器
MOVR0,41H
LCALLWRITE
CALLTIME_DELAY
JMPK020
;---------------------------------------------------
K021B:
MOVA,41H
XRLA,#00H
JZK022B
SETBC;求补运算
CLRA
ADDCA,#99H;加99
SUBBA,#01H;减去减数
ADDA,41H;加被减数
DAA;十进制调整
MOV41H,A;
XRLA,#00H
JNZK022C
K022B:
MOV41H,#59H
K022C:
MOVR1,#82H;写分寄存器
MOVR0,41H
LCALLWRITE
CALLTIME_DELAY
JMPK020
;---------------------------------------------------
K003:
CALLDATE_DELAY;校日
JNBK3,K003;K3为位移键
K030:
CALLCHULI
JNB0AH,KR01
MOV60H,7FH;送入熄灭符
MOV61H,7FH
JMPKR02
KR01:
MOV60H,76H;送实时值
MOV61H,77H;送实时值
KR02:
MOVR0,#DATE_DATA
CALLDISP
MOVR0,#DATE_DATA
CALLTIME_DISPLAY
JNBK1,K031A
JNBK2,K031B
JNBK3,K004
JMPK030
K031A:
MOVA,43H
ADDA,#01H
DAA
MOV43H,A
XRLA,#32H
JNZK032A
MOV43H,#00H
K032A:
MOVR1,#86H;写日寄存器
MOVR0,43H
LCALLWRITE
CALLDATE_DELAY
JMPK030
K031B:
MOVA,43H
XRLA,#00H
JZK032B
SETBC;求补运算
CLRA
ADDCA,#99H;加99
SUBBA,#01H;减去减数
ADDA,43H;加被减数
DAA;十进制调整
MOV43H,A
XRLA,#00H
JNZK032C
K032B:
MOV43H,#31H
K032C:
MOVR1,#86H;写日寄存器
MOVR0,43H
LCALLWRITE
CALLDATE_DELAY
JMPK030
;------------------------------------------------
K004:
CALLDATE_DELAY;校月
JNBK3,K004;K3为位移键
K040:
CALLCHULI
JNB0AH,KC01
MOV62H,7FH;送入熄灭符
MOV63H,7FH
JMPKC02
KC01:
MOV62H,78H;送实时值
MOV63H,79H;送实时值
KC02:
MOVR0,#DATE_DATA
CALLDISP
MOVR0,#DATE_DATA
CALLTIME_DISPLAY
JNBK1,K041A
JNBK2,K041B
JNBK3,K005
JMPK040
K041A:
MOVA,44H
ADDA,#01H
DAA
MOV44H,A
XRLA,#13H
JNZK042A
MOV44H,#00H
K042A:
MOVR1,#88H;写月寄存器
MOVR0,44H
LCALLWRITE
CALLDATE_DELAY
JMPK040
K041B:
MOVA,44H
XRLA,#00H
JZK042B
SETBC;求补运算
CLRA
ADDCA,#99H;加99
SUBBA,#01H;减去减数
ADDA,44H;加被减数
DAA;十进制调整
MOV44H,A;
XRLA,#00H
JNZK042C
K042B:
MOV44H,#12H
K042C:
MOVR1,#88H;写月寄存器
MOVR0,44H
LCALLWRITE
CALLDATE_DELAY
JMPK040
;-----------------------------------------------
K005:
CALLDATE_DELAY;校年
JNBK3,K005;K3为位移键
K050:
CALLCHULI
JNB0AH,KY01
MOV64H,7FH;送入熄灭符
MOV65H,7FH
JMPKY02
KY01:
MOV64H,7AH;送实时值
MOV65H,7BH;送实时值
KY02:
MOVR0,#DATE_DA