第5組萬年歷實(shí)驗(yàn)報(bào)告_第1頁
第5組萬年歷實(shí)驗(yàn)報(bào)告_第2頁
第5組萬年歷實(shí)驗(yàn)報(bào)告_第3頁
第5組萬年歷實(shí)驗(yàn)報(bào)告_第4頁
第5組萬年歷實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

北京郵電大學(xué)

單片機(jī)小學(xué)期實(shí)驗(yàn)報(bào)告

2012年9月12日

目錄

1硬件設(shè)計(jì)---------------------------------------3

1.1設(shè)計(jì)要求---------------------------------------------3

1.2硬件框圖---------------------------------------------3

1.3硬件選擇---------------------------------------------3

2軟件設(shè)計(jì)----------------------------------------6

2.1編程環(huán)境及語言----------------------------------------6

2.2程序框圖----------------------------------------------6

3電路設(shè)計(jì)---------------------------------------6

3.1DS1302電路--------------------------------------------6

3.2LCD1602電路------------------------------------------7

3.34*4鍵盤電路-------------------------------------------7

3.4蜂鳴器電路---------------------------------------------8

3.5綜合電路-----------------------------------------------8

4程序設(shè)計(jì)---------------------------------------9

5操作方法---------------------------------------37

6運(yùn)行結(jié)果---------------------------------------37

7實(shí)驗(yàn)過程排錯(cuò)------------------------------------38

8心得體會(huì)及建議---------------------------------38

8.1心得體會(huì)-----------------------------------------------38

8.2建議---------------------------------------------------38

9附錄-------------------------------------------38

9.1組內(nèi)分工-----------------------------------------------38

9.2參考文獻(xiàn)-----------------------------------------------38

1硬件設(shè)計(jì)

1.1設(shè)計(jì)要求

實(shí)現(xiàn)年月日、時(shí)分秒、星期的顯示功能,鬧鈴功能。用鍵盤來實(shí)現(xiàn)日期和時(shí)間的調(diào)整功

能,調(diào)整要求星期能自動(dòng)更新,能實(shí)現(xiàn)位調(diào),且閏年時(shí)2月份的天數(shù)自動(dòng)變?yōu)?9。顯示格

式:四位年,兩位月,兩位日,星期顯示數(shù)字,兩位時(shí),兩位分,兩位秒。比如:

YYYY-MM-DDX

HH:MM:SS

鬧鈴要求用鍵盤定時(shí)間,到時(shí)間后蜂鳴器響5s左右。

1.2硬件框圖

日期時(shí)間由硬件軟件結(jié)合產(chǎn)生;鍵盤完成當(dāng)前日期時(shí)間的調(diào)整和鬧鈴定時(shí)功能。過程與

結(jié)果由控制芯片分別輸出到顯示器上,鬧鈴鈴聲設(shè)為蜂鳴器鳴叫。

1.3硬件選擇

1).顯示模塊

由于八段數(shù)碼管連線多且復(fù)雜,因此選擇的是ds1602液晶顯示屏。

八段數(shù)碼管的優(yōu)點(diǎn):亮度高,顯示大。驅(qū)動(dòng)部份的軟件簡(jiǎn)單;缺點(diǎn):與液晶相比,耗電

及體積大。數(shù)碼管只能單純的顯示數(shù)字,不能生動(dòng)的表達(dá)各個(gè)參數(shù)的信息,消耗電力也比led

液晶顯示器大。

LCD液晶顯示器它是一種專門用來顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊,在單

片機(jī)系統(tǒng)中應(yīng)用晶液顯示器作為輸出器件有以下幾個(gè)優(yōu)點(diǎn):

顯示質(zhì)量高,由于液晶顯示器每一個(gè)點(diǎn)在收到信號(hào)后就一直保持那種色彩和亮度,恒定

發(fā)光,而不像陰極射線管顯示器(CRT)那樣需要不斷刷新新亮點(diǎn)。因此,液晶顯示器畫質(zhì)

高且不會(huì)閃爍。

數(shù)字式接口,液晶顯示器都是數(shù)字式的,和單片機(jī)系統(tǒng)的接口更加簡(jiǎn)單可靠,操作更加

方便。

體積小、重量輕,液晶顯示器通過顯示屏上的電極控制液晶分子狀態(tài)來達(dá)到顯示的目的,

在重量上比相同顯示面積的傳統(tǒng)顯示器要輕得多。

功耗低,相對(duì)而言,液晶顯示器的功耗主要消耗在其內(nèi)部的電極和驅(qū)動(dòng)IC上,因而耗

電量比其它顯示器要少得多。Led液晶能一屏把本設(shè)計(jì)所要顯示的信息表達(dá)完整。而且led

耗電小,體積小很適合與室內(nèi)使用。

本設(shè)計(jì)的要求日期時(shí)間以數(shù)字表示、星期用3位英文字符表示共21個(gè)字符,lcd1602

能顯示32個(gè)字符,足以完成顯示功能。Lcdl602有16個(gè)引腳,各個(gè)引腳功能見下表:

引腳號(hào)引腳名電平輸入/輸出作用

1VSS電源地

2VDDVcc電源(+5v)

3VEE對(duì)比調(diào)整電壓

4RS0/1輸入0=輸入指令,1=輸入數(shù)據(jù)

5R/W0/1輸入0=向led寫入數(shù)據(jù)或指令

1=從led讀取數(shù)據(jù)

6E1,1->0輸入使能信號(hào),1=讀取信息

1->0(下降沿)執(zhí)行指令

7DB00/1輸入/輸出數(shù)據(jù)總線lineO

8DB10/1輸入/輸出數(shù)據(jù)總線linel

9DB20/1輸入/輸出數(shù)據(jù)總線line2

10DB30/1輸入/輸出數(shù)據(jù)總線line3

11DB40/1輸入/輸出數(shù)據(jù)總線line4

12DB50/1輸入/輸出數(shù)據(jù)總線line5

13DB60/1輸入/輸出數(shù)據(jù)總線line6

14DB70/1輸入/輸出數(shù)據(jù)總線line7

15AVccLed背光正極

14KLed背光負(fù)極

表ITlcdl602引腳及功能

2).控制芯片

學(xué)校提供的Atmegal6芯片

高性能、低功耗的8位AVR微處理器

先進(jìn)的RISC結(jié)構(gòu)

131條指令

大多數(shù)指令執(zhí)行時(shí)間為單個(gè)時(shí)鐘周期

32個(gè)8位通用工作寄存器

全靜態(tài)工作

工作于16MHz時(shí)性能高達(dá)16MIPS

只需兩個(gè)時(shí)鐘周期的硬件乘法器

非易失性程序和數(shù)據(jù)存儲(chǔ)器

16K字節(jié)的系統(tǒng)內(nèi)可編程Flash,擦寫壽命:10,000次

具有獨(dú)立鎖定位的可選Boot代碼區(qū),通過片上Boot程序?qū)崿F(xiàn)系統(tǒng)內(nèi)編程,真正的同時(shí)讀寫操

512字節(jié)的EEPROM,擦寫壽命:100,000次

1K字節(jié)的片內(nèi)SRAM

可以對(duì)鎖定位進(jìn)行編程以實(shí)現(xiàn)用戶程序的加密

JTAG接口(與IEEE1149.1標(biāo)準(zhǔn)兼容)

符合JTAG標(biāo)準(zhǔn)的邊界掃描功能

支持?jǐn)U展的片內(nèi)調(diào)試功能

通過JTAG接口實(shí)現(xiàn)對(duì)Flash、EEPROM、熔絲位和鎖定位的編程

140

P1.0VCC

239

Pl.lPO.O(ADO)

338

Pl.2PO.l(ADl)

437

Pl.3P0.2(AD2)

536

Pl.4P0.3(AD3)

635

Pl.5P0.4(AD4)

734

Pl.6P().5(AD5)

833

Pl.7P0.6(AD6)

9八32

RSTP0J1AD7)

1031

P3.()(RXD)EA/VPP

1130

P3.KTXD)ALE/PROG

1229

P3.2(INT0)PSEN

1328

P3.3(INT1)P2.7(A15)

1427

P3.4(T0)P2.6(A14)

1526

P3.5(T1)P2.5(A13)

1625

P3.6(WR)P2.4(A12)

1724

P3.7(RD)P2.3(A11)

1823

XTAL2P2.2(A10)

1922

XTAL1P2.1(A9)

2021

GNDP2.0(A8)

ATMEGA16的管腳

3).日期時(shí)間生成模塊

低功耗時(shí)鐘芯片DS1302可以對(duì)年、月、日、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償?shù)?/p>

多種功能。DS1302用于數(shù)據(jù)記錄,特別是對(duì)某些具有特殊意義的數(shù)據(jù)點(diǎn)的記錄上,能實(shí)現(xiàn)

數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時(shí)間同時(shí)記錄。這種記錄對(duì)長(zhǎng)時(shí)間的連續(xù)測(cè)控系統(tǒng)結(jié)果的分析以及對(duì)異

常數(shù)據(jù)出現(xiàn)的原因的查找有重要意義。

采用DS1302作為記錄測(cè)控系統(tǒng)中的數(shù)據(jù)記錄,其軟硬件設(shè)計(jì)簡(jiǎn)單,時(shí)間記錄準(zhǔn)確,既

避免了連續(xù)記錄的大工作量,又避免了定時(shí)記錄的盲目性,給連續(xù)長(zhǎng)時(shí)間的測(cè)量、控制系統(tǒng)

的正常運(yùn)行及檢查都來了很大的方便,可廣泛應(yīng)用于長(zhǎng)時(shí)間連續(xù)的測(cè)控系統(tǒng)中。在測(cè)量控制

系統(tǒng)中,特別是長(zhǎng)時(shí)間無人職守的測(cè)控系統(tǒng)中,經(jīng)常需要記錄某些具有特殊意義的數(shù)據(jù)及其

出現(xiàn)的時(shí)間。記錄及分析這些特殊意義的數(shù)據(jù),對(duì)測(cè)控系統(tǒng)的性能分析及正常運(yùn)行具有重要

的意義。傳統(tǒng)的數(shù)據(jù)記錄方式是隔時(shí)采樣或定時(shí)采樣,沒有具體的時(shí)間記錄,因此只能記錄

數(shù)據(jù)而無法準(zhǔn)確記錄其出現(xiàn)的時(shí)間;若采用單片機(jī)計(jì)時(shí),一方面需要采用計(jì)數(shù)器,占用硬件

資源,另一方面需要設(shè)置中斷、查詢等,同樣耗費(fèi)單片機(jī)的資源,而且某些測(cè)控系統(tǒng)可能不

允許。而在系統(tǒng)中采用DS1302則能很好地解決這個(gè)問題

圖3-4DS1302內(nèi)部結(jié)構(gòu)圖

2軟件設(shè)計(jì)

2.1編程環(huán)境及語言

本設(shè)計(jì)是在ICCV7AVR中編程的,然后通過AVRstudio下載的。

2.2程序框圖

3電路設(shè)計(jì)

3.1DS1302電路

PC5/TDIK

FC€OIMC1五4

PCr/TO9C2a

IDORXDu

PDVTXDU2

?D2HNm_!L-5—vcci工

IKMNT1r-2—VCC2

P0WC1I3

PD8OC1A-it|口X1

-a.L__冏

”7821___CTML

X2

AREF

AVCC

圖3-1dsl302與單片機(jī)接口電路

3.2LCD1602電路

LCD1

U1016L

U1

2

PCDGCL

IC1G0A

-2-mi

IC2TCK

-2-XTA12

IC3T18

■C5g

JO

■心DO)EDI

亙M1ADC1FC</TO9C1

S_,心DC2FCI/TO9C2

437

至IA4AK4■DQRXD

35

IASADCSIDVTXD

Jl

,頷oce,詢m

方IDHNT1

POifiCil

圖3-21602液晶與單片機(jī)接口電路

3.34*4鍵盤電路

■^―FKmCK

》H1/T1

4lt2*WO1HT2

4—imiNtDCO

:“而

0網(wǎng)10*

IB&U6O

-2—?vra:K

ATBBDA16

圖3-34*4key與單片機(jī)接口電路

3.4蜂鳴器電路

PD1ZFKD

POCOOIB

POSOOM

,Xdd

PDTJOC2

ARBF□Q

AMCC

圖3-4蜂鳴器與單片機(jī)接口電路

3.5綜合電路

4程序設(shè)計(jì)

代碼分析

Yj1602函數(shù):

voidLCD1602_sendbyte(ucharDatCmd,uchardByte)

{

if(DatCmd==iCmd)〃指令操作

LCDa_CLR_RS;

else

LCDa_SET_RS;

LCDa_CLR_RW;〃寫操作

LCDa_SET_E;

LCDa_DO=dByte;〃寫入數(shù)據(jù)

Delayms⑴;

LCDa_CLR_E;

)

函數(shù)名稱:LCD1602_sendstr

功能:向1602液晶寫入一個(gè)字符串

參數(shù):ptSlring-字符串指針

返回值:無

voidLCD1602_sendstr(uchar*ptString)

while((*ptString)!='\0')〃字符串未結(jié)束

LCD1602_sendbyte(iDat,*ptString++);

)

)

函數(shù)名稱:LCD1602_clear

功能:1602液晶清屏

參數(shù):無

返回值:無

voidLCD1602_clear(void)

LCD1602_sendbyte(iCmd,LCDa_CLS);

Delayms⑵;〃清屏指令寫入后,2ms的延時(shí)是很必要的!!!

函數(shù)名稱:LCD1602_readBF

功能:1602液晶清屏

參數(shù):無

返回值:busy-為1時(shí)忙,為0時(shí)可以接收指令

ucharLCD1602_readBF(void)

ucharbusy;

busy=LCD1602_rcadbyte(iCnid);//讀回BF標(biāo)志和地址

if(busy&0x80)〃忙

busy=l;

else//不忙,可以寫入

busy=0;

returnbusy;

函數(shù)名稱:LCD1602_gotoXY

功能:移動(dòng)到指定位置

參數(shù):Row-指定的行

Col--指定的列

返回值:無

voidLCD1602_gotoXY(ucharRow,ucharCol)

{

switch(Row)〃選擇行

(

case2:

LCD1602_sendbyte(iCmd,LCDa_L2+Col);break;〃寫入第2行的指定列

default:

LCD1602_sendbyte(iCmd,LCDa_Ll+Col);break;〃寫入第1行的指定列

)

)

函數(shù)名稱:LCD1602_initial

功能:1602液晶初始化

參數(shù):無

返回值:無

voidLCD1602_initial(void)

Delayms(lOO);//等待內(nèi)部復(fù)位

LCD1602_portini();〃端口初始化

LCD1602_sendbyte(iCmd,LCDa_FUNCTION);//功能、模式設(shè)定

while(LCDl602_readBF());

LCD1602_sendbyte(iCmd,LCDa_ON);〃打開顯示

while(LCD1602_readBF());

LCD1602_clear();〃清屏

while(LCDl602_readBF());

LCD1602_sendbyte(iCmd,LCDa.ENTRY);//輸入模式設(shè)定

)

Dsl302函數(shù):

#defineRTC_CLKPD7//PCOPB7

#defineRTC_DATAPDO//PCIPB5

#defineRTC_CSPC7

#defineRTC_DDRDDRD//DDRB

#defineRTC.PORTPORTD//PORTB

#defineRTC.PINPIND//PINB

#defineRTC_CS_DDRDDRC

#defineRTC_CS_PORTPORTC

#defineRTC_CS_PINPINC

#defineLCDg_DDR_ONDDRDl=BIT(l);//LCD背光設(shè)置

#defineLCDg.ONPORTDl=BIT(l);〃LCD背光開啟

#defineLCDg_OFFPORTD&=~BIT(1);//LCD背光關(guān)閉

〃命令

#defineRD0x01

#defineWR0x00

#defineC_SEC0x80〃秒

#defineC_MIN0x82〃分

#defineC_HR0x84〃時(shí)

#dcfineC_DAY0x86〃日

#defineC_MTH0x88〃月

#dcfineC_WK0x8A//星期DATE

#defineC_YR0x8C//年

#defineC_WP0x8E〃控制(寫保護(hù))

#defineC_CHARGE0x90〃涓流充電

#defineC_BURSTOxBE//時(shí)鐘多字節(jié)

〃配置

#defineCLK_HALT0x80〃停止時(shí)鐘控制位SECONDbit7

#defineCLK_START0x00〃啟動(dòng)時(shí)鐘

#dcfineM12_240x80〃12/24小時(shí)值選擇位HOURbit7

#definePROTECT0x80〃寫保護(hù)控制位CONTROLbit7

#defineUPROTECT0x00〃寫保護(hù)控制位CONTROLbit7

〃涓流充電控制常量

#defineTC_DlR20xA5//high1Diode+2KResistors

#defineTC_D2R8OxAB//low2Diodes+8KResistors

#defineTC_DISABLED0x00//Disabled(TCS<>1010orDS=00orRS=00)

//RAM命令

#defineC_RAMBASE0xC0//RAM0-RAM30?1地址需左移一位

函數(shù)名稱:DS1302_init

功能:初始化DS1302的數(shù)據(jù)接口

參數(shù):無

返回值:無

voidDS1302_portinit(void)

RTC_DDRI=BIT(RTC_CLK)IBIT(RTC_DATA)IBIT(RTC_CS);〃將時(shí)鐘端(RTC_CLK)數(shù)據(jù)端

(RTJDATA)片選端(RTC_CS)設(shè)置為輸出

//RTC_CS_DDRI=BIT(RTC_CS);

)

函數(shù)名稱:DS1302_writeB

功能:向DS13()2寫入一個(gè)字節(jié)數(shù)據(jù)(沒有RST操作)

參數(shù):byte-要寫入的數(shù)據(jù)

返回值:無

voidDS1302_writeB(ucharbyte)

uchari;

for(i=0;i<8;i++)〃8位數(shù)據(jù)計(jì)數(shù)

(

RTC_PORT&=~BIT(RTC_CLK);〃拉低時(shí)鐘端

if(byte&0x01)//當(dāng)前位是否是1

(

RTC_PORTI=BIT(RTC_DATA);//當(dāng)前位是1,拉高數(shù)據(jù)端

1

else

(

RTC_PORT&=~BIT(RTC_DATA);〃當(dāng)前位是0,拉低數(shù)據(jù)端

)

Delayus(lO);〃調(diào)整時(shí)鐘和脈沖寬度

RTC_PORTI=BIT(RTC_CLK);//時(shí)鐘上升沿(DS1302采樣數(shù)據(jù))

byte?=l;〃數(shù)據(jù)右移1位,為送出新數(shù)據(jù)位做準(zhǔn)備

函數(shù)名稱:DS1302_readB

功能:從DS1302讀出一個(gè)字節(jié)數(shù)據(jù)(沒有RST操作)

參數(shù):無

返回值:byte--讀出的數(shù)據(jù)

ucharDS1302_readB(void)

{

uchari,byte=O;

RTC_DDR&=~BIT(RTC_DATA);〃將數(shù)據(jù)端口設(shè)置為輸入

RTC_PORT&=~BIT(RTC_DATA);〃無上拉電阻

for(i=0;i<8;i++)〃8位數(shù)據(jù)計(jì)數(shù)

(

byte?=l;//保存讀入的數(shù)據(jù)位

RTC_PORTI=BIT(RTC_CLK);//時(shí)鐘上升沿

Delayus(lO);〃延時(shí),調(diào)整時(shí)鐘脈沖寬度

RTC_PORT&=~BIT(RTC_CLK);〃時(shí)鐘下降沿,DS1302輸出數(shù)據(jù)位

Delayus(lO);//等待數(shù)據(jù)變化(MEGA16太快,必須等待DS1302的數(shù)據(jù)位

輸出,否則不能正確讀出)

if(RTC_PIN&BIT(RTC_DATA))//當(dāng)前位是否是高電平

(

bytel=BIT(RTC_CLK);〃是高電平就將返回?cái)?shù)據(jù)的當(dāng)前位置1

)

else

byte&=-BIT(RTC_CLK);〃是低電平就將返回?cái)?shù)據(jù)的當(dāng)前位置0

I

RTC_DDRI=BIT(RTC_DATA);〃最后將數(shù)據(jù)端口設(shè)置為輸出

returnbyte;〃返回讀出的數(shù)據(jù)

函數(shù)名稱:DS1302_writeD

功能:向DS1302的某個(gè)地址寫入一個(gè)字節(jié)數(shù)據(jù)

參數(shù):addi地址值(寄存器或RAM)

data-要寫入的地址

返回值:無

voidDS1302_writeD(ucharaddr.uchardata)

RTC_CS_PORT&=~BIT(RTC_CS);〃拉低片選端

RTC_PORT&=~BIT(RTC_CLK);〃拉低時(shí)鐘端

Delayus(lO);

RTC_CS_PORT1=BIT(RTC_CS);〃拉高片選端

Delayus(lO);〃調(diào)整片選脈沖

DS1302_writeB(addr);〃寫入操作命令(地址:)

Delayus(lO);

RTC_PORT&=~BIT(RTC_CLK);〃拉低時(shí)鐘端

Delayus(lO);

DS1302_writeB(data);〃寫入數(shù)據(jù)

RTC_PORT&=~BIT(RTC_CLK);〃拉低時(shí)鐘端

Delayus(lO);〃調(diào)整片選脈沖

RTC_CS_PORT&=~BIT(RTC_CS);//拉低片選端

)

函數(shù)名稱:DS1302_readD

功能:從DS1302的某個(gè)地址讀出一個(gè)字節(jié)數(shù)據(jù)

參數(shù):addr-地址值(寄存器或RAM)

返回值:data--讀出的數(shù)據(jù)

ucharDS1302_readD(ucharaddr)

(

uchardata;

RTC_CS_PORT&=~BIT(RTC_CS);〃拉低片?選端

RTC_PORT&=~BIT(RTC_CLK);//拉低時(shí)鐘端

Dclayus(lO);

RTC_CS_PORTI=BIT(RTC_CS);//拉高片選端

Delayus(lO);〃調(diào)整片選脈沖

DS1302_writeB(addr);〃寫入操作命令(地址)

Delayus(lO);

data=DS1302_readB();〃讀出數(shù)據(jù)

Delayus(lO);

RTC_PORT&=~BIT(RTC_CLK);//拉低時(shí)鐘端

RTC_CS_PORT&=~BIT(RTC_CS);〃拉低片選端

returndata;〃返回讀111的數(shù)據(jù)

}

函數(shù)名稱:DS13O2_setT

功能:設(shè)置DS1302的時(shí)間

參數(shù):ptTimeD-設(shè)置時(shí)間數(shù)組指針

返回值:無

voidDS1302_setT(ucharptTimeD[])

(

uchari;

ucharaddr=0x80;//寫入地址從秒寄存器開始

DS1302_writeD(C_WPlWR,UPROTECT);〃控制命令,WP位為0,允許寫操作

Delayms⑸;

for(i=0;i<7;i++)

(

DS1302_writeD(addrlWR,ptTimeD[i]);//秒分時(shí)日月星期年

addr+=2;

Delayms(l);

)

DS1302_writeD(C_WPIWR,PROTECT);〃控制命令,WP位為1,不允許寫操作

}

函數(shù)名稱:DS1302_getT

功能:讀取DS1302的當(dāng)前時(shí)間

參數(shù):time口-讀取的時(shí)間數(shù)組

返回值:無

voidDS1302_getT(uchartime口)

{

uchari;

/〃〃〃/下面的是單次讀寫///〃〃〃//〃/〃///〃〃///

/*ucharaddr=0x80;〃讀取地址從秒寄存器開始

for(i=();i<7;i++)

(

time[i]=DS1302_readD(addrlRD);〃秒分時(shí)日月星期年

addr+=2;

}*/

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

/////////卜.而是多字節(jié)讀取///////〃////〃

RTC_CS_PORT&=~BIT(RTC_CS);//拉低片選端

Delayus(lO);

RTC_CS_PORTI=BIT(RTC_CS);//拉高片選端

Delayus(lO);〃調(diào)整片選脈沖

DS1302_writeB(0xbf);//Oxbf:時(shí)鐘多字節(jié)讀取命令

for(i=0;i<8;i++)//時(shí)間數(shù)據(jù)的存放格式是:

//秒,分,時(shí),日,月,星期,年,控制

time[il=DS1302_readB();//【7個(gè)數(shù)據(jù)(BCD格式)+1個(gè)控制】

RTC_CS_PORT&=-B1T(RTC_CS);〃拉彳氐片選端

RTC_PORT&=~B1T(RTC_CLK);//拉低時(shí)鐘端(時(shí)鐘端在不操作時(shí)為

低)

函數(shù)名稱:DS1302_check

功能:檢測(cè)DS1302是否正常工作

參數(shù):無

返回值:exist-為TRUE為檢測(cè)到DS1302,為FALSE為沒檢測(cè)到

ucharDS1302_check(void)

ucharexist;

DS1302_writeD(C_WPIWR,UPROTECT);〃寫入寫允許命令

DS1302_writeD(C_RAMBASEIWR,0xA5);//RAM0寫入0xA5

exist=DS1302_readD(C_RAMBASEIRD);〃讀取RAM0

if(exist==0xA5)

exist=TRUE;〃如果讀取值與寫入值相等,返回TRUE

)

else

exist=FALSE;〃如果讀取值與寫入值不相等,返回FALSE

)

returnexist;

)

函數(shù)名稱:DS1302_init

功能:初始化DS1302

參數(shù):無

返回值:無

voidDS1302_init(void)

DS1302_writeD(C_WPIWR,UPROTECT);〃寫入寫允許命令

DS1302_writeD(C_SECIWR,CLK_START);〃啟動(dòng)振蕩器,DS1302開始工作

DS1302_writeD(C_WPIWR,PROTECT);〃控制命令,WP位為1,不允許寫操作

函數(shù)名稱:BCD_ASCI1

功能:將壓縮BCD碼轉(zhuǎn)換成ascii碼

參數(shù):BCD-將要轉(zhuǎn)換的壓縮BCD碼

ptasc-轉(zhuǎn)換后的ASCH碼數(shù)組指針

返回值:無

voidBCD_ASCII(ucharBCD.ucharptasc[])

ptasc[O]=BCD/16IOx3O;//0X583538〃轉(zhuǎn)換十位

ptasc[1]=BCD&0x0FI0x30;〃轉(zhuǎn)換個(gè)位

函數(shù)名稱:ASCILBCD

功能:將ascii碼轉(zhuǎn)換成壓縮BCD碼

參數(shù):

返回值:無

ucharASCII_BCD(ucharLCDstrh,ucharLCDstrl)

ucharLCDstr=(LCDstrh*16)1(LCDstrl&OxOf);

returnLCDstr;

)

函數(shù)名稱:Get_change

功能:將輸入的時(shí)間數(shù)據(jù)匹配成getlime數(shù)組中的形式

參數(shù):LCDstr,gettime

返回值:無

voidGet_change(uchar*time,uchar*LCDstr)

(

uchari,asc[2];

for(i=();i<3;i++)

(

BCD_ASCII(time[2-i],asc);

LCDstr(7+i*2]=asc[0];

LCDstr[8+i*2]=asc[l];

)

BCD_ASCII(time[6],asc);

LCDstr[0]=ascf01;

LCDstr[l]=asc[l];

BCD_ASCII(time[4],asc);

LCDstr[2]=asc[0];

LCDstr[3]=asc[l];

BCD_ASCII(time[3],asc);

LCDstr[4]=asc[0];

LCDstr[5]=asc[l];

BCD_ASCH(time[5],asc);

LCDstr[6]=asc[l];

)

函數(shù)名稱:Input_change(LCDstr,gettime)

功能:將輸入的時(shí)間數(shù)據(jù)匹配成gettime數(shù)組中的形式

參數(shù):LCDstr,gettime

返回值:無

voidInput_change(uchar*LCDstr,uchar*gettime)

(

uchari,week;

uintday,month,year;

for(i=0;i<13;i++)

(

switch(LCDstr[i])

(

caseT:

LCDstr[i]=0x01;

break;

case2:

LCDstrli]=0x02;

break;

case3':

LCDslr[i]=0x03;

break;

case'4':

LCDstr[iJ=0x04;

break;

case5:

LCDstrfi]=0x05;

break;

case6:

LCDstrli]=0x06;

break;

case7:

LCDstrfi]=0x07;

break;

case8:

LCDstr[i]=0x08;

break;

case'9":

LCDstr[i]=0x09;

break;

caseO:

LCDstr[i]=0x00;

break;

)

)

gettime[0]=ASCII_BCD(LCDstr[11],LCDstr[12]);

gettime[l]=ASCII_BCD(LCDstr[9],LCDstr[10]);

gettime[2]=ASCII_BCD(LCDstr[7],LCDstr[8]);

geltime[3]=ASCII_BCD(LCDstr[4],LCDstr[5]);

gettime[4]=ASCII_BCD(LCDstr[2],LCDstr[3]);

gettime[5]=LCDstr[6];

gettime[6]=ASCII_BCD(LCDstr[()],LCDstr[1]);

day=(gettime[3]&0xF0)/16*10+(gettime[3]&()x()F);

month=(gettime[4]&0xF0)/l6*10+(gettime[4]&0x0F);

year=(gettime[6]&0xF0)/16*10+(gettime[6]&0x0F);

week=(day+2*month+3*(month+1)/5+year+

year/4-year/100+year/400)%7+1;

gettime[51=(week%10)&0x0F;

)

函數(shù)名稱:Noisein_change

功能:將輸入的時(shí)間數(shù)據(jù)匹配成gellime數(shù)組中的形式

參數(shù):LCDstr,gettime

返回值:無

voidNoisein_change(uchar*LCDstr,uchar*time)

(

uchari;

for(i=();i<13;i++)

(

switch(LCDstr[i])

(

case*r:

LCDstr[i]=0x01;

break;

case'2':

LCDstr[i]=0x02;

break;

case3:

LCDstr[i]=0x03;

break;

case4:

LCDstr[i]=0x04;

break;

case'5':

LCDstr[i]=0x05;

break;

case6:

LCDstr[i]=0x06;

break;

case7':

LCDslr[i]=0x07;

break;

case8:

LCDstr[i]=0x08;

break;

case9:

LCDstr[i]=0x09;

break;

caseO:

LCDstr[iJ=0x00;

break;

time[0]=ASCII_BCD(LCDstr[4],LCDstr[5]);

=ASCII_BCD(LCDstr[2],LCDstr[3]);

time[2J=ASCII_BCD(LCDstr[O],LCDstrl1J);

函數(shù)名稱:Disp_time

功能:在1602液晶上顯示當(dāng)前時(shí)間(第】行格式:年-月一日星期;第2行格式:時(shí)-分-秒)

參數(shù):time口-時(shí)間數(shù)組

返回值:無

//#defineLCDa_RSPCO〃定義三個(gè)控制引腳

//#defineLCDa_RWPCI

//#defineLCDa_EPC6

voidwrite_com(ucharcom)

PORTC&=-BIT(0);

PORTC&=-BIT(1);

PORTA=com;

PORTCI=BIT(6);

Delayus(lO);

PORTC&=-BIT(6);

voidwrite_date(uchardate)

(

PORTCI=BIT(0);

PORTC&=-BIT(1);

PORTA=dale;

PORTCI=B1T(6);

Delayus(lO);

PORTC&二?BIT(6);

voidDisp_time(ucharlime[])

(

uchari,asc[2];

ucharlinel[]={O,O,'-',O,O,'-',O,O;V';';顯示第1行的字符數(shù)組

ucharline2[9]={0,0;:1,0,0,':',0,0,1\0'};〃顯示第2行的字符數(shù)組

write_com(()x4());〃自定義字符寫ACGRAM

BCD_ASClI(timel6],asc);〃為第1行的年賦值

linel[O]=asc[()];

linel[l]=asc[l];

BCD_ASCII(time[4],asc);〃為第1行的月賦值

linelf3]=asc[O];

linel[4]=ascllj;

BCD_ASCII(time[3],asc);〃為第1行的日賦值

linel[6]=asc[0];

linel[7]=asc[ll;

s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論