DS1302 是美國(guó)DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31×8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級(jí)產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時(shí)提供了對(duì)后背電源進(jìn)行涓細(xì)電流充電的能力。
ds1302程序
;=======================================================
;??function:?發(fā)送數(shù)據(jù)程序
;??input:??command---準(zhǔn)備發(fā)送命令
;????r0--------原數(shù)據(jù)首地址
;????r7-------數(shù)據(jù)字節(jié)計(jì)數(shù)
;??output:??---------
;??usage:??a,
;????r0
;????r2--------數(shù)據(jù)位計(jì)數(shù)器
;????r7??
;=========================================================
ds_send_byte:
??clr??DS_RST????;復(fù)位引腳為低電平,所有數(shù)據(jù)傳送終止
??nop
??clr??DS_CLK????;清時(shí)鐘總線
??nop
??setb??DS_RST????;復(fù)位引腳為高電平,邏輯控制有效
??nop
??mov??a,??command??;準(zhǔn)備發(fā)送命令字節(jié)
??mov??r2,??#08h??;傳送位數(shù)為8
ds_byte0:?
??rrc??a????;將最低位傳送給進(jìn)位位C
??mov??DS_IO,??C??;位傳送至數(shù)據(jù)總線
??nop
??setb??DS_CLK????;時(shí)鐘上升沿,發(fā)送數(shù)據(jù)有效
??nop
??clr??DS_CLK????;清時(shí)鐘總線
??djnz??r2,??ds_byte0?;位傳送未完畢則繼續(xù)
??nop
ds_byte1:?
??mov??a,??@r0??;準(zhǔn)備發(fā)送數(shù)據(jù)
??mov??r2,??#08h??;傳送數(shù)據(jù),過(guò)程與傳送命令相同
ds_byte2:
??rrc??a
??mov??DS_IO,??c
??nop
??setb??DS_CLK
??nop
??clr??DS_CLK
??djnz??r2,??ds_byte2
??inc??r0????;發(fā)送數(shù)據(jù)的內(nèi)存地址加1
??djnz??r7,??ds_byte1?;字節(jié)傳送未完畢則繼續(xù)
??nop
??clr??DS_RST????;邏輯操作完畢,清DS_RST
??ret??
;======================================================
;??function:?接收數(shù)據(jù)程序
;??input:??command---準(zhǔn)備發(fā)送命令
;????r1--------即目標(biāo)數(shù)
;????r7--------數(shù)據(jù)字節(jié)計(jì)數(shù)器
;??output:??---------
;??usage:??a,
;????r1
;????r2--------數(shù)據(jù)位計(jì)數(shù)器
;????r7
;===================================================
ds_receive_byte:
??clr??DS_RST????;復(fù)位引腳位低電平,所有數(shù)據(jù)傳送終止
??nop
??clr??DS_CLK????;清時(shí)鐘總線
??nop
??setb??DS_RST????;復(fù)位引腳為高電平,邏輯控制有效
??mov??a,??command??;準(zhǔn)備發(fā)送命令字節(jié)
??mov??r2,??#08h??;傳送位數(shù)為8
ds_r_byte0:
??rrc??a????;將最低位傳送給進(jìn)位位c
??mov??DS_IO,??c??;位傳送給數(shù)據(jù)總線
??nop
??setb??DS_CLK????;時(shí)鐘上升沿,發(fā)送數(shù)據(jù)有效
??nop
??clr??DS_CLK????;清時(shí)鐘總線
??djnz??r2,??ds_r_byte0?;位傳送未完畢則繼續(xù)
??nop
ds_r_byte1:
????????;準(zhǔn)備接收數(shù)據(jù)
??clr??a????;清累加器?
???
??clr??c????;清進(jìn)位位c
??mov??r2,??#08h??;接收位數(shù)為8
ds_r_byte2:
??nop
??mov??c,??DS_IO??;數(shù)據(jù)總線上的數(shù)據(jù)傳送給C
??rrc??a????;從最低位接收數(shù)據(jù)
??setb??DS_CLK????;時(shí)鐘總線置高
??nop
??clr??DS_CLK????;時(shí)鐘下降沿接收數(shù)據(jù)有效
??djnz??r2,??ds_r_byte2?;位接收未完畢則繼續(xù)
??mov ??@r1,??a??;接收到的完整數(shù)據(jù)字節(jié)放入接收內(nèi)存緩沖區(qū)
??inc??r1????;接收數(shù)據(jù)的內(nèi)存地址加1
??djnz??r7,??ds_r_byte1?;字節(jié)接收未完畢則繼續(xù)
??nop
??clr??DS_RST????;邏輯操作完畢,清DS_RST
??ret
;======================================================
;??function:?write?多字節(jié)寫入
;??input:??command---準(zhǔn)備發(fā)送命令
;????r0--------原數(shù)據(jù)首地址
;????r7--------數(shù)據(jù)字節(jié)數(shù)也是多字節(jié)寫入模式
;??output:??---------
;??usage:??r0,r7,command,dsdat?
;=========================================================
write_multibyte:
??mov??command,?#0beh??;命令字節(jié)為beh
??mov??r7,??#08h??;多字節(jié)寫入模式(此模式為8個(gè))
??mov??r0,??#dsdat??;數(shù)據(jù)地址覆給r0
??mov??dsdat,??#00h??;秒單元內(nèi)容為00h
??mov??dsdat+1,?#00h??;分單元內(nèi)容為00h
??mov??dsdat+2,?#00h??;時(shí)單元內(nèi)容為12h
??mov??dsdat+3,?#15??;日期單元內(nèi)容為15h
??mov??dsdat+4,?#07h??;月單元內(nèi)容為07h
??mov??dsdat+5,?#04h??;星期單元內(nèi)容為04h
??mov??dsdat+6,?#04h??;年單元內(nèi)容為04h
??mov??dsdat+7,?#00h??;寫保護(hù)單元內(nèi)容為00h
??lcall??ds_send_byte???;調(diào)用寫入數(shù)據(jù)子程序
??ret
;=================================================
;??function:?read?多字節(jié)讀出
;??input:??command---準(zhǔn)備發(fā)送命令
;????r7---------在這里為讀出的數(shù)據(jù)字節(jié)數(shù)為3個(gè)
;????---------
;??output:??---------
;??usage:??a,r7?
;????r1-------目標(biāo)數(shù)據(jù)地址
;????rcvdat-------所接收的數(shù)據(jù)地址
;========================================================
read_multibyte:
??mov??command,?#0bfh??;命令字節(jié)為BFh
??mov??r7,??#3h??;多字節(jié)讀出模式(由于只需要時(shí),分,秒所以只需讀出3個(gè)
??mov??r1,??#rcvdat??;數(shù)據(jù)地址覆給r1
??lcall??ds_receive_byte???;調(diào)用讀出數(shù)據(jù)子程?
??mov??r1,??#rcvdat??;數(shù)據(jù)地址覆給r1
??mov??a,??@r1??;將 R1里的數(shù)據(jù)送給a
??lcall??zip_to_unzip???;調(diào)用解壓即拆字節(jié)
??mov??CLK_SecL,?b??;將低位送給秒低位
??mov??CLK_SecH,?a??;將高位送給秒高位
??inc??r1
??mov??a,??@r1??;將 R1里的數(shù)據(jù)送給a
??lcall??zip_to_unzip
??mov??CLK_MinL,?b
??mov??CLK_MinH,?a
??inc??r1
??mov??a,??@r1??;將 R1里的數(shù)據(jù)送給a
??lcall??zip_to_unzip
??mov??CLK_HourL,?b
??mov??CLK_HourH,?a?
??ret
;=====================================================
;??function:?clk_enable;啟動(dòng)時(shí)鐘開始
;??input:??command---準(zhǔn)備發(fā)送命令
;????r7--------數(shù)據(jù)字節(jié)數(shù)也是多字節(jié)寫入模式
;????---------
;??output:??---------
;??usage:??r3,r7??
;=======================================================
clk_enable:
??mov??command,?#80h??;命令字節(jié)為80h,啟動(dòng)時(shí)鐘開始
??mov??r7,??#8h??;多字節(jié)傳送模式
??mov ??r3,??#dsdat??;數(shù)據(jù)地址覆給r3
??mov??dsdat,??#00h??;數(shù)據(jù)內(nèi)容為0(振蕩器工作允許)
??lcall ??ds_send_byte???;調(diào)用寫入數(shù)據(jù)子程序
??ret??
;=====================================================
;??function:?write_enable;允許寫程序
;??input:??command---準(zhǔn)備發(fā)送命令
;????r7--------數(shù)據(jù)字節(jié)數(shù)也是多字節(jié)寫入模式?
;?
???---------
;??output:??---------
;??usage:??r4,r7??
;========================================
write_enable:
??mov??command,?#8eh??;命令字節(jié)為8e允許寫命令
??mov??r7,??#8h?
??mov??r4,??#dsdat??;數(shù)據(jù)地址覆給r4
??mov??dsdat,??#00h??;數(shù)據(jù)內(nèi)容為0(寫入允許)
??lcall??ds_send_byte???;調(diào)用寫入數(shù)據(jù)子程序
??ret
;======================================================
;??function:?charge_set;充電子程序
;??input:??command---準(zhǔn)備發(fā)送命令
;????r7--------數(shù)據(jù)字節(jié)數(shù)也是多字節(jié)寫入模式?
;?
???r0--------原數(shù)據(jù)首地址
;??output:??---------
;??usage:??r0,r7??
;==========================================================
charge_set:
??mov??command,?#90h??;充電命令字為90h
??mov??r7,??#1??;單字節(jié)傳送
??mov??r0,??#dsdat??
??mov??dsdat,??#0a5h??;數(shù)據(jù)內(nèi)容為5ah(允許充電)
??lcall??ds_send_byte???;調(diào)用寫入數(shù)據(jù)子程序
??ret
評(píng)論
查看更多