基于單片機(jī)的智能調(diào)光燈設(shè)計(jì),基于,單片機(jī),智能,調(diào)光,設(shè)計(jì)
基于單片機(jī)的智能調(diào)光燈設(shè)計(jì) 答辯人:屈曉東導(dǎo) 師:李雪霞一、研究內(nèi)容可調(diào)節(jié)LED 光亮度;顯示當(dāng)前的時(shí)間,24 時(shí)制的時(shí)、分、秒;可調(diào)節(jié)時(shí)間。二、總體方案LED調(diào)光功能:按鍵K0、K1、K2分別控制一級(jí)亮度紅燈、二級(jí)亮度黃燈和三級(jí)亮度綠燈。時(shí)間/日期顯示:系統(tǒng)采用24小時(shí)制。正常情況下,系統(tǒng)顯示當(dāng)前日期、時(shí)間。設(shè)置功能:依次進(jìn)入日期設(shè)置、星期設(shè)置、時(shí)間設(shè)置。在進(jìn)行設(shè)置時(shí),光標(biāo)停留在相應(yīng)位,通過K3鍵,在各個(gè)數(shù)位間移動(dòng)。按下K4鍵、K5鍵對(duì)數(shù)值進(jìn)行加、減調(diào)整,用K6鍵確定所設(shè)置的時(shí)間。三、總體硬件原理圖單片機(jī)控制模塊震蕩模塊復(fù)位模塊時(shí)鐘模塊顯示模塊單片機(jī)控制模塊按鍵模塊臺(tái)燈模塊3、1 單片機(jī)最小系統(tǒng)3、2 臺(tái)燈模塊(1)(2)3、3 臺(tái)燈調(diào)光按鍵模塊 3、4 DS1302時(shí)鐘電路模塊 3、5 1602LCD顯示模塊 3、6 調(diào)節(jié)時(shí)鐘按鍵模塊 四、總體軟件流程圖4、1 臺(tái)燈模塊流程圖 4、2 時(shí)鐘設(shè)置流程圖=8次五、總體仿真圖(1)LED燈亮度仿真(2)LCD1602時(shí)鐘仿真 六、致謝 在此設(shè)計(jì)完成之際,我要特別感謝李雪霞老師,自始至終給我以指導(dǎo),使我能夠順利完成設(shè)計(jì)。衷心的感謝,各位老師!
本科畢業(yè)設(shè)計(jì)論文
題 目 基于單片機(jī)的智能調(diào)光燈設(shè)計(jì)
專業(yè)名稱 自動(dòng)化
學(xué)生姓名 屈曉東
指導(dǎo)教師 李雪霞
畢業(yè)時(shí)間 2014.06
西北工業(yè)大學(xué)明德學(xué)院本科畢業(yè)設(shè)計(jì)論文
設(shè)計(jì)
論文
畢業(yè) 任務(wù)書
一、題目:
基于單片機(jī)的智能調(diào)光燈設(shè)計(jì)
二、指導(dǎo)思想和目的要求:
通過畢業(yè)設(shè)計(jì),使學(xué)生對(duì)所學(xué)電子工藝、電路基礎(chǔ)知識(shí)、模電、數(shù)電、等電子基礎(chǔ)課程的基本知識(shí)加深理解,掌握單片機(jī)的基本指令及基本結(jié)構(gòu),并將其與實(shí)際工程應(yīng)用緊密結(jié)合起來,培養(yǎng)創(chuàng)新意識(shí),增強(qiáng)分析問題解決問題能力,為盡快進(jìn)入社會(huì)角色,熟悉相關(guān)開發(fā)工作流程、項(xiàng)目小組組成、分工、合作方式方法等。增強(qiáng)團(tuán)隊(duì)合作意識(shí),提高基本工作技能,為即將踏入社會(huì)奠定理論和實(shí)踐基礎(chǔ)。
內(nèi)容:設(shè)計(jì)一電路,不僅亮度可調(diào),還可以顯示時(shí)間等功能。
具體要求如下:
1) 顯示當(dāng)前的時(shí)間,24 時(shí)制的時(shí)、分、秒;
2) 可調(diào)節(jié)時(shí)間;
3) 可調(diào)節(jié)LED 光亮度;
步驟: l、了解所設(shè)計(jì)系統(tǒng)的工作原理及要求。
2、設(shè)計(jì)單片機(jī)工作的基本電路,如:晶振電路、復(fù)位電路。
3、根據(jù)系統(tǒng)設(shè)計(jì)要求選擇發(fā)光二極管、按鍵等模擬部件。
4、設(shè)計(jì)系統(tǒng)基本電路。
5、繪制PRTUSE電原理圖并編寫系統(tǒng)控制程序。
6、聯(lián)機(jī)進(jìn)行系統(tǒng)仿真調(diào)試。
三、進(jìn)度與要求:
1.第一周~第一周 收集設(shè)計(jì)系統(tǒng)相關(guān)資料。
2.第二周~第三周 用PROTUSE設(shè)計(jì)硬件原理圖并進(jìn)行器件選型。
3.第四周~第六周 編寫系統(tǒng)各功能模塊控制程序。
4.第七周~第十周 聯(lián)機(jī)進(jìn)行系統(tǒng)調(diào)試。
5. 第十一周~第十二周 整理并組織論文。
6.第十三周~第十四周 完成修改稿,定稿,打印,交評(píng)閱。
7.第十五周~第十六周 評(píng)閱與答辯
學(xué)生 屈曉東 指導(dǎo)教師 李雪霞 系主任 史儀凱
摘 要
在實(shí)際的應(yīng)用中發(fā)現(xiàn),當(dāng)周邊亮度大時(shí),LED燈過亮,存在電能浪費(fèi);當(dāng)周邊亮度小時(shí),LED燈過暗,又不能提供足夠和恰當(dāng)?shù)墓舛取S脕砀纳莆覀兊纳钯|(zhì)量,體驗(yàn)到科學(xué)技術(shù)帶給我們更方便的生活,節(jié)省電能。因此,研究實(shí)用具有時(shí)鐘功能的臺(tái)燈的應(yīng)用,有著非常現(xiàn)實(shí)的意義,具有很大的實(shí)用價(jià)值。
本文介紹了設(shè)計(jì)的框架結(jié)構(gòu)和組成模塊以及各模塊的原理,介紹了各部分硬件設(shè)計(jì)和各部分軟件設(shè)計(jì)以及軟件流程圖。該設(shè)計(jì)是以AT89C52 單片機(jī)為控制核心的集多種功能于一體的智能LED臺(tái)燈。該臺(tái)燈具有燈光亮度調(diào)節(jié)功能;具有時(shí)間顯示功能。硬件設(shè)計(jì)分為單片機(jī)控制模塊、按鍵模塊、臺(tái)燈模塊、時(shí)鐘模塊、顯示模塊等五個(gè)部分。單片機(jī)控制用AT89C52,顯示模塊用LCD1602 液晶顯示時(shí)間、日期等內(nèi)容,按鍵模塊用來調(diào)整時(shí)間、日期、LED的亮度等,時(shí)鐘用DS1302 時(shí)鐘芯片,臺(tái)燈模塊用13 顆LED燈。軟件設(shè)計(jì)用單片機(jī)C /C++編寫,通過PROTEUS和KEIL仿真軟件進(jìn)行程序仿真,實(shí)現(xiàn)了全部控制功能。
關(guān)鍵詞:?jiǎn)纹瑱C(jī),智能,顯示,LED燈,時(shí)間
ABSTRACT
In practical applications, we found that the brightness of LED lights in the surrounding large power LED is still the same, there is a waste of energy; hours in the surrounding brightness LED lights do not provide adequate and appropriate luminosity. Used to improve our quality of life, to experience science and technology bring us more convenient life, to save energy.Therefore, the study and practical application of electronic bell, has a very real sense, has great practical value.
This paper describes the design principles of the framework structure and composition of modules and each module, introduces the various parts of the various parts of the hardware design and software design and software flow. The design is based on AT89C52 microcontroller core set of functions in one smart LED lamp. The lamp has a light brightness adjustment function; has a time display function; alarm function. Hardware design is divided into five parts.MCU control module, the key modules, lamp modules, clock module, alarm module, display module. MCU control with AT89C52, display module displays time, date and other content with LCD1602 , keypad module is used to adjust the time, date, etc. brightness LED clock with DS1302 clock chip, lamp module with 13 LED. SCM software design written in C/C++ language, the realization of all the control functions.
KEY WORDS: microcontroller, smart, display, LED lights and time
目 錄
摘 要 I
ABSTRACT II
目 錄 III
第一章 緒 論 5
1.1 選題意義 5
1.2 設(shè)計(jì)要求 6
1.2.1 功能實(shí)現(xiàn) 6
1.2.2 系統(tǒng)所需功能模塊 6
1.3 系統(tǒng)基本方案選擇和論證 7
1.3.1 單片機(jī)芯片的選擇方案和論證 7
1.3.2 顯示模塊選擇方案和論證 7
1.3.3 時(shí)鐘芯片的選擇方案和論證 8
第二章 系統(tǒng)的硬件設(shè)計(jì) 9
2.1 系統(tǒng)模塊框圖 9
2.2 系統(tǒng)整體硬件圖 9
2.3 各模塊電路的設(shè)計(jì) 10
2.3.1 單片機(jī)控制模塊 10
2.3.2 晶振/復(fù)位模塊 11
2.3.3 臺(tái)燈模塊 13
2.3.4 臺(tái)燈調(diào)光按鍵模塊 15
2.3.5 DS1302時(shí)鐘電路模塊 15
2.3.6 1602LCD顯示模塊 17
2.3.7 調(diào)節(jié)時(shí)鐘按鍵模塊 19
第三章 系統(tǒng)的軟件設(shè)計(jì) 20
3.1 系統(tǒng)軟件編程工具C和C++ 20
3.1.1 C簡(jiǎn)介 20
3.1.2 C++ 21
3.2 主程序的設(shè)計(jì)流程圖 22
3.3.1 臺(tái)燈模塊流程圖 22
3.3.2 臺(tái)燈模塊程序 23
3.4 LCD1602液晶顯示 25
3.4.1 時(shí)鐘設(shè)置流程圖 25
3.4.2 時(shí)鐘程序 26
第四章 仿真結(jié)果 36
4.1 仿真軟件PROTEUS和KEIL 36
4.1.1 PROTEUS仿真軟件 36
4.1.2 KEIL仿真軟件 37
4.2 PROTEUS仿真圖 37
4.2.1 LED燈亮度仿真 37
4.2.2 LCD1602時(shí)鐘仿真 39
4.3 KEIL仿真 40
4.4 問題及解決 41
4.4.1 存在的問題 41
4.4.2 解決的措施 41
參考文獻(xiàn) 42
致 謝 43
小 結(jié) 44
III
第一章 緒 論
1.1 選題意義
現(xiàn)代人類生活中所用的幾乎每件有電子器件的產(chǎn)品中都會(huì)集成有單片機(jī)。手機(jī)、電話、計(jì)算器、家用電器、電子玩具、掌上電腦以及鼠標(biāo)等電子產(chǎn)品中都含有單片機(jī)。智能燈不是傳統(tǒng)燈具,而是智能設(shè)備的一種,除了智能燈體,還有一個(gè)手持智能控制設(shè)備,智能燈控制設(shè)備具備計(jì)算能力和網(wǎng)絡(luò)聯(lián)接能力,通過應(yīng)用程序,功能可以不斷擴(kuò)展。智能燈的核心功能是控制、燈光效果、創(chuàng)作、分享、光與音樂互動(dòng)、光提升健康和幸福。開關(guān)燈的控制,不但可以通過控制器,手動(dòng)遙控?zé)舻拈_關(guān),還可以進(jìn)行定時(shí)開關(guān)燈的控制,可以設(shè)定不同的時(shí)間開燈關(guān)燈。其次是對(duì)光的控制,光的亮度,光的冷暖,光的色彩都可以連續(xù)手動(dòng)控制或自動(dòng)控制。
白熾燈和金鹵燈在調(diào)光領(lǐng)域應(yīng)用得比較廣泛,但隨著節(jié)能減排的不斷推廣,LED可調(diào)光在攻克了調(diào)光技術(shù)障礙后,開始呈現(xiàn)發(fā)展趨勢(shì),LED可調(diào)光與LED紅外智能燈管、LED聲光控等一起統(tǒng)稱為LED智能化系列,在LED普通燈具價(jià)格競(jìng)爭(zhēng)日趨激烈的今天,LED智能化已經(jīng)成為大型LED照明企業(yè)的發(fā)展方向。
電子鐘已成為人們?nèi)粘I钪斜夭豢缮俚奈锲罚瑥V泛用于個(gè)人家庭以及車站、碼頭、劇院、辦公室等公共場(chǎng)所,給人們的生活、學(xué)習(xí)、工作、娛樂帶來極大的方便。隨著技術(shù)的發(fā)展,人們已不再滿足于鐘表原先簡(jiǎn)單的報(bào)時(shí)功能,希望出現(xiàn)一些新的功能,諸如日歷的顯示、鬧鐘的非接觸式止鬧跑表功能、重要日期倒計(jì)時(shí)顯示等,以帶來更大的方便,而所有這些,又都是以數(shù)字化的電子時(shí)鐘為基礎(chǔ)的。因此,研究實(shí)用電子鐘的應(yīng)用,有著非?,F(xiàn)實(shí)的意義,具有很大的實(shí)用價(jià)值。
由于數(shù)字集成電路技術(shù)的發(fā)展和采用了先進(jìn)的石英技術(shù),使電子鐘具有走時(shí)準(zhǔn)確、性能穩(wěn)定、攜帶方便等優(yōu)點(diǎn),它還用于計(jì)時(shí)、自動(dòng)報(bào)時(shí)及自動(dòng)控制等各個(gè)領(lǐng)域?,F(xiàn)在市場(chǎng)上已有現(xiàn)成的電子鐘集成電路芯片出售,價(jià)格便宜,使用也靈活,如可以隨意設(shè)置時(shí)、分、秒的輸出,改變顯示數(shù)字的大小等,并且由于集成電路技術(shù)的發(fā)展,特別是MOS 集成電路技術(shù)的發(fā)展,使電子鐘具有體積小、攜帶方便的特點(diǎn),這里介紹的實(shí)用電子鐘可以滿足使用者的一些基本要求,輸出方式靈活、功耗低、計(jì)時(shí)準(zhǔn)確、性能穩(wěn)定、維護(hù)方便等優(yōu)點(diǎn)。實(shí)用電子鐘是一個(gè)時(shí)間控制系統(tǒng),既能作為一般的時(shí)間顯示器,也可作為一個(gè)定時(shí)控制器,驅(qū)動(dòng)負(fù)載或顯示信息,同時(shí)可以根據(jù)需要擴(kuò)展其功能。在此項(xiàng)目的設(shè)計(jì)研究過程中需綜合運(yùn)用所學(xué)的數(shù)字電子技術(shù)、單片機(jī)原理與應(yīng)用等課程的知識(shí),掌握實(shí)用電子鐘的設(shè)計(jì)、組裝與調(diào)試方法,利用現(xiàn)代的單片機(jī)等新電子技術(shù)以及現(xiàn)代的設(shè)計(jì)手段,系統(tǒng)地培養(yǎng)了綜合設(shè)計(jì)、操作調(diào)試、故障處理的能力,達(dá)到綜合素質(zhì)以及創(chuàng)新能力的提高。
1.2 設(shè)計(jì)要求
1.2.1 功能實(shí)現(xiàn)
(1)LED調(diào)光燈功能:當(dāng)按下按鍵K0、K1、K2分為一級(jí)亮度紅燈、二級(jí)亮度黃燈和三級(jí)亮度綠燈來實(shí)現(xiàn)。
(2)時(shí)間、日期顯示:系統(tǒng)采用24小時(shí)制。正常情況下,系統(tǒng)顯示當(dāng)前日期、時(shí)間,由LCD顯示。
(3)設(shè)置功能:用戶可以對(duì)LED燈光的亮度進(jìn)行調(diào)節(jié),對(duì)時(shí)間、日期、星期進(jìn)行設(shè)置。用戶依次進(jìn)入日期設(shè)置、星期設(shè)置、時(shí)間設(shè)置。在進(jìn)行設(shè)置時(shí),光標(biāo)停留在相應(yīng)位,按下K4鍵、K5鍵對(duì)數(shù)值進(jìn)行加、減調(diào)整。通過K3鍵,在各個(gè)數(shù)位間移動(dòng)。 通過K6鍵,確定所設(shè)置的時(shí)間。
1.2.2 系統(tǒng)所需功能模塊
由功能分析,臺(tái)燈系統(tǒng)分為燈光模塊、鍵盤模塊、顯示模塊、時(shí)鐘部分、電源模塊和單片機(jī)模塊,考慮成本時(shí)鐘模塊可由單片機(jī)內(nèi)部計(jì)數(shù)器模擬實(shí)現(xiàn)。
(1)燈光模塊用D0~D12個(gè)LED燈實(shí)現(xiàn)。
(2)按鍵模塊分為調(diào)光3個(gè)按鍵和調(diào)節(jié)時(shí)間4個(gè)按鍵,分別是K0、K1、K2和K3、K4、K5、K6。
(3)顯示模塊負(fù)責(zé)顯示系統(tǒng)的日期、星期、時(shí)間。
(4)電源模塊采用+5V直流供電。
(5)單片機(jī)模塊內(nèi)部計(jì)數(shù)器負(fù)責(zé)LED燈光和時(shí)鐘,通過程序模擬生成亮度調(diào)節(jié)和時(shí)間走時(shí)。同時(shí)負(fù)責(zé)掃描鍵盤,并將時(shí)間送給LCD顯示。
1.3 系統(tǒng)基本方案選擇和論證
1.3.1 單片機(jī)芯片的選擇方案和論證
方案一:
采用STC89C52芯片作為硬件核心,采用Flash ROM,內(nèi)部具有4KB ROM 存儲(chǔ)空間,能于3V的超低壓工作,而且與MCS-51系列單片機(jī)完全兼容,但是運(yùn)用于電路設(shè)計(jì)中時(shí)由于不具備ISP在線編程技術(shù), 當(dāng)在對(duì)電路進(jìn)行調(diào)試時(shí),由于程序的錯(cuò)誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r(shí),對(duì)芯片的多次拔插會(huì)對(duì)芯片造成一定的損壞。
方案二:
采用AT89C52,片內(nèi)ROM全都采用Flash ROM;能以3V的超底壓工作;同時(shí)也與MCS-51系列單片機(jī)完全該芯片內(nèi)部存儲(chǔ)器為8KB ROM 存儲(chǔ)空間,同樣具有STC89C52的功能,且具有在線編程可擦除技術(shù),對(duì)所下載的程序能夠加密,比較安全。當(dāng)在對(duì)電路進(jìn)行調(diào)試時(shí),由于程序的錯(cuò)誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r(shí),不需要對(duì)芯片多次拔插,所以不會(huì)對(duì)芯片造成損壞。所以選擇采用AT89C52作為主控制系統(tǒng)。
1.3.2 顯示模塊選擇方案和論證
方案一:
采用點(diǎn)陣式數(shù)碼管顯示,點(diǎn)陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對(duì)于顯示文字比較適合,如采用在顯示數(shù)字顯得太浪費(fèi),且價(jià)格也相對(duì)較高,所以不用此種作為顯示。
方案二:
采用LED數(shù)碼管動(dòng)態(tài)掃描,雖然LED數(shù)碼管價(jià)格適中,但要顯示多個(gè)數(shù)字所需要的個(gè)數(shù)偏多,功耗較大,所以也不用此種作為顯示。
方案三:
采用LCD液晶顯示屏,液晶顯示屏的顯示功能強(qiáng)大,可顯示大量文字,圖形,顯示多樣,清晰可見,與普通數(shù)碼管相比功耗較小,硬件連接簡(jiǎn)單。所以顯示部分采用1602液晶顯示。
1.3.3 時(shí)鐘芯片的選擇方案和論證
方案一:
直接采用單片機(jī)定時(shí)計(jì)數(shù)器提供秒信號(hào),使用程序?qū)崿F(xiàn)年、月、日、星期、時(shí)、分、秒計(jì)數(shù)。采用此種方案雖然減少芯片的使用,節(jié)約成本,但是,實(shí)現(xiàn)的時(shí)間誤差較大。所以不采用此方案。
方案二:
采用DS1302時(shí)鐘芯片實(shí)現(xiàn)時(shí)鐘,DS1302芯片是一種高性能的時(shí)鐘芯片,可自動(dòng)對(duì)秒、分、時(shí)、周、月、年以及閏年補(bǔ)償?shù)哪赀M(jìn)行計(jì)數(shù),而且精度高,RAM作為數(shù)據(jù)暫存區(qū),工作電壓2.5V~5.5V范圍內(nèi),2.5V時(shí)耗電小于300nA。
第二章 系統(tǒng)的硬件設(shè)計(jì)
2.1 系統(tǒng)模塊框圖
六大模塊以AT89C52 單片機(jī)為控制核心,實(shí)現(xiàn)了該智能臺(tái)燈的各項(xiàng)要求,外接一個(gè)5V 的直流電源,為整個(gè)系統(tǒng)供電。
圖2-1 系統(tǒng)結(jié)構(gòu)示意圖
2.2 系統(tǒng)整體硬件圖
該設(shè)計(jì)是以AT89C52 單片機(jī)為控制核心的集多種功能于一體的智能 LED 臺(tái)燈。該臺(tái)燈具有燈光亮度調(diào)節(jié)功能;具有時(shí)間顯示功能。硬件設(shè)計(jì)分為單片機(jī)控制模塊、按鍵模塊、臺(tái)燈模塊、時(shí)鐘模塊、鬧鈴模塊、顯示模塊等五個(gè)部分。單片機(jī)控制用AT89C52,顯示模塊用LCD1602液晶顯示、時(shí)間、日期等內(nèi)容,按鍵模塊用來調(diào)整時(shí)間、日期、LED 的亮度等,時(shí)鐘用DS1302 時(shí)鐘芯片,臺(tái)燈模塊用13 顆LED,通過按鍵K0、K1、K2調(diào)節(jié)燈光的亮度,分為一級(jí)亮度、二級(jí)亮度和三級(jí)亮度。
圖2-2 系統(tǒng)整體硬件圖
2.3 各模塊電路的設(shè)計(jì)
2.3.1 單片機(jī)控制模塊
單片機(jī)是一種集成電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU、隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)數(shù)器等功能(可能還包括顯示驅(qū)動(dòng)電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個(gè)小而完善的微型計(jì)算機(jī)系統(tǒng),在工業(yè)控制領(lǐng)域廣泛應(yīng)用。從上世紀(jì)80年代,由當(dāng)時(shí)的4位、8位單片機(jī),發(fā)展到現(xiàn)在的300M的高速單片機(jī)。AT89C52單片機(jī)為40引腳雙列直插芯片,有四個(gè)I/O口P0,P1,P2,P3, MCS-51單片機(jī)共有4個(gè)8位的I/O口(P0、P1、P2、P3),每一條I/O線都能獨(dú)立地作輸出或輸入。
圖2-3 AT89C52單片機(jī)控制模塊
2.3.2 晶振/復(fù)位模塊
晶振是晶體振蕩器的簡(jiǎn)稱,在電氣上它可以等效成一個(gè)電容和一個(gè)電阻并聯(lián)再串聯(lián)一個(gè)電容的二端網(wǎng)絡(luò),電工學(xué)上這個(gè)網(wǎng)絡(luò)有兩個(gè)諧振點(diǎn),以頻率的高低分其中較低的頻率是串聯(lián)諧振,較高的頻率是并聯(lián)諧振。由于晶體自身的特性致使這兩個(gè)頻率的距離相當(dāng)?shù)慕咏?在這個(gè)極窄的頻率范圍內(nèi),晶振等效為一個(gè)電感,所以只要晶振的兩端并聯(lián)上合適的電容它就會(huì)組成并聯(lián)諧振電路。晶振是給單片機(jī)提供工作信號(hào)脈沖的。這個(gè)脈沖就是單片機(jī)的工作速度。單片機(jī)的工作頻率是有范圍的,不能太大。
圖中19與18引腳分別為XTAL1、XTAL2,他們分別接晶振的輸入與輸出, XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.因?yàn)橐粋€(gè)機(jī)器周期含有6個(gè)狀態(tài)周期,而每個(gè)狀態(tài)周期為2個(gè)振蕩周期,所以一個(gè)機(jī)器周期共有12個(gè)振蕩周期。本設(shè)計(jì)選擇晶振頻率為12MHz,輸入芯片震蕩周期為1/12μs,一個(gè)機(jī)器周期為1μs。
圖2-4 晶振電路模塊
復(fù)位電路,就是利用它把電路恢復(fù)到起始狀態(tài)。就像計(jì)算器的清零按鈕的作用一樣,以便回到原始狀態(tài),重新進(jìn)行計(jì)算。和計(jì)算器清零按鈕有所不同的是,復(fù)位電路啟動(dòng)的手段有所不同。一是在給電路通電時(shí)馬上進(jìn)行復(fù)位操作;二是在必要時(shí)可以由手動(dòng)操作;三是根據(jù)程序或者電路運(yùn)行的需要自動(dòng)地進(jìn)行。在RST復(fù)位輸入引腳上接一電容至Vcc端,下接一個(gè)電阻到地即可。
復(fù)位電路工作原理如下圖所示,Vcc上電時(shí),C3充電,在10K電阻上出現(xiàn)電壓,使得單片機(jī)復(fù)位;幾個(gè)毫秒后,C3充滿,10K電阻上電流降為0,電壓也為0,使得單片機(jī)進(jìn)入工作狀態(tài)。工作期間,按下K7,C3放電,在10K電阻上出現(xiàn)電壓,使得單片機(jī)復(fù)位。K7松手,C3又充電,幾個(gè)毫秒后,單片機(jī)進(jìn)入工作狀態(tài)。第9引腳為復(fù)位輸入端,接上電容,電阻及開關(guān)后夠上電復(fù)位電路。
圖2-5 復(fù)位電路模塊
2.3.3 臺(tái)燈模塊
臺(tái)燈模塊用13 顆LED作為發(fā)光系統(tǒng),每一顆和一個(gè)220 的電阻串聯(lián),用P1.4~P1.6 口控制。電阻起限流作用, 13 個(gè)I/O 均采用低電平有效方式,即給相應(yīng)的I/O 低電平LED工作。通過按鍵K0、K1、K2調(diào)節(jié)燈光的亮度,亮度分為三個(gè)等級(jí):一級(jí)亮度控制紅色的D0燈亮;二級(jí)亮度控制黃色的D1、D2、D3、D4燈亮;三級(jí)亮度控制綠色的D5、D6、D7、D8、D9、D10、D11、D12燈亮。
圖2-6 臺(tái)燈模塊(1)
圖2-7 臺(tái)燈模塊(2)
2.3.4 臺(tái)燈調(diào)光按鍵模塊
圖2-8 臺(tái)燈按鍵模塊
按鍵K0、K1、K2用來調(diào)節(jié)臺(tái)燈的亮度,通過按下按鍵K0可以讓臺(tái)燈變亮,按下按鍵K1可以讓臺(tái)燈變的更亮,按下按鍵K2可以讓臺(tái)燈燈光達(dá)到最亮。3 個(gè)I/O 均采用低電平有效方式。
2.3.5 DS1302時(shí)鐘電路模塊
下圖示出DS1302的引腳排列圖,其中Vcc1為后備電源,Vcc2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768KHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動(dòng)置高電平來啟動(dòng)所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;
其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過程中RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電動(dòng)行時(shí),在Vcc大于等于2.5V之前,RST必須保持低電平。中有在SCLK 為低電平時(shí),才能將RST置為高電平,I/O為串行數(shù)據(jù)輸入端(雙向)。SCLK始終是輸入端。
表1 DS1302引腳功能表
引腳號(hào)
引腳名稱
功能
1
VCC2
主電源
2、3
X1、X2
振蕩源,外接32768Hz晶振
4
GND
地線
5
RST
復(fù)位/片選線
6
I/O
串行數(shù)據(jù)輸入/輸出端(雙向)
7
SCLK
串行時(shí)鐘輸入端
8
VCC1
后備電源
DS1302在每次進(jìn)行讀、寫程序前都必須初始化,先把SCLK端置“0”,接著把RST端置“1”,最后才給予SCLK脈沖。DS1302的控制字,此控制字的位7必須置1,若為0則不能把對(duì)DS1302進(jìn)行讀寫數(shù)據(jù)。對(duì)于位6,若對(duì)程序進(jìn)行讀/寫時(shí)RAM=1,對(duì)時(shí)間進(jìn)行讀/寫時(shí),CK=0。位1至位5指操作單元的地址。位0是讀/寫操作位,進(jìn)行讀操作時(shí),該位為1;該位為0則表示進(jìn)行的是寫操作??刂谱止?jié)總是從最低位開始輸入/輸出的。DS1302的日歷、時(shí)間寄存器內(nèi)容:“CH”是時(shí)鐘暫停標(biāo)志位,當(dāng)該位為1時(shí),時(shí)鐘振蕩器停止,DS1302處于低功耗狀態(tài);當(dāng)該位為0時(shí),時(shí)鐘開始運(yùn)行?!癢P”是寫保護(hù)位,在任何的對(duì)時(shí)鐘和RAM的寫操作之前,“WP”必須為0。當(dāng)“WP”為1時(shí),寫保護(hù)位防止對(duì)任一寄存器的寫操作。
圖2-9 DS1302時(shí)鐘電路模塊
2.3.6 1602LCD顯示模塊
字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號(hào)等點(diǎn)陣式LCD,目前常用16*1,16*2,20*2和40*2行等的模塊。
1602LCD分為背光和不帶背光兩種,基控制大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應(yīng)用中并無差別,引腳功能說明:
表2 1602LCD功能表
編號(hào)
符號(hào)
引腳說明
編號(hào)
符號(hào)
引腳說明
1
Vss
電源地
9
D2
數(shù)據(jù)口
2
Vcc
電源正極
10
D3
數(shù)據(jù)口
3
VO
液晶顯示對(duì)比度調(diào)節(jié)端
11
D4
數(shù)據(jù)口
4
RS
數(shù)據(jù)/命令選擇端(H/L)
12
D5
數(shù)據(jù)口
5
R/W
讀寫選擇端(H/L)
13
D6
數(shù)據(jù)口
6
E
能使信號(hào)
14
D7
數(shù)據(jù)口
7
D0
數(shù)據(jù)口
15
BLA
背光電源正極
8
D1
數(shù)據(jù)口
16
BLK
背光電源負(fù)極
1602LCD采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表2所示:
第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VEE為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度。
第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄器。
第5腳:R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。
1602LCD的一般初始化(復(fù)位)過程
延時(shí)15mS
寫指令38H(不檢測(cè)忙信號(hào))
延時(shí)5mS
寫指令38H(不檢測(cè)忙信號(hào))
延時(shí)5mS
寫指令38H(不檢測(cè)忙信號(hào))
以后每次寫指令、讀/寫數(shù)據(jù)操作均需要檢測(cè)忙信號(hào)
寫指令38H:顯示模式設(shè)置
寫指令08H:顯示關(guān)閉
寫指令01H:顯示清屏
寫指令06H:顯示光標(biāo)移動(dòng)設(shè)置
寫指令0CH:顯示開及光標(biāo)設(shè)置
LCD1602液晶顯示,如下圖所示:
圖2-10 1602LCD顯示模塊
2.3.7 調(diào)節(jié)時(shí)鐘按鍵模塊
因?yàn)橛心暝氯?,時(shí)分秒幾個(gè)參數(shù)要調(diào),所以設(shè)置這幾個(gè)參數(shù)的計(jì)數(shù)。當(dāng)按下一個(gè)鍵時(shí),單片機(jī)進(jìn)行相應(yīng)的操作。根據(jù)設(shè)計(jì)要求需要選擇四個(gè)獨(dú)立按鍵分別為選擇、加、減、確定,按鍵用來調(diào)整時(shí)間和設(shè)置鬧鐘,調(diào)光亮度,各鍵功能在介紹硬件部分已描述。按鍵模塊下圖所示:
圖2-11 調(diào)節(jié)時(shí)鐘按鍵模塊
第三章 系統(tǒng)的軟件設(shè)計(jì)
3.1 系統(tǒng)軟件編程工具C和C++
3.1.1 C簡(jiǎn)介
C語言是一種計(jì)算機(jī)程序設(shè)計(jì)語言,它既具有高級(jí)語言的特點(diǎn),又具有匯編語言的特點(diǎn)。它可以作為工作系統(tǒng)設(shè)計(jì)語言,編寫系統(tǒng)應(yīng)用程序,也可以作為應(yīng)用程序設(shè)計(jì)語言,編寫不依賴計(jì)算機(jī)硬件的應(yīng)用程序。它的應(yīng)用范圍廣泛,具備很強(qiáng)的數(shù)據(jù)處理能力,不僅僅是在軟件開發(fā)上,而且各類科研都需要用到C語言,適于編寫系統(tǒng)軟件、三維、二維圖形和動(dòng)畫,具體應(yīng)用例如單片機(jī)以及嵌入式系統(tǒng)開發(fā)。
C程序是由一組變量或是函數(shù)的外部對(duì)象組成的。 函數(shù)是一個(gè)自我包含的完成一定相關(guān)功能的執(zhí)行代碼段。我們可以把函數(shù)看成一個(gè)“黑盒子”,你只要將數(shù)據(jù)送進(jìn)去就能得到結(jié)果,而函數(shù)內(nèi)部究竟是如何工作的的,外部程序是不知道的。外部程序所知道的僅限于輸入給函數(shù)什么以及函數(shù)輸出什么。函數(shù)提供了編制程序的手段,使之容易讀、寫、理解、排除錯(cuò)誤、修改和維護(hù)。C程序中函數(shù)的數(shù)目實(shí)際上是不限的,如果說有什么限制的話,那就是,一個(gè)C程序中必須至少有一個(gè)函數(shù),而且其中必須有一個(gè)并且僅有一個(gè)以main為名,這個(gè)函數(shù)稱為主函數(shù),整個(gè)程序從這個(gè)主函數(shù)開始執(zhí)行。C 語言程序鼓勵(lì)和提倡人們把一個(gè)大問題劃分成一個(gè)個(gè)子問題,對(duì)應(yīng)于解決一個(gè)子問題編制一個(gè)函數(shù),因此,C 語言程序一般是由大量的小函數(shù)而不是由少量大函數(shù)構(gòu)成的,即所謂“小函數(shù)構(gòu)成大程序”。這樣的好處是讓各部分相互充分獨(dú)立,并且任務(wù)單一。因而這些充分獨(dú)立的小模塊也可以作為一種固定規(guī)格的小“構(gòu)件”, 用來構(gòu)成新的大程序。
3.1.2 C++
C++是在C語言的基礎(chǔ)上開發(fā)的一種集面向?qū)ο缶幊獭⒎盒途幊毯瓦^程化編程于一體的編程語言。應(yīng)用較為廣泛,是一種靜態(tài)數(shù)據(jù)類型檢查的,支持多重編程的通用程序設(shè)計(jì)語言。它支持過程化程序設(shè)計(jì),數(shù)據(jù)抽象,面向?qū)ο笤O(shè)計(jì),制作圖標(biāo)等多種程序設(shè)計(jì)風(fēng)格。在操作系統(tǒng)和系統(tǒng)使用程序以及需要對(duì)硬件進(jìn)行操作的場(chǎng)合,用C語言明顯優(yōu)于其它高級(jí)語言,但在編寫大型程序時(shí),C語言仍面臨著挑戰(zhàn)。C語言是C++的基礎(chǔ),C++和C語言在很多方面是兼容的。
C語言是一個(gè)結(jié)構(gòu)化語言,它的重點(diǎn)在于算法與數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過一個(gè)過程,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事物)控制)。C++,首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問題域,這樣就可以通過獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事物)控制。所以C語言和C++的最大區(qū)別在于它們解決問題的思想方法不一樣。C++語言的主要特點(diǎn)表現(xiàn)在兩個(gè)方面,一是盡量兼容C,二是支持面向?qū)ο蟮姆椒?。它操持了C的簡(jiǎn)潔、高效的接近匯編語言等特點(diǎn),對(duì)C的類型系統(tǒng)進(jìn)行了改革的擴(kuò)充,因此C++比C更安全,C++的編譯系統(tǒng)能檢查出更多的類型錯(cuò)誤。另外,由于C語言的廣泛使用,因而極大的促進(jìn)了C++的普及和推廣。
C++由四個(gè)“子語言”組成:C子語言,C++支持C語言的幾乎全部功能,主要是c89的部分,在語法上與C語言僅有極微妙的差別(如括號(hào)表達(dá)式的左右值性,具體請(qǐng)參考C++標(biāo)準(zhǔn)文獻(xiàn))。這部分功能對(duì)應(yīng)于傳統(tǒng)的面向過程的編程泛型,并提供了面向函數(shù)編程泛型的基礎(chǔ)。面向?qū)ο蟮腃++語言,C++語言原本不具備面向?qū)ο蟮脑O(shè)計(jì)功能,然而隨著面向?qū)ο缶幊痰母拍畹钠占?,C++語言也開發(fā)出了支持面向?qū)ο蠊δ艿陌姹尽_@部分功能對(duì)應(yīng)于面向?qū)ο蟮木幊谭盒?。泛型編程語言,C++強(qiáng)大(但容易失控的)模板功能使它能在編譯期完成許多工作,從而大大提高運(yùn)行期效率,并且大大提高了C++的表達(dá)能力。STL(C++標(biāo)準(zhǔn)模板庫,Standard Template Library)是一個(gè)基于模板技術(shù)的庫。隨著STL的不斷發(fā)展,它已經(jīng)逐漸成為C++程序設(shè)計(jì)中不可或缺的部分,其效率可能比一般的native代碼低些,但是其安全性與規(guī)范性使它大受歡迎。模板使C++能夠支持泛型編程(generic programming)和生成式編程(generative programming)
的泛型。在C++0X中引入的Lambda,使得程序員可以定義匿名函數(shù),完善了C++對(duì)于面向函數(shù)的編程泛型的支持。
3.2 主程序的設(shè)計(jì)流程圖
圖3-1 主程序流程圖
一給單片機(jī)上電,單片機(jī)就初始化。通過接收并處理,有人按下開關(guān)就工作。然后檢開始LED工作顯示時(shí)間、日期,按鍵按下,修正時(shí)間,設(shè)置鬧鐘系統(tǒng)初始化測(cè)按鍵是否按下,判斷工作在那個(gè)模式下。液晶還顯示當(dāng)前的時(shí)間,日期,最后進(jìn)入循環(huán)。
3.3 臺(tái)燈模塊編程
3.3.1 臺(tái)燈模塊流程圖
該模塊只需給LED紅燈D0的P1.4口、黃燈D1到D4的P1.5口和綠燈D5到D12的P1.6口送低電平即可,再通過按鍵K0、K1、K2調(diào)LED燈光亮度。
圖3-2 臺(tái)燈模塊流程圖
3.3.2 臺(tái)燈模塊程序
#include
sbit K0=P2^5;//調(diào)光燈亮度等級(jí)開關(guān)I/O口分配
sbit K1=P2^6;
sbit K2=P2^7;
sbit D0=P1^4;//LED燈I/O口分配
sbit D1=P1^5;
sbit D2=P1^5;
sbit D3=P1^5;
sbit D4=P1^5;
sbit D5=P1^6;
sbit D6=P1^6;
sbit D7=P1^6;
sbit D8=P1^6;
sbit D9=P1^6;
sbit D10=P1^6;
sbit D11=P1^6;
sbit D12=P1^6;
void main()//主程序
{
while(1)
{
if(K0==0)//一級(jí)亮度調(diào)光開關(guān)被按下
{
D0=0; //D3燈亮
}
else
{
D0=1; //D3燈滅
}
if(K1==0)//二級(jí)亮度調(diào)光開關(guān)被按下
{
D1=0;//D1,D2,D3,D4燈亮
D2=0;
D3=0;
D4=0;
}
else
{
D1=1;//D1,D2,D3,D4燈滅
D2=1;
D3=1;
D4=1;
}
if(K2==0)//三級(jí)亮度調(diào)光開關(guān)被按下
{
D5=0; //D5,D6,D7,D8,D9,D10,D11,D12燈亮
D6=0;
D7=0;
D8=0;
D9=0;
D10=0;
D11=0;
D12=0;
}
else
{
D5=1; //D5,D6,D7,D8,D9,D10,D11,D12燈滅
D6=1;
D7=1;
D8=1;
D9=1;
D10=1;
D11=1;
D12=1;
}
}
}
3.4 LCD1602液晶顯示
3.4.1 時(shí)鐘設(shè)置流程圖
調(diào)整時(shí)間用4個(gè)調(diào)整按鈕,1個(gè)作為選擇控制用,另外3個(gè)分別作為加調(diào)整,減調(diào)整和確定用。
圖3-3 時(shí)鐘設(shè)置流程圖
3.4.2 時(shí)鐘程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0; // LCD寄存器選擇
sbit RW=P2^1; // LCD讀寫控制
sbit EN=P2^2; // LCD啟動(dòng)
//*--------延時(shí)子程序--------*//
void DelayMS(uint K)
{
uchar i;
while(K--)
{
for(i=0;i<120;i++);
}
}
//*----------讀取LCD的狀態(tài)-------*//
uchar Read_LCD_State()
{
uchar state;
RS=0;
RW=1;
EN=1;
DelayMS(2);
state=P0;
EN=0;
DelayMS(2);
return state;
}
//*-------------忙檢查--------------*//
void LCD_Busy_Wait()
{
while((Read_LCD_State()&0x80)==0x80);
DelayMS(5);
}
//*-----------寫LCD命令-----------------*//
void Write_LCD_Command(uchar cmd)
{
LCD_Busy_Wait();
RS=0;
RW=0;
EN=0;
P0=cmd;
EN=1;
DelayMS(2);
EN=0;
}
//*-----------向LCD寫入數(shù)據(jù)-----------------*//
void Write_LCD_Data(uchar dat)
{
LCD_Busy_Wait();
RS=1;
RW=0;
EN=0;
P0=dat;
EN=1;
DelayMS(2);
EN=0;
}
//*-----------LCD初始化-----------------*//
void Initialize_LCD1602() //液晶初始化函數(shù)
{
Write_LCD_Command(0x38);DelayMS(2); //功能設(shè)置,數(shù)據(jù)長度為8位,雙行顯示,5×7點(diǎn)陣字體
Write_LCD_Command(0x01);DelayMS(2); //清屏
Write_LCD_Command(0x06);DelayMS(2); //字符進(jìn)入模式:屏幕不動(dòng),字符后移
Write_LCD_Command(0x0c);DelayMS(2); // 顯示開,關(guān)光標(biāo)
}
//*-----------設(shè)置液晶顯示位置-----------------*//
void Set_LCD_Position(uchar pos)
{
Write_LCD_Command(pos|0x80); //設(shè)置7位的DDRAM地址值
}
//*-----------在LCD上顯示字符串-----------------*//
void LCD_Display(uchar p,uchar *str)
{
uchar i;
Set_LCD_Position(p);
for(i=0;i<16;i++)
{
Write_LCD_Data(str[i]);
DelayMS(2);
}
}
//*----------main.c源程序----------*//
//*-----用DS1302和1602液晶顯示的實(shí)時(shí)時(shí)鐘-----*//
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
void Initialize_LCD1602(); //液晶初始化函數(shù)
void LCD_Display(uchar p,uchar *str);
sbit SDA=P1^0; //DS1302數(shù)據(jù)線
sbit CLK=P1^1; //DS1302時(shí)鐘線
sbit RST=P1^2; // DS1302 復(fù)位線
sbit k1=P3^4; // 選擇按鍵
sbit k2=P3^5; // 加
sbit k3=P3^6; // 減
sbit k4=P3^7; // 確定
uchar tcount=0;
uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; // 一年中每個(gè)月的天數(shù),二月的天數(shù)由年份決定
uchar *Week[]={"SUN","MON","TUS","WEN","THU","FRI","SAT"}; //周日,周一到周六
// LCD顯示緩沖
uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00 "} ;
uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "} ;
uchar DateTime[7];//所讀取的日期時(shí)間
char Adjust_Index=-1; //當(dāng)前調(diào)節(jié)的時(shí)間對(duì)象:秒,分,時(shí),日,月,年(0,1,2,3,4,6)
uchar Change_Flag[]="-MHDM-Y";//(分,時(shí),日,月,年)不調(diào)節(jié)秒和周
//函數(shù)聲明
void Write_Byte_TO_DS1302(uchar X); // 向DS1302寫入一個(gè)字節(jié)
uchar Read_Byte_FROM_DS1302(); //從DS1302中讀取一個(gè)字節(jié)
uchar Read_Data_FROM_DS1302(uchar addr); //從DS1302指定位置讀取數(shù)據(jù) , 讀數(shù)據(jù)
void Write_Data_TO_DS1302(uchar addr,uchar dat); // 向DS1302指定位置寫入數(shù)據(jù), 寫數(shù)據(jù)
void SET_DS1302(); // 設(shè)置時(shí)間
void GetTime(); // 讀取當(dāng)前時(shí)間
void Initialization(); //初始化函數(shù)
//*----------主程序----------*//
void main()
{
Initialization();
while(1)
{
if(Adjust_Index==-1)
GetTime();
}
}
//*-----------------初始化函數(shù)--------------*//
void Initialization()
{
Initialize_LCD1602(); //調(diào)用液晶初始化函數(shù)
IE=0x83; //允許中斷 外部0中斷和T0中斷
IP=0x01; // 設(shè)置中斷優(yōu)先級(jí)
IT0=0x01; // 設(shè)置外部中斷的脈沖觸發(fā)方式
TMOD=0x01; // 設(shè)置定時(shí)器的工作方式,為方式1
TH0=-50000/256; // 寫入初值
TL0=-50000%256; // 寫入初值
TR0=1; // 啟動(dòng)定時(shí)器
}
//*--------寫字節(jié)函數(shù),向DS1302寫入一個(gè)字節(jié)--------*//
void Write_Byte_TO_DS1302(uchar X) // 向DS1302寫入一個(gè)字節(jié)
{
uchar i;
for(i=0;i<8;i++)
{
SDA=X&1;
CLK=1;
CLK=0;
X>>=1;
}
}
//*--------讀字節(jié)函數(shù),從DS1302讀取一個(gè)字節(jié)--------*//
uchar Read_Byte_FROM_DS1302() //從DS1302中讀取一個(gè)字節(jié)
{
uchar i,byte,t;
for(i=0;i<8;i++)
{
byte>>=1;
t=SDA;
byte|=t<<7;
CLK=1;
CLK=0;
}
//-------------------------------------------------------------
//BCD碼轉(zhuǎn)換
//-------------------------------------------------------------
return byte/16*10+byte%16;
}
//-------------------------------------------------------------
//從DS1302指定位置讀取數(shù)據(jù),讀數(shù)據(jù)
//-------------------------------------------------------------
uchar Read_Data_FROM_DS1302(uchar addr) //從DS1302指定位置讀取數(shù)據(jù) , 讀數(shù)據(jù)
{
uchar dat;
RST=0;
CLK=0;
RST=1;
Write_Byte_TO_DS1302(addr); //向DS1302寫入一個(gè)地址
dat=Read_Byte_FROM_DS1302(); //在上面寫入的地址中讀取數(shù)據(jù)
CLK=1;
RST=0;
return dat;
}
//-------------------------------------------------------------
//向DS1302指定位置寫入數(shù)據(jù), 寫數(shù)據(jù)
//-------------------------------------------------------------
void Write_Data_TO_DS1302(uchar addr,uchar dat) // 向DS1302指定位置寫入數(shù)據(jù), 寫數(shù)據(jù)
{
CLK=0;
RST=1;
Write_Byte_TO_DS1302(addr);
Write_Byte_TO_DS1302(dat);
CLK=1;
RST=0;
}
//---------------------------------------------------------
// 設(shè)置時(shí)間
//---------------------------------------------------------
void SET_DS1302() // 設(shè)置時(shí)間
{
uchar i;
Write_Data_TO_DS1302(0x8E,0x00); //寫控制字,取消寫保護(hù)
// 分,時(shí),日,月,年依次寫入
for(i=1;i<7;i++)
{
// 分的起始地址是10000010(0x82),后面依次是時(shí),日,月,周,年,寫入地址每次遞增2 Write_Data_TO_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));
}
Write_Data_TO_DS1302(0x8E,0x80); //寫控制字,加寫保護(hù)
}
//--------------------------------------------------------
// 讀取當(dāng)前時(shí)間
//-------------------------------------------------------
void GetTime() // 讀取當(dāng)前時(shí)間
{
uchar i;
for(i=0;i<7;i++)
{
DateTime[i]=Read_Data_FROM_DS1302(0x81+2*i);
}
}
//------------------------------------------------------------
//日期與時(shí)間值轉(zhuǎn)換為數(shù)字字符
//-------------------------------------------------------------
void Format_DateTime(uchar d,uchar *a)
{
a[0]=d/10+'0';
a[1]=d%10+'0';
}
//-------------------------------------------------------------------
// 判斷是否為閏年
//-------------------------------------------------------------------
uchar Is_Leapyear(uint year)
{
return (year%4==0&&year%100!=0)||(year%400==0) ;
}
//------------------------------------------------------------------
// 求自2000.1.1開始的任何一天是星期幾?
//-------------------------------------------------------------------void Refresh_Week_Day()
{
uint i,d,w=5; //已知1999年12.31是星期五
for(i=2000;i<2000+DateTime[6];i++)
{
d=Is_Leapyear(i)?366:365;
w=(w+d)%7;
}
d=0;
for (i=1;i
收藏