《電子技術(shù)課程設(shè)計》實訓報告_第1頁
《電子技術(shù)課程設(shè)計》實訓報告_第2頁
《電子技術(shù)課程設(shè)計》實訓報告_第3頁
《電子技術(shù)課程設(shè)計》實訓報告_第4頁
《電子技術(shù)課程設(shè)計》實訓報告_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

?訝Q充考法

《電子技術(shù)課程設(shè)計》實訓報告

題目ds1302、ds18b20做的

led顯示的萬年歷

學生姓名

專業(yè)班級

學號

系(部)

指導教師

實訓時間2014.5.26-2014.6.6

實訓報告評語

等級:_________

評閱人:職稱:

年月日

一、實訓任務(wù)要求

1、根據(jù)所學模擬電子電路、數(shù)字電子電路、自己了解的課外知識,自己設(shè)計完

成一個電子產(chǎn)品。

2、萬年歷(溫度顯示)具有走時準確、顯示直觀、易校時等優(yōu)點,因此得到了

廣泛的應(yīng)用。多功能說子時鐘由以下幾部分組成:電源部分、時鐘電路、復(fù)位電

路、顯示電路、溫度測量電路等。顯示內(nèi)容為:萬年歷(溫度顯示)是一種用

DS1302實時時鐘芯片計時的裝置,DS18B20測試環(huán)境溫度,利用LCD1602顯

示溫度和時間。最終實現(xiàn)萬年歷的所有功能。

3、自己動手,從理論上升到實踐,更好的實現(xiàn)理論和實踐的結(jié)合。從中總結(jié)經(jīng)

驗教訓,不斷提高。

二、實訓目的

1、培養(yǎng)動手能力,在實踐中加強對理論知識的理解。

2、掌握對電子元器件識別,相應(yīng)工具的操作,相關(guān)儀器的使用,電子設(shè)備制作、

裝調(diào)的全過程的方法。

3、掌握查找及排除電子電路故障的常用方法。

4、學習使用proteus>protel電路仿真與設(shè)計軟件,動手繪制電路圖。

三、實訓步驟:

(-)>設(shè)計方案的選擇:

萬年歷的設(shè)計能夠?qū)W習運用到多方面的知識。如單片機的使用、一些簡單程

序的讀寫、了解運用(dsl302實時時鐘芯片、ds18b20溫度傳感器、LCD1602液

晶等)的原理及功能、學會Altiumdesigner、proteus、keil等軟件的使用。如果此

產(chǎn)品做成功不僅可以收獲大量知識,而且自己日后可以使用自制的萬年歷。這將

會使自己有不小的成就感,曾加對專業(yè)學習的興趣。

(二)、電路原理分析:

1、電路設(shè)計框圖:

2、工作原理描述:

本電路由STC90C51單片機為控制核心,在5V電壓下工作;時鐘電路由

DS1302提供,它是一種高性能、低功耗、帶RAM的實時時鐘電路,可以對年、

月、日、周日、時、分、秒進行計時。需要5V、3V直流電源分別供電。采用三

線接口與CPU進行同步通信,并采用突發(fā)方式一次傳遞多個字節(jié)的時鐘信號或

RAM數(shù)據(jù),同時具有掉電自動保存功能。由它將時鐘信號傳遞給單片機。溫度

的采集由DS18B20構(gòu)成,將當前環(huán)境溫度轉(zhuǎn)換為電信號傳遞給單片機。顯示部

分由LCD1602液晶顯示屏完成。最后,由單片機將D31302、DS18B20c傳來的

信號傳遞給LCD1602,從LCD1602上就可以讀出所要顯示的所有信息。

(三)、芯片封裝及功能:

DS1302實時時鐘芯片:

封裝:

1、引腳說明:

(1)Vccl:后備電源,VCC2:主電源。在主電源關(guān)閉的情況下,也能保持

口寸鐘的連續(xù)運行。DS1302由Vccl或Vcc2兩者中的較大者供電。當Vcc2大于

Vccl+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vccl時,DS1302由Vccl

供電。

(2)XI、X2:振蕩源,外接32.768kHz晶振。

(3)RST:復(fù)位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳

送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入

移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當RST為

高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過

程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行

時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能

將RST置為高電平。

(4)I/O為串行數(shù)據(jù)輸入輸出端(雙向)。

(5)SCLK為時鐘輸入端。

2、DS1302的控制字節(jié)

DS1302的控制字如下圖所示。

控制字節(jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入

DS1302中,位6如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);

位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為

1表示進行讀操作,控制字節(jié)總是從最低位開始輸出。

3、數(shù)據(jù)輸入輸出(I/O)

在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,

數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK

脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7o

4、DS1302的寄存器

DS1302有12個寄存器,其中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)

位為BCD碼形式,其日歷、時間寄存器及其控制字見數(shù)據(jù)手冊。

此外,DS1302還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及

與RAM相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的

所有寄存器內(nèi)容。DS1302與RAM相關(guān)的寄存器分為兩類:一類是單個RAM

單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H?FDH,

其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方

式下可一次性讀寫所有的RAM的31個字節(jié),命令控制字為FEH(寫)、FFH(讀)。

18B20溫度傳感器:

1、封裝:

DS18B20芯片封裝結(jié)構(gòu):

DALLASNC匚ZINC

18B20

NC匚

DQ匚GND

8-Pin150milSO

(DS18B20Z)

DQ『一8t=3Voo

NC匚口NC

27

NCc=d£L=)NC

3S°

GNDEZd3LzjNC

8-Pin"SOP

(BOTTOM\TEU^(DS18B20U)

TO-92

(DS18B20)

圖I

2、DS18B20引腳功能:

?GND電壓地?DQ單數(shù)據(jù)總線?VDD電源電壓?NC空引腳

3、DS18B20工作原理及應(yīng)用:

DS18B20的溫度檢測與數(shù)字數(shù)據(jù)輸出全集成于一個芯片之上,從而抗干擾力

更強。其一個工作周期可分為兩個部分,即溫度檢測和數(shù)據(jù)處理。在講解其工作

流程之前我們有必要了解18B20的內(nèi)部存儲器資源。18B20共有2種形態(tài)的存

儲器資源,它們分別是:

(1)ROM只讀存儲器,用于存放DS18B20ID編碼,其前8位是單線系列

編碼(DS18B20的編碼是19H),后面48位是芯片唯一的序列號,最后8位

是以上56的位的CRC碼(冗余校驗)。數(shù)據(jù)在出產(chǎn)時設(shè)置不由用戶更改。

DS18B2O共64位ROM。

(2)RAM數(shù)據(jù)暫存器,用于內(nèi)部計算和數(shù)據(jù)存取,數(shù)據(jù)在掉電后丟失,

DS18B20共9個字節(jié)RAM,每個字節(jié)為8位。第1、2個字節(jié)是溫度轉(zhuǎn)換后

的數(shù)據(jù)值信息,第3、4個字節(jié)是用戶EEPROM(常用于溫度報警值儲存)的

鏡像。在上電復(fù)位時其值將被刷新。第5個字節(jié)則是用戶第3個EEPROM的

鏡像。第6、7、8個字節(jié)為計數(shù)寄存器,是為了讓用戶得到更高的溫度分辨率

而設(shè)計的,同樣也是內(nèi)部溫度轉(zhuǎn)換、計算的暫存單元。第9個字節(jié)為前8個字

節(jié)的CRC碼。EEPROM非易失性記憶體,用于存放長期需要保存的數(shù)據(jù),上

下限溫度報警值和校驗數(shù)據(jù),DS18B20共3位EEPROM,并在RAM者K存在

鏡像,以方便用戶操作。

LCD1602液晶顯示器:

1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號

等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組成,每個點陣

字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,

起到了字符間距和行間距的作用,正因為如此所以它不能很好地顯示圖形。

1、LCD1602的引腳功能:圖(1)LCD1602

第1腳:VSS為電源地

第2腳:VDD接5V電源正極

第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源

時對比度最高(對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器

調(diào)整對比度)。

第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指

令寄存器。

第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操

作。

第6腳:E(或EN)端為使能(enable)端。

第7?14腳:D0?D7為8位雙向數(shù)據(jù)端。

第15?16腳:空腳或背燈電源。15腳背光正極,16腳背光負極。

4、電路仿真結(jié)果:

圖(2)電路仿真圖

5、電路制作與調(diào)試

(1)上網(wǎng)查找電路圖及程序(2)在KEIL中編譯修改程序(3)PROTUES

上進行仿真(4)畫原理圖,生成PCB(5)打印PCB圖(7)進行熱轉(zhuǎn)印,腐蝕

(8)打孔(9)向打過孔的PCB涂錫(10)焊接電路(11)向單片機下載程序,

進行調(diào)試(12)用萬用表測量電氣連接是否完好(13)調(diào)節(jié)LCD液晶的對比度

(14)正常顯示時間、溫度

四、實訓心的

作為一?名大學生,做出來的東西要能拿得出手,要像是一個上過大學的人

做的。不能敷衍了事,無法與同學相較。不能總以沒有時間為借口,下次有時間

再好好做來自欺。你做出來的東西,就體現(xiàn)著你的能力。習慣性的應(yīng)付工作,有

嚴重的危害。工作是生活的一部分,如果完成的工作質(zhì)量粗劣,不但使工作效能

降低,而且還會使你喪失做事的才能。當然,永遠不可能擁有超人的成就和某種

特長。同時,他人也將不會尊重你的工作和你。因此,工作需要認真,要做就盡

力把工作做完滿,絕不敷衍了事。

設(shè)計東西時統(tǒng)籌安排好,再開始做,不然做出來的產(chǎn)品不理想的地方也不易

修改。做產(chǎn)品不可能一蹴而就,需要耐心和毅力,要能坐得住,把握好每一個環(huán)

節(jié),才能做出來好的產(chǎn)品。檢測調(diào)試時,要仔細,不放過任何細節(jié)。這樣不僅不

會浪費時間,反而有事半功倍的效果。

現(xiàn)在,對于我來說,電子制作還是剛剛接觸。設(shè)計的東西雖然是非常的簡單,

但是也得到了很多的樂趣。我相信,隨著不斷地學習,以后肯定會有大的突破。

原來感覺專業(yè)方面的學習是無聊的,自己學習也沒有興趣和動力。通過實訓讓我

了解到電子設(shè)計的魅力,漸漸地有了想要學習相關(guān)知識,自己設(shè)計產(chǎn)品的渴望。

只要有興趣,付出的努力一定會有回報。

多向他人學習,學習他人的優(yōu)點,虛心接受他人合理化的批評。從他人身上

發(fā)現(xiàn)自己需要改進和提高的方面。

做事情,只要下定決心,面對困難,不放棄,想方法去解決。最終,一定能

夠成功。

附錄一:元器件清單

⑴單片機STC90C51XI

(2)晶振12MXI

32768HzXI

(3)陶瓷電容22pX2

(4)電解電容10uXI

(5)電阻IkXI

(6)排阻103XI

(7)電位器103XI

(8)按鍵開關(guān)X5

⑼DS1302XI

(10)LCD1602XI

(11)DS18B20XI

(12)覆銅10X10XI

附錄二:電路原理圖

圖(3)AltiumDesigner電路原理圖

附錄三:實物連線圖(或pcb圖)

:1308^15Oxz5838.769mH

:4448.648dy:798ZM8m3

nap:OOImiHotspotSnap(AlLayers):8mi

Jln

XOT5

O

O5

m

5

5

?

G

O

O

0

O

圖(4)AltiumDesigner電路PCB圖

附錄四:實物照片

圖(5)實物照片圖

附錄五:程序

ttinclude<REG51.H>

ttinclude<intrins.h>

//#include”LCD1602.h〃

//ttinclude〃DS1302.h〃

#defineuintunsignedint

#defineucharunsignedchar

sbitDS1302_CLK=Pr7;//實時時鐘時鐘線弓I

sbitDS1302_I0=P「6;〃實時時鐘數(shù)據(jù)線

引腳

sbitDS1302_RST=PT5;〃實時時鐘復(fù)位線引

sbitbeep=P3"4;

sbitACCO=ACC"O;

sbitACC7=ACC7

char

hide_sec,hide_min,hide_hour,hide_day,hide_zhou,hide_mon

th,hide_year,hide_m,hide_f,hide_h;

sbitSet=P20;〃模式切換鍵

sbitUp=P21;〃加法按鈕

sbitDown=P22;〃減法按鈕

sbitout=P2:3;〃立刻跳出調(diào)整模式按鈕

sbitDQ=Pro;〃溫度傳送數(shù)據(jù)10口

sbitdd=P3"7;

chardone,count,temp,flag,up_flag,down_flag,key;

uchartemp_value;〃溫度值

ucharm,f,h,mo,d,y,w,kaiguan,h=00,f=00;

ucharTempBuffer[5],zhou_value[2],nao[8];

voidnaotime();

ucharcode

tone[]={212,212,190,212,159,169,212,212,190,212,142,159

212,212,106,126,159,169,190,119,119,126,159,142,159,0);

ucharcodelon[]={9,3,12,12,12,24,9,3,12,12,12,24,

9,3,12,12,12,12,12,9,3,12,12,12,24,0};

voiddelay(uintz)

{

uintx,y;

for(x-z;x>0;x一)

for(y=110;y>0;y--);

voidmusic()

uinti,j,k=0,m;

for(m=0;m<26;m++)

for(i=0;i<lon[k]*20;i++)

beep=~beep;

for(j=0;j<tone[k]/3;j++);

delay(10);

k++;

voidshow_time();〃液晶顯示程序

/***********1602液晶顯示部分子程序****************/

//Port

Definitions********************************************

ZT<*T*XIXXIXXT%

sbitLcdRs=P25;

sbitLcdRw=P2-6;

sbitLcdEn=P27

sfrDBPort=0x80;

〃P0=0x80,Pl=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口

//內(nèi)部等待函數(shù)

sixKL*%L**X**X*vjx*Jxxlx*L**L*six*lxxlxxlz*lx*lxxlx*lxxlx*Jxxlx*lx*L**L*six*Xx

^TKXTXXjXXTSXTH?lxXT><1X<7xXT*XT*>TXXTS?TXX7>ZTSXT*<TSXTSXTS<Tx^TSXTS^TSXTHXT>XT><1X<1XXl>XlXXlXXTSXTS*TSXTX<T*XTS<I>XT*XTH?TSXT*XT**J、XT*XT*^T\

vl*xl**1^>lxsL*si*xlx*lx*lxxlxxlx*Jx*X*sixslx*Jx*Jx

q、XTS*TXXTWxr*^TXXTS*7X*7XXTXXTX*TSZTH^T*^T*XT*XTSXTXXTS

unsignedcharLCDWait(void)

(

LcdRs=0;

LcdRw=l;_nop_();

LcdEn=l;_nop_();

LcdEn=O;

returnDBPort;

)

〃向LCD寫入命令或數(shù)據(jù)

MXXL*XL*six*Jx*Jx*lx*X*xL*sixxlxxlz*lx*lxxlx*lxxlx*Jxxlx*lx*L**L*six*Xx*lx

^r\xTxx7^xTs?TsXT*XTSXT*XT*xr*>Txxrs?rxXT>ZTSXT*<TSXTSXTS<TX^TSXTSXTHXT><7X<7Xxl>XTXXTXXTSXTSXTX<r*xrs^r\XTHxp*xrs^r\?Tsxrsxrsxr*XT*xjsxj%

xlxxlxxl*

xj>ZTS*1>

#defineLCD_COMMAND0//Command

ttdefineLCD_DATA1//Data

ttdefineLCD_CLEAR_SCREEN0x01//清屏

ttdefineLCD_HOMING0x02//光標返回原點

voidLCDJVrite(bitstyle,unsignedcharinput)

{

LcdEn=0;

LcdRs=style;

LcdRw=0;_nop_();

DBPort=input;_nop_();〃注意順序

LcdEn=l;_nop_();〃注意順序

LcdEn=O;_nop_();

LCILWaitO;

〃設(shè)置顯示模式

vlxvlxxlzsixxlx>L**1^^L**X**x**lx*Jx*Jx*X*^L*vi**A*xL*xL**1^

^r\xTxxTs?TsXT*XTS?r*xr*xr*zr*zr*?rxZTN?TSZTS<TS<i>^rszrs<7>^7xx7xxj><7x<7xxT>xlxxlxXTSxrx<r*xrs^r\XTHxp*xrs^r\?lx<7xXT*xjsxj%

xlxxlxxl**Jx>lx

xj>ZTS*1>XTS

#defineLCD__SHOW0x04〃顯示開

#defineLCD__HIDE0x00〃顯示關(guān)

#defineLCD__CURSOR0x02〃顯示光標

#defineLCD__NO_CURSOR0x00〃無光標

#defineLCD_FLASH0x01〃光標閃動

#defineLCD__NO_FLASH0x00〃光標不閃動

voidLCI)_SetDisplay(unsignedcharDisplayMode)

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

//設(shè)置輸入模式

Kt*KtZK1*KLZ%tzxlzxlzxL*xL*Vl>Kt*Kt*XX*XX*xlxxlxxtz*£>%£>XX*KL^KIZxl>XX^*X*XX*

XlX^T**T*>p*ZT<*T*XIX?TXXT%>T*XTHXT*??*??**T**TX?T^?T^^jX?jXXT*XT*?TX?TXXr*XTHXTHXIX>T*>r*??*>7<*TX?T^^TX?jXXT*ZTXXT*XT*?TXXT*^T*XT*

xlzxlxsixxX*

**r**T**T**T*

#defineLCDACUP0x02

#defineLCDACDOWN0x00//default

#defineLCDMOVE0x01//畫面可平移

#defineLCDNOMOVE0x00//default

voidLCDSetlnput(unsignedcharInputMode)

{

LCD_Write(LCD_COMMAND,0x04|InputMode);

)

初始化

Il/1|I)Ixrss<ri*s?rxZTS<r\<r\xT>>7>xp*xrs^Tx*z?rx**<Xr%**zXr*s*xXrs*?TxxysxysZTN^rxzlx?r*zrs^Z£T*X*Z*1T^S*Z1T^S><!r<\*<1r<\*J**xp*xp*XTSXT*XTH*XXT*S*XXT<*<I>?!>*x1y*s**Z?TX**x?p**x?p*><1r*\^zrLs*?rx*z1r^s*z1r^s><!r<\*xT?>*>7>*X*xp*

xl*xlzxlxxL*^L*vl^

?TxxT><IXZVSXTS"、XT*?Tx

voidLCDInitial()

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);//8位數(shù)據(jù)端口,2

行顯示,5*7點陣

delay(1);

LCD_Write(LCD_COMMAND,0x38);

delay(1);

LCD^SetDisplay(LCD_SII0W|LCD_N0_CURS0R);〃開啟顯示,

無光標

LCD^Write(LCD_COMMAND,LCD_CLEAR_SCREEN);〃清屏

delay(1);

LCD_SetInput(LCD_AC_UP|LCD_N0_M0VE);〃AC遞增,畫

面不動

)

//液晶字符輸入的位置************************

voidGotoXY(unsignedcharx,unsignedchary)

if(y==0)

LCD_Write(LCD_COMMAND,0x801x);

delay(1);

if(y==l)

LCDWrite(LCD_C0MMAND,0x801(x-0x40));

delay(l);

}

〃將字符輸出到液晶顯示

voidPrint(unsignedchar*str)

(

while(*str!='\0')

(

LCDWrite(LCDDATA,*str);

delay(1);

str++;

)

Avoidprintc(unsignedcharIcddata)

{

LCD_Write(LCD_DATA,lcd_data);

}*/

/***********DS1302時鐘部分子程序******************/

typedefstruct_SYSTEMTIME

unsignedcharSecond;

unsignedcharMinute;

unsignedcharHour;

unsignedcharZhou;

unsignedcharDay;

unsignedcharMonth;

unsignedcharYear;

unsignedcharDateString[12];

unsignedcharTimeString[10];

}SYSTEMTIME;〃定義的時間類型

SYSTEMTIMECurrentTime;

#defineAM(X)X

ttdefinePM(X)(X+12)//轉(zhuǎn)成24小時制

ttdefineDS1302_SEC0ND0x80〃時鐘芯片的寄存器

位置,存放時間

ttdefineDS1302_MINUTE0x82

ttdefineDS1302_H0UR0x84

#defineDS1302_ZH0U0x8A

#defineDS1302.DAY0x86

ttdefineDS1302MONTH0x88

ttdefineDS1302YEAR0x8C

voidI)S1302InputByte(unsignedchard)〃實時時鐘寫入一,

字節(jié)(內(nèi)部函數(shù))

(

unsignedchari;

ACC=d;

for(i=8;i>0;i一)

(

DS1302J0=ACCO;〃相當于匯編中的RRC

DS1302_CLK=1;

DS1302_CLK=0;

ACC=ACC?1;

)

)

unsignedcharDS13020utputByte(void)〃實時時鐘讀取一

字節(jié)(內(nèi)部函數(shù))

unsignedchari;

for(i=8;i>0;i--)

{

ACC=ACC?1;〃相當于匯編中的RRC

ACC7=DS1302J0;

DS1302_CLK=1;

DS1302_CLK=0;

}

return(ACC);

)

voidWritel302(unsignedcharucAddr,unsignedcharucDa)

//ucAddr:DS1302地址,ucData:要寫的數(shù)據(jù)

{

I)S1302.._RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr);//地址,命令

DS1302InputByte(ucDa);//寫IByte數(shù)據(jù)

I)S1302_CLK=1;

DS1302_RST=0;

}

unsignedcharReadl302(unsignedcharucAddr)〃讀取

DS1302某地址的數(shù)據(jù)

(

unsignedcharucData;

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr10x01);//地址,命令

ucData=DS13020utputByte();//讀IByte數(shù)據(jù)

I)S1302_CLK=1;

DS1302_RST=0;

return(ucData);

voidDS1302_GetTime(SYSTEMTIME*Time)〃獲取時鐘芯片的

時鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組

unsignedcharReadValue;

ReadValue=Readl302(DS1302_SEC0ND);

Time->Second=((ReadValue&0x70)?4)*10+

(ReadValue&OxOF);

ReadValue=Readl302(DS1302_MINUTE);

Time->Minute=((ReadValue&0x70)?4)*10+

(ReadValue&OxOF);

ReadValue=Read1302(DS1302_H0UR);

Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&OxOF);

ReadValue=Read1302(DS1302_DAY);

Time->Day=((ReadValue&0x70)?4)*10+(ReadValue&OxOF);

ReadValue=Read1302(DS1302_ZH0U);

Time->Zhou=((ReadValue&0x70)>>4)*10+(ReadValue&OxOF);

ReadValue=Read1302(DS1302_M0NTH);

Time->Month=((ReadValue&0x70)?4)*10+

(ReadValue&OxOF);

ReadValue=Readl302(DS1302_YEAR);

Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&OxOF);

)

voidDateToStr(SYSTEMTIME*Time)〃將時間年,月,日,星

期數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里DateString[]

{if(hide_year<2)〃這里的if,else語

句都是判斷位閃爍,<2顯示數(shù)據(jù),>2就不顯示,輸出字符串為

2007/07/22

(

Time->DateString[O]='2';

Time->DateString[l]='O';

Time->DateString[2]=Time->Year/10+'O';

Time->DateString[3]=Time->Year%10+'O';

)

else

Time->DateString[O]=

Time->DateString[1]=

Time->DateString[2]=

Time->DateString[3]=

Time->DateString[4]=';

if(hide_month<2)

(

Time->DateString[5]=Time->Month/10+'O';

Time->DateString[6]=Time->Month%10+'O';

)

else

Time->DateString[5]=

Time->DateString[6]=

)

Time->DateString[7]=',;

if(hide_day<2)

{

Time->DateString[8]=Time->Day/10+'O';

Time->DateString[9]=Time->Day%10+'O';

Time->DateString[10]='';

Time->DateString[l1]='';

}

else

(

Time->DateString[8]='';

Time->DateString[9]='';

Time->DateString[10]=';

Time->DateString[l1]='';

}

if(hide_zhou<2)

zhou_value[0]=Time->Zhou%10+'O';〃星期的數(shù)據(jù)另外放

到zhou_value□數(shù)組里,跟年,月,日的分開存放,因為等一下要

在最后顯示

)

else

(

zhou_value[0]='';

)

zhouvalue[1]='\0';

Time->DateString[10]='\0';〃字符串末尾加'\0',判斷結(jié)

束字符

)

voidTimeToStr(SYSTEMTIME*Time)〃將時,分,秒數(shù)據(jù)轉(zhuǎn)換成

液晶顯示字符放到數(shù)組TimeString[];

if(hide_hour<2)

Time->TimeString[O]=Time->Hour/10+'O';

Time->TimeString[1]Time->Hour%10+'O';

)

else

{

Time->TimeString[0]=

Time->TimeString[l]=

)

Time->TimeString[2]=

if(hide_min<2)

Time->TimeString[3]Time->Minute/10+'O';

Time->TimeString[4]=Time->Minute%10+'O';

else

Time->TimeString[3]=

Time->TimeString[4]=

}

Time->TimeString[5]=

if(hide_sec<2)

Time->TimeString[6]=Time->Second/10+'O';

Time->TimeString[7]=Time->Second%10+'O';

Time->TimeString[8]='';

else

{

Time->TimeString[6]=

Time->TimeString[7]=

Time->TimeString[8]=

)

Time->DateString[9]='\0';

}

voidbaoshi(SYSTEMTIME*Time)

{

if(Time->Hour<22&&Tinie->Hour>8&&Time->Minute/10==0&&Tini

e->Minute%10==0&&Time->Second/10==0&&Time->Second%10==0

)

music();

}

voidnaozhong(SYSTEMTIME*Time)

if(Time->Minute%10=(f%10)&&Time->Minute/10==(f/10)&&Ti

me->Hour%10—(h%10)&&Time->Hour/10=(h/10)&&Time->Secon

d%10==(m%

10)&&Time->Second/10==(m/10))

music();

voidInitial_DS1302(void)〃時鐘芯片初始化

unsignedcharSecond=Readl302(DS1302_SEC0ND);

if(Second&0x80)〃判斷時鐘芯片是否關(guān)閉

{

Writel302(0x8e,0x00);〃寫入允許

Writel302(0x8c,0x07);〃以下寫入初始化時間日

期:07/07/25.星期:3.時間:23:59:55

Writel302(0x88,0x07);

Writel302(0x86,0x25);

Writel302(0x8a,0x07);

Writel302(0x84,0x23);

Writel302(0x82,0x59);

Writel302(0x80,0x55);

Writel302(0x8e,0x80);〃禁止寫入

/***********dsl8b20延遲子函數(shù)(晶振12MHz)*******/

voiddelay18B20(unsignedinti)

while(i一);

voidInitDS18B20(void)

unsignedcharx=0;

DQ=1;//DQ復(fù)位

delay_18B20(8);〃稍做延時

DQ=0;〃單片機將DQ拉低

delay_18B20(80);〃精確延時大于480us

DQ=1;〃拉高總線

delay_18B20(14);

x=DQ;〃稍做延時后如果x=0則初始化成功x=l

則初始化失敗

delay」8B20(20);

unsignedcharReadOneChar(void)

{

uchari=0;

uchardat=0;

for(i=8;i>0;i一一)

DQ=0;//給脈沖信號

dat>>=l;

DQ=1;//給脈沖信號

if(DQ)

dat|=0x80;

delay_18B20(4);

return(dat);

)

/*************dsl8b20寫~1個字節(jié)****************/

voidWriteOneChar(uchardat)

unsignedchari=0;

for(i=8;i>0;i一)

DQ=0;

DQ=dat&OxOl;

delay_18B20(5);

DQ=1;

dat>>=l;

)

}

/**************讀取dsl8b20當前溫度************/

voidReadTemp(void)

{

unsignedchara=0;

unsignedcharb=0;

unsignedchart=0;

IniOS18B200;

WriteOneChar(OxCC);//跳過讀序號列號的操作

WriteOneChar(0x44);//啟動溫度轉(zhuǎn)換

delay_18B20(100);//thismessageisweryimportant

IniOS18B20();

WriteOneChar(OxCC);〃跳過讀序號列號的操作

WriteOneChar(OxBE);〃讀取溫度寄存器等(共可讀9個寄存

器)前兩個就是溫度

delay_18620(100);

a=ReadOneChar();〃讀取溫度值低位

b=ReadOneChar();〃讀取溫度值高位

temp_value=b<<4;

temp_value+=(a&OxfO)>>4;

)

voidtemp_to_str()〃溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示

(

TempBuffer[0]=temp_value/10+,0);〃十位

TempBuffer[l]=temp_value%10+,0);〃個位

TempBuffer[2]=Oxdf;〃溫度符號

TempBuffer[3]=,C);

TempBuffer[4]=,\0);

voidnaoz()

if(hide_h<2)

nao[0]=h/10+,O';

nao[l]=h%10+,O';

}

else

{

nao[0]=,';

nao[l]=,,;

)

nao[2]=':';

if(hide_f<2)

(

nao[3]=f/10+,O';

nao[4]=f%10+,O';

else

nao[3]=,,;

nao[4]=',;

}

nao[5]=,:';

if(hide_m<2)

{

nao[6]=m/10+,O';

nao[7]=m%10+,O';

}

else

(

nao[6]='';

nao[7]=,,;

)

nao[8]='\0';

voidDelaylms(unsignedintcou

溫馨提示

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

最新文檔

評論

0/150

提交評論