欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2756|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

DS1302中文資料與源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

DS1302是DALLAS公司推出的涓流充電時鐘芯片,內(nèi)含一個實(shí)時時鐘/日歷和31字節(jié)靜態(tài)RAM,可以通過串行接口與單片機(jī)進(jìn)行通信。實(shí)時時鐘/日歷電路提供秒、分、時、日、星期、月、年的信息,每個月的天數(shù)和閏年的天數(shù)可自動調(diào)整,時鐘操作可通過AM/PM標(biāo)志位決定采用24或12小時時間格式。

  DS1302與單片機(jī)之間能簡單地采用同步串行的方式進(jìn)行通信,僅需三根I/O線:復(fù)位(RST)、I/O數(shù)據(jù)線、串行時鐘(SCLK)。時鐘/RAM的讀/寫數(shù)據(jù)以一字節(jié)或多達(dá)31字節(jié)的字符組方式通信。DS1302工作時功耗很低,保持?jǐn)?shù)據(jù)和時鐘信息時,功耗小于1mW。

  DS1302內(nèi)部結(jié)構(gòu)

  DS1302的外部引腳功能說明如圖3所示:

  DS1302的內(nèi)部結(jié)構(gòu)如圖4所示,主要組成部分為:移位寄存器、控制邏輯、振蕩器、實(shí)時時鐘以及RAM。雖然數(shù)據(jù)分成兩種,但是對單片機(jī)的程序而言,其實(shí)是一樣的,就是對特定的地址進(jìn)行讀寫操作。

  DS1302含充電電路,可以對作為后備電源的可充電電池充電,并可選擇充電使能和串入的二極管數(shù)目,以調(diào)節(jié)電池充電電壓。不過對我們目前而言,最需要熟悉的是和時鐘相關(guān)部分的功能,對于其它參數(shù)請參閱數(shù)據(jù)手冊。

  DS1302特點(diǎn)

  時鐘計(jì)數(shù)功能,可以對秒、分鐘、小時、月、星期、年的計(jì)數(shù)。年計(jì)數(shù)可達(dá)到2100 年。

  有31*8 位的額外數(shù)據(jù)暫存寄存器(即RAM,掉電丟失)最少I/O 引腳傳輸,通過三引腳控制、作電壓:2.0-5.5V、工作電流小于320 納安(2.0V)。

  讀寫時鐘寄存器或內(nèi)部RAM(31*8 位的額外、數(shù)據(jù)暫存寄存)可以采用單字節(jié)模式(一次讀寫單個字節(jié))和突發(fā)模式(一次讀寫多個字節(jié))、8-pin DIP (直插封裝)或8-pin SOICs(貼片封裝)。

  DS1302寄存器簡介

  DS1302的寄存器(讀時81h~8Dh,寫時80h~8Ch)是存放秒、分,小時、日、月、年、周數(shù)據(jù)的,存放的數(shù)據(jù)格式為BCD碼形式。它的內(nèi)部時間寄存器如下表:

  上表是DS1302內(nèi)部的7個與時間、日期有關(guān)的寄存器圖和一個寫保護(hù)寄存器,我們要做的就是將初始設(shè)置的時間、日期數(shù)據(jù)寫入這幾個寄存器,然后再不斷地讀取這幾個寄存器來獲取實(shí)時時間和日期。現(xiàn)對這幾個寄存器的說明如下:

  ①、秒寄存器(81h、80h)的位7定義為時鐘暫停標(biāo)志(CH)。當(dāng)初始上電時該位置為1,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);只有將秒寄存器的該位置改寫為0時,時鐘才能開始運(yùn)行,一般我們在用的時候是在設(shè)置時間完成后吧秒寄存器寫入0,這樣就啟動了芯片的計(jì)時功能。

  ②、小時寄存器(85h、84h)的位7定義為DS1302是運(yùn)行于12小時模式還是24小時模式。當(dāng)為1時,選擇12小時模式,為0時選擇24小時模式。在12小時模式時,位5是標(biāo)志位 ,為0時表示AM,為1時表示PM。在24小時模式時,位5是第二個10小時位。

  ③、控制寄存器(8Fh、8Eh)的位7是寫保護(hù)位(WP),其它7位均置為0。在任何的時候?qū)r鐘和RAM的寫操作之前,WP位必須為0。當(dāng)WP位為1時,寫保護(hù)位防止對任一寄存器的寫操作。也就是說在電路上電的初始態(tài)WP是1,這時是不能改寫上面任何一個時間寄存器的,只有首先將WP改寫為0,才能進(jìn)行其它寄存器的寫操作。

  其余的寄存器沒有什么特殊的說明。對于DS1302芯片還有一個控制字,該控制字控制這芯片的讀寫操作。具體的內(nèi)容如下:

  如上表所示,位0就是讀寫位,當(dāng)位0為1時,就是告訴DS1302,下面是進(jìn)行讀出操作,而當(dāng)位0為0時就是寫入操作。

  位0-位5是要進(jìn)行操作的DS1302寄存器地址。

  位6就是告訴DS1302,是要對RAM進(jìn)行操作還是對時間寄存器進(jìn)行操作,0就是對時間寄存器操作,一般我們都是對時間寄存器進(jìn)行操作。

  位7就是固定的1。

  現(xiàn)在就知道為什么控制字80H是寫秒寄存器,而81H是讀秒寄存器了吧。80H換成二進(jìn)制就是10000000。而81H的二進(jìn)制就是10000001,一個是寫操作,另一個是讀操作嘛!

  DS1302操作步驟

  1)首先要通過8eH將寫保護(hù)去掉,這樣我們才能將日期,時間的初值寫時各個寄存器。

  2)然后就可以對80H、82H、84H、86H、88H、8AH、8CH進(jìn)行初值的寫入。同時也通過秒寄存器將位7的CH值改成0,這樣DS1302就開始走時運(yùn)行了。

  3)將寫保護(hù)寄存器再寫為80H,防止誤改寫寄存器的值。

  4)不斷讀取80H-8CH的值,將他們轉(zhuǎn)化為十進(jìn)制后顯示出來就可以啦,之前我們說過,DS1302讀出的數(shù)據(jù)是BCD碼,所以需要轉(zhuǎn)換一下。

  DS1302的數(shù)據(jù)讀寫是通過I/O串行進(jìn)行的。當(dāng)進(jìn)行一次讀寫操作時最少得讀寫兩個字節(jié),第一個字節(jié)是控制字節(jié),就是一個命令,告訴DS1302是讀還是寫操作,是對RAM還是對CLOK寄存器操作,以及操作的地址。第二個字節(jié)就是要讀或?qū)懙臄?shù)據(jù)了。

  我們先看單字節(jié)寫:在進(jìn)行操作之前先得將CE(也可說是RST)置高電平,然后單片機(jī)將控制字的位0放到I/O上,當(dāng)I/O的數(shù)據(jù)穩(wěn)定后,將SCLK置高電平,DS1302檢測到SCLK的上升沿后就將I/O上的數(shù)據(jù)讀取,然后單片機(jī)將SCLK置為低電平,再將控制字的位1放到I/O上,如此反復(fù),將一個字節(jié)控制字的8個位傳給DS1302。接下來就是傳一個字節(jié)的數(shù)據(jù)給DS1302,當(dāng)傳完數(shù)據(jù)后,單片機(jī)將CE置為低電平,操作結(jié)束。

  單字節(jié)讀操作的一開始寫控制字的過程和上面的單字節(jié)寫操作是一樣,但是單字節(jié)讀操作在寫控制字的最后一個位,SCLK還在高電平時,DS1302就將數(shù)據(jù)放到I/O上,單片機(jī)將SCLK置為低電平后數(shù)據(jù)鎖存,單機(jī)機(jī)就可以讀取I/O上的數(shù)據(jù)。如此反復(fù),將一個字節(jié)的數(shù)據(jù)讀入單片機(jī)。讀與寫操作的不同就在于,寫操作是在SCLK低電平時單片機(jī)將數(shù)據(jù)放到IO上,當(dāng)SCLK上升沿時,DS1302讀取。而讀操作是在SCLK高電平時DS1302放數(shù)據(jù)到IO上,將SCLK置為低電平后,單片機(jī)就可從IO上讀取數(shù)據(jù)。

  在單字節(jié)讀操作時,在寫控制字的最后一個位也就是位7時,DS1302已將它的寄存器數(shù)據(jù)位0放到IO上了,要是控制字的位7是0的話,DS1302就無法將它的隨后的數(shù)據(jù)放到IO上了,所以控制字的7位為固定的1,原因在這里哦。

  DS1302的讀寫操作代碼
  1.   void Write1302(unsigned char dat)

  2.   {

  3.   unsigned char i;

  4.   SCLK=0; //拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準(zhǔn)備

  5.   delaynus(2); //稍微等待,使硬件做好準(zhǔn)備

  6.   for(i=0;i《8;i++) //連續(xù)寫8個二進(jìn)制位數(shù)據(jù)

  7.   {

  8.   DATA=dat&0x01; //取出dat的第0位數(shù)據(jù)寫入1302

  9.   delaynus(2); //稍微等待,使硬件做好準(zhǔn)備

  10.   SCLK=1; //上升沿寫入數(shù)據(jù)

  11.   delaynus(2); //稍微等待,使硬件做好準(zhǔn)備

  12.   SCLK=0; //重新拉低SCLK,形成脈沖

  13.   dat》》=1; //將dat的各數(shù)據(jù)位右移1位,準(zhǔn)備寫入下一個數(shù)據(jù)位

  14.   }

  15.   }

  16.   void WriteSet1302(unsigned char Cmd,unsigned char dat)

  17.   {

  18.   RST=0; //禁止數(shù)據(jù)傳遞

  19.   SCLK=0; //確保寫數(shù)據(jù)前SCLK被拉低

  20.   RST=1; //啟動數(shù)據(jù)傳輸

  21.   delaynus(2); //稍微等待,使硬件做好準(zhǔn)備

  22.   Write1302(Cmd); //寫入命令字

  23.   Write1302(dat); //寫數(shù)據(jù)

  24.   SCLK=1; //將時鐘電平置于已知狀態(tài)

  25.   RST=0; //禁止數(shù)據(jù)傳遞

  26.   }

  27.   unsigned char Read1302(void)

  28.   {

  29.   unsigned char i,dat;

  30.   delaynus(2); //稍微等待,使硬件做好準(zhǔn)備

  31.   for(i=0;i《8;i++) //連續(xù)讀8個二進(jìn)制位數(shù)據(jù)

  32.   {

  33.   dat》》=1; //將dat的各數(shù)據(jù)位右移1位,因?yàn)橄茸x出的是字節(jié)的最低位

  34.   if(DATA==1) //如果讀出的數(shù)據(jù)是1

  35.   dat|=0x80; //將1取出,寫在dat的最高位

  36.   SCLK=1; //將SCLK置于高電平,為下降沿讀出

  37.   delaynus(2); //稍微等待

  38.   SCLK=0; //拉低SCLK,形成脈沖下降沿

  39.   delaynus(2); //稍微等待

  40.   }

  41.   return dat; //將讀出的數(shù)據(jù)返回

  42.   }

  43.   unsigned char ReadSet1302(unsigned char Cmd)

  44.   {

  45.   unsigned char dat;

  46.   RST=0; //拉低RST

  47.   SCLK=0; //確保寫數(shù)居前SCLK被拉低

  48.   RST=1; //啟動數(shù)據(jù)傳輸

  49.   Write1302(Cmd); //寫入命令字

  50.   dat=Read1302(); //讀出數(shù)據(jù)

  51.   SCLK=1; //將時鐘電平置于已知狀態(tài)

  52.   RST=0; //禁止數(shù)據(jù)傳遞

  53.   return dat; //將讀出的數(shù)據(jù)返回

  54.   }
復(fù)制代碼


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:345003 發(fā)表于 2018-6-6 19:55 | 只看該作者
謝謝 懂了很多
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表