四年级中队活动课:时钟芯片DS1302汇编程序(51)-我思故我在-搜狐博客

来源:百度文库 编辑:偶看新闻 时间:2024/04/18 14:40:24
搜狐博客 > 我思故我在 > 日志 > 电子设计

2006-12-22 | 时钟芯片DS1302汇编程序(51)

标签: 万年历  DS1302  汇编  时钟 

;1.每次上电,必须把秒寄存器高位(第7位)设置为0,时钟才能走时。
;2.如果需要写入数据和时钟日历信息,必须把“写保护”寄存器设置成为0
;内存数据定义
BitCnt data 30h ; 数据位计数器
ByteCnt data 31h ; 数据字节计数器
Command data 32h ; 命令字节地址
RcvDat DATA 40H ; 接收数据缓冲区
XmtDat DATA 50H ; 发送数据缓冲区
;端口位定义
IO_DATA bit P1.3 ; 数据传送总线
SCLK bit P1.2 ; 时钟控制总线
RST bit P1.4 ; 复位总线

        ORG   0000H
        AJMP  START
        
;****************************  ;main program
       ORG    0030H
START: CLR     RST
       MOV  SP,#2AH

;------------------------------------初始化1302-------------------------
SET1302:
LCALL Write_Enable;写允许
LCALL Osc_Disable
LCALL Write_Multiplebyte;初始化1302,将我们要设定的数据写入
LCALL Read_Multiplebyte;将我们设定的数据读出来
LCALL Osc_Enable
JMP START

;********************************************************************************************
;发送数据程序
;名称:Send_Byte
;描述:发送ByteCnt 个字节给被控器DS1302
;命令字节地址在Command 中
;所发送数据的字节数在ByteCnt 中发送的数据在XmtDat 缓冲区中
;********************************************************************************************
Send_Byte:
CLR RST ;复位引脚为低电平所有数据传送终止
NOP
CLR SCLK; 清时钟总线
NOP
SETB RST ;复位引脚为高电平逻辑控制有效
NOP
MOV A,Command; 准备发送命令字节
MOV BitCnt,#08h ;传送位数为8
S_Byte0:
RRC A ;将最低位传送给进位位C
MOV IO_DATA,C ;位传送至数据总线
NOP
SETB SCLK ;时钟上升沿发送数据有效
NOP
CLR SCLK ;清时钟总线
DJNZ BitCnt,S_Byte0 ;位传送未完毕则继续
NOP
S_Byte1: ;准备发送数据
MOV A,@R0 ;传送数据过程与传送命令相同
MOV BitCnt,#08h
S_Byte2:
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,S_Byte2
INC R0 ;发送数据的内存地址加1
DJNZ ByteCnt,S_Byte1 ;字节传送未完毕则继续
NOP
CLR RST ;逻辑操作完毕清RST
RET
;***************************************************************************************
;接收数据程序;
;名称:Receive_Byte
;描述:从被控器DS1302 接收ByteCnt 个字节数据
;命令字节地址在Command 中
;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中
;***********************************************************************************
Receive_Byte:
CLR RST ;复位引脚为低电平所有数据传送终止
NOP
CLR SCLK ;清时钟总线
NOP
SETB RST ;复位引脚为高电平逻辑控制有效
MOV A,Command ;准备发送命令字节
MOV BitCnt,#08h ;传送位数为8
R_Byte0:
RRC A ;将最低位传送给进位位C
MOV IO_DATA,C ;位传送至数据总线
NOP
SETB SCLK ;时钟上升沿发送数据有效
NOP
CLR SCLK ;清时钟总线
DJNZ BitCnt,R_Byte0 ;位传送未完毕则继续
NOP
R_Byte1: ;准备接收数据
CLR A ;清类加器
CLR C ;清进位位C
MOV BitCnt,#08h ;接收位数为8
R_Byte2:
NOP
MOV C,IO_DATA ;数据总线上的数据传送给C
RRC A ;从最低位接收数据
SETB SCLK ;时钟总线置高
NOP
CLR SCLK ;时钟下降沿接收数据有效
DJNZ BitCnt,R_Byte2 ;位接收未完毕则继续
MOV @R1,A ;接收到的完整数据字节放入接收内存缓冲区
INC R1 ;接收数据的内存地址加1
DJNZ ByteCnt,R_Byte1 ;字节接收未完毕则继续
NOP
CLR RST ;逻辑操作完毕清RST
RET

;--写保护寄存器操作------------------------------------------
Write_Enable:
MOV Command,#8Eh ;命令字节为8E
MOV ByteCnt,#1 ;单字节传送模式
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#00h ;数据内容为0 写入允许
ACALL Send_Byte ;调用写入数据子程序
RET

;当写保护寄存器的最高位为1 时禁止数据写入寄存器---------------
Write_Disable:
MOV Command,#8Eh ;命令字节为8E
MOV ByteCnt,#1 ;单字节传送模式
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#80h ;数据内容为80h 禁止写入
ACALL Send_Byte ;调用写入数据子程序
RET ;返回调用本子程序处


;当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始---------
Osc_Enable:
MOV Command,#80h ; 命令字节为80
MOV ByteCnt,#1 ; 单字节传送模式
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#00h ;数据内容为0 振荡器工作允许
ACALL Send_Byte ;调用写入数据子程序
RET ;返回调用本子程序处


;当把秒寄存器的第7 位时钟停止位设置为1 时时钟振荡器停止HT1380 进入低功耗方式---------------
Osc_Disable:
MOV Command,#80h ;命令字节为80
MOV ByteCnt,#1 ;单字节传送模式
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#80h ;数据内容为80h 振荡器停止
ACALL Send_Byte ;调用写入数据子程序
RET ;返回调用本子程序处


;写入00 年6 月21 日星期三13 时59 分59---------------------
Write_Multiplebyte:
MOV Command,#0BEh ;命令字节为BEh
MOV ByteCnt,#8 ;多字节写入模式此模块为8 个
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#59h ;秒单元内容为59h
MOV XmtDat+1,#59h ;分单元内容为59h
MOV XmtDat+2,#13h ;时单元内容为13h
MOV XmtDat+3,#21h ;日期单元内容为21h
MOV XmtDat+4,#06h ;月单元内容为06h
MOV XmtDat+5,#03h ;星期单元内容为03h
MOV XmtDat+6,#0 ;年单元内容为00h
MOV XmtDat+7,#0 ;写保护单元内容为00h
ACALL Send_Byte ;调用写入数据子程序
RET ;返回调用本子程序处


;读出寄存器0-7 的内容程序设置如下
Read_Multiplebyte:
MOV Command,#0BFh ;命令字节为BFh
MOV ByteCnt,#8 ;多字节读出模式此模块为8 个
MOV R1,#RcvDat ;数据地址覆给R1
ACALL Receive_Byte; 调用读出数据子程序
RET; 返回调用本子程序处


;写入8 时12 小时模式程序设置如下
Write_Singlebyte:
MOV Command,#84h ; 命令字节为84h
MOV ByteCnt,#1 ; 单字节传送模式
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#88h ;数据内容为88h
ACALL Send_Byte ;调用写入数据子程序
RET ;返回调用本子程序处


;=============================================================================================
END

http://www.0net.cn/singlechip/Print.asp?ArticleID=17512&Page=1这个网址上也有

下面还有一个程序也贴出对比一下:

CLK  EQU P1.4
IO   EQU P1.3
RST  EQU P1.2
          ORG 0000H
        AJMP START
        ORG 0003H
        AJMP SIN0
        ORG 000BH
        AJMP DS0
        ORG 0013H
        AJMP SIN1
        ORG 001BH
        AJMP DS1
        ORG 0100H
START:  MOV SP,#30H
        CLR P1
fuwei:  MOV 60H,#8FH   ;写保护控制命令寄存器地址 8FH读,8EH写
        mov 61H,#00H   ; 打开写保护准备写数据 00H写, 80H读
        mov r2,#02h
        setb rst
        LCALL Wrt
        MOV 60H,#70H   ;秒寄存器控制字地址
        MOV 61H,#00H   ;秒初始化为0,同时启动时钟工作
        mov r2,#02h
        setb rst
        lcall WRT
        ;lcall delay
red:    MOV 60h,#10000001B     ;读秒的命令字 10000001b
        mov r2,#01h
        SETB RST
        lcall wrt
        nop
        nop
        nop
        nop
        nop
        lcall red1
        CLR RST
        lcall chuli
        ljmp red
wrt:   MOV R0,#60H
CC:    MOV A,@R0
       MOV R3,#08H
SEND: RRC A
       MOV IO,C
       DJNZ R3,SEND
       INC R0
       DJNZ R2,CC
       RET
RED1:  CLR C
       MOV R3,#08H
CC1:   SETB CLK
       MOV C,IO
       RRC A
       SETB CLK
       DJNZ R3,CC1
       MOV 50H,A
       RET

CHULI: MOV A,50H
       ANL A,#0FH
       MOV 40H,A
       MOV A,50H
       ANL A,#01110000B
       MOV 41H,A
       MOV 42H,#0
       MOV 43H,#0
       LCALL DISP
       LCALL DELAY
       RET
DISP:  MOV R0,#40H
       MOV R3,#04H
DISP1: MOV A,@R0
       MOV DPTR,#DDSEG
       MOVC A,@A+DPTR
       MOV SBUF,A
WAIT:  JNB TI,WAIT
       CLR TI
       INC R0
       DJNZ R3,DISP1
       RET
DS0:   NOP
       RETI
DS1:   NOP
       RETI
SIN0:  NOP
       RETI
SIN1:  NOP
       RETI
delay:mov r4,#40
DE1 :mov r5,#20
DE2 :djnz r5,DE2
      djnz r4,DE1
      ret
DDSEG: DB 03H,09FH,25H,0DH,99H,49H,41H,1FH,00H,09H
       DB 11H,00H,63H,85H,61H,71H ;A-F
       DB 0FFH,0FDH  ;灭