51單片機(jī)實(shí)戰(zhàn)指南-使用DS1302設(shè)計(jì)數(shù)字時(shí)鐘_第1頁(yè)
51單片機(jī)實(shí)戰(zhàn)指南-使用DS1302設(shè)計(jì)數(shù)字時(shí)鐘_第2頁(yè)
51單片機(jī)實(shí)戰(zhàn)指南-使用DS1302設(shè)計(jì)數(shù)字時(shí)鐘_第3頁(yè)
51單片機(jī)實(shí)戰(zhàn)指南-使用DS1302設(shè)計(jì)數(shù)字時(shí)鐘_第4頁(yè)
51單片機(jī)實(shí)戰(zhàn)指南-使用DS1302設(shè)計(jì)數(shù)字時(shí)鐘_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

使用DS1302設(shè)計(jì)數(shù)字時(shí)鐘51單片機(jī)實(shí)戰(zhàn)指南本章內(nèi)容:2DS1302芯片介紹1封裝的編程思想和結(jié)構(gòu)體類型22DS1302讀寫操作的編程實(shí)現(xiàn)3DS1302讀寫實(shí)戰(zhàn)412.1.1DS1302芯片特點(diǎn)DS1302實(shí)時(shí)時(shí)鐘芯片具有功耗低、精確度高、軟件編程較簡(jiǎn)單,且芯片體積小、成本低等特點(diǎn)提供秒、分、小時(shí)、日期、月、年等信息,可以通過(guò)配置AM/PM來(lái)決定采用24小時(shí)格式還是12小時(shí)格式

擁有31*8位的額外數(shù)據(jù)暫存寄存器(即RAM,掉電丟失)串行I/O通信方式工作電壓比較寬,在2.0~5.5V的范圍內(nèi)都可以正常工作功耗很低,它在工作電壓2.0V的時(shí)候,工作電流小于300nA提供主電源和備用電源共兩個(gè)電源,保證系統(tǒng)掉電的情況下仍繼續(xù)工作12.1.2DS1302芯片引腳功能引腳編號(hào)引腳名稱引腳功能1VCC2主電源引腳,當(dāng)VCC2比VCC1高0.2V以上時(shí),DS1302由VCC2供電,當(dāng)VCC2低于VCC1時(shí),由VCC1供電。2X1這兩個(gè)引腳需要接一個(gè)32.768K的晶振,給DS1302提供一個(gè)基準(zhǔn)。3X24GND接地引腳。5CE使能引腳。當(dāng)讀寫DS1302時(shí),這個(gè)引腳必須是高電平。6I/O串行數(shù)據(jù)輸入/輸出端(雙向)。7SCLKSerialClock輸入引腳,用來(lái)作為通信的時(shí)鐘信號(hào)。8VCC1備用電源引腳。12.1.2DS1302芯片寄存器功能寄存器名命令字取值范圍各位內(nèi)容寫操作讀操作76543210秒寄存器80H81H00-59CH10SECSEC分鐘寄存器82H83H00-59010MINMIN小時(shí)寄存器84H85H00-12/00-2312/010/PHRHR日期寄存器86H87H01-310010DATEDATE月份寄存器88H89H01-1200010MMONTH星期寄存器8AH8BH01-0700000DAY年份寄存器8CH8DH00-9910YEARYEAR控制寄存器8EH8FH—WP0000000bit7bit6bit5bit4bit3bit2bit1bit01RAM/CKA4A3A2A1A0R/W本章內(nèi)容:2DS1302芯片介紹1封裝的編程思想和結(jié)構(gòu)體類型22DS1302讀寫操作的編程實(shí)現(xiàn)3DS1302讀寫實(shí)戰(zhàn)412.2.1封裝的編程思想封裝是面向?qū)ο缶幊倘筇匦裕ǚ庋b、繼承、多態(tài))之一核心思想就是盡可能地隱藏內(nèi)部的細(xì)節(jié),只保留一些對(duì)外接口使之與外部發(fā)生聯(lián)系就C語(yǔ)言而言,封裝的體現(xiàn)就是函數(shù)的編寫(小封裝)和模塊文件的編寫(大封裝)如LCD,IIC總線,EEPROM,鍵盤等都進(jìn)行了模塊文件的編寫lcd1602.c、i2c.c、EEPROM.c、keyboard.c,包括它們各自的頭文件(.h)12.2.2結(jié)構(gòu)體的應(yīng)用1.結(jié)構(gòu)體類型的定義DS1302的日歷時(shí)鐘寄存器可以如下定義:structsCalenda{

//日歷結(jié)構(gòu)體定義

unsigned

intyear;

//年,加上了‘2’‘0’,所以int類型

unsigned

charmon;

//月

unsigned

charday;

//日

unsigned

charhour;

//時(shí)

unsigned

charmin;

//分

unsigned

charsec;

//秒

unsigned

charweek;

//星期};12.2.2結(jié)構(gòu)體的應(yīng)用2.結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的定義有三種方法先結(jié)構(gòu)體先定義結(jié)構(gòu)體類型,再定義變量名;定義結(jié)構(gòu)體類型同時(shí)定義結(jié)構(gòu)體類型變量;直接定義結(jié)構(gòu)體類型變量。structsCalendacalenda;

calenda.mon=0x07; //7月Calenda.day=0x19; //19日structsCalenda*calenda;calenda->mon=0x07;calenda->day=0x19;12.2.2結(jié)構(gòu)體的應(yīng)用3.結(jié)構(gòu)體變量作為函數(shù)的參數(shù)指針變量作為函數(shù)參數(shù),實(shí)際上傳遞的是結(jié)構(gòu)體變量的地址,并不是結(jié)構(gòu)體變量本身voidGetCurrentTime(structsCalenda*calenda);本章內(nèi)容:2DS1302芯片介紹1封裝的編程思想和結(jié)構(gòu)體類型22DS1302讀寫操作的編程實(shí)現(xiàn)3DS1302讀寫實(shí)戰(zhàn)412.3.1操作DS1302寄存器函數(shù)的實(shí)現(xiàn)1.寫DS1302寄存器函數(shù)12.3.1操作DS1302寄存器函數(shù)的實(shí)現(xiàn)1.寫DS1302寄存器函數(shù)voidDS1302WriteReg(unsigned

charreg,

unsigned

chardat){

unsigned

charn; DS1302_CE=

1;

//將CE置高電平,使能通信

for

(n=0;n<8;n++)

//開始傳送八位地址命令

{ DS1302_IO=reg&

0x01;

//數(shù)據(jù)從低位開始傳送 reg>>=

1; DS1302_CK=

1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù) DS1302_CK=

0;

}

for

(n=0;n<8;n++)

//寫入8位數(shù)據(jù)

{ DS1302_IO=dat&

0x01; dat>>=

1; DS1302_CK=

1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù) DS1302_CK=

0;

}

DS1302_CE=

0;

//傳送數(shù)據(jù)結(jié)束}12.3.1操作DS1302寄存器函數(shù)的實(shí)現(xiàn)1.讀DS1302寄存器函數(shù)12.3.1操作DS1302寄存器函數(shù)的實(shí)現(xiàn)1.讀DS1302寄存器函數(shù)unsigned

charDS1302ReadReg(unsigned

charreg){

unsigned

charn,temp;unsigned

chardat=0; DS1302_CE=

1;

//然后將CE)高電平。

for

(n=0;n<8;n++)

//開始傳送八位地址命令

{ DS1302_IO=reg&

0x01;

//數(shù)據(jù)從低位開始傳送 reg>>=

1; DS1302_CK=

1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù) DS1302_CK=

0;

}

for(n=0;n<8;n++)

//讀取8位數(shù)據(jù)

{ temp=DS1302_IO;

//從最低位開始接收,上升沿之前讀 dat=

(dat>>1)

|

(temp<<7); DS1302_CK=

1; //產(chǎn)生上升沿 DS1302_CK=

0;//DS1302下降沿輸出數(shù)據(jù),完成一個(gè)位的操作

} DS1302_CE=

0;

//傳送數(shù)據(jù)結(jié)束

returndat;}12.3.2讀寫函數(shù)的封裝-DS1302WriteByte/*發(fā)送一個(gè)字節(jié)到DS1302通信總線上*/voidDS1302WriteByte(unsigned

chardat){

unsigned

chari;

for

(i=0;i<8;i++)

//低位在前,逐位移出

{DS1302_IO=dat&

0x01;dat>>=

1;DS1302_CK=

1;

//然后拉高時(shí)鐘DS1302_CK=

0;

//再拉低時(shí)鐘,完成一個(gè)位的操作

}DS1302_IO=

1;

//最后確保釋放IO引腳}12.3.2讀寫函數(shù)的封裝-DS1302WriteReg/*用單次寫操作向某一寄存器寫入一個(gè)字節(jié),reg:寄存器地址,dat:待寫入字節(jié)*/voidDS1302WriteReg(unsigned

charreg,

unsigned

chardat){DS1302_CE=

1;

//使能片選信號(hào)DS1302WriteByte((reg<<1)|0x80); //發(fā)送寫寄存器指令DS1302WriteByte(dat);

//寫入字節(jié)數(shù)據(jù)DS1302_CE=

0;

//除能片選信號(hào)}12.3.2讀寫函數(shù)的封裝-DS1302ReadByte/*由DS1302通信總線上讀取一個(gè)字節(jié)*/unsigned

charDS1302ReadByte(){

unsigned

chari,temp;

unsigned

chardat=

0;

for

(i=0;i<8;i++)

//低位在前,逐位讀取

{temp=DS1302_IO; dat=

(dat>>1)

|

(temp<<7);DS1302_CK=

1;

//然后拉高時(shí)鐘DS1302_CK=

0;

//再拉低時(shí)鐘,完成一個(gè)位的操作

}

returndat;

//最后返回讀到的字節(jié)數(shù)據(jù)}12.3.2讀寫函數(shù)的封裝-DS1302ReadReg/*用單次讀操作從某一寄存器讀取一個(gè)字節(jié),reg:寄存器地址,返回值為讀到的字節(jié)*/unsigned

charDS1302ReadReg(unsigned

charreg){

unsigned

chardat;DS1302_CE=

1;

//使能片選信號(hào)DS1302WriteByte((reg<<1)|0x81);

//發(fā)送讀寄存器指令dat=DS1302ReadByte();

//讀取字節(jié)數(shù)據(jù)DS1302_CE=

0;

//除能片選信號(hào)

returndat;}本章內(nèi)容:2DS1302芯片介紹1封裝的編程思想和結(jié)構(gòu)體類型22DS1302讀寫操作的編程實(shí)現(xiàn)3DS1302讀寫實(shí)戰(zhàn)412.4DS1302讀寫實(shí)戰(zhàn)【例12.1】在開發(fā)板上編程實(shí)現(xiàn)如下功能:先將2009年7月19號(hào)星期日14點(diǎn)00分00秒這個(gè)時(shí)間寫到DS1302內(nèi)部,讓DS1302正常運(yùn)行,然后再每隔200ms讀取一次DS1302的當(dāng)前時(shí)間,并顯示在我們的液晶屏上。本開發(fā)板使用了P4.0~P4.2分別連接DS1302芯片的RST復(fù)位及使能引腳(CE)、DSIO數(shù)據(jù)線引腳及SCLK時(shí)鐘引腳。需要特別注意的是,開發(fā)板與步進(jìn)電機(jī)復(fù)用了此三個(gè)引腳,因此在使用該芯片時(shí)請(qǐng)注意跳線的正確連接。12.4DS1302讀寫實(shí)戰(zhàn)【例12.1】在開發(fā)板上編程實(shí)現(xiàn)如下功能:先將2009年7月19號(hào)星期日14點(diǎn)00分00秒這個(gè)時(shí)間寫到DS1302內(nèi)部,讓DS1302正常運(yùn)行,然后再每隔200ms讀取一次DS1302的當(dāng)前時(shí)間,并顯示在我們的液晶屏上。本開發(fā)板使用了P4.0~P4.2分別連接DS1302芯片的RST復(fù)位及使能引腳(CE)、DSIO數(shù)據(jù)線引腳及SCLK時(shí)鐘引腳。需要特別注意的是,開發(fā)板與步進(jìn)電機(jī)復(fù)用了此三個(gè)引腳,因此在使用該芯片時(shí)請(qǐng)注意跳線的正確連接。12.4DS1302讀寫實(shí)戰(zhàn)-ds1302.c#include<reg52.h>

#include"lcd1602.h"#include"DS1302.h"

bitflag200ms=

0;

//200ms定時(shí)標(biāo)志unsigned

charT0RH=

0;

//T0重載值的高字節(jié)unsigned

charT0RL=

0;

//T0重載值的低字節(jié)voidConfigTimer0(unsigned

intms);12.4DS1302讀寫實(shí)戰(zhàn)-ds1302.cvoidmain(){

//秒備份,初值A(chǔ)A確保首次讀取時(shí)間后會(huì)刷新顯示unsigned

charsecBackup=0xAA;

unsigned

charstr[12];

//字符串轉(zhuǎn)換緩沖區(qū)

structsCalendabufTime;

//日歷緩沖區(qū)

EA=

1;

//開總中斷ConfigTimer0(1);

//T0定時(shí)1msInitDS1302();

//初始化實(shí)時(shí)時(shí)鐘InitLcd1602();

//初始化液晶

while

(1)

{

if(flag200ms)

{12.4DS1302讀寫實(shí)戰(zhàn)-ds1302.c flag200ms=

0; GetCurrentTime(&bufTime); //傳遞是地址

if(secBackup!=bufTime.sec)

{

//顯示年月日信息 str[0]

=

'2'; str[1]

=

'0'; str[2]

=

(bufTime.year>>

4)

+

'0'; str[3]

=

(bufTime.year&

0x0F)

+

'0'; str[4]

=

'-'; str[5]

=

(bufTime.mon>>

4)

+

'0'; str[6]

=

(bufTime.mon&

0x0F)

+

'0'; str[7]

=

'-'; str[8]

=

(bufTime.day>>

4)

+

'0'; str[9]

=

(bufTime.day&

0x0F)

+

'0'; str[10]

=

'\0'; LcdShowStr(0,

0,str);

//顯示星期信息 str[0]

=

(bufTime.week&

0x0F)

+

'0'; str[1]

=

'\0'; LcdShowStr(11,

0,

"week"); LcdShowStr(15,

0,str);12.4DS1302讀寫實(shí)戰(zhàn)-ds1302.c

//顯示時(shí)分秒信息 str[0]

=

(bufTime.hour>>

4)

+

'0'; str[1]

=

(bufTime.hour&

0x0F)

+

'0'; str[2]

=

':'; str[3]

=

(bufTime.min>>

4)

+

'0'; str[4]

=

(bufTime.min&

0x0F)

+

'0'; str[5]

=

':'; str[6]

=

(bufTime.sec>>

4)

+

'0'; str[7]

=

(bufTime.sec&

0x0F)

+

'0'; str[8]

=

'\0'; LcdShowStr(4,

1,str);

secBackup=bufTime.sec;

//更新秒備份

}

}

}}12.4DS1302讀寫實(shí)戰(zhàn)-Timer0voidTimer0()interrupt1{

static

unsigned

chartmr200ms=

0;

TH0=T0RH;

//重新加載重載值TL0=T0RL;tmr200ms++;

if

(tmr200ms>=

200)

//定時(shí)200ms

{tmr200ms=

0;flag200ms=

1;

}}12.4DS1302讀寫實(shí)戰(zhàn)-ds1302.h#include<reg52.h>

#ifndef__DS1302_H_#define__DS1302_H_

sbitDS1302_CE=P4^1;

//本書配套開發(fā)板所接引腳sbitDS1302_IO=P4^2;

//本開發(fā)板此三引腳為復(fù)用引腳,注意需跳線sbitDS1302_CK=P4^3;

structsCalenda{

//日歷結(jié)構(gòu)體定義

unsigned

intyear;

//年

unsigned

charmon;

//月

unsigned

charday;

//日

unsigned

charhour;

//時(shí)

unsigned

charmin;

//分

unsigned

charsec;

//秒

unsigned

charweek;

//星期};

voidGetCurrentTime(structsCalenda*calenda);voidInitDS1302();unsigned

charDS1302ReadReg(unsigned

charreg);

#endif12.4DS1302讀寫實(shí)戰(zhàn)-DS1302BurstWrite/*用突發(fā)模式連續(xù)寫入8個(gè)寄存器數(shù)據(jù),dat:待寫入數(shù)據(jù)指針*/voidDS1302BurstWrite(unsigned

char

*dat){

unsigned

chari;

DS1302_CE=

1;DS1302WriteByte(0xBE);

//發(fā)送突發(fā)寫寄存器指令

for

(i=0;i<8;i++)

//連續(xù)寫入8字節(jié)數(shù)據(jù)

{DS1302WriteByte(dat[i]);

}DS1302_CE=

0;}12.4DS1302讀寫實(shí)戰(zhàn)-DS1302BurstRead/*用突發(fā)模式連續(xù)讀取8個(gè)寄存器的數(shù)據(jù),dat:讀取數(shù)據(jù)的接收指針*/voidDS1302BurstRead(unsigned

char

*dat){

unsigned

chari;

DS1302_CE=

1;DS1302WriteByte(0xBF);

//發(fā)送突發(fā)讀寄存器指令

for

(i=0;i<8;i++)

//連續(xù)讀取8個(gè)字節(jié)

{dat[i]

=DS1302ReadByte();

}DS1302_CE=

0;}12.4DS1302讀寫實(shí)戰(zhàn)-GetCurrentTime/*獲取當(dāng)前時(shí)間,即讀取DS1302當(dāng)前時(shí)間并轉(zhuǎn)換為時(shí)間結(jié)構(gòu)體格式*/voidGetCurrentTime(structsCalenda*calenda){

unsigned

charbuf[8];

DS1302BurstRead(buf);calenda->year=buf[6]

+

0x2000;calenda->mon=buf[4];calenda->day=buf[3];calenda->hour=buf[2];calenda->min=buf

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論