基于51單片機的智能臺燈設計_第1頁
基于51單片機的智能臺燈設計_第2頁
基于51單片機的智能臺燈設計_第3頁
基于51單片機的智能臺燈設計_第4頁
基于51單片機的智能臺燈設計_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGEPAGEIV基于51單片機的智能臺燈設計摘要臺燈從其自身的結(jié)構和客觀性的是實現(xiàn)性能上來看的話,我們不難發(fā)現(xiàn),他不僅僅是能夠?qū)崿F(xiàn)較好的照明作用,同時也能夠較好的發(fā)揮出良好的裝飾作用,種類繁多,造型各異,在實現(xiàn)光源的管理和光源的實時性的配置過程中,功能也是較為強大的。在當前這樣的一種電子產(chǎn)品高速發(fā)展,不斷的呈現(xiàn)出較大程度的發(fā)展的時代背景之下,家用電器也逐漸的從過往的那種相對較為傳統(tǒng)的層面上,逐漸的朝著一個更加的智能化的層面上,實現(xiàn)快速的發(fā)展,已經(jīng)應用于實際中的有智能洗衣機,智能電飯鍋,智能電磁爐等,但是從當前智能家電在具體的使用過程中,一個尤為核心的特點就是,他們都是以單片機作為最核心的管理元件和系統(tǒng)性的控制元件來發(fā)揮出系統(tǒng)高效的作用的。結(jié)合了單片機的智能家用電器和普通家用電器相比,不管是從功能上,還是從智能化的層面上,較之于從前,都是實現(xiàn)了較大程度的發(fā)展和有效的予以提升的態(tài)勢的完成,其中表現(xiàn)的最為明顯的就是能夠更好的實現(xiàn)省電的設置和自動調(diào)節(jié)亮度管理,進而最終實現(xiàn)了家電的性能更加的優(yōu)質(zhì)。家用電器也是因為單片機這樣的一個核心的控制元件的作用,最終呈現(xiàn)出智能化的實施和智能化的發(fā)展趨勢的完成,并且由于人們的生活水平的較大程度的提升和系統(tǒng)性的加強,進而逐漸的使得過往的那種價格較為高昂的智能家用電器,逐漸的呈現(xiàn)出一種平民化的價格模式,也使得更多的人能夠更加容易的接受他當前呈現(xiàn)出來的價格,人們的生活水平以及生活質(zhì)量,也隨著當前這樣的一種智能家電的模式的大力的發(fā)展而呈現(xiàn)出較大程度的提升。在當前這樣的一種家用電器具體的實施和系統(tǒng)性的發(fā)展過程中,作為家用電器當中的小臺燈也是應該充分的契合當前的發(fā)展形勢,逐漸的朝著一個更加的智能化的模式發(fā)展,進而為人們的生活以及具體的工作提供更大的便捷性。關鍵詞:單片機;自動調(diào)節(jié)亮度;臺燈

AbstractDesklampisadornmentsexoflampsandlanterns,awiderangeofdifferentshapes,withthelightsourceismorealso.Withtherapiddevelopmentofelectronicproducts,householdelectricalappliancesalsomoreandmoretowardintelligent,hasappliedtotheactualofintelligentwashingmachine,intelligentelectricricecooker,intelligentinductioncooker,etc.,andusedinintelligenthomeapplianceswithacommonfeature,isusingthesinglechipmicrocomputerasthecentralcontrolunit.Combinedwiththesinglechipmicrocomputerintelligenthouseholdappliancescomparedwithordinaryhouseholdelectricalappliances,moreonthefunction,usemoreconvenient,highersafetyandreliability,themostimportantthingisthatmoreelectricalenergysaving,improvethequalityofhouseholdappliances.Householdappliancesforsinglechipmicrocomputertojoinandbecomesmarter,andaspeoplelivingstandardriseincreasinglycommon,ourlifealsowiththedevelopmentofhouseholdelectricalappliancesmoreconvenientandcomfortable.Withthedevelopmentofhouseholdappliances,asasmalldesklampofhouseholdelectricalappliancestopacewiththedevelopmentofscienceandtechnologytotheintelligent.

Keywords:singlechipmicrocomputer;Automaticallyadjustthebrightness;DesklampKeywords:singlechipmicrocomputer;Automaticallyadjustthebrightness;Desklamp

目錄摘要 IAbstract II1緒論 11.1課題的研究背景 11.2課題的研究意義 錯誤!未定義書簽。1.3設計方案 12硬件系統(tǒng)電路設計 32.1整體電路系統(tǒng)模塊 32.2單片機主控系統(tǒng) 32.3恒流驅(qū)動系統(tǒng) 42.4時鐘系統(tǒng) 52.5液晶顯示系統(tǒng) 62.6溫度檢測系統(tǒng) 82.7蜂鳴系統(tǒng) 92.8按鍵系統(tǒng) 102.9電源系統(tǒng) 103系統(tǒng)軟件設計 123.1系統(tǒng)主程序 123.2按鍵檢測和處理程序 123.3外部中斷程序 133.4定時器中斷程序 143.5C語言程序編寫和ISP軟件程序下載 144軟件的調(diào)試和仿真 16總結(jié) 錯誤!未定義書簽。致謝 17參考文獻 20附錄1電路原理總圖 21附錄2電路程序清單 22附錄3元器件清單 57PAGE57第1章緒論1.1課題的研究背景臺燈在具體的作用過程中,發(fā)揮出來的主要作用,是一種照明的作用。它一般分為兩種,一種是立柱式的,一種是有夾子的。他在具體的工作過程中,最為核心的原理就是將燈光集中到一個相對較小的區(qū)域內(nèi),集中光線,進而最終為人們的具體的生活和學習,提供良好的便捷性的發(fā)展措施。一般臺燈用的燈泡是白熾燈或者節(jié)能燈泡,有的臺燈還存在有應急功能,在停電的過程中,是能夠較好的發(fā)揮出其良好的照明作用的。在當前這樣的一種系統(tǒng)性的實施階段和客觀性的發(fā)展階段來看的話,我們不難發(fā)現(xiàn),燈具市場出售的燈具,不管是從數(shù)量的層面上,還是從種類的層面上,都是非常繁多的,一般臺燈均采用220V交流電源供電,日光燈管、白熾燈泡為光源,手動開關或觸摸感應式開光來控制。但是這樣的一類臺燈,在具體的使用過程中,是存在著較多的弊端的,一是電壓,從其具體的實施形勢上來看的話,是一種不穩(wěn)定,不安全的發(fā)展形勢的,給人們的生活帶來了較大的不安全的發(fā)展因素和客觀性的實施因素的建立;二是日光燈還具有頻閃效應,如果人在長時間使用的過程中,是會對人眼造成較大程度的傷害的;三是耗電量大、臺燈通常都是以日光燈為主,在幾瓦到幾十瓦之間;四是人工化,如果只是單純的通過人工操作的話,通常會忘記關燈,最終導致電能發(fā)生較大程度的浪費現(xiàn)象,到目前為止,在燈具市場上,很少見到采用+5V的直流電源供電的一種人體智能臺燈,他在具體的運行過程中,是不會發(fā)生較大程度的觸電現(xiàn)象的,使用壽命長、無輻射、又不污染等優(yōu)點,有許多普通按鍵臺燈所無法比及的優(yōu)勢,智能化臺燈一方面可以更節(jié)省電能,有利于環(huán)保,另一方面可以糾正使用者的坐姿,預防脊椎變形和眼睛近視。同時,智能臺燈在黑暗的時候自動開關燈的功能也讓使用者使用起來更方便,省去黑暗摸燈的麻煩。1.2設計方案LED是一個發(fā)光二極管,它可以快速實現(xiàn)開關。這一特點是其他的發(fā)光器件所無法比擬的。因此,我們需要把供電源改成脈沖恒流源,改變電源脈沖寬度的方法,就可以改變其亮度。種方法稱為脈寬調(diào)制(PWM)調(diào)光法。假如脈沖的周期為tpwm,脈沖寬度為ton,那么其工作比D(或稱為孔度比)就是ton/tpwm.改變恒流源脈沖的工作比就可以改變LED的亮度。簡而言之,PWM是一種對模擬信號電平進行數(shù)字編碼的方法。通過高分辨率計數(shù)器的使用,方波的占空比被調(diào)制用來對一個具體模擬信號的電平進行編碼。第2章硬件系統(tǒng)電路設計2.1整體電路系統(tǒng)模塊該臺燈系統(tǒng)可具體實現(xiàn)LED臺燈的10級PWM調(diào)光控制;液晶屏實時顯示時鐘、日歷與環(huán)境溫度信息;鬧鐘功能采用聲音報警方式,即一旦到達鬧鐘時間,LED臺燈能夠出蜂鳴聲報警,以喚醒用戶;用戶則可以通過按鍵系統(tǒng)實現(xiàn)對時鐘日歷與鬧鐘參數(shù)的設置、LED亮度的調(diào)節(jié)以及鬧鐘報警的解除。圖2.1系統(tǒng)結(jié)構框圖2.2單片機主控系統(tǒng)STC89系列單片機具有ISP/IAP功能,無需專用編程器,無需將單片機從目標板上取下,即可通過PC機串口,對單片機進行編程。STC89系列單片機的Flash存儲器被分成Block1(BootROM,即引導區(qū))和Block0(用戶程序區(qū))兩個區(qū),在物理結(jié)構上,Block0在前,Block1在后,在出廠時,Block1區(qū)內(nèi)已經(jīng)燒錄有ISP引導碼,并設置為從Block1啟動。單片機啟動時,首先執(zhí)行ISP引導碼,如果是程序下載,ISP引導碼就會引導單片機將用戶程序下載到Flash存儲器的Block0用戶程序區(qū),然后,開始用戶程序;否則,如果啟動時ISP未檢測到程序下載,則直接執(zhí)行Block0中的用戶程序。本次采用的STC89C52的主要特點:增強型6時鐘/機器周期,12時鐘/機器周期8051CPU工作電壓:5.5–3.4V(5V單片機)/3.8-2.0V(3V單片機)工作頻率范圍:0–40MHz,相當于普通8051的0~80MHz.實際實際工作頻率可達48MHz.用戶應用程序空間4K/8K/13K/16K/20K/32K/64K字節(jié)片上集成1280字節(jié)/512字節(jié)RAM通用I/O口(32/36個),復位后為:P1/P2/P3/P4是準雙向口/弱上拉(普通8051傳統(tǒng)I/O口)。P0口是開漏輸出,作為總線擴展用時,不用加上上拉電阻,作為I/O口用時,需加上拉上電阻。ISP(在系統(tǒng)可編程)/IAP(在應用可編程),無需專用編程器/仿真器??赏ㄟ^串口(P3.0/P3.1)直接下載到用戶編程,8K程序3秒即可完成一片。單片機最小系統(tǒng)電路如圖2.2所示。圖2.2單片機最小系統(tǒng)2.3恒流驅(qū)動系統(tǒng)本臺燈設計LED光源采用相互并聯(lián)方式,共由20只高亮度小功率LED組成;每只LED燈珠的壓降約3.1V,工作電流約20mA.由白光LED的正向伏安特性可知,當LED端電壓超過其正向?qū)妷汉螅^小的電壓波動都會導致工作電流的的劇烈變化,從而影響LED的正常使用,固LED宜采用恒流驅(qū)動方式。因此,本設計LED采用高性能PT4115恒流芯片驅(qū)動。LED恒流驅(qū)動電路如圖2.3所示圖2.3LED恒流驅(qū)動系統(tǒng)電路圖PT4115恒流驅(qū)動輸出的電流值計算公式為:IOUT=(0.1×D)/Rs(D為方波信號占空比,Rs為限流電阻。)圖2.4PWM調(diào)光原理圖2.4時鐘系統(tǒng)時鐘系統(tǒng)和單片機系統(tǒng)連接圖如圖2.5。圖2.5時鐘系統(tǒng)電路圖2.5液晶顯示系統(tǒng)液晶顯示在具體的實施和使用的過程中,不管是從宏觀的層面上,還是從微觀的層面上,其具體的使用范圍都是較為廣泛的,而且綜合的使用量也是較為普及的。除此之外,根據(jù)搭載設備在具體的使用過程中的用途上的較大程度的差異,最終顯示出來的畫面大小和具體的像素質(zhì)量也是存在著較大的差異化的。從手用型到電視用數(shù)十種,根據(jù)其實際的使用過程中的較大的差異性,液晶面板最終呈現(xiàn)出來的性能也是大不相同的。但是,由于我國的液晶顯示器的大范圍的普及和廣泛性的應用,其主要元器件液晶顯示屏,在具體的使用過程中的故障問題也逐漸的顯示出來,本論文從液晶顯示器在具體的實施和執(zhí)行的過程中的安全問題作為主要的切入點,對其之所以會大幅度的發(fā)生的綜合原理做出重點的闡釋和系統(tǒng)性的說明,并且對其實際的成象和具體的檢測方式也是重點的予以研究和說明。在對于液晶顯示屏的管理和系統(tǒng)性的控制過程中,對于其存在的諸多的不良的現(xiàn)象,是要加強控制和管理的,進而維持其較為和諧發(fā)展的態(tài)勢,并且對于當前存在的這一系列的故障問題,已經(jīng)采取怎樣的執(zhí)行方案和具體的管理措施,做出了詳細的說明。進而最終實現(xiàn)成本的有效降低,進而在具體的工業(yè)發(fā)展和實際的工業(yè)生產(chǎn)的過程中,最大程度的實現(xiàn)工業(yè)生產(chǎn)效率和具體的生產(chǎn)質(zhì)量的大幅度的提升和加強。通過單片機控制1602液晶實現(xiàn)首行年、月、日、星期顯示,第二行時、分、秒以及環(huán)境溫度顯示。液晶顯示屏,從其本質(zhì)上來看,其主要的性質(zhì)是一種電光源的性質(zhì)和系統(tǒng)性的發(fā)展裝置,在實際的方向上,也是存在著較大的極化方向上的差異性的,不同極化方向的光在經(jīng)過液晶的作用之下,最終呈現(xiàn)出來的成效也是存在著不一致的態(tài)勢的,光經(jīng)過一系列的作用之后,再進行有序的發(fā)展和客觀性的予以組合,最終對其實際的極化方式也是會產(chǎn)生較大程度的改變的,配合偏光板,對來自于某個方向的極化光予以及時的阻擋,通過這樣的方式實現(xiàn)光的穿透率的客觀的管理和高效的計算的。在對光的相關特性做出了系統(tǒng)性的了解和有序的發(fā)展之后,那么電是如何與光結(jié)合呢?在電壓呈現(xiàn)出較大的差異性的發(fā)展形勢之下,液晶呈現(xiàn)出來的排列方式也是存在著較大的不同的,不同的液晶排列方式最終使得其具體的光程差也是不一致的,進而光源在具體的穿透過程中,光源的穿透率大幅度的降低。在將光與電進行系統(tǒng)的管理和有效的結(jié)合的情況之下,就可將電信號(電)轉(zhuǎn)換成亮暗顯示(光)。液晶顯示的優(yōu)點:(1)顯示質(zhì)量好,可視面積大。液晶顯示器每一個點在收到信號后會一直保持色彩和亮度,恒定發(fā)光,而不需要像陰極射線管顯示器(CRT)那樣需要不斷刷新亮點。因此,液晶顯示器畫質(zhì)高且不會閃爍。(2)數(shù)字式接口。液晶顯示器都是數(shù)字式的,和單片機系統(tǒng)的接口更加簡單可靠,不需要把數(shù)字信號轉(zhuǎn)化為模擬信號在進行輸出,操作更加方便。液晶顯示器各種圖形的顯示原理:(1)線段的顯示點陣圖形式液晶由M×N個顯示單元組成,假設LCD顯示屏有64行,每行有128列,每8列對應1字節(jié)的8位,即每行有16字節(jié),共16×8=128個點組成,屏上64×16個顯示單元與顯示RAM區(qū)1024字節(jié)相對應,每一字節(jié)的內(nèi)容和顯示屏上相應位置的亮暗對應。(2)字符的顯示用LCD顯示一個字符時比較復雜,因為一個字符由6×8或8×8點陣組成,既要找到和顯示屏幕上某幾個位置對應的顯示RAM區(qū)的8字節(jié),還要使每字節(jié)的不同位為“1”,其它的為“0”,為“1”的點亮,為“0”的不亮。這樣一來就組成某個字符。(3)漢字的顯示漢字的顯示一般采用圖形的方式,事先從微機中提取要顯示的漢字的點陣碼(一般用字模提取軟件),每個漢字占32B,分左右兩半,各占16B,左邊為1、3、5…右邊為2、4、6…根據(jù)在LCD上開始顯示的行列號及每行的列數(shù)可找出顯示RAM對應的地址,設立光標,送上要顯示的漢字的第一字節(jié),光標位置加1,送第二個字節(jié),換行按列對齊,送第三個字節(jié)…直到32B顯示完LCD就可以得到一個完整的漢字。圖2.6液晶系統(tǒng)電路圖2.6溫度檢測系統(tǒng)系統(tǒng)的溫度檢測選用DALLAS公司“一線總線”數(shù)字溫度傳感器DS18B20,該傳感器具有微型化、低功耗、高性能等優(yōu)點,可直接將溫度轉(zhuǎn)化成串行數(shù)字信號處理,測溫范圍為-55-125℃,最高分辨率可達0.0625℃。DS18B20共有三個引腳電源正VCC、電源負GND和信號輸入輸出口DQ.R3為4.7K的上拉電阻,用于保證單片機與DS18B20通訊時高低電平準確的被單片機機和DS18B20識別。單片機P3.0口通過R3連接DQ端口實現(xiàn)溫度數(shù)據(jù)的采集處理,并通過液晶屏實時顯示。溫度檢測電路如圖2.7所示。圖2.7溫度檢測電路圖DS18B20共有2種形態(tài)的存儲器資源,它們分別是:(1)ROM只讀存儲器,用于存放DS18B20ID編碼,其前8位是單線系列編碼(DS18B20的編碼是19H),后面48位是芯片唯一的序列號,最后8位是以上56的位的CRC碼(冗余校驗)。數(shù)據(jù)在出產(chǎn)時設置不由用戶更改。DS18B20共64位ROM。(2)RAM數(shù)據(jù)暫存器,用于內(nèi)部計算和數(shù)據(jù)存取,數(shù)據(jù)在掉電后丟失,DS18B20共9個字節(jié)RAM,每個字節(jié)為8位。由于DS18B20溫度檢測傳感器使用范圍比較廣,電路設計和軟件編程都比較成熟。所以本電路系統(tǒng)采用DS18B20溫度檢測傳感器不管是從硬件電路設計還是軟件編程方面都具有很好的優(yōu)勢,能夠起到簡化電路設計節(jié)約成本的作用。2.7蜂鳴系統(tǒng)蜂鳴器發(fā)聲原理是電流通過電磁線圈,使電磁線圈產(chǎn)生磁場來驅(qū)動振動膜發(fā)聲的,基于當前這樣的一種原因的實施和存在的狀況之下,是需要足夠的電流的管理和系統(tǒng)性的驅(qū)動態(tài)勢的完成的,單片機IO引腳輸出的電流較小,單片機輸出的TTL電平基本上驅(qū)動不了蜂鳴器,所以在具體的電路實施和客觀的管理過程中,是應該有一個較大的功率,實現(xiàn)對整個電路的高效的管理和系統(tǒng)性的放大事宜的完成和執(zhí)行的。由單片機P3.7接口外接一個1K電阻和兩個NPN型三極管來驅(qū)動蜂鳴器。其主要任務是實現(xiàn)功率的較大程度的管理和系統(tǒng)性的輸出,對音頻信號有效不失真的進行放大,進而最終導致聲音在揚聲器的作用之下,予以良好的管理和系統(tǒng)性的予以呈現(xiàn)的態(tài)勢的完成。蜂鳴系統(tǒng)用于產(chǎn)生鬧鐘報警聲以及按鍵提示音。由單片機P2.4口控制PNP三極管9012的通斷實現(xiàn)對蜂鳴器聲音控制;通過延遲函數(shù)實現(xiàn)蜂鳴報警聲的長短音控制,長音‘滴’用于鬧鐘鈴聲,短音‘滴’用于按鍵提示音。蜂鳴系統(tǒng)電路如圖2.8所示。圖2.8蜂鳴系統(tǒng)電路圖2.8按鍵系統(tǒng)按鍵控制系統(tǒng)由S2~S6五個按鍵組成,分別為S2時間設置鍵、S3數(shù)值增大鍵、S4數(shù)值減小鍵、S5鬧鐘設置鍵以及S6亮度調(diào)節(jié)鍵。S2用于選擇需要調(diào)整的時間日歷以及鬧鐘參數(shù),并作為時間日歷參數(shù)的存儲確認鍵。S3與S4用于調(diào)整被選參數(shù)值的大小。S5用于鬧鐘查看與存儲確認鍵。S6用于LED燈光10級亮度的調(diào)節(jié)鍵。按鍵系統(tǒng)電路如圖2.9所示。圖2.9按鍵系統(tǒng)電路圖2.9電源系統(tǒng)本系統(tǒng)設計最大功率約1.6W,可采用電池或穩(wěn)壓電源多種方式供電。由于系統(tǒng)光源采用20只LED燈珠并聯(lián)組成,所以LED恒流驅(qū)動芯片PT4115供電電源在6~30V電壓范圍內(nèi)均可使LED燈正常使用。但單片機供電需要恒壓供電。系統(tǒng)采用三端穩(wěn)壓芯片7805,來穩(wěn)定給單片機供電的電源。該線性穩(wěn)壓芯片正常工作輸入電壓與輸出電壓差值應至少高于2V,若差值過大會增加額外功耗。因此,本系統(tǒng)宜選用穩(wěn)壓電源方式供電。同時,本文LED恒流驅(qū)動系統(tǒng)設計簡潔靈活,可根據(jù)用戶需求適當調(diào)整驅(qū)動電路參數(shù),即可擴展LED照明功率,最大可至10W左右。集成直流穩(wěn)壓電源的要求是比較基本的設計,設計要求電源輸出5V直流電壓。恒流源是能夠向需要電源的設備實現(xiàn)電源的及時管理和系統(tǒng)性的供應態(tài)勢的完成的,一次恒流源,從其使用的深度上,以及使用的廣度上來看,都是非常廣泛的,并且也是逐漸的得到了更多的人的關注和系統(tǒng)性的認可,這樣的一種態(tài)勢,不管是從哪個層面上,都是需要重點的明確的問題。例如在通用的充電器對蓄電池充電時,由于整個蓄電池的電壓的提升,充電電源能夠充進去的電量,也呈現(xiàn)出較大程度的降低和減少的態(tài)勢的完成,為了實現(xiàn)其在一種相對較為恒定的范圍內(nèi)予以有效的管理和系統(tǒng)性的執(zhí)行,對于其最終輸出的電壓數(shù)值,是應該大幅度的予以降低的,但是如果采用恒壓的電源來實現(xiàn)整個電路的系統(tǒng)性的實施和客觀的予以管理的話,對于其最終輸出的電壓數(shù)值,就不需要做出過多的體艾歐整和管理,進而使得人們的工作強度以及勞動強度實現(xiàn)了較大程度的降低,從而從根本上,實現(xiàn)整個生產(chǎn)效率的大幅度的提升和加強,進而最終,不管是從社會效益的層面上,還是從其最終呈現(xiàn)出來的經(jīng)濟效益,都是會得到大幅度的提升。恒流源在實現(xiàn)電源的有效的管理和系統(tǒng)性的測量過程中,也是得到了大力的關注和廣泛性的應用。圖2.10直流穩(wěn)壓電源第3章系統(tǒng)軟件設計該系統(tǒng)控制程序主要包含系統(tǒng)初始化程序、實時時鐘芯片處理程序、溫度傳感器芯片處理程序、液晶顯示程序、鍵盤檢測與處理程序、鬧鐘中斷以及定時器產(chǎn)生PWM程序構成。3.1系統(tǒng)主程序系統(tǒng)主程序流程圖如圖3.1所示。圖3.1主程序流程圖3.2按鍵檢測和處理程序按鍵控制系統(tǒng)由S2~S6五個按鍵組成,分別為S2時間設置鍵、S3數(shù)值增大鍵、S4數(shù)值減小鍵、S5鬧鐘設置鍵以及S6亮度調(diào)節(jié)鍵。S2用于選擇需要調(diào)整的時鐘以及鬧鐘參數(shù),根據(jù)S2按下次數(shù),依次選擇秒、分、時、星期、日、月、年,液晶屏上被選參數(shù)下方以光標閃爍狀態(tài)提示,再通過按下S3或S4調(diào)整被選參數(shù)值的大小,S2按下累積8次時,則退出選擇功能并保存當前數(shù)據(jù)至時鐘芯片。按鍵檢測與處理流程圖如圖3.2所示。圖3.2按鍵檢測與處理流程圖3.3外部中斷程序鬧鐘中斷程序如圖3.3所示。圖3.3外部中斷流程圖3.4定時器中斷程序這樣,P1.1口就產(chǎn)生了所需的PWM調(diào)光信號。定時器生成PWM流程圖如圖3.4所示。圖3.4定時器生成PWM流程圖3.5C語言程序編寫和ISP軟件程序下載C語言是國際社會廣泛流行的計算機高級語言。語言簡潔,緊湊,使用方便靈活,是完全模塊化和結(jié)構化的語言,語法設計不太嚴格,程序設計自由度大,用C語言編寫的程序可移植性好。C語言的這些特點和電路的設計比較吻合。全局性和局部性,模塊化可以簡便編程過程。因此選擇C語言進行程序設計,要比匯編語言好。在程序編寫的過程中需要做到認真仔細,程序的編寫是個比較大的一個工程。在這個過程中會遇到許多的問題,需要一一解決。程序編寫也是論文設計過程中最重要的一個環(huán)節(jié),因為硬件和軟件是不可能脫離的。兩者都能成功并且結(jié)合到一起才能實現(xiàn)論文的要求。SP(In-SystemProgramming)是當今流行的單片機編程模式??稍诰€系統(tǒng)編程的意思是指電路板上的可編程下載的空白元器件可以直接編程寫入最終用戶代碼,而不需要從電路板上取下可重復編程邏輯器件。已經(jīng)編程的器件也可以用ISP方式擦除或再編程。在完成編寫程序的編譯通過之后,把可以燒寫STC89C51的ISP編程器并與電腦主機硬件連接后,打開相應下載軟件按步驟即可對STC89C51芯片進行程序燒錄下載。燒錄完成成功后會有提示。重新通電即可測試和運行電路。本系統(tǒng)采用匯編語言和C51混合編程的方法。為了使得整個程序在具體的實施和系統(tǒng)性的操作過程中,更加的簡便易行,而且在實際的調(diào)試過程中,能夠最大程度的發(fā)揮出其較好的作用,當前采用的最為廣泛和普及的方式就是結(jié)構編程的方式來予以完成和執(zhí)行的。第4章軟件的調(diào)試和仿真Proteus仿真如圖4.1圖4.1電路仿真圖由此仿真圖可以看到電路設計滿足設計要求。能夠顯示溫度,時間,日期,燈光亮度能夠進行鬧鐘定時,能夠形成PWM脈寬調(diào)制波形進行臺燈亮度調(diào)節(jié)。此仿真結(jié)果說明電路和程序是可行的。用本次畢業(yè)設計來驗證書本中所學習的內(nèi)容,不僅能夠讓我們鞏固以前所學習的知識,更能學習到許多課本以外的知識。論文設計需要綜合考慮每種電路的優(yōu)缺點,以及整體電路的需求。而關于電子元器件的選擇是查閱了許多資料。材料的選擇參數(shù)的計算很重要,這直接關系到本次實驗能否獲得成功。對于電路的仿真實驗,我做了許多摸索,仿真軟件自己在以前接觸的比較少,用的也不是很熟悉。經(jīng)過一段時間的練習能夠基本操作仿真軟件了。并對Proteus仿真軟件有了進一步的了解。最后我設計出了各個部分模塊的電路圖,并實現(xiàn)了電路圖的組合。經(jīng)過不斷地測試和調(diào)試,以及與指導老師和同學的溝通與交流,最終完善了硬件電路的設計,我所設計的電路在Proteus仿真軟件上仿真成功。本次畢業(yè)設計經(jīng)歷了設計階段、開發(fā)實現(xiàn)階段以及最后的應用測試階段。經(jīng)過幾個月的努力,核心問題已經(jīng)全部解決,所有功能均已基本實現(xiàn),能夠顯示日期,時間,星期,溫度,燈光亮度,能夠進行調(diào)光,進行鬧鐘定時。并基本上能夠?qū)崿F(xiàn)本次畢業(yè)設計的設計要求。畢業(yè)設計這個環(huán)節(jié)是對從前所學知識的一個很好的鞏固。之前對模擬電路和數(shù)字電路還有C語言都知識掌握了一定的理論知識,沒有真正的聯(lián)系起來的運用一個系統(tǒng)中。通過這次畢業(yè)設計,不管理論知識還是運用的實際操作能力都有了很大的提高。但是由于本人水平和時間有限,不能非常深入的掌握,相關知識在實際中的應用,對C語言編程更是只通皮毛而已,很多地方都沒有考慮周全,還有很多不足之處有待改進。下面就是我對這次畢業(yè)設計的一些總結(jié)。經(jīng)過兩個多月的努力,我的畢業(yè)設計終于完成了,但是現(xiàn)在回想起來做畢業(yè)設計的整個過程,頗有心得,其中有苦也有甜,艱辛的同時又充滿樂趣!通過本次畢業(yè)設計,沒有接受任務以前覺得畢業(yè)設計只是對這幾年來所學知識的單純總結(jié),但是通過這次做畢業(yè)設計發(fā)現(xiàn)畢業(yè)設計不僅是對前面所學知識的一種檢驗,而且也是對自己能力的一種提高。下面我對整個畢業(yè)設計的過程做一下簡單的總結(jié)。第一,在選擇畢業(yè)設計的選題時,我就選擇自己比較感興趣的數(shù)字控制方面的,這樣做起來動力很大。第二,確定好畢業(yè)設計選題后就是找資料了。查資料是做畢業(yè)設計的前期準備工作,圖書館去借了相關方面的書籍,同時也在網(wǎng)上大量搜索相關內(nèi)容??傊?,不管通過哪種方式查的資料都是有利用價值的,要一一記錄下來以備后用。第三,綜合已有的資料來更透徹的分析本次設計題目。首先,我們要閱讀大量的資料,能夠是自己對畢業(yè)設計課題有更深入的理解,然后基于此,展開自己的設計,第一步要完成的是系統(tǒng)總體方案的設計。這一步是關鍵,因為以后的工作都是在此基礎上做的!第四,有了研究方向,就要動手實現(xiàn)。為了更好的編寫程序,先利用Proteus仿真。編寫源代碼的時候是編寫一個小模塊就進行調(diào)試,這樣可以避免設計的最后出現(xiàn)太多的錯誤而亂成一團糟。一步步地做下去之后,你會發(fā)現(xiàn)要做出來并不難,只不過每每做一會兒會發(fā)現(xiàn)一處錯誤要修改,就這樣在不斷的修改調(diào)試,再修改再調(diào)試。第五,軟件仿真成功以后,才開始寫論文和實物電路的焊接,Word雖然是人人都知道的文字編輯軟件,但真要用它來寫論文,才發(fā)現(xiàn)自己懂得的一點點Word知識不夠用,還好有網(wǎng)絡,能夠在線學習Word的使用技巧,以完成論文的編輯和排版。電路的焊接,我們也不敢輕易妄動,畢竟時間有限,并且有些芯片數(shù)量有限,燒壞就很麻煩,所以也只能在別人的指導和幫助下一步一步完成,是一個動手學習的過程!我們只有對自己有了更高的要求,才能作為動力不斷取得新的成績!在整個設計過程中,使我懂得了許多東西,也培養(yǎng)了我獨立工作的能力,樹立了對自己工作能力的信心,相信會對今后的學習工作生活有非常重要的影響??傮w來說,通過本次畢業(yè)設計,我的文獻檢索能力提高了,綜合分析問題的能力也有所提高,同時提高了運用所學知識解決實際問題的能力,提高了獨立獲得新知識的能力,提高了自己技術文件的編寫能力。致謝本論文從選題、構思到定稿無不滲透著導師的心血和汗水;導師淵博的知識和嚴謹?shù)膶W風使我受益終身,在此表示深深的敬意和感謝。我還要感謝含辛茹苦、任勞任怨、望子成龍、不圖回報的父母的養(yǎng)育之恩,他們給予我的愛和支持讓我順利地完成了自己的學業(yè)。最后,因本人水平有限,在文中難免有不足之處,懇請各位老師批評指正。參考文獻[1]孫育才.ATMEL新型AT89C5X系列單片機及其應用[M].清華大學出版社,2005[2]陳桂友,柴遠斌.單片機應用技術[M].北京機械工業(yè)出版社,2008.[3]劉健,徐煒,伊均萍,劉良成.電路分析[M].北京:電子工業(yè)出版社,2005[4]謝望.煙霧傳感器技術的現(xiàn)狀和發(fā)展趨勢[J].儀器儀表用,2006,(5):1~2[5]余小平,奚大順.電子系統(tǒng)設計[M].北京:航空航天大學出版社,2007[6]謝自美.電子線路設計、實驗、測試[M].北京:華中科技大學出版社,2006[7]李全利,仲偉峰,徐軍.單片機原理及應用[M].北京:清華大學出版社,2006[8]康光華,鄒壽彬.電子技術基礎數(shù)字部分(第五版)[M].北京:高等教育出版社,2006[9]謝維成,劉勇.微機原理與接口技術[M].華中科技大學出版社,2009[10]高玲,尹立強.基于單片機的LCD顯示系統(tǒng)設計與Proteus仿真實現(xiàn)[J].辦公自動化.2011,(18):10[11]魯捷,焦振宇.PROTEL2004電路設計[M].北京:清華大學出版社,2006[12]李春葆,金晶.C語言程序設計輔導[M].北京:清華大學出版社,2007[13]楊將新,李華軍.單片機程序設計及應用(第三版)[M].北京:電子工業(yè)出版社,2006[14]馬忠梅.單片機的C語言應用程序設計(第3版)[M].北京:北京航空航天大學出版社,2003[15]陳曉莉,張俊濤.KEILC51單片機仿真器的設計[J].微計算機信息(嵌入式與SOC),2006,(02):19~20附錄1電路原理總圖附錄2電路程序清單#include<STC89C51.h>#include<intrins.h>//_nop_();延時函數(shù)用#defineuintunsignedint#defineucharunsignedcharucharhour_set=17,min_set=1;//設定的蜂鳴器提示時間bitalarmflag=1;//報警標志位ucharTHTIME0=(8192-400)/32;ucharTLTIME0=(8192-400)%32;//規(guī)定初始PWM高電平時間ucharset_pwmtime=5;//設定的PWM占空比ucharpwmtime;//當前的PWM的定時器值/****************************************************************//*延時程序/****************************************************************/voiddelayms(unsignedintms){ unsignedintx; for(;ms;ms--) //ms=0則跳出 for(x=1000;x;x--);} #include"intrins.h"http://_nop_();延時函數(shù)用//*****************////以下是DS18B20驅(qū)動程序//*****************///****************************************************功能描述:DS18B20驅(qū)動程序,使用12M晶體**DQ占用引腳資源P1^7****************************************************/sbitDQ=P3^0;//溫度輸入口unsignedchardatatemper_data={0x00,0x00};//讀出溫度暫放unsignedchardata_1820display={0x00};//顯示單元數(shù)據(jù),共4個數(shù)據(jù)和一個運算暫用unsignedinttemper;//**************溫度小數(shù)部分用查表法***********//unsignedcharcodeditab={ 0x00,0x01,0x01,0x02, 0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07, 0x08,0x08,0x09,0x09};/*****************11us延時函數(shù)*************************///void_18B20_delay(unsignedintt){for(;t>0;t--);}/****************DS18B20復位函數(shù)************************/_18B20_reset(void){ charpresence=1; while(presence) { while(presence){ DQ=1; _nop_();_nop_();//從高拉倒低 DQ=0; _18B20_delay(50);//550us DQ=1; _18B20_delay(6);//66us presence=DQ;//presence=0復位成功,繼續(xù)下一步 } _18B20_delay(45);//延時500us presence=~DQ; } DQ=1;//拉高電平}/****************DS18B20寫命令函數(shù)************************///向1-WIRE總線上寫1個字節(jié)void_18B20_write(unsignedcharval){unsignedchari;for(i=8;i>0;i--){ DQ=1; _nop_();_nop_();//從高拉倒低 DQ=0; _nop_();_nop_();_nop_();_nop_();//5us DQ=val&0x01;//最低位移出 _18B20_delay(6);//66us val=val/2;//右移1位}DQ=1;_18B20_delay(1);}/****************DS18B20讀1字節(jié)函數(shù)************************///從總線上取1個字節(jié)unsignedchar_18B20read_byte(void){ unsignedchari; unsignedcharvalue=0; for(i=8;i>0;i--) { DQ=1; _nop_();_nop_();//從高拉倒低 value>>=1; DQ=0; _nop_();_nop_();_nop_();_nop_();//4us DQ=1; _nop_();_nop_();_nop_();_nop_();//4us if(DQ)value|=0x80; _18B20_delay(6);//66us } DQ=1; return(value);}_18B20_read() //讀出溫度函數(shù){ _18B20_reset();//總線復位 _18B20_delay(200); _18B20_write(0xcc);//發(fā)命令 _18B20_write(0x44);//發(fā)轉(zhuǎn)換命令 _18B20_reset();_18B20_delay(1); _18B20_write(0xcc);//發(fā)命令 _18B20_write(0xbe); temper_data=_18B20read_byte();//讀溫度值的低字節(jié) temper_data=_18B20read_byte();//讀溫度值的高字節(jié) temper=temper_data; temper<<=8; temper=temper|temper_data;//兩字節(jié)合成一個整型變量。 returntemper;//返回溫度值}/****************溫度數(shù)據(jù)處理函數(shù)************************///二進制高字節(jié)的低半字節(jié)和低字節(jié)的高半字節(jié)組成一字節(jié),這個//字節(jié)的二進制轉(zhuǎn)換為十進制后,就是溫度值的百、十、個位值,而剩//下的低字節(jié)的低半字節(jié)轉(zhuǎn)化成十進制后,就是溫度值的小數(shù)部分/********************************************************/_18B20_work(unsignedinttem){ unsignedcharn=0; if(tem>6348)//溫度值正負判斷 { tem=65536-tem; n=1; }//負溫度求補碼,標志位置1 _1820display=tem&0x0f;//取小數(shù)部分的值 _1820display=ditab[_1820display];//存入小數(shù)部分顯示值 _1820display=tem>>4;//取中間八位,即整數(shù)部分的值 _1820display=_1820display/100;//取百位數(shù)據(jù)暫存 _1820display=_1820display%100;//取后兩位數(shù)據(jù)暫存 _1820display=_1820display/10;//取十位數(shù)據(jù)暫存 _1820display=_1820display%10;/******************數(shù)碼管符號位顯示判斷**************************/ if(!_1820display) { _1820display=''-'0';//最高位為0時不顯示 if(!_1820display) _1820display=''-'0';//次高位為0時不顯示 } if(n) _1820display='-'-'0';//負溫度時最高位顯示"-"}_18B20_init()//18B20初始化{ _18B20_reset();//開機先轉(zhuǎn)換一次 _18B20_write(0xcc);//SkipROM _18B20_write(0x44);//發(fā)轉(zhuǎn)換命令}//*****************////以下是LCM1602驅(qū)動程序//*****************///****************************************************功能描述:1602驅(qū)動程序,使用12M晶體**占用引腳資源數(shù)據(jù)口八位,命令控制兩位****************************************************/sbitLCD_RS=P2^7;sbitLCD_E=P2^6;#defineLCD_DATAP0/****************************************************函數(shù)名稱:delay**入口參數(shù):h(unsignedint型)**出口參數(shù):無**功能描述:短暫延時,使用11.0592晶體,約0.01MS****************************************************/voiddelay(unsignedintz)//1毫秒延時子函數(shù){ unsignedintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}/****************************************************函數(shù)名稱:WriteDataLcd**入口參數(shù):wdata(unsignedchar型)**出口參數(shù):無**功能描述:寫數(shù)據(jù)到LCD****************************************************/voidWriteDataLcd(unsignedcharwdata){ LCD_RS=1; LCD_DATA=wdata; delay(1);//短暫延時,代替檢測忙狀態(tài) LCD_E=1; delay(1);//短暫延時,代替檢測忙狀態(tài) LCD_E=0;}/****************************************************函數(shù)名稱:WriteCommandLcd**入口參數(shù):wdata(unsignedchar型)**出口參數(shù):無**功能描述:寫命令到LCD****************************************************/voidWriteCommandLcd(unsignedcharwdata){ LCD_RS=0; LCD_DATA=wdata; delay(1);//短暫延時,代替檢測忙狀態(tài) LCD_E=1; delay(1);//短暫延時,代替檢測忙狀態(tài) LCD_E=0;}ucharcodehanzi[8]= //中文漢字庫{0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,//日0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,//月0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//年};voidwriteCG() //允許寫入中文漢字{ ucharx,y; WriteCommandLcd(0x40); for(y=0;y<3;y++) { for(x=0;x<8;x++) { WriteDataLcd(hanzi[y][x]); } } }//LCD初始化voidlcd_init(void){ LCD_E=0; writeCG(); //允許寫入中文漢字 WriteCommandLcd(0x38); WriteCommandLcd(0x38);//顯示模式設置 WriteCommandLcd(0x0c);//光標無 WriteCommandLcd(0x06);//顯示光標移動設置 WriteCommandLcd(0x01);//顯示清屏 WriteCommandLcd(0x90);//顯示開及光標移動設置}/****************************************************函數(shù)名稱:display_xy**入口參數(shù):x(unsignedchar型),y(unsignedchar型)**出口參數(shù):無**功能描述:設置光標位置,x是列號,y是行號****************************************************/voiddisplay_xy(unsignedcharx,unsignedchary){ if(y==1) x+=0x40; x+=0x80; WriteCommandLcd(x);}/**********************************************************************函數(shù)名稱:display_char**入口參數(shù):x(unsignedchar型),y(unsignedchar型),dat(unsignedchar型)**出口參數(shù):無**功能描述:在具體位置顯示單個字符,x是列號,y是行號/*********************************************************************/voiddisplay_char(unsignedcharx,unsignedchary,unsignedchardat){ display_xy(x,y); WriteDataLcd(dat);}/***********************************************************************函數(shù)名稱:display_string**入口參數(shù):x(unsignedchar型),y(unsignedchar型),s(指針型)**出口參數(shù):無**功能描述:在具體位置顯示字符串,以/0結(jié)束,x是列號,y是行號**********************************************************************/voiddisplay_string(unsignedcharx,unsignedchary,unsignedchar*s){ display_xy(x,y); while(*s) { WriteDataLcd(*s); s++; }} #defineDS1302_SECOND 0x80//時鐘芯片的寄存器位置,存放時間#defineDS1302_MINUTE 0x82#defineDS1302_HOUR 0x84#defineDS1302_WEEK 0x8A#defineDS1302_DAY 0x86#defineDS1302_MONTH 0x88#defineDS1302_YEAR 0x8C#defineDS1302_YEARH0xC0#defineDS1302_WRITE 0x8E#defineBCD2DEC(X) (((X&0x70)>>4)*10+(X&0x0F)) //用于將BCD碼轉(zhuǎn)成十進制的宏#defineDEC2BCD(X) ((X/10)<<4|(X%10)) //用于將十進制轉(zhuǎn)成BCD碼的宏#defineBD(t)(t=t%16+t/16*10) //BCD碼轉(zhuǎn)十進制#defineDB(t)(t=t%10+t/10*16) //十進制轉(zhuǎn)BCD碼sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit DS1302_CLK=P1^6; //實時時鐘時鐘線引腳sbit DS1302_IO=P1^7;//實時時鐘數(shù)據(jù)線引腳sbit DS1302_RST=P1^5; //實時時鐘復位線引腳 sbit Up = P3^4;//加法按鈕!sbit Down= P3^5;//減法按鈕sbit Set= P3^1;//模式切換鍵sbit out= P3^3;//立刻跳出調(diào)整模式按鈕chardone,count,temp,up_flag,down_flag,hideflag=10,week_value;//done:1:進入調(diào)整模式,0:正常模式//count切換閃爍位(位置變量)//temp:閃爍位變量值//up,downflag:按鍵加減標志位。//hideflag,控制閃爍頻率 charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;//秒,分,時到日,月,年位閃的計數(shù)typedefstructSYSTEMTIME{ unsignedcharSecond; unsignedcharMinute; unsignedcharHour;unsignedcharWeek; unsignedcharDay; unsignedcharMonth; unsignedcharYear; unsignedcharYearH; unsignedcharYearL; unsignedcharday; unsignedcharmonth; unsignedcharyear; unsignedcharDateString; unsignedcharTimeString;}SYSTEMTIME; //定義的時間類型SYSTEMTIMECurrentTime;//voidDS1302InputByte(unsignedchard) //實時時鐘寫入一字節(jié)(內(nèi)部函數(shù)){uchari;ACC=d;for(i=8;i>0;i--){DS1302_IO=ACC0; //相當于匯編中的RRCDS1302_CLK=1;DS1302_CLK=0;ACC=ACC>>1;}}ucharDS1302OutputByte(void) //實時時鐘讀取一字節(jié)(內(nèi)部函數(shù)){unsignedchari;for(i=8;i>0;i--){ACC=ACC>>1; //相當于匯編中的RRCACC7=DS1302_IO;DS1302_CLK=1;DS1302_CLK=0;}return(ACC);}voidWrite1302(ucharucAddr,ucharucDa) //ucAddr:DS1302地址,ucData:要寫的數(shù)據(jù){DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr); //地址,命令DS1302InputByte(ucDa); //寫1Byte數(shù)據(jù)DS1302_CLK=1;DS1302_RST=0;}ucharRead1302(ucharucAddr) //讀取DS1302某地址的數(shù)據(jù){unsignedcharucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr|0x01);//地址,命令ucData=DS1302OutputByte();//讀1Byte數(shù)據(jù)DS1302_CLK=1;DS1302_RST=0;return(ucData);}voidDS1302_GetTime(SYSTEMTIME*Time)//獲取時鐘芯片的時鐘數(shù)據(jù)到自定義的結(jié)構型數(shù)組{ ucharReadValue; ReadValue=Read1302(DS1302_SECOND); Time->Second=BCD2DEC(ReadValue&0x7F); ReadValue=Read1302(DS1302_MINUTE); Time->Minute=BCD2DEC(ReadValue); ReadValue=Read1302(DS1302_HOUR); Time->Hour=BCD2DEC(ReadValue&0x7F); ReadValue=Read1302(DS1302_DAY); Time->Day=BCD2DEC(ReadValue); ReadValue=Read1302(DS1302_WEEK); Time->Week=BCD2DEC(ReadValue); ReadValue=Read1302(DS1302_MONTH); Time->Month=BCD2DEC(ReadValue); ReadValue=Read1302(DS1302_YEAR); Time->Year=BCD2DEC(ReadValue); ReadValue=Read1302(DS1302_YEARH); Time->YearH=BCD2DEC(ReadValue); }voidInitial_DS1302(void)//時鐘芯片初始化{ ucharSecond=Read1302(DS1302_SECOND); if(Second&0x80) //判斷時鐘芯片是否關閉 { Write1302(DS1302_WRITE,0x00);//寫入允許 Write1302(DS1302_YEARH,0x20); Write1302(DS1302_YEAR,0x12);//以下寫入初始化時間!!!!! Write1302(DS1302_MONTH,0x03); Write1302(DS1302_DAY,0x24); Write1302(DS1302_WEEK,0x06); Write1302(DS1302_HOUR,0x11); Write1302(DS1302_MINUTE,0x25); Write1302(DS1302_SECOND,0x00); Write1302(DS1302_WRITE,0x80);//禁止寫入 }} voidDateToStr(SYSTEMTIME*Time)//將時間年,月,日,星期數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里DateString[]{ if(hide_year<hideflag/2)//這里的if,else語句都是判斷位閃爍,<hideflag/2顯示數(shù)據(jù),>hideflag/2就不顯示,輸出字符串為2007/07/22 { Time->DateString='2'; Time->DateString='0'; Time->DateString=Time->Year/10+'0'; Time->DateString=Time->Year%10+'0'; } else { Time->DateString=''; Time->DateString=''; Time->DateString=''; Time->DateString=''; } Time->DateString=0x02; //年,'/'//// if(hide_month<hideflag/2) { Time->DateString=Time->Month/10+'0'; Time->DateString=Time->Month%10+'0'; } else { Time->DateString=''; Time->DateString=''; } Time->DateString=0x01;//月'/';//// if(hide_day<hideflag/2) { Time->DateString=Time->Day/10+'0'; Time->DateString=Time->Day%10+'0'; } else { Time->DateString=''; Time->DateString=''; } Time->DateString=0x00;//日 Time->DateString='\0';//字符串末尾加'\0',判斷結(jié)束字符(1602顯示結(jié)束)//// if(hide_week<hideflag/2) { week_value=Time->Week%10+'0';//星期的數(shù)據(jù)另外放到week_value[]數(shù)組里,跟年,月,日的分開存放,因為等一下要在最后顯示 } else { week_value=''; } week_value='\0';}voidTimeToStr(SYSTEMTIME*Time)//將時,分,秒數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符放到數(shù)組TimeString[];{ if(hide_hour<hideflag/2){ Time->TimeString=Time->Hour/10+'0'; Time->TimeString=Time->Hour%10+'0'; } else { Time->TimeString=''; Time->TimeString=''; } Time->TimeString=':';////if(hide_min<hideflag/2) { Time->TimeString=Time->Minute/10+'0'; Time->TimeString=Time->Minute%10+'0'; } else { Time->TimeString=''; Time->TimeString=''; } Time->TimeString=':';////if(hide_sec<hideflag/2){ Time->TimeString=Time->Second/10+'0'; Time->TimeString=Time->Second%10+'0';} else { Time->TimeString=''; Time->TimeString=''; }//// Time->DateString='\0';//字符串末尾加'\0',判斷結(jié)束字符(1602顯示結(jié)束)}voidshow_time()//液晶顯示程序{ DS1302_GetTime(&CurrentTime);//獲取時鐘芯片的時間數(shù)據(jù) TimeToStr(&CurrentTime);//時間數(shù)據(jù)轉(zhuǎn)換液晶字符 DateToStr(&CurrentTime);//日期數(shù)據(jù)轉(zhuǎn)換液晶字符 display_string(0,1,CurrentTime.TimeString);//顯示時間 display_string(0,0,CurrentTime.DateString);//顯示日期 display_char(10,0,0);//“日” display_char(11,0,'');//“” display_char(12,0,'');//“” display_char(13,0,'*');//顯示* display_char(14,0,week_value);//顯示星期 display_char(15,0,'*');//顯示*}voidoutkey()//跳出調(diào)整模式,返回默認顯示{ ucharSecond; if(out==0) { delay(8); count=0; hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0; Second=Read1302(DS1302_SECOND);//讀出秒 Write1302(DS1302_WRITE,0x00);//寫入允許 Write1302(DS1302_SECOND,Second&0x7f);//將秒寫回去 Write1302(DS1302_WRITE,0x80);//禁止寫入 done=0; while(out==0); }}voidUpkey()//升序按鍵{ Up=1; if(Up==0) { delayms(8); switch(count) {case1:temp=Read1302(DS1302_SECOND);//讀取秒數(shù) temp=0;//秒數(shù)歸零up_flag=1;//數(shù)據(jù)調(diào)整后更新標志 if((temp&0x7f)>0x59)//超過59秒,清零temp=0; break; case2:temp=Read1302(DS1302_MINUTE);//讀取分數(shù) BD(temp); temp++;//分數(shù)加1 DB(temp); up_flag=1; if(temp>0x59)//超過59分,清零 temp=0; break; case3:temp=Read1302(DS1302_HOUR);//讀取小時數(shù) BD(temp); temp++;//小時數(shù)加1 DB(temp);up_flag=1; if(temp>0x23)//超過23小時,清零 temp=0; break; case4:temp=Read1302(DS1302_WEEK);//讀取星期數(shù) BD(temp); temp++;//星期數(shù)加1 DB(temp);up_flag=1; if(temp>0x7) temp=1; break; case5:temp=Read1302(DS1302_DAY);//讀取日數(shù) BD(temp); temp++;//日數(shù)加1 DB(temp);up_flag=1; if(temp>0x31) temp=1; break; case6:temp=Read1302(DS1302_MONTH);//讀取月數(shù) BD(temp); temp++;//月數(shù)加1 DB(temp);up_flag=1; if(temp>0x12) temp=1; break; case7:temp=Read1302(DS1302_YEAR);//讀取年數(shù) BD(temp); temp++;//年數(shù)加1 DB(temp);up_flag=1; if(temp>0x85) temp=0; break; default:break; } while(Up==0); }}voidDownkey()//降序按鍵{ Down=1; if(Down==0) { delayms(8); switch(count) {case1:temp=Read1302(DS1302_SECOND);//讀取秒數(shù) BD(temp); temp=0; //秒數(shù)減1 DB(temp);down_flag=1;//數(shù)據(jù)調(diào)整后更新標志 if(temp==-1)//小于0秒,返回59秒 temp=0x59; break; case2:temp=Read1302(DS1302_MINUTE);//讀取分數(shù) BD(temp); temp--;//分數(shù)減1 DB(temp);down_flag=1; if(temp==-1) temp=0x59;//小于0秒,返回59秒 break; case3:temp=Read1302(DS1302_HOUR);//讀取小時數(shù) BD(temp); temp--;//小時數(shù)減1 DB(temp);down_flag=1; if(temp==-1) temp=0x23; break; case4:temp=Read1302(DS1302_WEEK);//讀取星期數(shù) BD(temp); temp--;//星期數(shù)減1 DB(temp);down_flag=1; if(temp==0) temp=0x7;; break; case5:temp=Read1302(DS1302_DAY);//讀取日數(shù) BD(temp); temp--;//日數(shù)減1 DB(temp);down_flag=1; if(temp==0) temp=0x31; break; case

溫馨提示

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

最新文檔

評論

0/150

提交評論