基于單片機萬年歷設(shè)計_第1頁
基于單片機萬年歷設(shè)計_第2頁
基于單片機萬年歷設(shè)計_第3頁
基于單片機萬年歷設(shè)計_第4頁
基于單片機萬年歷設(shè)計_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

基于單片機萬年歷設(shè)計摘要:本文介紹了基于STC89C52單片機的多功能電子萬年歷的硬件結(jié)構(gòu)和軟硬件設(shè)計方法。本設(shè)計由數(shù)據(jù)顯示模塊、溫度采集模塊、時間處理模塊和調(diào)整設(shè)置模塊四個模塊組成。系統(tǒng)以STC89C52單片機為控制器,以串行時鐘日歷芯片DS1302記錄日歷和時間,它可以對年、月、日、時、分、秒進行計時,還具有閏年補償?shù)榷喾N功能。溫度采集選用DS18B20芯片,萬年歷采用直觀的數(shù)字顯示,數(shù)據(jù)顯示采用1602A液晶顯示模塊,可以在LCD上同時顯示年、月、日、周日、時、分、秒,還具有時間校準等功能。此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、本錢低廉等諸多優(yōu)點,具有廣闊的市場前景。關(guān)鍵字:萬年歷溫度計液晶顯示0前言隨著科技的快速開展,時間的流逝,從觀太陽、擺鐘到現(xiàn)在電子鐘,人類不斷研究,不斷創(chuàng)新紀錄。它可以對年、月、日、時、分、秒進行計時,還具有閏年補償?shù)榷喾N功能,而且DS1302的使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、時、分、秒和溫度等信息,還具有時間校準等功能。該電路采用STC89C52單片機作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。

此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、本錢低廉等諸多優(yōu)點,符合電子儀器儀表的開展趨勢,具有廣闊的市場前景。1總體方案設(shè)計單片機電子萬年歷的制作有多種方法,可供選擇的器件和運用的技術(shù)也有很多種。所以,系統(tǒng)的總體設(shè)計方案應(yīng)在滿足系統(tǒng)功能的前提下,充分考慮系統(tǒng)使用的環(huán)境,所選的結(jié)構(gòu)要簡單使用、易于實現(xiàn),器件的選用著眼于適宜的參數(shù)、穩(wěn)定的性能、較低的功耗以及低廉的本錢。系統(tǒng)的功能往往決定了系統(tǒng)采用的結(jié)構(gòu),經(jīng)過本錢,性能,功耗等多方面的考慮決定用三個8位74LS164串行接口外接LCD顯示器,RESPACK-8對單片機STC89C52進行供電,時間芯片DS1302連接單片機STC89C52。從而實現(xiàn)電子萬年歷的功能。按照系統(tǒng)設(shè)計的要求,初步確定系統(tǒng)由電源模塊、時鐘模塊、顯示模塊、鍵盤接口模塊、溫度測量模塊和鬧鐘模塊共六個模塊組成,電路系統(tǒng)構(gòu)成框圖如圖1所示。鬧鐘模塊獨立按鍵顯示模塊始終模塊STC89C52溫度模塊電源模塊鬧鐘模塊獨立按鍵顯示模塊始終模塊STC89C52溫度模塊電源模塊圖1硬件電路框圖2硬件電路設(shè)計2.1單片機的選擇2.1.151單片機及12單片機結(jié)構(gòu)及功能單片機又稱單片微控制器,可以完成復(fù)雜的運算、邏輯控制、通信等功能。80C51單片機的時鐘信號用來提供單片機內(nèi)各種位操作時間基準,80C52單片機的時鐘信號。通常有兩種電路形式:內(nèi)部震蕩方式和外部震蕩方式。由于80C52的系統(tǒng)性能滿足系統(tǒng)數(shù)據(jù)采集及時間精度的要求,而且產(chǎn)品產(chǎn)量豐富來源廣,應(yīng)用也很成熟,故采用來作為控制核心。單片機系統(tǒng)是實現(xiàn)環(huán)境電壓多路采集功能的核心模塊。每次選通一路通道信號進行模擬量轉(zhuǎn)換數(shù)字量和輸出允許。STC12C5A60AD/S2系列帶A/D轉(zhuǎn)換的單片機的A/D轉(zhuǎn)換口在P1口,上電復(fù)位后P1口為弱上拉型IO口,用戶可以通過軟件設(shè)置將8路中的任何一路設(shè)置為A/D轉(zhuǎn)換,不須作為A/D使用的口可繼續(xù)作為IO口使用。STC12C5A60AD/S2系列單片機與89C52單片機最小系統(tǒng)相同,而功能上較51單片機相比更為強大。單片機最小系統(tǒng)電路如圖2所示。圖2單片機最小系統(tǒng)2.1.2時鐘電路89C51系列單片機的時鐘信號通常有內(nèi)部振蕩和外部振蕩方式。本最小系統(tǒng)采用外部晶振電路,利用11.0592MHZ的晶體振蕩器和兩個30pF的電容組成。其中晶體振蕩器起振蕩作用,兩電容起到去耦合的作用,具體設(shè)計圖如圖3所示:圖3時鐘電路2.1.3復(fù)位電路本系統(tǒng)的復(fù)位電路是采用按鍵復(fù)位的電路,復(fù)位輸入引腳RET為其提供了初始化的手段。當其ALE及PSEN兩引腳輸出高電平,RET引腳高電平到時,單片機復(fù)位。按下按鈕,那么直接把+5V加到了RET端從而復(fù)位稱為手動復(fù)位。復(fù)位后,P0到P3并行I/O口全為高電平,其它存放器全部清零,只有SBUF存放器狀態(tài)不確定。系統(tǒng)復(fù)位電路如圖4所示。圖4復(fù)位電路2.2時鐘芯片DS1302接口設(shè)計與性能分析2.2.1DS1302性能簡介DS1302是Dallas公司生產(chǎn)的一種實時時鐘芯片。它通過串行方式與單片機進行數(shù)據(jù)傳送,能夠向單片機提供包括秒、分、時、日、月、年等在內(nèi)的實時時間信息,并可對月末日期、閏年天數(shù)自動進行調(diào)整;它還擁有用于主電源和備份電源的雙電源引腳,在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。另外,它還能提供31字節(jié)的用于高速數(shù)據(jù)暫存的RAM。DS1302時鐘芯片內(nèi)主要包括移位存放器、控制邏輯電路、振蕩器。DS1302與單片機系統(tǒng)的數(shù)據(jù)傳送依靠RST,I/O,SCLK三根端線即可完成。其工作過程可概括為:首先系統(tǒng)RST引腳驅(qū)動至高電平,然后在SCLK時鐘脈沖的作用下,通過I/O引腳向DS1302輸入地址/命令字節(jié),隨后再在SCLK時鐘脈沖的配合下,從I/O引腳寫入或讀出相應(yīng)的數(shù)據(jù)字節(jié)。因此,其與單片機之間的數(shù)據(jù)傳送是十分容易實現(xiàn)的,DS1302的引腳排列及內(nèi)部結(jié)構(gòu)圖如圖4:DS1302引腳說明:X1,X232.768kHz晶振引腳GND地線RST復(fù)位端I/O數(shù)據(jù)輸入/輸出端口SCLK串行時鐘端口VCC1慢速充電引腳VCC2電源引腳圖4DS1302的引腳2.2.2DS1302接口電路設(shè)計1時鐘芯片DS1302的接口電路及工作原理:圖5DS1302與MCU接口電路圖5為DS1302的接口電路,其中Vcc1為后備電源,Vcc2為主電源。VCC1在單電源與電池供電的系統(tǒng)中提供低電源并提供低功率的電池備份。VCC2在雙電源系統(tǒng)中提供主電源,在這種運用方式中VCC1連接到備份電源,以便在沒有主電源的情況下能保存時間信息以及數(shù)據(jù)。DS1302由VCC1或VCC2兩者中較大者供電。當VCC2大于VCC1+0.2V時,VCC2給DS1302供電。當VCC2小于VCC1時,DS1302由VCC1供電。DS1302在每次進行讀、寫程序前都必須初始化,先把SCLK端置“0〞,接著把RST端置“1〞,最后才給予SCLK脈沖;讀/寫時序如下列圖6所示。表-1為DS1302的控制字,此控制字的位7必須置1,假設(shè)為0那么不能對DS1302進行讀寫數(shù)據(jù)。對于位6,假設(shè)對時間進行讀/寫時,CK=0,對程序進行讀/寫時RAM=1。位1至位5指操作單元的地址。位0是讀/寫操作位,進行讀操作時,該位為1;進行寫操作時,該位為0。控制字節(jié)總是從最低位開始輸入/輸出的。表-2為DS1302的日歷、時間存放器內(nèi)容:“CH〞是時鐘暫停標志位,當該位為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當該位為0時,時鐘開始運行。“WP〞是寫保護位,在任何的對時鐘和RAM的寫操作之前,“WP〞必須為0。當“WP〞為1時,寫保護位防止對任一存放器的寫操作。2、DS1302的控制字DS1302的控制字如表2所示??刂谱止?jié)的高有效位〔位7〕必須是邏輯1,如果它為0,那么不能把數(shù)據(jù)寫入DS1302中,位6如果0,那么表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位〔位0〕如為1表示進行讀操作,為0表示進行寫操作??刂谱止?jié)總是從最低位開始輸出。表2DS1302的控制字格式1RAM/CKA4A3A2A1A0RD/WR3、數(shù)據(jù)輸入輸出〔I/O〕在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。如下列圖6所示。圖6DS1302讀/寫時序圖4、DS1302的存放器AMDS1302有12個存放器,其中有7個存放器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時間存放器及其控制字見表3。表3DS1302的日歷、時間存放器寫存放器讀存放器Bit7Bit6Bit5Bit7Bit3Bit2Bit1Bit080H81HCH10秒秒82H83H10分分84H85H12/EQ\*jc0\*"Font:宋體"\*hps8\o\ad(\s\up9(——),24)010時時EQ\*jc0\*"Font:TimesNewRoman"\*hps12\o\ad(\s\up11(——),AM)/PM86H87H0010日日88H89H00010月月8AH8BH00000星期8CH8DH10年年8EH8FHWP0000000此外,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(讀)。2.3溫度芯片DS18B20接口設(shè)計與性能分析2.3.1DS18B20性能簡介1.DS18B20的主要特性DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改良型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等元件相比,它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9-12位的數(shù)字值讀數(shù)方式。現(xiàn)場溫度直接以"一線總線"的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾性。適合于惡劣環(huán)境的現(xiàn)場溫度測量,如:環(huán)境控制、設(shè)備或過程控制、測溫類消費電子產(chǎn)品等。與前一代產(chǎn)品不同,新的產(chǎn)品支持3V~5.5V的電壓范圍,使系統(tǒng)設(shè)計更靈活、方便。其性能特點可歸納如下:1獨特的單線接口僅需要一個端口引腳進行通信;2測溫范圍在-55℃到125℃,分辨率最大可達0.0625℃;3采用了3線制與單片機相連,減少了外部硬件電路;4零待機功耗;5可通過數(shù)據(jù)線供電,電壓范圍在3.0V-5.5V;6用戶可定義的非易失性溫度報警設(shè)置;7報警搜索命令識別并標志超過程序限定溫度〔溫度報警條件〕的器件;8負電壓特性,電源極性接反時,溫度計不會因發(fā)熱燒毀,只是不能正常工作。2.DS18B20工作原理DS18B20的讀寫時序和測溫原理與DS1820相同,只是得到的溫度值的位數(shù)因分辨率不同而不同,且溫度轉(zhuǎn)換時的延時時間由2s減為750ms。DS18B20測溫原理如圖5所示。圖中低溫度系數(shù)晶振的振蕩頻率受溫度影響很小,用于產(chǎn)生固定頻率的脈沖信號送給計數(shù)器1。高溫度系數(shù)晶振隨溫度變化其振蕩率明顯改變,所產(chǎn)生的信號作為計數(shù)器2的脈沖輸入。計數(shù)器1和溫度存放器被預(yù)置在-55℃所對應(yīng)的一個基數(shù)值。計數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行減法計數(shù),當計數(shù)器1的預(yù)置值減到0時,溫度存放器的值將加1,計數(shù)器1的預(yù)置將重新被裝入,計數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行計數(shù),如此循環(huán)直到計數(shù)器2計數(shù)到0時,停止溫度存放器值的累加,此時溫度存放器中的數(shù)值即為所測溫度。圖7中的斜率累加器用于補償和修正測溫過程中的非線性,其輸出用于修正計數(shù)器1的預(yù)置值。LSBLSB位置/去除增加計數(shù)器1斜率累加器計數(shù)比擬器溫度存放器減到0預(yù)置計數(shù)器2減到0停止預(yù)置低溫度系數(shù)晶振高溫度系數(shù)晶振圖7DS18B20測溫原理2.3.2DS18B20接口電路設(shè)計如8圖所示,該系統(tǒng)中采用數(shù)字式溫度傳感器DS18B20,具有測量精度高,電路連接簡單特點,此類傳感器僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,用P3.7與DS18B20的DQ口連接,Vcc接電源,GND接地。圖8溫度傳感器DS18B20接口電路2.3.3DS18B20的工作時序1、復(fù)位時序圖圖9復(fù)位時序圖2、讀時序圖圖10讀時序圖3、寫時序圖圖11寫時序圖4、工作時序1〕總線時序圖12總線時序2〕寫周期時序圖13寫周期時序3〕起始/停止時序圖14起始/停止時序4〕應(yīng)答時序圖15應(yīng)答時序5〕立即地址讀時序圖16立即地址讀時序2.4LCD顯示模塊2.4.1LCM1602的特性及使用說明1.LCM1602的接口信號說明如表4:表4LCM1602的接口信號編號引腳符號功能說明編號引腳符號功能說明1VSS電源地9D2DATAI/O2VDD電源正極10D3DATAI/O3VL液晶顯示偏壓信號11D4DATAI/O4RS數(shù)據(jù)/命令選擇端〔H/L〕12D5DATAI/O5R/W讀/寫選擇端〔H/L〕13D6DATAI/O6E使能信號14D7DATAI/O7D0DATAI/O15BLA背光正極8D1DATAI/O16BLK背光負極2、根本操作時序如下:1〕讀狀態(tài):RS=L,RW=H,E=H2〕寫指令:RS=L,RW=L,D0~D7=指令碼,E=高脈沖3〕讀數(shù)據(jù):RS=H,RW=H,E=H4〕寫數(shù)據(jù):RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖3、初始化設(shè)置1〕顯示模式設(shè)置如表5:表5顯示模式設(shè)置指令碼功能00111000設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口顯示開/關(guān)及光標設(shè)置如表6:表6顯示開/關(guān)及光標設(shè)置指令碼功能00001DCBD=1開顯示;D=0關(guān)顯示C=1顯示光標;C=0不顯示光標B=1光標閃爍;B=0光標不顯示000001NSN=1當讀或?qū)懸粋€字符后地址指針加一,且光標加一N=0當讀或?qū)懸粋€字符后地址指針減一,且光標減一S=1當寫一個字符,整屏顯示左移〔N=1〕2.4.2LCM1602與MCU的接口電路LCD的D0~D7分別接單片機的的P2口,作為數(shù)據(jù)線,因為P0口內(nèi)部沒有上拉電阻,所以外部另外加上10K的上拉電阻;P1.0—P1.2分別接LCD的RS、RW、E三個控制管腳;RV1用來調(diào)節(jié)LCD的顯示灰度;BLK、BLA為背光的陰極和陽極,接上相應(yīng)電平即點亮背光燈。2.5按鍵模塊設(shè)計本系統(tǒng)用到了5個按鍵,其中一個用作系統(tǒng)手動復(fù)位,另外4個采用獨立按鍵,該種接法查詢簡單,程序處理簡單,可節(jié)省CPU資源,按鍵電路如圖17所示,4個獨立按鍵分別與STC89C52的P3.4、P3.5、P3.6、P3.7接口相連。圖17按鍵電路對以上4個按鍵作簡要說明:S4——SET鍵,S3——UP鍵,S2——DOWN鍵,S5——OUT/STOP鍵。SET鍵:按下SET鍵進入時間校準狀態(tài),按一下進入秒調(diào)整,兩下分調(diào)整,依此類推可進行各年月日,時分秒以及星期的校準;UP鍵:當SET鍵按下時,UP進行SET選定項〔如:小時〕的加操作;DOWN鍵:當SET鍵按下時,DOWN進行SET選定項〔如:小時〕的減操作;OUT鍵:當OUT鍵按下時,此鍵功能為退出校準功能,進入下一模式,顯示溫度值和上下限的溫度值。2.6復(fù)位電路的設(shè)計當STC89C52單片機的復(fù)位引腳RST〔全稱RESET〕出現(xiàn)2個機器周期以上的高電平時,單片機就完成了復(fù)位操作。如果RST持續(xù)為高電平,單片機就處于循環(huán)復(fù)位狀態(tài),而無法執(zhí)行程序。因此要求單片機復(fù)位后能脫離復(fù)位狀態(tài)。而本系統(tǒng)選用的是12MHz的晶振,因此一個機器周期為1μs,那么復(fù)位脈沖寬度最小應(yīng)為2μs。在實際應(yīng)用系統(tǒng)中,考慮到電源的穩(wěn)定時間,參數(shù)漂移,晶振穩(wěn)定時間以及復(fù)位的可靠性等因素,必須有足夠的余量。根據(jù)應(yīng)用的要求,復(fù)位操作通常有兩種根本形式:上電復(fù)位、手動復(fù)位。上電復(fù)位要求接通電源后,自動實現(xiàn)復(fù)位操作。STC89C52單片機的上電復(fù)位POR〔PowerOnReset〕實質(zhì)上就是上電延時復(fù)位,也就是在上電延時期間把單片機鎖定在復(fù)位狀態(tài)上。在單片機每次初始加電時,首先投入工作的功能部件是復(fù)位電路。復(fù)位電路把單片機鎖定在復(fù)位狀態(tài)上并且維持一個延時〔記作TRST〕,以便給予電源電壓從上升到穩(wěn)定的一個等待時間;在電源電壓穩(wěn)定之后,再插入一個延時,給予時鐘振蕩器從起振到穩(wěn)定的一個等待時間;在單片機開始進入運行狀態(tài)之前,還要至少推遲2個機器周期的延時。本設(shè)計采用上電且開關(guān)復(fù)位電路,如圖18所示上電后,由于電容充電,使RST持續(xù)一段高電平時間。當單片機已在運行之中時,按下復(fù)位鍵也能使RST持續(xù)一段時間的高電平,從而實現(xiàn)上電且開關(guān)復(fù)位的操作。通常選擇C=10~30μF,本設(shè)計采用的電容值為10μF的電容和電阻為4.7K的電阻。圖18復(fù)位電路3系統(tǒng)的軟件設(shè)計電子萬年歷的功能是在程序控制下實現(xiàn)的。該系統(tǒng)的軟件設(shè)計方法與硬件設(shè)計相對應(yīng),按整體功能分成多個不同的程序模塊,分別進行設(shè)計、編程和調(diào)試,最后通過主程序?qū)⒏鞒绦蚰K連接起來。這樣有利于程序修改和調(diào)試,增強了程序的可移植性。本系統(tǒng)的軟件局部主要要進行公歷計算程序設(shè)計,溫度測量程序設(shè)計,按鍵的掃描輸入等。程序開始運行后首先要進行初始化,把單片機的各引腳的狀態(tài)按程序里面的初始化命令進行初始化,初始化完成后運行溫度測量程序,讀取出溫度傳感器測量出來的溫度,然后運行公歷計算程序,得到公歷的時間、日期信息,再運行按鍵掃描程序,檢測有無按鍵按下,如果沒有按鍵按下那么直接調(diào)用節(jié)日計算程序,根據(jù)得到的公歷日期信息計算出節(jié)日,如果有按鍵按下那么更新按鍵修改后的變量后送給節(jié)日計算程序,由節(jié)日計算程序根據(jù)修改后的變量計算出對應(yīng)的節(jié)假日,計算完成后運行顯示程序,顯示程序?qū)⒌玫降臏囟葦?shù)據(jù)、公歷信息、節(jié)假日信息送給對應(yīng)的數(shù)碼管讓其顯示。3.1主程序流程圖的設(shè)計主程序流程圖:開始開始DS1302初始化設(shè)置DS1302讀年月日星期時分秒將讀取的數(shù)據(jù)處理后送液晶屏顯示返回圖19主程序流程圖3.2程序設(shè)計3.2.1DS1302讀寫程序設(shè)計本系統(tǒng)的時間讀取主要來源于單片機對DS1302的操作,在硬件上時鐘芯片DS1302與單片機的連接需要三條線,即SCLK(7)、I/O(6)、RST(5),具體連接圖見系統(tǒng)硬件設(shè)計原理圖。讀取寫程序設(shè)計如下:sbitclk=P1^3; //ds1302時鐘線定義sbitio=P1^4; //數(shù)據(jù)線sbitrst=P1^5; //復(fù)位線 //秒分時日月年星期 ucharcodewrite_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};//寫地址ucharcoderead_add[]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};//讀地址ucharcodeinit_ds[]={0x58,0x00,0x00,0x01,0x01,0x13,0x1};ucharmiao,fen,shi,ri,yue,week,nian;uchari;ucharfen1=0x11,shi1=0; //兩個鬧鐘變量的定義bitopen1;/*************寫一個數(shù)據(jù)到對應(yīng)的地址里***************/voidwrite_ds1302(ucharadd,uchardat){ rst=1; //把復(fù)位線拿高 for(i=0;i<8;i++) { //低位在前 clk=0; //時鐘線拿低開始寫數(shù)據(jù) io=add&0x01; add>>=1; //把地址右移一位 clk=1; //時鐘線拿高 } for(i=0;i<8;i++) { clk=0; //時鐘線拿低開始寫數(shù)據(jù) io=dat&0x01; dat>>=1; //把數(shù)據(jù)右移一位 clk=1; //時鐘線拿高 } rst=0; //復(fù)位線合低 clk=0; io=0;}/*************從對應(yīng)的地址讀一個數(shù)據(jù)出來***************/ucharread_ds1302(ucharadd){ ucharvalue,i; rst=1; //把復(fù)位線拿高 for(i=0;i<8;i++) { //低位在前 clk=0; //時鐘線拿低開始寫數(shù)據(jù) io=add&0x01; add>>=1; //把地址右移一位 clk=1; //時鐘線拿高 } for(i=0;i<8;i++) { clk=0; //時鐘線拿低開始讀數(shù)據(jù) value>>=1; if(io==1) value|=0x80; clk=1; //時鐘線拿高 } rst=0; //復(fù)位線合低 clk=0; io=0; returnvalue; //返回讀出來的數(shù)據(jù)}/*************把要的時間年月日都讀出來***************/voidread_time(){ miao=read_ds1302(read_add[0]); //讀秒 fen=read_ds1302(read_add[1]); //讀分 shi=read_ds1302(read_add[2]); //讀時 ri=read_ds1302(read_add[3]); //讀日 yue=read_ds1302(read_add[4]); //讀月 nian=read_ds1302(read_add[5]); //讀年 week=read_ds1302(read_add[6]); //讀星期 Conversion(0,nian,yue,ri); //農(nóng)歷轉(zhuǎn)換 n_nian=year_moon; n_yue=month_moon; n_ri=day_moon;}/*************把要寫的時間年月日都寫入ds1302里***************/voidwrite_time(){ write_ds1302(0x8e,0x00); //翻開寫保護 write_ds1302(write_add[0],miao); //寫秒 write_ds1302(write_add[1],fen); //寫分 write_ds1302(write_add[2],shi); //寫時 write_ds1302(write_add[3],ri); //寫日 write_ds1302(write_add[4],yue); //寫月 write_ds1302(write_add[5],nian); //寫星期 write_ds1302(write_add[6],week); //寫年 write_ds1302(0x8e,0x80); //關(guān)閉寫保護}/*************把數(shù)據(jù)保存到ds1302RAM中**0-31*************/voidwrite_ds1302ram(ucharadd,uchardat){ add<<=1;//地址是從第二位開始的 add&=0xfe;//把最低位清零是寫的命令 add|=0xc0;//地址最高兩位為1 write_ds1302(0x8e,0x00); write_ds1302(add,dat); write_ds1302(0x8e,0x80);}/*************把數(shù)據(jù)從ds1302RAM讀出來**0-31*************/ucharread_ds1302ram(ucharadd){ add<<=1;//地址是從第二位開始的 add|=0x01;//把最高位置1是讀命令 add|=0xc0;//地址最高兩位為1 return(read_ds1302(add)); }/*************初始化ds1302時間***************/voidinit_ds1302(){ uchari; rst=0; //第一次讀寫數(shù)據(jù)時要把IO品拿低 clk=0; io=0; i=read_ds1302ram(30); if(i!=3) { i=3; write_ds1302ram(30,i); //40504100 3080 write_ds1302(0x8e,0x00); //翻開寫保護 for(i=0;i<7;i++) write_ds1302(write_add[i],init_ds[i]); //把最高位值0允許ds1302工作 write_ds1302(0x8e,0x80); //關(guān)寫保護 }}DS1302與微處理器進行數(shù)據(jù)交換時,首先由微處理器向電路發(fā)送命令字節(jié),命令字節(jié)最高位MSB(D7)必須為邏輯1,如果D7=0,那么禁止寫DS1302,即寫保護;D6=0,指定時鐘數(shù)據(jù),D6=1,指定RAM數(shù)據(jù);D5~D1指定輸入或輸出的特定存放器;最低位LSB(D0)為邏輯0,指定寫操作(輸入),D0=1,指定讀操作(輸出)。3.2.2溫度程序設(shè)計單總線上最根本的操作有初始化、寫和讀3種,所有其它的操作都由這3種根本操作組合而成,初始化用于對總線上的器件進行狀態(tài)復(fù)位,寫用于主節(jié)點向總線上寫入一位數(shù)據(jù),讀用于主節(jié)點從總線上讀取一位數(shù)據(jù)。在這3種操作中,只有寫操作是單向的,初始化操作和讀操作都是雙向的。具體程序設(shè)計如下:byteow_reset(void){bytepresence;DQ=0;//拉低總線delay(29);//保持480usDQ=1;//釋放總線delay(3);//等待回復(fù)presence=DQ;//讀取信號delay(25);//等待結(jié)束信號return(presence);//返回0:正常1:不存在}//從1-wire總線上讀取一個字節(jié)byteread_byte(void){bytei;bytevalue=0;for(i=8;i>0;i--){value>>=1;DQ=0;DQ=1;delay(1);if(DQ)value|=0x80;delay(6);}return(value);}//向1-WIRE總線上寫一個字節(jié)voidwrite_byte(charval){bytei;for(i=8;i>0;i--)//一次寫一位{DQ=0;//DQ=val&0x01;delay(5);//DQ=1;val=val/2;}delay(5);}4調(diào)試分析在protues上進行仿真實驗。首先使用KeiluVsion2將編寫完成的程序編譯生成HEX文件,將HEX文件燒錄到兩片單片機中,進行仿真實驗,結(jié)果如圖20所示。圖20仿真圖5結(jié)論在整個設(shè)計過程中,硬件方面主要設(shè)計了STC89C52單片機的最小系統(tǒng)、DS1302接口電路、DS18B20接口電路、鬧鐘及LCD顯示;軟件方面借助各個渠道的資料,主要設(shè)計了陽歷數(shù)據(jù)讀取程序、陽歷轉(zhuǎn)陰歷程序、溫度采集程序、鬧鈴程序以及LCD顯示程序;系統(tǒng)的調(diào)試主要是通過一塊STC89C52開發(fā)板,再借助于Keil、STC以及少許自己搭建的外圍電路實現(xiàn)的;再此過程中,分步調(diào)試時顯示出了陽歷的日期及時間,還有實時溫度,集中調(diào)試時沒有到達預(yù)期效果。此萬年歷具有讀顯示直觀、功能多樣、電路簡潔、本錢低廉等諸多優(yōu)點,符合電子儀器儀表的開展趨勢,具有廣闊的市場前景。在整個設(shè)計過程中學(xué)到了許多沒學(xué)到的知識,在電路焊接時雖然沒什么大問題,但從中也知道了焊接在整個作品中的重要性,電路工程量大,不能心急,一個個慢慢來不能急于求成。反而到達事半功倍的效果。對電路的設(shè)計、布局要先有一個好的構(gòu)思,才顯得電路板美觀、大方。程序編寫中,由于思路不清晰,開始時遇到了很多的問題,經(jīng)過靜下心來思考,理清了思路,反而得心應(yīng)手。在此次設(shè)計中,知道了做事要有一顆平常的心,不要想著走捷徑,一步一腳印。也練就了我的耐心,做什么事都要有耐心。在本次設(shè)計中學(xué)到了很

溫馨提示

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

評論

0/150

提交評論