第18章實(shí)時(shí)時(shí)鐘芯片應(yīng)用_第1頁(yè)
第18章實(shí)時(shí)時(shí)鐘芯片應(yīng)用_第2頁(yè)
第18章實(shí)時(shí)時(shí)鐘芯片應(yīng)用_第3頁(yè)
第18章實(shí)時(shí)時(shí)鐘芯片應(yīng)用_第4頁(yè)
第18章實(shí)時(shí)時(shí)鐘芯片應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第18章 實(shí)時(shí)時(shí)鐘芯片應(yīng)用對(duì)于一個(gè)完善的單片機(jī)系統(tǒng),經(jīng)常需要對(duì)時(shí)間進(jìn)行操作。例如,記錄當(dāng)前采集數(shù)據(jù)的時(shí)間、顯示當(dāng)前時(shí)間、設(shè)定關(guān)機(jī)時(shí)間等等。為了能夠?qū)r(shí)間進(jìn)行控制,通常需要在硬件電路中集成實(shí)時(shí)時(shí)鐘芯片。實(shí)時(shí)時(shí)鐘芯片一般均內(nèi)置了可編程的實(shí)時(shí)日歷時(shí)鐘,用于設(shè)定以及保存時(shí)間。其采用備份電池供電,在系統(tǒng)斷電時(shí)仍可以工作,因此時(shí)間值不會(huì)丟失。另外,實(shí)時(shí)時(shí)鐘芯片一般內(nèi)置閏年補(bǔ)償系統(tǒng),計(jì)時(shí)很準(zhǔn)確。實(shí)時(shí)時(shí)鐘芯片的這些優(yōu)點(diǎn),使得其廣泛應(yīng)用于需要時(shí)間顯示的測(cè)控系統(tǒng)或者手持式設(shè)備中。本章以美國(guó)dallas公司推出實(shí)時(shí)時(shí)鐘芯片ds1302為例,介紹實(shí)時(shí)時(shí)鐘芯片的功能、控制指令以及時(shí)間的操作,并給出了相應(yīng)的操作子函數(shù)供讀

2、者調(diào)用。本章最后通過(guò)一個(gè)具體的實(shí)例,講解了如何使用51系列單片機(jī)來(lái)操作實(shí)時(shí)時(shí)鐘芯片ds1302。 18.1 實(shí)時(shí)時(shí)鐘芯片ds1302概述ds1302是美國(guó)dallas semiconductor公司推出的一款實(shí)時(shí)時(shí)鐘芯片。其以計(jì)時(shí)準(zhǔn)確、接口簡(jiǎn)單、使用方便、工作電壓范圍寬和低功耗等優(yōu)點(diǎn),得到了廣泛的應(yīng)用。ds1302的主要特點(diǎn)如下:ds1302采用3線(xiàn)串行接口,占用引腳少。ds1302內(nèi)部集成了可編程日歷時(shí)鐘,用戶(hù)可以根據(jù)需要設(shè)置。ds1302內(nèi)部集成了31個(gè)字節(jié)的靜態(tài)ram。ds1302的日歷時(shí)鐘可自動(dòng)進(jìn)行閏年補(bǔ)償。ds1302支持雙電源供電,可以使用外部主電源和備份電源。ds1302芯片具有

3、對(duì)備份電池進(jìn)行涓流充電功能,可有效長(zhǎng)備份電池的使用壽命。18.1.1 實(shí)時(shí)時(shí)鐘芯片ds1302概述 實(shí)時(shí)時(shí)鐘芯片ds1302引腳結(jié)構(gòu),如圖所示。其中各個(gè)引腳功能如下所示。ds1302的引腳排列 18.1.2 實(shí)時(shí)時(shí)鐘芯片ds1302日期操作 ds1302的日期操作主要用于對(duì)日期和時(shí)間相關(guān)的寄存器進(jìn)行操作。實(shí)時(shí)時(shí)鐘芯片ds1302與日期和時(shí)間有關(guān)的寄存器數(shù)據(jù)格式,如圖所示。下面分別介紹各個(gè)寄存器含義:ds1302的日期數(shù)據(jù)格式 18.1.3 實(shí)時(shí)時(shí)鐘芯片ds1302的控制操作 ds1302的控制操作用于寫(xiě)保護(hù)和充電控制。與控制有關(guān)的ds1302寄存器格式,如圖所示。下面分別介紹各個(gè)寄存器含義:d

4、s1302的控制數(shù)據(jù)格式 18.1.4 實(shí)時(shí)時(shí)鐘芯片ds1302的ram操作 ds1302的ram操作用于讀寫(xiě)片內(nèi)的ram存儲(chǔ)器。實(shí)時(shí)時(shí)鐘芯片ds1302的ram定義,如圖所示。a4a0用于表示片內(nèi)ram單元地址,地址范圍為00h1eh,地址1fh為ram多字節(jié)命令。ds1302的ram定義 18.1.5 實(shí)時(shí)時(shí)鐘芯片ds1302數(shù)據(jù)傳輸方式 實(shí)時(shí)時(shí)鐘芯片ds1302為從器件,只由外部微控制器來(lái)控制數(shù)據(jù)傳輸。每次傳送時(shí)由外部控制器向ds1302寫(xiě)入一個(gè)命令字節(jié)開(kāi)始,然后是數(shù)據(jù)字節(jié)。ds1302的數(shù)據(jù)傳輸則可以采用單字節(jié)方式,或者多字節(jié)突發(fā)方式進(jìn)行。多字節(jié)數(shù)據(jù)傳輸時(shí)序 單字節(jié)數(shù)據(jù)傳輸時(shí)序 18.

5、2 ds1302的控制子函數(shù) ds1302通過(guò)rst、sclk和i/o引腳和外部控制器進(jìn)行通信。在程序中,需要首先聲明接口引腳,示例如下: sbit sclk = p13;/聲明接口引腳 sbit i_o = p14; sbit rstb = p15; 下面,給出在c51語(yǔ)言中,對(duì)實(shí)時(shí)時(shí)鐘芯片ds1302進(jìn)行操作的各個(gè)子函數(shù),供讀者使用。18.2.1 復(fù)位子函數(shù) 復(fù)位子函數(shù)用于對(duì)實(shí)時(shí)時(shí)鐘芯片ds1302進(jìn)行硬件復(fù)位操作。在程序中,通過(guò)rstb引腳賦值來(lái)進(jìn)行復(fù)位操作。復(fù)位子函數(shù)程序代碼示例如下: void resetds1302() /復(fù)位子函數(shù) sclk = 0; rstb = 0;/復(fù)位 r

6、stb = 1; 18.2.2 字節(jié)讀取子函數(shù)字節(jié)讀取子函數(shù)用于讀取實(shí)時(shí)時(shí)鐘芯片ds1302的內(nèi)部數(shù)據(jù)。在程序中,構(gòu)造sclk引腳時(shí)鐘,通過(guò)io引腳逐位讀取ds1302返回的字節(jié)數(shù)據(jù)。字節(jié)讀取子函數(shù)程序代碼示例如下:uchar readbyteds1302()/字節(jié)讀取子函數(shù)uchar i;uchar rbyte;uchar tempbyte;rbyte = 0 x00;/初始化i_o = 1;for(i=0; i8; +i) /逐位讀取字節(jié)數(shù)據(jù)sclk = 1;/構(gòu)造時(shí)鐘sclk = 0;tempbyte = (uchar)i_o;tempbyte = tempbyte 1;rbyte |=

7、 tempbyte; return rbyte;/返回結(jié)果 18.2.3 字節(jié)寫(xiě)入子函數(shù)字節(jié)寫(xiě)入子函數(shù)用于向?qū)崟r(shí)時(shí)鐘芯片ds1302寫(xiě)入寄存器地址或者數(shù)據(jù)。在程序中,構(gòu)造sclk引腳時(shí)鐘,并通過(guò)i/o引腳逐位寫(xiě)入8位的字節(jié)數(shù)據(jù)。字節(jié)寫(xiě)入子函數(shù)程序代碼示例如下:void writebyteds1302(uchar w_byte) /字節(jié)寫(xiě)入子函數(shù)uchar i;for(i = 0; i 1;/移位 18.2.4 年設(shè)置子函數(shù)年設(shè)置子函數(shù)用于向?qū)崟r(shí)時(shí)鐘芯片ds1302的年寄存器寫(xiě)入年數(shù)據(jù)。在程序中,首先輸入年數(shù)據(jù),然后按照單字節(jié)數(shù)據(jù)傳輸方式寫(xiě)入年數(shù)據(jù)。年設(shè)置子函數(shù)程序代碼示例如下:void set

8、year() /年設(shè)置子函數(shù)ucharyear;printf(nplease enter the year (0-99): );/輸入年scanf(%bx, &year);resetds1302();/復(fù)位ds1302writebyteds1302(0 x06);/年寄存器地址writebyteds1302(year);/寫(xiě)入年resetds1302();/復(fù)位ds130218.2.5 月設(shè)置子函數(shù)月設(shè)置子函數(shù)用于向?qū)崟r(shí)時(shí)鐘芯片ds1302的月寄存器寫(xiě)入年數(shù)據(jù)。在程序中,首先輸入月數(shù)據(jù),然后按照單字節(jié)數(shù)據(jù)傳輸方式寫(xiě)入月數(shù)據(jù)。月設(shè)置子函數(shù)程序代碼示例如下:void setmonth()

9、/月設(shè)置子函數(shù)uchar month;printf(n please enter the month (1-12): );/輸入月scanf(%bx, &month);resetds1302();/復(fù)位ds1302writebyteds1302(0 x04);/月寄存器地址writebyteds1302(month);/寫(xiě)入月resetds1302();/復(fù)位ds130218.2.6 日設(shè)置子函數(shù)日設(shè)置子函數(shù)用于向?qū)崟r(shí)時(shí)鐘芯片ds1302的日寄存器寫(xiě)入日數(shù)據(jù)。在程序中,首先輸入日數(shù)據(jù),然后按照單字節(jié)數(shù)據(jù)傳輸方式寫(xiě)入日數(shù)據(jù)。日設(shè)置子函數(shù)程序代碼示例如下:void setdate() /日

10、設(shè)置子函數(shù)uchar date;printf(n please enter the date (1-31): );/輸入日scanf(%bx, &date);resetds1302();/復(fù)位ds1302writebyteds1302(0 x03);/日寄存器地址writebyteds1302(date);/寫(xiě)入日resetds1302();/復(fù)位ds130218.2.7 星期設(shè)置子函數(shù)星期設(shè)置子函數(shù)用于向?qū)崟r(shí)時(shí)鐘芯片ds1302的星期寄存器寫(xiě)入星期數(shù)據(jù)。在程序中,首先輸入星期數(shù)據(jù),然后按照單字節(jié)數(shù)據(jù)傳輸方式寫(xiě)入星期數(shù)據(jù)。星期設(shè)置子函數(shù)程序代碼示例如下:void setday() /星

11、期設(shè)置子函數(shù)uchar day;printf(n please enter the day (1-7): );/輸入星期scanf(%bx, &day);resetds1302();/復(fù)位ds1302writebyteds1302(0 x05);/星期寄存器地址writebyteds1302(day);/寫(xiě)入星期resetds1302();/復(fù)位ds130218.2.8 小時(shí)設(shè)置子函數(shù)小時(shí)設(shè)置子函數(shù)用于向?qū)崟r(shí)時(shí)鐘芯片ds1302的小時(shí)寄存器寫(xiě)入小時(shí)數(shù)據(jù)。在程序中,首先輸入小時(shí)數(shù)據(jù),然后按照單字節(jié)數(shù)據(jù)傳輸方式寫(xiě)入小時(shí)數(shù)據(jù)。小時(shí)設(shè)置子函數(shù)程序代碼示例如下:void sethour() /小

12、時(shí)設(shè)置子函數(shù)ucharhour;printf(n please enter the hour (1-24): );/輸入小時(shí)scanf(%bx, &hour);hour =hour & 0 x3f;/設(shè)置時(shí)鐘為24小時(shí)方式resetds1302();/復(fù)位ds1302writebyteds1302(0 x02);/小時(shí)寄存器地址writebyteds1302(hour);/寫(xiě)入小時(shí)resetds1302();/復(fù)位ds130218.2.9 分鐘設(shè)置子函數(shù)分鐘設(shè)置子函數(shù)用于向?qū)崟r(shí)時(shí)鐘芯片ds1302的分鐘寄存器寫(xiě)入分鐘數(shù)據(jù)。在程序中,首先輸入分鐘數(shù)據(jù),然后按照單字節(jié)數(shù)據(jù)傳輸方式寫(xiě)

13、入分鐘數(shù)據(jù)。分鐘設(shè)置子函數(shù)程序代碼示例如下:void setminute () /分鐘設(shè)置子函數(shù)ucharminute;printf(n please enter the minute (0-59): );/輸入分鐘scanf(%bx, &minute);resetds1302();/復(fù)位ds1302writebyteds1302(0 x01);/分鐘寄存器地址writebyteds1302(minute);/寫(xiě)入分鐘resetds1302();/復(fù)位ds1302 18.2.10 秒設(shè)置子函數(shù)秒設(shè)置子函數(shù)用于向?qū)崟r(shí)時(shí)鐘芯片ds1302的秒寄存器寫(xiě)入秒數(shù)據(jù)。在程序中,首先輸入秒數(shù)據(jù),然后

14、按照單字節(jié)數(shù)據(jù)傳輸方式寫(xiě)入秒數(shù)據(jù)。秒設(shè)置子函數(shù)程序代碼示例如下:void setsecond () /秒設(shè)置子函數(shù)ucharsecond;printf(n please enter the second (0-59): );/輸入秒scanf(%bx, &second);resetds1302();/復(fù)位ds1302writebyteds1302(0 x00);/秒寄存器地址writebyteds1302(second);/寫(xiě)入秒resetds1302();/復(fù)位ds130218.2.11 寫(xiě)保護(hù)子函數(shù)寫(xiě)保護(hù)子函數(shù)用于禁止修改實(shí)時(shí)時(shí)鐘芯片ds1302內(nèi)部寄存器的數(shù)據(jù)。在程序中,按照單字

15、節(jié)數(shù)據(jù)傳輸方式向?qū)懕Wo(hù)控制寄存器寫(xiě)入0 x80。寫(xiě)保護(hù)子函數(shù)程序代碼示例如下:void disablewrite () /寫(xiě)保護(hù)子函數(shù)resetds1302();/復(fù)位ds1302writebyteds1302(0 x8e);/寫(xiě)保護(hù)控制寄存器writebyteds1302(0 x80);/禁止寫(xiě)入resetds1302();/復(fù)位ds130218.2.12 寫(xiě)允許子函數(shù)寫(xiě)允許子函數(shù)用于允許修改實(shí)時(shí)時(shí)鐘芯片ds1302內(nèi)部寄存器的數(shù)據(jù)。在程序中,按照單字節(jié)數(shù)據(jù)傳輸方式向?qū)懕Wo(hù)控制寄存器寫(xiě)入0 x00。寫(xiě)允許子函數(shù)程序代碼示例如下:void enablewrite () /寫(xiě)允許子函數(shù)reset

16、ds1302();/復(fù)位ds1302writebyteds1302(0 x8e);/寫(xiě)保護(hù)控制寄存器writebyteds1302(0);/允許寫(xiě)入resetds1302();/復(fù)位ds130218.2.13 充電控制子函數(shù)充電控制子函數(shù)用于允許實(shí)時(shí)時(shí)鐘芯片ds1302對(duì)備份電池進(jìn)行充電操作。在程序中,按照單字節(jié)數(shù)據(jù)傳輸方式向涓流充電寄存器寫(xiě)入0 xab。充電控制子函數(shù)程序代碼示例如下:void charge () /充電控制子函數(shù)resetds1302();/復(fù)位ds1302writebyteds1302(0 x90);/涓流充電寄存器writebyteds1302(0 xab);/允許充電

17、resetds1302();/復(fù)位ds130218.2.14 初始化子函數(shù) 初始化子函數(shù)用于對(duì)實(shí)時(shí)時(shí)鐘芯片ds1302的時(shí)鐘寄存器進(jìn)行初始化操作。在程序中,分別輸入需要設(shè)置的年、月、星期、日、小時(shí)、分鐘和秒的數(shù)值,然后調(diào)用寫(xiě)允許子函數(shù)允許對(duì)寄存器操作,調(diào)用充電控制子函數(shù)允許涓流充電,最后以多字節(jié)突發(fā)方式寫(xiě)入多個(gè)時(shí)鐘數(shù)據(jù)。18.2.15 ram字節(jié)寫(xiě)入子函數(shù)ram字節(jié)寫(xiě)入子函數(shù)用于對(duì)實(shí)時(shí)時(shí)鐘芯片ds1302的片內(nèi)ram執(zhí)行寫(xiě)操作。在程序中,首先獲取ram地址以及需要寫(xiě)入的數(shù)據(jù),然后分別調(diào)用字節(jié)寫(xiě)入子函數(shù)來(lái)執(zhí)行寫(xiě)寄存器地址和寫(xiě)數(shù)據(jù)操作。ram字節(jié)寫(xiě)入子函數(shù)程序代碼示例如下:void writera

18、mbyte() / ram字節(jié)寫(xiě)入子函數(shù)uchar address;uchar data;printf(nwrite ram function:); printf(nwrite ram address (hex):);scanf(%bx, &address);/獲取ram地址printf(nwrite ram data (hex):);scanf(%bx, &data); /獲取ram數(shù)據(jù)address = (address * 2) | 0 xc0);/ram數(shù)據(jù)寫(xiě)入命令resetds1302();/復(fù)位ds1302writebyteds1302(address);/寫(xiě)ram

19、地址writebyteds1302(data);/寫(xiě)ram數(shù)據(jù)resetds1302();/復(fù)位ds130218.2.16 時(shí)鐘顯示子函數(shù) 時(shí)鐘顯示子函數(shù)用于讀取并顯示實(shí)時(shí)時(shí)鐘芯片ds1302內(nèi)部時(shí)鐘寄存器中的數(shù)據(jù)。在程序中,首先復(fù)位ds1302,然后采用多字節(jié)突發(fā)方式讀取時(shí)鐘寄存器中的數(shù)據(jù),然后每秒顯示一次結(jié)果。18.2.17 多字節(jié)突發(fā)方式讀取ram子函數(shù) 多字節(jié)突發(fā)方式讀取ram子函數(shù)用于讀取實(shí)時(shí)時(shí)鐘芯片ds1302內(nèi)部ram的數(shù)據(jù)。在程序中,首先以多字節(jié)突發(fā)方式來(lái)讀取ds1302的片內(nèi)ram,并將數(shù)據(jù)保存在數(shù)組中,接著將各個(gè)數(shù)據(jù)輸出顯示。18.2.18 多字節(jié)突發(fā)方式寫(xiě)入ram子函數(shù)多

20、字節(jié)突發(fā)方式寫(xiě)入ram子函數(shù)用于對(duì)實(shí)時(shí)時(shí)鐘芯片ds1302的片內(nèi)ram執(zhí)行寫(xiě)操作。在程序中,首先獲取ram數(shù)據(jù),然后采用多字節(jié)突發(fā)方式來(lái)寫(xiě)入ram數(shù)據(jù)。多字節(jié)突發(fā)方式寫(xiě)入ram子函數(shù)程序代碼示例如下:void burstwriteram() /多字節(jié)突發(fā)方式寫(xiě)入ram子函數(shù)uchar data31;uchari;for(i=0;i31;i+)printf(nwrite ram data (hex):);scanf(%bx, &datai);/獲取ram數(shù)據(jù)resetds1302();/復(fù)位ds1302writebyteds1302(0 xfe);/多字節(jié)方式寫(xiě)入ram for (i=0; i31; i+) /循環(huán)寫(xiě)入writebyteds1302(datai);resetds1302();/復(fù)位ds1302 18.3 c51讀寫(xiě)實(shí)時(shí)時(shí)鐘芯片實(shí)例 在單片機(jī)應(yīng)用系統(tǒng)中,經(jīng)常需要對(duì)時(shí)間和日期

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論