DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 170|回复: 0
打印 上一主题 下一主题

ds1302程序

[复制链接]
跳转到指定楼层
楼主
发表于 2011-4-30 14:05:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
ds1302程序
;=======================================================
;function:发送数据程序
;input:command---准备发送命令
;r0--------原数据首地址
;r7-------数据字节计数
;output:---------
;usage:a,
;r0
;r2--------数据位计数器
;r7
;=========================================================
ds_send_byte:
clrDS_RST;复位引脚为低电平,所有数据传送终止
nop
clrDS_CLK;清时钟总线
nop
setbDS_RST;复位引脚为高电平,逻辑控制有效
nop
mova,command;准备发送命令字节
movr2,#08h;传送位数为8
ds_byte0:
rrca;将最低位传送给进位位C
movDS_IO,C;位传送至数据总线
nop
setbDS_CLK;时钟上升沿,发送数据有效
nop
clrDS_CLK;清时钟总线
djnzr2,ds_byte0;位传送未完毕则继续
nop
ds_byte1:
mova,@r0;准备发送数据
movr2,#08h;传送数据,过程与传送命令相同
ds_byte2:
rrca
movDS_IO,c
nop
setbDS_CLK
nop
clrDS_CLK
djnzr2,ds_byte2
incr0;发送数据的内存地址加1
djnzr7,ds_byte1;字节传送未完毕则继续
nop
clrDS_RST;逻辑操作完毕,清DS_RST
ret
;======================================================
;function:接收数据程序
;input:command---准备发送命令
;r1--------即目标数
;r7--------数据字节计数器
;output:---------
;usage:a,
;r1
;r2--------数据位计数器
;r7
;===================================================
ds_receive_byte:
clrDS_RST;复位引脚位低电平,所有数据传送终止
nop
clrDS_CLK;清时钟总线
nop
setbDS_RST;复位引脚为高电平,逻辑控制有效
mova,command;准备发送命令字节
movr2,#08h;传送位数为8
ds_r_byte0:
rrca;将最低位传送给进位位c
movDS_IO,c;位传送给数据总线
nop
setbDS_CLK;时钟上升沿,发送数据有效
nop
clrDS_CLK;清时钟总线
djnzr2,ds_r_byte0;位传送未完毕则继续
nop
ds_r_byte1:
;准备接收数据
clra;清累加器

clrc;清进位位c
movr2,#08h;接收位数为8
ds_r_byte2:
nop
movc,DS_IO;数据总线上的数据传送给C
rrca;从最低位接收数据
setbDS_CLK;时钟总线置高
nop
clrDS_CLK;时钟下降沿接收数据有效
djnzr2,ds_r_byte2;位接收未完毕则继续
mov @r1,a;接收到的完整数据字节放入接收内存缓冲区
incr1;接收数据的内存地址加1
djnzr7,ds_r_byte1;字节接收未完毕则继续
nop
clrDS_RST;逻辑操作完毕,清DS_RST
ret
;======================================================
;function:write多字节写入
;input:command---准备发送命令
;r0--------原数据首地址
;r7--------数据字节数也是多字节写入模式
;output:---------
;usage:r0,r7,command,dsdat
;========================================================= 
write_multibyte:
movcommand,#0beh;命令字节为beh
movr7,#08h;多字节写入模式(此模式为8个)
movr0,#dsdat;数据地址覆给r0
movdsdat,#00h;秒单元内容为00h
movdsdat+1,#00h;分单元内容为00h
movdsdat+2,#00h;时单元内容为12h
movdsdat+3,#15;日期单元内容为15h
movdsdat+4,#07h;月单元内容为07h
movdsdat+5,#04h;星期单元内容为04h
movdsdat+6,#04h;年单元内容为04h
movdsdat+7,#00h;写保护单元内容为00h
lcallds_send_byte;调用写入数据子程序
ret
;=================================================
;function:read多字节读出
;input:command---准备发送命令
;r7---------在这里为读出的数据字节数为3个
;---------
;output:---------
;usage:a,r7
;r1-------目标数据地址
;rcvdat-------所接收的数据地址
;======================================================== 
read_multibyte:
movcommand,#0bfh;命令字节为BFh
movr7,#3h;多字节读出模式(由于只需要时,分,秒所以只需读出3个
movr1,#rcvdat;数据地址覆给r1
lcallds_receive_byte;调用读出数据子程?
movr1,#rcvdat;数据地址覆给r1
mova,@r1;将 R1里的数据送给a
lcallzip_to_unzip;调用解压即拆字节
movCLK_SecL,b;将低位送给秒低位
movCLK_SecH,a;将高位送给秒高位
incr1
mova,@r1;将 R1里的数据送给a
lcallzip_to_unzip
movCLK_MinL,b
movCLK_MinH,a
incr1
mova,@r1;将 R1里的数据送给a
lcallzip_to_unzip
movCLK_HourL,b
movCLK_HourH,a
ret
;=====================================================
;function:clk_enable;启动时钟开始
;input:command---准备发送命令
;r7--------数据字节数也是多字节写入模式
;---------
;output:---------
;usage:r3,r7
;======================================================= 
clk_enable:
movcommand,#80h;命令字节为80h,启动时钟开始
movr7,#8h;多字节传送模式
mov r3,#dsdat;数据地址覆给r3
movdsdat,#00h;数据内容为0(振荡器工作允许)
lcall ds_send_byte;调用写入数据子程序
ret
;=====================================================
;function:write_enable;允许写程序
;input:command---准备发送命令
;r7--------数据字节数也是多字节写入模式?
;
---------
;output:---------
;usage:r4,r7
;========================================
write_enable:
movcommand,#8eh;命令字节为8e允许写命令
movr7,#8h
movr4,#dsdat;数据地址覆给r4
movdsdat,#00h;数据内容为0(写入允许)
lcallds_send_byte;调用写入数据子程序
ret
;======================================================
;function:charge_set;充电子程序
;input:command---准备发送命令
;r7--------数据字节数也是多字节写入模式?
;
r0--------原数据首地址
;output:---------
;usage:r0,r7
;==========================================================
charge_set:
movcommand,#90h;充电命令字为90h
movr7,#1;单字节传送
movr0,#dsdat
movdsdat,#0a5h;数据内容为5ah(允许充电)
lcallds_send_byte;调用写入数据子程序
ret
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-10-27 06:52 , 耗时 0.096882 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表