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:
??clr??DS_RST????;復位引腳為低電平,所有數據傳送終止
??nop
??clr??DS_CLK????;清時鐘總線
??nop
??setb??DS_RST????;復位引腳為高電平,邏輯控制有效
??nop
??mov??a,??command??;準備發送命令字節
??mov??r2,??#08h??;傳送位數為8
ds_byte0:?
??rrc??a????;將最低位傳送給進位位C
??mov??DS_IO,??C??;位傳送至數據總線
??nop
??setb??DS_CLK????;時鐘上升沿,發送數據有效
??nop
??clr??DS_CLK????;清時鐘總線
??djnz??r2,??ds_byte0?;位傳送未完畢則繼續
??nop
ds_byte1:?
??mov??a,??@r0??;準備發送數據
??mov??r2,??#08h??;傳送數據,過程與傳送命令相同
ds_byte2:
??rrc??a
??mov??DS_IO,??c
??nop
??setb??DS_CLK
??nop
??clr??DS_CLK
??djnz??r2,??ds_byte2
??inc??r0????;發送數據的內存地址加1
??djnz??r7,??ds_byte1?;字節傳送未完畢則繼續
??nop
??clr??DS_RST????;邏輯操作完畢,清DS_RST
??ret??
;======================================================
;??function:?接收數據程序
;??input:??command---準備發送命令
;????r1--------即目標數
;????r7--------數據字節計數器
;??output:??---------
;??usage:??a,
;????r1
;????r2--------數據位計數器
;????r7
;===================================================
ds_receive_byte:
??clr??DS_RST????;復位引腳位低電平,所有數據傳送終止
??nop
??clr??DS_CLK????;清時鐘總線
??nop
??setb??DS_RST????;復位引腳為高電平,邏輯控制有效
??mov??a,??command??;準備發送命令字節
??mov??r2,??#08h??;傳送位數為8
ds_r_byte0:
??rrc??a????;將最低位傳送給進位位c
??mov??DS_IO,??c??;位傳送給數據總線
??nop
??setb??DS_CLK????;時鐘上升沿,發送數據有效
??nop
??clr??DS_CLK????;清時鐘總線
??djnz??r2,??ds_r_byte0?;位傳送未完畢則繼續
??nop
ds_r_byte1:
????????;準備接收數據
??clr??a????;清累加器?
???
??clr??c????;清進位位c
??mov??r2,??#08h??;接收位數為8
ds_r_byte2:
??nop
??mov??c,??DS_IO??;數據總線上的數據傳送給C
??rrc??a????;從最低位接收數據
??setb??DS_CLK????;時鐘總線置高
??nop
??clr??DS_CLK????;時鐘下降沿接收數據有效
??djnz??r2,??ds_r_byte2?;位接收未完畢則繼續
??mov ??@r1,??a??;接收到的完整數據字節放入接收內存緩沖區
??inc??r1????;接收數據的內存地址加1
??djnz??r7,??ds_r_byte1?;字節接收未完畢則繼續
??nop
??clr??DS_RST????;邏輯操作完畢,清DS_RST
??ret
;======================================================
;??function:?write?多字節寫入
;??input:??command---準備發送命令
;????r0--------原數據首地址
;????r7--------數據字節數也是多字節寫入模式
;??output:??---------
;??usage:??r0,r7,command,dsdat?
;=========================================================
write_multibyte:
??mov??command,?#0beh??;命令字節為beh
??mov??r7,??#08h??;多字節寫入模式(此模式為8個)
??mov??r0,??#dsdat??;數據地址覆給r0
??mov??dsdat,??#00h??;秒單元內容為00h
??mov??dsdat+1,?#00h??;分單元內容為00h
??mov??dsdat+2,?#00h??;時單元內容為12h
??mov??dsdat+3,?#15??;日期單元內容為15h
??mov??dsdat+4,?#07h??;月單元內容為07h
??mov??dsdat+5,?#04h??;星期單元內容為04h
??mov??dsdat+6,?#04h??;年單元內容為04h
??mov??dsdat+7,?#00h??;寫保護單元內容為00h
??lcall??ds_send_byte???;調用寫入數據子程序
??ret
;=================================================
;??function:?read?多字節讀出
;??input:??command---準備發送命令
;????r7---------在這里為讀出的數據字節數為3個
;????---------
;??output:??---------
;??usage:??a,r7?
;????r1-------目標數據地址
;????rcvdat-------所接收的數據地址
;========================================================
read_multibyte:
??mov??command,?#0bfh??;命令字節為BFh
??mov??r7,??#3h??;多字節讀出模式(由于只需要時,分,秒所以只需讀出3個
??mov??r1,??#rcvdat??;數據地址覆給r1
??lcall??ds_receive_byte???;調用讀出數據子程?
??mov??r1,??#rcvdat??;數據地址覆給r1
??mov??a,??@r1??;將 R1里的數據送給a
??lcall??zip_to_unzip???;調用解壓即拆字節
??mov??CLK_SecL,?b??;將低位送給秒低位
??mov??CLK_SecH,?a??;將高位送給秒高位
??inc??r1
??mov??a,??@r1??;將 R1里的數據送給a
??lcall??zip_to_unzip
??mov??CLK_MinL,?b
??mov??CLK_MinH,?a
??inc??r1
??mov??a,??@r1??;將 R1里的數據送給a
??lcall??zip_to_unzip
??mov??CLK_HourL,?b
??mov??CLK_HourH,?a?
??ret
;=====================================================
;??function:?clk_enable;啟動時鐘開始
;??input:??command---準備發送命令
;????r7--------數據字節數也是多字節寫入模式
;????---------
;??output:??---------
;??usage:??r3,r7??
;=======================================================
clk_enable:
??mov??command,?#80h??;命令字節為80h,啟動時鐘開始
??mov??r7,??#8h??;多字節傳送模式
??mov ??r3,??#dsdat??;數據地址覆給r3
??mov??dsdat,??#00h??;數據內容為0(振蕩器工作允許)
??lcall ??ds_send_byte???;調用寫入數據子程序
??ret??
;=====================================================
;??function:?write_enable;允許寫程序
;??input:??command---準備發送命令
;????r7--------數據字節數也是多字節寫入模式?
;?
???---------
;??output:??---------
;??usage:??r4,r7??
;========================================
write_enable:
??mov??command,?#8eh??;命令字節為8e允許寫命令
??mov??r7,??#8h?
??mov??r4,??#dsdat??;數據地址覆給r4
??mov??dsdat,??#00h??;數據內容為0(寫入允許)
??lcall??ds_send_byte???;調用寫入數據子程序
??ret
;======================================================
;??function:?charge_set;充電子程序
;??input:??command---準備發送命令
;????r7--------數據字節數也是多字節寫入模式?
;?
???r0--------原數據首地址
;??output:??---------
;??usage:??r0,r7??
;==========================================================
charge_set:
??mov??command,?#90h??;充電命令字為90h
??mov??r7,??#1??;單字節傳送
??mov??r0,??#dsdat??
??mov??dsdat,??#0a5h??;數據內容為5ah(允許充電)
??lcall??ds_send_byte???;調用寫入數據子程序
??ret
評論
查看更多