4917|0

7

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

DS1302时钟芯片多字节传送问题 [复制链接]

问题,多字节传送一定要8个字节吗?程序如下:
SCLK BIT P1.3
IO_DATA BIT P1.4
RST BIT P1.5

BitCnt  data  30h ; 数据位计数器
ByteCnt  data  31h ; 数据字节计数器
Command  data  32h ; 命令字节地址
L_DISPLAY  data  33H
RcvDat DATA 40H ; 接收数据缓冲区
XmtDat DATA 50H ; 发送数据缓冲区

ORG 0030H
TABLE:      DB  3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,40H
                             /*共阴数码管 0-9 - 表*/

ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:   MOV SP,#60H
            LCALL Write_Enable;写允许
            LCALL Write_Multiplebyte;初始化1302,将我们要设定的数据写入
M0: LCALL Read_Multiplebyte;将我们设定的数据读出来  ;循环读取时间数据
       MOV R0,#L_DISPLAY
       MOV A,42H  ;把时拆分为两个数据,个时和十时  
       MOV B,#16
       DIV AB
       MOV @R0,A   ;十时
       INC R0
       MOV @R0,B   ;个时
       INC R0
       MOV @R0,#10   ;加"-"
       INC R0
       MOV A,41H  ;同上
       MOV B,#16
       DIV AB
       MOV @R0,A
       INC R0
       MOV @R0,B
       INC R0
       MOV @R0,#10
       INC R0
       MOV A,40H
       MOV B,#16
       DIV AB
       MOV @R0,A
I     NC R0
       MOV @R0,B
       MOV R0,#L_DISPLAY
       MOV R7,#8
       LCALL DISPLAY
       SJMP M0

DISPLAY:MOV DPTR,#TABLE  /*R0为地址,R7为个数*/
               MOV P2,#0
               ANL P1,#0F8H
L2: MOV A,@R0
      MOVC A,@A+DPTR
      MOV P2,A
      LCALL DELAY
      MOV P2,#0
      INC P1
      INC R0
      DJNZ R7,L2
      RET

DELAY: MOV R5,#20
D1:        DJNZ R5,D1
              RET

;********************************************************************************************
;发送数据程序
;名称: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

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; 返回调用本子程序处


问题:此程序下,数码管正确显示设置的时分秒,即13-59-59,并正常运行,当擦除单片机ROM,重新下载后,数码管仍按程序设置的初始时间显示。
          将程序中划线内容屏蔽,将8改成3后,数码管却不能正确显示程序设置时间,重新下载后,数码管显示时间=擦除前时间+执行擦除,重新下载任务的时间,即时钟芯片一直都在运行。
请问各位大侠,这是什么原因啊,多字节传送一定要8字节才行吗?小妹谢谢各位了!
此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
直播报名最后1周:艾迈斯欧司朗 OSP 开放协议,从氛围灯动态照明到传感器交互融合
直播时间:4月22日(周二)10:00
直播奖励:京东卡、蓝牙温湿度计、定制水杯

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 4

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表