MSP430-電子萬年歷_第1頁
MSP430-電子萬年歷_第2頁
MSP430-電子萬年歷_第3頁
MSP430-電子萬年歷_第4頁
MSP430-電子萬年歷_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、-作者xxxx-日期xxxxMSP430-電子萬年歷【精品文檔】目 錄1. 系統(tǒng)總體設(shè)計11.1 功能說明11.2 任務(wù)分配情況21.3 系統(tǒng)工作流程232.1 MSP430F5438A芯片簡介34 4 2.2.2 矩陣鍵盤實物圖4 2.2.3 矩陣鍵盤與MSP430F5438A接口電路42.3 液晶12864模塊52.3.1 液晶介紹562.4 DS1302實時時鐘芯片模塊62.4.1 DS1302實時時鐘芯片簡介62.4.2 DS1302實時時鐘芯片實物圖72.4.3 DS1302實時時鐘芯片與MSP430F5438A接口電路72.4.4 SPI協(xié)議簡介82.5 DS18B20溫度芯片模塊

2、82.5.1 DS18B20溫度芯片簡介82.5.2 DS18B20溫度芯片實物圖92.5.3 DS18B20溫度芯片與MSP430F5438A接口電路92.5.4 單總線協(xié)議簡介103. 軟件設(shè)計113.1 系統(tǒng)總體設(shè)計113.1.1 系統(tǒng)流程圖113.2 矩陣鍵盤模塊123.2.1 按鍵進入修改界面123.2.2 按鍵選擇修改內(nèi)容123.2.3 按鍵修改時間143.3 液晶模塊143.4 DS1302實時時鐘芯片模塊163.4.1 DS1302的初始化163.4.2 DS1302的讀寫16 DS18B20溫度芯片模塊173.5.1 DS18B20初始化173.5.2 DS18B20寫操作1

3、83.5.3 DS18B20讀操作183.6 芯片值轉(zhuǎn)化為顯示值模塊20214.1 整體圖21215. 缺陷與調(diào)試2525256. 實驗心得267. 附錄30【精品文檔】1. 系統(tǒng)總體設(shè)計1.1 功能說明 本次課程設(shè)計的要求是制作一個電子萬年歷,要求在顯示屏上顯示年、月、日、時、分、秒、周、溫度等信息,并且能夠自行修改相關(guān)信息,且在修改信息時時鐘停振。根據(jù)要求所設(shè)計的系統(tǒng)的總體框架如圖1所示: 矩陣鍵盤 MSP430F5338A DS1302 12864 DS18B20 時鐘芯片 顯示屏 溫度芯片 圖1 系統(tǒng)總體框架圖 1、單片機最小系統(tǒng)要求系統(tǒng)設(shè)計使用Texas Instrument公司的M

4、SP430F5438A單片機作為系統(tǒng)的核心控制器。2、時鐘芯片DS1302DS1302是dallas公司推出的一種高性能、定功耗的實時時鐘芯片,內(nèi)含一個實時時鐘和31字節(jié)的靜態(tài)RAM,采用SPI三線接口與CPU通信。3、 溫度芯片DS18B20DS18B20的數(shù)字溫度計提供9位到12位的攝氏溫度測量,并具有報警功 能,DS18B20通過定義僅需要一個數(shù)據(jù)線(和地面)與中央微處理器通信。它的工作范圍為-55C至+ 125C,在-10C至+ 85C的范圍內(nèi)精確到。4、矩陣鍵盤使用4*3的矩陣鍵盤,可以通過矩陣鍵盤得到09的數(shù)字也可以生成“*”和“#”,用戶可通過顯示屏與矩陣鍵盤對DS1302的時間

5、進行自定義修改。5、液晶屏12864 液晶屏為128*64點陣屏幕,在液晶上顯示時間和溫度信息,用戶可以通過顯示屏查看時間和溫度,并根據(jù)提示對DS1302內(nèi)時間進行修改。 1.2 任務(wù)分配情況1.3 系統(tǒng)工作流程單片機開機后(第一次開機會對DS1302初始化賦初值),會在顯示屏上顯示從DS1302中讀取的時間信息和從DS18B20中讀出的溫度信息,在不對矩陣鍵盤進行操作的情況下,系統(tǒng)正常讀取時間和溫度顯示。當(dāng)需要修改時間信息時,按對應(yīng)鍵進入修改界面,進入修改后,DS1302停止工作,通過矩陣鍵盤選擇所要修改的內(nèi)容,修改完成后將修改值存入DS1302,修改完成,使DS1302繼續(xù)工作,退回顯示時

6、間和溫度的界面。2.硬件設(shè)計此次課設(shè)課題中硬件部分的選取與設(shè)計主要包含以下模塊:MSP430F5438A單片機,液晶屏12864,4*3矩陣鍵盤,DS1302時鐘芯片,DS18B20溫度芯片,若干連接線。2.1 MSP430F5438A芯片簡介MSP430系列單片機是美國德州儀器(TI)1996年開始推向市場的一種16位超低功耗、具有精簡指令集(RISC)的混合信號處理器(Mixed Signal Processor)。稱之為混合信號處理器,是由于其針對實際應(yīng)用需求,將多個不同功能的模擬電路、數(shù)字電路模塊和微處理器集成在一個芯片上,以提供“單片機”解決方案。該系列單片機多應(yīng)用于需要電池供電的便

7、攜式儀器儀表中。在超低功耗方面,其處理器功耗()和口線輸入漏電流(最大50nA)在業(yè)界都是最低的,在運算性能上,指令速度可以達到16MIPS,在開發(fā)工具上,支持最先進的JTAG調(diào)制,在系統(tǒng)整合方面,根據(jù)其不同產(chǎn)品,集成了許多功能模塊,性能穩(wěn)定,可靠性高。MSP430F5438A主要性能參數(shù):(1)高達25MHz的CPU速度。(2)1.8-3.6V工作電壓。(3)高達256KB的閃存。(4)高達18KB的RAM。(5)獨特的USB開發(fā)套件。(6)超低功耗5us之內(nèi)快速從待機模式喚醒。圖2 MSP430F5438A單片機實物圖模塊2.2.1矩陣鍵盤介紹矩陣鍵盤將鍵盤以矩陣形式排列,本次課設(shè)使用的是

8、4*3矩陣鍵盤,4行3列,用來修改時間,如圖3所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接,將按鍵當(dāng)作一個開關(guān),以行掃描為例,在矩陣鍵盤函數(shù)中會對四行不斷進行掃描,直到有按鍵按下后(掃描到對應(yīng)行時),該鍵即可導(dǎo)通,從而使單片機收到按鍵信息。2.2.2 矩陣鍵盤實物圖 圖3 矩陣鍵盤實物圖2.2.3 矩陣鍵盤與MSP430F5438A接口電路圖4 矩陣鍵盤電路接口 矩陣鍵盤每一列分別于單片機的P2.4P2.6相連,每行分別于單片機的P2.0P2.3相連。2.3 液晶12864模塊2.3.1 液晶介紹12864漢字圖形點陣液晶顯示模塊,可顯示漢字及圖形。其主

9、要特征有如下幾點: (1)顯示分辨率:128*64 (2)內(nèi)置漢字字庫,提供8192個16*16點陣漢字 (3)內(nèi)置128個8*16點陣字符 (4)通信方式:串口、并口 (5)低電源電壓(35.5V) (6)工作溫度:055度 圖5 12864液晶的引腳圖 本次的課程設(shè)計使用的液晶屏是12864。具有8位并行和3線串行連接方式,內(nèi)部含有簡體中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為12864,內(nèi)置8192個16*16點陣的中文漢字,和128個8*16點陣的字符,可以顯示4行8列16*16點陣的漢字,也可完成圖形顯示,具有光標(biāo)顯示、畫面移位、自定義字符、睡眠模式等功能,操作簡單。2.3.2液

10、晶與MSP430F5438A接口電路圖6 12864與單片機的接口電路液晶的DB0-DB7與P4.0P4.7是數(shù)據(jù)線,RS與P3.2相連,RW與P3.3相連,EN與P3.6相連,RST與P3.7相連,PSB與P3.0相連,置高,表示并行。2.4 DS1302實時時鐘芯片模塊2.4.1 DS1302實時時鐘芯片簡介DS1302是DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,內(nèi)含一個實時時鐘/日歷和31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU通信。 (1)DS1302實時時鐘具有能計算2100年之前的秒、分、時、日、日期、星期、月、年的能力,還有閏年調(diào)整的能力。 (2)內(nèi)部含有31個字

11、節(jié)靜態(tài)RAM,可提供用戶訪問。 (3)采用串行數(shù)據(jù)傳送方式,使得管腳數(shù)量最少,簡單SPI 3線接口。 (4)工作電壓范圍寬:2.05.5V。 (5)工作電流:2.0V時,小于300nA。 (6)時鐘或RAM數(shù)據(jù)的讀/寫有兩種傳送方式:單字節(jié)傳送和多字節(jié)傳送方式。 (7)采用8腳DIP封裝或SOIC封裝。 (8)與TTL兼容,Vcc=5V。 (9)可選工業(yè)級溫度范圍:-40C+85C。 (10)具有涓流充電能力。 (11)采用主電源和備份電源雙電源供應(yīng)。 (12)備份電源可由電池或大容量電容實現(xiàn)。圖7 DS1302芯片的引腳圖2.4.2 DS1302實時時鐘芯片實物圖圖8 DS1302芯片實物圖

12、2.4.3 DS1302實時時鐘芯片與MSP430F5438A接口電路 DS1302與單片機的連接僅需要3條線:時鐘線SCLK、數(shù)據(jù)線I/O和復(fù)位線 RST。連接圖如下圖。時鐘線SCLK與P6.7相連,數(shù)據(jù)線I/O與P6.6相連,復(fù)位線 RST與P6.5相連,x1和x2之間連接了一個基頻為32768HZ的外部晶振,GND接地,Vcc1為備用電源,Vcc2接單片機上3V電壓。圖9 DS1302接口電路圖2.4.4 SPI協(xié)議簡介SPI 總線是Motorola公司推出的三線同步接口,同步串行3線方式進行通信:一條時鐘線SCK,一條數(shù)據(jù)輸入線MOSI,一條數(shù)據(jù)輸出線MISO;用于CPU與各種外圍器件

13、進行全雙工、同步串行通訊。SPI主要特點有:可以同時發(fā)出和接收串行數(shù)據(jù);可以當(dāng)作主機或從機工作;提供頻率可編程時鐘;發(fā)送結(jié)束中斷標(biāo)志;寫沖突保護;總線競爭保護等。2.5 DS18B20溫度芯片模塊2.5.1 DS18B20溫度芯片簡介圖10 DS18B20芯片圖該芯片僅需一個端口引腳進行通信,每個器件有唯一的64位的序列號存儲在存儲器中,高速暫存器中含有兩個字節(jié)的溫度寄存器,這兩個寄存器用來存儲溫度傳感器輸出的數(shù)據(jù),除此之外,高速暫存器提供一個直接的溫度報警值寄存器(TH和TL),和一個字節(jié)的配置寄存器,它們是非易失性的可擦除程序寄存器(EEPROM),所以存儲的數(shù)據(jù)在器件掉電時不會消失??赏?/p>

14、過數(shù)據(jù)線供電,供電范圍為3.0V到5.5V,測溫范圍為-55到+125,在-10到+85范圍內(nèi)精確度為5。溫度計分辨率可以被使用者選擇為9-12位,DS18B20芯片圖如圖9所示。GND:電源地。VDD:電源引腳。DQ:數(shù)據(jù)I/O。2.5.2 DS18B20溫度芯片實物圖 圖11 DS18B20芯片實物圖2.5.3 DS18B20溫度芯片與MSP430F5438A接口電路圖12 DS18B20接口電路圖(1)DS18B20的VDD接單片機的電源(),GND接地,DQ為數(shù)據(jù)接口,負責(zé)發(fā)送和接收數(shù)據(jù)。(2增量遞增。在上電狀態(tài)下默認的精度為12位。(3)DS18B20啟動后保持低功耗等待狀態(tài);當(dāng)需要

15、執(zhí)行溫度測量和AD轉(zhuǎn)換時,總線控制器必須發(fā)出44h命令。在那之后,產(chǎn)生的溫度數(shù)據(jù)以兩個字節(jié)的形式被存儲到高速暫存器的溫度寄存器中,DS18B20繼續(xù)保持等待狀態(tài)。當(dāng)DS18B20由外部電源供電時,總線控制器在溫度轉(zhuǎn)換指令之后發(fā)起“讀時序”,DS18B20正在溫度轉(zhuǎn)換中返回0,轉(zhuǎn)換結(jié)束返回1。如果DS18B20由寄生電源供電,除非在進入溫度轉(zhuǎn)換時總線被一個強上拉拉高,否則將不會由返回值。(4)VDD連接5V電壓,GND接地,DQ連接P6.0。(5)DS18B20儲存器如圖13所示,位0和位1為測得溫度信息的LSB和MSB。這兩個字節(jié)是只讀的。第2和第3字節(jié)是TH和TL的拷貝。位4包含配置寄存器數(shù)

16、據(jù)。位5,6和7被器件保留,禁止寫入;這些數(shù)據(jù)在讀回時全部表現(xiàn)為邏輯1。所以當(dāng)讀取溫度時,需要連續(xù)讀取兩次(位0和位1)才能將溫度信息完全讀出。圖13 DS18B20存儲器圖2.5.4 單總線協(xié)議簡介DS18B20通過達拉斯公司獨有的單總線協(xié)議依靠一個單線端口通訊。當(dāng)全部器件經(jīng)由一個3態(tài)端口或者漏極開路端口(DQ引腳在DS18B20上的情況下)與總線連接的時候,控制線需要連接一個弱上拉電阻。在這個總線系統(tǒng)中,微控制器(主器件)依靠每個器件獨有的64位片序列號辨認總線上的器件和記錄總線上的器件地址。由于每個裝置有一個獨特的片序列碼,總線可以連接的器件數(shù)目事實上是無限的。3. 軟件設(shè)計3.1 系統(tǒng)

17、總體設(shè)計課設(shè)中單片機連接顯示屏12864、實時時鐘芯片DS1302、溫控芯片DS18B20以及矩陣鍵盤,在正常情況下矩陣鍵盤不工作,單片機從DS1302和DS18B20中讀取相應(yīng)信息并顯示在顯示屏12864上,具體讀寫代碼在附錄中有詳細說明,當(dāng)需要修改時間時,矩陣鍵盤開始工作。按矩陣鍵盤“0”鍵進入修改界面,選擇要修改的內(nèi)容(年、月、日、時、分、秒、周),修改過程中DS1302停振(通過將秒寄存器中的最高位CH置1使其停振),DS18B20正常工作。選擇修改內(nèi)容時,每一個鍵盤值對應(yīng)修改一個內(nèi)容(其中一個鍵代表退出),選擇后即可進入修改,修改后,將修改內(nèi)容發(fā)送給DS1302,最后退出修改界面,正

18、常顯示時間和溫度。3.1.1 系統(tǒng)流程圖開始存入 DS1302MSP430F5438A單片機12864顯示時間、溫度DS18B20 “0”鍵是否按下? 否 是進入界面,判斷鍵值? 1-7鍵 其他鍵 #鍵無操作進入對應(yīng)修改退出圖 14 系統(tǒng)流程圖單片機在未收到矩陣鍵盤信號時,只是讀取DS1302和DS18B20的時間和溫度信息并在12864上進行顯示,當(dāng)有“0”按鍵按下時,進入按鍵中斷,1-7號按鍵分別對應(yīng)年、周、月、日、時、分、秒的修改,“#”為退出修改,修改時間時,DS1302停止工作,時間修改結(jié)束后從上一次進入中斷的時間開始運行。3.2 矩陣鍵盤模塊 3.2.1 按鍵進入修改界面 if(P

19、2IFG!= 0X00) delay_ms(30); if(P2IFG!= 0X00) _EINT(); 1、首先要進行按鍵進行修改界面的部分,由于程序采用按鍵中斷,所以在判斷時沒有進行掃描,而是直接判斷終端標(biāo)志位,當(dāng)有按鍵按下時,P2IFG將不等于0X00,以此判斷出有按鍵按下,所以按下任意鍵都可以進入修改程序,但在本程序中,在液晶屏上顯示為按“0”鍵進入修改,原因是本次課設(shè)矩陣鍵盤不太靈敏,1-7鍵在進入修改界面后都有選擇修改內(nèi)容的作用,而“0”鍵在進入修改界面后不再做功能鍵使用,即使出現(xiàn)消抖不到位的情況也不會對修改產(chǎn)生影響。2、在確認有鍵按下后,進入中斷,DS1302停振,進入修改界面,

20、屏幕上顯示供給用戶修改的選擇。3.2.2 按鍵選擇修改內(nèi)容#pragma vector=PORT2_VECTOR _interrupt void Port2(void) /進入中斷 . do change_disp(); /修改界面 delayms(50); key2(); /key2用來取數(shù)值,選擇對應(yīng)修改內(nèi)容 while(j); /j初始化為1,當(dāng)取到鍵值后變?yōu)?.1、 進入修改界面后,用戶可以選擇修改內(nèi)容(1.年、2.周、3.月、4.日、5.時、6.分、7.秒、#.退出),key2函數(shù)就是用來選擇這些功能。變量j初始化為1,一直進行循環(huán),當(dāng)在循環(huán)時有按鍵按下時進入key2函數(shù),對矩陣鍵盤

21、進行行掃描(0XFE、0XFD、0XFB、0XF7),當(dāng)按鍵按下時,對應(yīng)按鍵的開關(guān)被打開(由列控制),當(dāng)行掃描掃到時,按鍵出形成通路,相應(yīng)的按鍵信息將發(fā)送給單片機,按鍵成功。2、 key2函數(shù)中,不同鍵值實質(zhì)代表不同的s值,s是選擇修改哪種信息的變量,鍵盤值1-7代表s值1-7;而s值(1-7)分別代表進入年、周、月、日、時、分、秒修改,s值為11時表示按下為“#”鍵,意為退出修改。當(dāng)按鍵成功后,將j置為0,表示跳出當(dāng)前DO-WHILE循環(huán),程序繼續(xù)向下執(zhí)行。_interrupt void Port2(void). if(s=1) /s=1時修改年 change_year(); . if(s=

22、7) /s=7時修改秒 change_second(); if(s=11) /s=11時退出修改 P2IFG= 0X00; lcd_clr(); if(s!=7) /如果修改的不是秒,則將中斷前的秒還原/這是將之前時鐘停振進行復(fù)原的操作 TIME0=TIME10; Ds1302Init(); . 3、該段為選擇修改內(nèi)容的部分,鍵值1-7在上一階段已經(jīng)介紹,當(dāng)s=11時意為按下“#”鍵,退出修改界面,回到主界面。4、最后if(s!=7) TIME0=TIME10;意為假如用戶之前修改的內(nèi)容不是秒,則修改完成后,時鐘恢復(fù)運轉(zhuǎn)后將秒數(shù)還原成停振時的秒數(shù),也就是滿足題目要求的修改過程中時鐘停振的要求(

23、TIME10是暫存停振前秒數(shù)的數(shù)組,TIME0是用來存儲時間信息的數(shù)組),如果修改的是秒(s=7),則停振后秒數(shù)已經(jīng)發(fā)生改變,所以不用進行此操作(秒數(shù)已經(jīng)有了新值),但并不影響時鐘恢復(fù)工作(因為正常的秒數(shù)為0-59,CH位為0)。3.2.3 按鍵修改時間key1(): 鍵入個位內(nèi)容函數(shù)key0(): 鍵入十位內(nèi)容函數(shù)1、當(dāng)進入修改時間函數(shù)后(如change_year().change_second()),用key1()和key0()函數(shù)分別鍵入所要修改值的個位和十位,根據(jù)我們平時的習(xí)慣,我們一般先輸入十位,再輸入個位,所以先調(diào)用key0()函數(shù),再調(diào)用key1()函數(shù),矩陣鍵盤掃描原理與之前相

24、同。假設(shè)我們要輸入的年份為16年,則調(diào)用key0()函數(shù)時,按下按鍵“1”,得到p=0X10,然后調(diào)用key1()函數(shù),按下鍵“6”,得到h=0X06,然后通過q=h|p,得到BCD碼0X16,寫入DS1302中,修改成功。3.3 液晶模塊 電子萬年歷中,液晶的作用是顯示時間和溫度,以及給用戶提供修改的顯示界面,顯示用戶修改的信息。顯示功能在之前的實驗中已經(jīng)多次涉及,只需要注意漢字為16X16的點陣,一個屏幕上只能顯示4X8個漢字即可,用數(shù)組存儲漢字,通過for循環(huán)將所需要顯示的相關(guān)信息讀出。需要注意的是在修改時間的時候,輸入的時間需要顯示在屏幕上,且輸入的數(shù)字要實時顯示在屏幕上,以修改年為例

25、:void change_year() . dis16= 0xd6,0xd0+12,0xc9,0xe0+8,0xd6,0xc0+3,0,0,0,0,0,0,0,0,0; Lcd_WriteCmd(0x90); for(int i=0;i4; dis7=askiitemp1; while(u=1); Lcd_WriteData(dis6); Lcd_WriteData(dis7); do u=1; key1(); temp2=h&0x0f; dis8=askiitemp2; while(u=1); Lcd_WriteData(dis8); delayms(1000); .在未按鍵輸入的時候先顯示

26、“設(shè)置年”三個字,然后掃描鍵盤,當(dāng)輸入了數(shù)字后,將第一個數(shù)字存入dis7中(前六個存了設(shè)置年三個字),然后顯示在屏幕上,然后繼續(xù)掃描,將輸入的按鍵存在dis8中,然后進行顯示,延時一秒后返回初始界面。其他相關(guān)函數(shù):void WaitBusy(void) /延時一小段時間,等待LCD空閑void lcd_clr(void) /清除LCD的顯示內(nèi)容void Lcd_WriteCmd(uchar cmdcode) /寫指令void Lcd_WriteData(uchar dispdata) /寫數(shù)據(jù)void Lcd_Init() /初始化LCDvoid hanzi_Disp() /初始界面void

27、change_disp() /修改時間界面3.4 DS1302實時時鐘芯片模塊首先要對DS1302的各個寄存器進行操作,那就要熟悉它的控制寄存器,控制寄存器用于存放DS1302的控制命令字,DS1302的RST引腳回到高電平后寫入的第一個字就為控制命令。它用于對DS1302讀寫過程進行控制,它的格式如下:表2 DS1302的控制命令的格式D7D6D5D4D3D2D1D01RAM/CKA4A3A2A1A0R/W3.4.1 DS1302的初始化1、首先要注意的是秒寄存器D7位的CH,該位如果置1的話,時鐘就會停振,進入低功耗模式,所以在初始化該寄存器時注意該位不能置1.2、所謂初始化也就是對DS1

28、302各個寄存器進行寫操作,將你要顯示的值寫進DS1302中,接下來就是要對DS1302各個寄存器進行寫操作,做這一步之前首先要將寫保護寄存器的寫保護位去掉,也就是將該寄存器的值改為0x80,因為不去掉寫保護位的話就不能對DS1302各個寄存器進行寫操作。3、接下來就是確定好寫操作模式,是單字節(jié)寫還是突發(fā)模式寫,本次課設(shè)我采用的方式是突發(fā)模式寫,所謂突發(fā)模式寫就是一次性對8個特殊寄存器進行寫操作。用TIME7保存著特殊寄存器的值,其中TIME7 = 0x40, 0x12, 0x17, 0x16, 0x11, 0x01, 0x15;然后在利用Ds1302Init()函數(shù)對7個寄存器進行突發(fā)寫模式

29、。4、寫完之后再將寫保護加上。3.4.2 DS1302的讀寫圖15 DS1302讀寫時序圖1、 DS1302的寫過程,先要從單片機發(fā)送八個字節(jié)的寫指令(地址),然后接著發(fā)送寫的數(shù)據(jù),如Ds1302Write(0x80,0x80);前一個0x80代表指令,后一個0x80代表數(shù)據(jù)。2、 DS1302的讀過程,要先從單片機發(fā)送八個字節(jié)的指令,告訴DS1302要讀的地址是什么,然后單片機做輸入,接受DS1302傳送過來的數(shù)據(jù),讀過程完成。3、 寫進去的值是以二進制的BCD碼存儲在DS1302中的,要將該值取出其實很簡單,就以0x56為例,它就代表著十進制的56,要取出十位5,只要(0x564)就可以了

30、,要取出各位就只需(0x56 & 0x0f)就可以了。3.5 DS18B20溫度芯片模塊3.5.1 DS18B20初始化圖 16 DS18B20初始化過程圖主機首先發(fā)出一個480960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖?,并在隨后的480微秒時間內(nèi)對總線進行檢測,如果有低電平出現(xiàn)說明總線上有器件已做出應(yīng)答。若無低電平出現(xiàn)一直都是高電平說明總線上無器件應(yīng)答。做為從器件的DS18B20在一上電后就一直在檢測總線上是否有480960微秒的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待1560微秒后將總線電平拉低60240微秒做出響應(yīng)存在脈沖,告訴主機本器件已做好準(zhǔn)備。若沒有檢測到就一直在檢測等待。3

31、.5.2 DS18B20寫操作圖 17 DS18B20寫過程圖寫周期最少為60微秒,最長不超過120微秒。寫周期一開始做為主機先把總線拉低1微秒表示寫周期開始。隨后若主機想寫0,則繼續(xù)拉低電平最少60微秒直至寫周期結(jié)束,然后釋放總線為高電平。若主機想寫1,在一開始拉低總線電平1微秒后就釋放總線為高電平,一直到寫周期結(jié)束。而做為從機的DS18B20則在檢測到總線被拉底后等待15微秒然后從15us到45us開始對總線采樣,在采樣期內(nèi)總線為高電平則為1,若采樣期內(nèi)總線為低電平則為0。3.5.3 DS18B20讀操作圖 18 DS18B20讀過程圖讀時隙是從主機把單總線拉低之后,在1微秒之后就得釋放單

32、總線為高電平,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩€上。DS18B20在檢測到總線被拉低1微秒后,便開始送出數(shù)據(jù),若是要送出0就把總線拉為低電平直到讀周期結(jié)束。若要送出1則釋放總線為高電平。主機在一開始拉低總線1微秒后釋放總線,然后在包括前面的拉低總線電平1微秒在內(nèi)的15微秒時間內(nèi)完成對總線進行采樣檢測,采樣期內(nèi)總線為低電平則確認為0。采樣期內(nèi)總線為高電平則確認為1。完成一個讀時序過程,至少需要60us才能完成。int Save_Ds18b20()int temp3,temp4;Init_Ds18b20(); /初始化delay_50us(18);Write_Ds18b20(0xcc); /跳過

33、ROM配置Write_Ds18b20(0x44); /啟動溫度轉(zhuǎn)換 Init_Ds18b20();delay_50us(18);Write_Ds18b20(0xcc); /跳過ROM配置Write_Ds18b20(0xbe); /讀溫度寄存器 delay_50us(10); /600ustemp3 = Read_Ds18b20(); /讀溫度值的低字節(jié)temp4 = Read_Ds18b20(); /讀溫度值的高字節(jié) temp4 = (temp44取出十位,存入數(shù)組,自增的目的是讓TIME自動指向下一個元素,繼續(xù)讀取。經(jīng)過這樣一個過程,可以讓時間信息的各位十進制存入指定的數(shù)組中,然后通過數(shù)組A

34、SCII數(shù)組,將對應(yīng)的值轉(zhuǎn)化為12864可以顯示的符號。讀取溫控芯片值時,讀出的是16位十六進制數(shù)值,要轉(zhuǎn)化為十進制,根據(jù)用戶手冊可知該芯片默認精度為12位,對應(yīng)增量為0.0625,所以將取出的十六進制數(shù)乘以0.0625即可得出對應(yīng)的十進制,從而用除法和求余等方法求出個位、十位、小數(shù)位,然后通過數(shù)組ASCII數(shù)組,將對應(yīng)的值轉(zhuǎn)化為12864可以顯示的符號。unsigned char ASCII = /12864DS18B20選值:0-9 /時10.11 分12.13 秒14.15 年16.17 月 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x3

35、9,0xca,0xb0+1,0xb7,0xd0+6,0xc3,0xe0+11,0xc4,0xe0+10,0xd4,0xc0+2,0xc8,0xd0+5,0xd0,0xc0+7,0xc6,0xd0+10,0x20;4.1 整體圖圖19 整體圖4.2運行過程初始界面:圖20 初始界面按0鍵進入修改時間:圖21 修改界面將時間修改為2016年1月1日 圖22 修改年 圖23 修改月 圖24 修改日 圖25 修改后界面輸入錯誤時間如輸入80秒,DS1302停止工作: 圖26 輸入錯誤時間5. 缺陷與調(diào)試(1)在最開始,讀出溫度和時間的數(shù)值的函數(shù)是通過switch語句判斷的,這樣造成了程序的冗長,導(dǎo)致程

36、序易讀性降低,在程序基本實現(xiàn)后,將程序進行了優(yōu)化,使讀值函數(shù)一目了然。 (2)程序一開始使用的不是按鍵中斷,但是由于在本題中矩陣鍵盤被大量使用,需要多次掃描矩陣鍵盤,循環(huán)嵌套太多時,矩陣鍵盤使用效果不理想,請教杜神同學(xué)后,最終采用按鍵中斷進行操作,使鍵盤的可靠性大幅提升。 (3)在實驗中,由于線路較多,全部連接以后發(fā)現(xiàn)有些混亂,這是以后需要注意的,在連接之前要考慮到使用的方便,然后再分配引腳。 (4)在實驗中,判斷矩陣鍵盤的行列,直接通過程序判斷,但答辯后知道用萬用表測試會更加方便,也可以節(jié)省很多時間。(5) 在修改時間時,本考慮應(yīng)該在輸入時設(shè)置一個刪除錯誤鍵值的功能,但考慮到程序已經(jīng)將修改年

37、、月、日等分開修改,即使輸入錯誤也方便再一次進行輸入,就沒有添加刪除功能。(6) 在設(shè)置DS1302和DS18B20時,部分代碼忘記設(shè)置單片機引腳輸入輸出方向,導(dǎo)致芯片無法正常運行卻也找不出原因,在今后還需要更加細心。程序未設(shè)置時間設(shè)置范圍(正確時間),即使輸入的是一個不正確的時間,也可以發(fā)送給DS1302,應(yīng)該在程序中針對年月日時分秒周的不同特點,對鍵入值進行限制,如果超出限制,則輸入無效(附帶提示)。6. 實驗心得7. 附錄# include#include #include #define uchar unsigned char#define uint unsigned int/*/ /

38、 定義 / /*/*DS1302功能初始化指令*/#define hclk() P6OUT |= BIT7 /時鐘#define lclk() P6OUT &= (BIT7) #define hdat() P6OUT |= BIT6 /數(shù)據(jù)#define ldat() P6OUT &= (BIT6) #define en() P6OUT |= BIT5 /使能#define disen() P6OUT &= (BIT5) /時鐘(寄存器) 命令#defineCMD_ READ 0x01 /讀操作位 #define CMD_WRITE 0x00 /寫操作位 #define CMD_CONTROL

39、 0x8E /寫保護/時鐘配置常量(位)#define CFG_CLOCK_HALT 0x80 /暫停時鐘運行 CH #define CFG_PROTECT 0x80 /寫保護#define CFG_UNPROTECT 0x00 /寫允許/*12864功能初始化指令*/#define CLEAR_SCREEN 0x01 /清屏指令:清屏且AC值為00H#define AC_INIT 0x02 /將AC設(shè)置為00H。且游標(biāo)移到原點位置#define CURSE_ADD 0x06 /設(shè)定游標(biāo)移到方向及圖像整體移動方向(默認游標(biāo)右移,圖像整體不動)#define FUN_MODE 0x30 /工作模

40、式:8位基本指令集#define DISPLAY_ON 0x0c /顯示開,顯示游標(biāo),且游標(biāo)位置反白#define DISPLAY_OFF 0x08 /顯示關(guān)#define LCM_Data_Out P4OUT /輸出 DBO0-DBO7#define LCM_Data_In P4IN /輸入 DBO0-DBO7#define SET_LCD_RS doP3OUT |= BIT2;while(0) / LCD_RS=1 1為讀寫數(shù)據(jù)#define CLR_LCD_RS doP3OUT &= (BIT2);while(0) / LCD_RS=0 0為讀寫指令#define SET_LCD_RW

41、doP3OUT |= BIT3;while(0) / LCD_RW=1 1為讀#define CLR_LCD_RW doP3OUT &= (BIT3);while(0) / LCD_RW=0 2為寫#define SET_LCD_EN doP3OUT |= BIT6;while(0) / LCD_EN=1 1為使能#define CLR_LCD_EN doP3OUT &= (BIT6);while(0) / LCD_EN=0 0為斷開#define SET_LCD_RST doP3OUT |= BIT7;while(0) / LCD_RST=1 1為復(fù)位#define CLR_LCD_RST

42、doP3OUT &= (BIT7);while(0) / LCD_RST=0 0為不變#define keyin (P2IN&0xf0)/*/ / 聲明 / /*/void delayms(uint t);void WaitBusy(void);void Lcd_WriteCmd(uchar cmdcode);void Lcd_WriteData(uchar dispdata);void Lcd_Init();void lcd_clr(void); void read_t();void Init_Ds1302();unsigned char* TimeToString(unsigned cha

43、r* TIME);void Write_to_Ds1302(uchar address, uchar data);char Read_from_Ds1302(uchar address);void Transfer_Ds1302();void key0();void key1();void key2();void change_disp();void change();void change_year();void change_week();void change_month();void change_day();void change_hour();void change_minute();void change_second();int a;/read_t中臨時變量char h,p;unsigned int x,y,z,w;/read_t中臨時變量int j,temp,u=1,s,q,temp1,temp2,temp3;unsigned char t116=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;/12864第一行顯示溫度及周unsigned char t

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論