單片機(jī)技術(shù)及其應(yīng)用參考模板_第1頁
單片機(jī)技術(shù)及其應(yīng)用參考模板_第2頁
單片機(jī)技術(shù)及其應(yīng)用參考模板_第3頁
單片機(jī)技術(shù)及其應(yīng)用參考模板_第4頁
單片機(jī)技術(shù)及其應(yīng)用參考模板_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、單片機(jī)技術(shù)及其應(yīng)用 課程設(shè)計(jì)報(bào)告 題 目: 萬年歷的設(shè)計(jì) 班 級(jí): 120302 學(xué) 號(hào): 1203010216 姓 名: 涂劃 同組人員: 湯吉鑫、高翔、王正提 指導(dǎo)教師: 薛蓮 二0一四年九月二十七日 1 / 38 目 錄 1課程設(shè)計(jì)目的42課程設(shè)計(jì)題目描述和要求43.課程設(shè)計(jì)報(bào)告內(nèi)容53.1 設(shè)計(jì)思路53.2設(shè)計(jì)過程53.3電路的仿真及調(diào)試174.總結(jié)185.指導(dǎo)教師意見19參考書目19程序代碼20 1課程設(shè)計(jì)目的在學(xué)習(xí)單片機(jī)后,我們深知它在我們的生活中無處不在,而社會(huì)更好的發(fā)展需要當(dāng)代知識(shí)分子不懈的努力。在理論知識(shí)的充溢后,我們必須通過實(shí)踐來更好的掌握單片機(jī)技術(shù),只有自己動(dòng)手通過單片機(jī)

2、做出自己想做的東西,才可證明我們對(duì)單片機(jī)能夠靈活的運(yùn)用。在理論與實(shí)踐結(jié)合的情況下我們可在此次設(shè)計(jì)小作品中自己查閱資料并自己仿真電路編寫程序設(shè)計(jì)出完整的單片機(jī)電路。在完成課程設(shè)計(jì)的過程中我們可提升自己對(duì)電路的分析能力,及編譯程序的能力,并且可以增強(qiáng)我們布局電路的意識(shí),從而讓我們自己全面的運(yùn)用到學(xué)過的知識(shí),讓自己在今后的發(fā)展中能好的學(xué)以致用。2課程設(shè)計(jì)題目描述和要求我們選擇的課題為:萬年歷的設(shè)計(jì)。隨著當(dāng)今世界經(jīng)濟(jì)的快速發(fā)展和信息化時(shí)代的來臨,各種各樣的小型智能家電產(chǎn)品陸續(xù)出現(xiàn)在我們的生活當(dāng)中;電子萬年歷作為一種功能十分強(qiáng)大的日常計(jì)時(shí)工具,它可以對(duì)年、月、日、星期、時(shí)、分、秒進(jìn)行計(jì)時(shí),還具有閏年補(bǔ)償

3、等多種功能,而且DS1302的使用壽命長,誤差小。對(duì)于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時(shí)顯示年、月、日、星期、時(shí)、分、秒等信息,還具有時(shí)間校準(zhǔn)等功能,已逐步的出現(xiàn)在我們的日常生活中。一般日常生活中大都使用的是紙質(zhì)日歷,紙質(zhì)日歷顯示效果不太好并且使用壽命不長,造成了一定的資源浪費(fèi)。 針對(duì)傳統(tǒng)的紙質(zhì)日歷局限性,本論文設(shè)計(jì)了一款基于單片機(jī)的電子萬年歷系統(tǒng);本設(shè)計(jì)以STC89C52單片機(jī)為核心,構(gòu)成系統(tǒng)主控制電路,全部信息用12864液晶顯示;時(shí)間、日期調(diào)整、鬧鈴及界面的切換由三個(gè)獨(dú)立按鍵來實(shí)現(xiàn),并可對(duì)鬧鈴開關(guān)進(jìn)行設(shè)置。日歷能顯示陽歷和陰歷年、月、日以及星期、時(shí)、分、秒。電子萬年歷采

4、用智能電子控制和顯示技術(shù),改善了紙制日歷的缺陷。它集時(shí)間、日期、星期等功能于一身,具有讀取方便、顯示直觀、功能多樣、電路簡潔等諸多優(yōu)點(diǎn),符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。 本次的課程設(shè)計(jì)題目要求為:采用51系列單片機(jī)和LCD12864液晶顯示屏設(shè)計(jì)一個(gè)萬年歷,能夠?qū)崿F(xiàn)年、月、日、農(nóng)歷、星期、時(shí)間和定時(shí)的功能。主要功能如下:(1)、顯示年、月、日,時(shí)、分、秒和星期,并有相應(yīng)的農(nóng)歷顯示;(2)、可通過鍵盤自動(dòng)調(diào)整時(shí)間;(3)、具有鬧鐘功能;(4)、能夠顯示環(huán)境溫度,誤差小于±1;(5)、計(jì)時(shí)精度:月誤差小于20s。3.課程設(shè)計(jì)報(bào)告內(nèi)容3.1 設(shè)計(jì)思路(1)根據(jù)設(shè)計(jì)

5、要求,選擇AT89C52單片機(jī)為核心控制器件。(2)時(shí)鐘芯片采用DS1302實(shí)現(xiàn)計(jì)時(shí)的功能。(3)采用DS18B20溫度傳感器與單片機(jī)P2.6口相連實(shí)現(xiàn)溫度顯示功能。(4)使用一個(gè)PNP三極管作為蜂鳴器的驅(qū)動(dòng),接P2.7口實(shí)現(xiàn)鬧鐘功能。3.2設(shè)計(jì)過程3.2.1硬件設(shè)計(jì)(1)系統(tǒng)模塊根據(jù)系統(tǒng)功能要求,可大致畫出系統(tǒng)所需硬件結(jié)構(gòu)框圖如圖3-1所示:圖3-1 系統(tǒng)功能模塊圖主控模塊采用性價(jià)比較高的AT89S52單片機(jī)芯片,在其內(nèi)部燒寫好程序,可通過程序的運(yùn)行控制測溫模塊進(jìn)行測溫;測溫模塊主要是由DS18B20構(gòu)成,將其與所測對(duì)象進(jìn)行接觸即可獲取被測對(duì)象的溫度數(shù)據(jù),而所測得的溫度和時(shí)鐘芯片測得的實(shí)時(shí)日

6、歷將通過顯示模塊的液晶顯示器以數(shù)字形式顯示;單片機(jī)調(diào)用程序,讀取DS1302內(nèi)寄存器,可以得到萬年歷的時(shí)間數(shù)據(jù),經(jīng)過程序處理就可以輸出在LCD上;鍵盤電路可對(duì)實(shí)時(shí)日歷進(jìn)行調(diào)整;蜂鳴器可以在作為聲音提醒。(2)單片機(jī)模塊AT89S52是ATMEL公司生產(chǎn)的低功耗,高性能CMOS8位單片機(jī),片內(nèi)含8k bytes的可系統(tǒng)編程的Flash只讀程序存儲(chǔ)器,器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)8051指令系統(tǒng)及引腳,它集Flash存儲(chǔ)器既可在線編輯(ISP)也可用傳統(tǒng)方法進(jìn)行編輯及通用8位微處理器于單片芯片中,功能強(qiáng)大AT89S52單片機(jī)可為您提供許多高性價(jià)比的應(yīng)用場合。器管腳

7、圖如圖3-2:圖3-2 AT89S52管腳圖在本系統(tǒng)中,AT89S52單片機(jī)內(nèi)部的功能單元已經(jīng)能夠滿足系統(tǒng)設(shè)計(jì)需要,不需要系統(tǒng)擴(kuò)展。AT89S52具有以下的特點(diǎn):主要性能 與MCS-51單片機(jī)產(chǎn)品兼容 8K字節(jié)在系統(tǒng)可編程Flash存儲(chǔ)器 1000次擦寫周期 全靜態(tài)操作:0Hz33Hz 三級(jí)加密程序存儲(chǔ)器 32個(gè)可編程I/O口線 三個(gè)16位定時(shí)器/計(jì)數(shù)器 八個(gè)中斷源 全雙工UART串行通道 低功耗空閑和掉電模式 掉電后中斷可喚醒 看門狗定時(shí)器 雙數(shù)據(jù)指針 掉電標(biāo)識(shí)符 AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K在系統(tǒng)可編程Flash存儲(chǔ)器。使用Atmel公司高密度非易失性存

8、儲(chǔ)器技術(shù)制造,與工業(yè)80C51產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8位CPU和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。(3)時(shí)鐘模塊DS1302為美國DALLAS公司的一種實(shí)時(shí)時(shí)鐘芯片,主要特點(diǎn)是采用串行數(shù)據(jù)傳輸,可為掉電保護(hù)電源提供可編程的充電功能,并且可以關(guān)閉充電功能。采用32.768Hz晶振。它可以對(duì)年、月、日、星期、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償?shù)榷喾N功能。DS1302 用于數(shù)據(jù)記錄,特別是對(duì)某些具有特殊意義的數(shù)據(jù)點(diǎn)的記錄上,能實(shí)現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時(shí)間同時(shí)

9、記錄。這種記錄對(duì)長時(shí)間的連續(xù)測控系統(tǒng)結(jié)果的分析以及對(duì)異常數(shù)據(jù)出現(xiàn)的原因的查找有重要意義。在本設(shè)計(jì)中,它的實(shí)際電路圖如圖3-2所示:圖3-3 DS1302與單片機(jī)的連接DS1302需要外接32.768K的晶振,1號(hào)引腳接主電源VCC(5V)電源,8號(hào)引腳接備用電池(3V),當(dāng)主電源掉電后,備用電源為DS1302提供電源,維持DS1302內(nèi)數(shù)據(jù)不丟失。DS1302的各引腳的功能如下:1 :VCC2 主電源 2,3: X1,X2 振蕩源,外接32768HZ晶振 4: GND 地線 5 :RST

10、0;復(fù)位/片選線 6 :I/O 串行數(shù)據(jù)輸入/輸出端(雙向) 7 :SCLK 串行數(shù)據(jù)輸入端 8 :VCC1 后備電源時(shí)鐘芯片DS1302的性能特性 :實(shí)時(shí)時(shí)鐘,可對(duì)秒、分、時(shí)、日、周、月以及帶閏年補(bǔ)償?shù)哪赀M(jìn)行計(jì)數(shù);用于高速數(shù)據(jù)暫存的31×8位RAM;最少引腳的串行I/O;2.55.5V 電壓工作范圍;2.5V時(shí)耗電小于300nA; 用于時(shí)鐘或RAM數(shù)據(jù)讀/寫的單字節(jié)或多字節(jié)(脈沖方式)數(shù)據(jù)傳送方式;簡單的3線接口; 可選的慢速充電(至VCC1)的能力。&

11、#160;時(shí)鐘芯片DS1302的工作原理:  DS1302在每次進(jìn)行讀、寫程序前都必須初始化,先把SCLK端置 “0”,接著把RST端置“1”,最后才給予SCLK脈沖;讀/寫時(shí)序如下圖4所示。圖5為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é)總是從最低位開始輸入/輸出的??刂谱止?jié)如圖3-4所示。 圖3-4 DS1302控制字節(jié)DS1302時(shí)間

12、日期寄存器及相應(yīng)位定義:表3-5為DS1302時(shí)間寄存器信息:表3-5為DS1302時(shí)間寄存器信息DS1302數(shù)據(jù)的輸入和輸出在控制指令字輸入后的下一個(gè)SCLK 時(shí)鐘的上升沿時(shí)數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0 開始。同樣,在緊跟8 位的控制指令字后的下一個(gè)SCLK 脈沖的下降沿讀出DS1302 的數(shù)據(jù),讀出數(shù)據(jù)時(shí)從低位0 位至高位7。圖3-6 DS1302的時(shí)序(4)顯示模塊本設(shè)計(jì)顯示模塊主要采用LCD12864液晶顯示器,其電路原理圖如下:圖3-7 LCD12864模塊LCD12864液晶顯示器通過數(shù)據(jù)端口也即端口714與主控芯片AT89S52的I/O端口P3相連接實(shí)現(xiàn)數(shù)據(jù)與指令

13、的傳輸,再通過控制端口RS、RW、EN也即端口46與主控芯片P1.5,P1.6,P1.7端口相接實(shí)現(xiàn)對(duì)數(shù)據(jù)和指令傳輸?shù)目刂?。(5)溫度模塊傳統(tǒng)的溫度傳感器系統(tǒng)大都采用放大、調(diào)理、A/D轉(zhuǎn)換,轉(zhuǎn)換后的數(shù)字信號(hào)送入計(jì)算機(jī)處理,處理電路復(fù)雜、可靠性相對(duì)較差,占用計(jì)算機(jī)的資源比較多,本設(shè)計(jì)測溫模塊采用一線制總線數(shù)字溫度傳感器DS18B20,可將溫度信號(hào)直接轉(zhuǎn)換成數(shù)字信號(hào)送給微處理器,電路簡單,成本低,其電路原理圖如圖3-8所示:圖3-8 DS18B20溫度模塊從圖中可看出,將溫度傳感器的一線制總線通過端口2與本設(shè)計(jì)主控芯片STC12C5A6S2的端口標(biāo)號(hào)為DS18B20的相連即可實(shí)現(xiàn)相互之間的通信。

14、設(shè)計(jì)中的測溫元件采用的是DS18B20測溫元件,DS18B20是由DALLAS(達(dá)拉斯)公司生產(chǎn)的一種溫度傳感器。超小的體積,超低的硬件開消,抗干擾能力強(qiáng),精度高,附加功能強(qiáng),使得DS18B20很受歡迎。這是世界上第一片支持“一線總線”接口的溫度傳感器。DS18B20數(shù)字溫度計(jì)提供9位(二進(jìn)制)溫度讀數(shù),指示器件的溫度。信息經(jīng)過單線接口送入DS18B20或從DS18B20送出,因此從單片機(jī)到DS18B20僅需一條線連接即可。它可在1秒鐘(典型值)內(nèi)把溫度變換成數(shù)字。(6)蜂鳴器模塊蜂鳴器模塊是本設(shè)計(jì)中體現(xiàn)人機(jī)交互的又一大設(shè)計(jì)亮點(diǎn),其電路原理圖如下圖3-9 蜂鳴器模塊(7)蜂鳴器的介紹蜂鳴器的作

15、用:蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。 蜂鳴器的分類:蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩類。蜂鳴器的電路圖形符號(hào):蜂鳴器在電路中用字母“H”或“HA”(舊標(biāo)準(zhǔn)用“FM”、“LB”、“JD”等)表示。本設(shè)計(jì)里,我們采用有源蜂鳴器,由于蜂鳴器的工作電流一般比較大,以至于單片機(jī)的I/O 口是無法直接驅(qū)動(dòng)的,所以要利用放大電路來驅(qū)動(dòng),我們使用三極管來放大電流,驅(qū)動(dòng)蜂鳴器,此模塊只要通過BELL(連接到到單片機(jī)P2.7)輸入的PWM波既可以使蜂鳴器分出聲音,我們?cè)O(shè)計(jì)的這款萬

16、年歷可以在鬧鐘定時(shí)中作為聲音提醒信號(hào)。(8)獨(dú)立鍵盤模塊鍵盤是人與萬年歷實(shí)現(xiàn)信息交互的接口,本設(shè)計(jì)中,我們采用3個(gè)獨(dú)立鍵盤,電路原理如下圖3-9:圖3-10 獨(dú)立鍵盤當(dāng)按鍵按下,與主控芯片連接的端口被降為低電平,按鍵松開則也升為高電平。按鍵采用的是Tack Switch按鈕開關(guān),它具有自動(dòng)恢復(fù)(彈回)的功能。當(dāng)我們按下按鈕時(shí),其中的接點(diǎn)接通(或切斷),放開按鈕后,接點(diǎn)恢復(fù)為切斷(或接通)。按照尺寸區(qū)分,電子電路或微型計(jì)算機(jī)所使用的Tack Swith可分為8mm、10mm、12mm等。雖然Tack Switch有4個(gè)引腳,但實(shí)際上,其內(nèi)部只有一對(duì)a接點(diǎn),即其中兩個(gè)引腳是內(nèi)部相連通的,而另外兩個(gè)

17、引腳內(nèi)部也是相連通的。3個(gè)按鍵實(shí)現(xiàn)了開機(jī)模式選擇,日期調(diào)節(jié)等功能,獨(dú)立按鍵的引入使得體現(xiàn)了本設(shè)計(jì)的人性化,智能化,功能的強(qiáng)大。3.2.2軟件設(shè)計(jì)(1)萬年歷軟件系統(tǒng)的流程圖圖3-11 系統(tǒng)軟件流程圖當(dāng)接通電源開始工作后,單片機(jī)中的程序開始運(yùn)行,將對(duì)DS18B20進(jìn)行初始化,以便和單片機(jī)芯片達(dá)成通信協(xié)議。完成初始化后,由于本系統(tǒng)只有一個(gè)測溫元件,單片機(jī)會(huì)向其發(fā)出跳過RAM指令,接下來便可向其發(fā)送操作指令,啟動(dòng)測溫程序,測溫過程完成后,發(fā)出溫度轉(zhuǎn)換指令,從而便可將溫度轉(zhuǎn)化成數(shù)字模式進(jìn)行顯示讀取;同時(shí)DS1302將讀取時(shí)分秒星期以及年月日寄存器然后通過液晶顯示實(shí)時(shí)時(shí)間、星期及日期;鍵盤電路中按鍵可對(duì)

18、實(shí)時(shí)日歷時(shí)鐘進(jìn)行調(diào)整。(2)DS1302讀寫程序部分DS1302讀寫模塊與單片機(jī)進(jìn)行數(shù)據(jù)交換時(shí),先有STC89C52向電路發(fā)出命令字節(jié),命令字節(jié)的最高位MSB(D7)必須為邏輯1,如果D7=0,則禁止寫DS1302,即寫保護(hù);如果D6=0,指定時(shí)數(shù)據(jù),D6=1,指定RAM數(shù)據(jù);D5D1指定輸入的寄存器;最低位MLB(D0)為邏輯0,指定寫操作(輸入),=1,指定讀操作(輸出)。 若進(jìn)行單字節(jié)傳送,8位命令字節(jié)傳送結(jié)束后,在下另一個(gè)SCLK周期的上升沿輸入數(shù)據(jù)字節(jié),或在下八個(gè)SCLK周期的下降沿輸出數(shù)據(jù)字節(jié)。 圖3-12 DS1302讀寫程序模塊流程圖(3)溫度的顯示控制當(dāng)所測溫度從DS18B2

19、0輸送到單片機(jī)上之后,下一步就是要將其在液晶顯示器上顯示出來。首先對(duì)液晶進(jìn)行初始化,液晶顯示器12864的初始化過程如下:先將復(fù)位引腳置高位即RST=1、數(shù)據(jù)傳輸方式設(shè)為并口方式即PSB=1(在設(shè)計(jì)中,我們將LCD的該引腳接VCC),然后將指令集調(diào)到基本指令集上來即寫指令30H,再將顯示打開、關(guān)光標(biāo)、清除液晶里先前的顯示內(nèi)容即分別寫指令0CH、01H,寫指令時(shí)需分別延時(shí)5ms。然后就是數(shù)據(jù)的傳送過程,要使數(shù)據(jù)在液晶顯示器上顯示必須要按照其讀寫操作時(shí)序來進(jìn)行,其讀、寫操作時(shí)序圖為3-13所示。 圖3-13 12864 液晶顯示器寫時(shí)序圖(4)蜂鳴器模塊蜂鳴器模塊的設(shè)計(jì),主要是讓單片機(jī)產(chǎn)生一定頻率

20、的電流信號(hào),在我們的設(shè)計(jì)中,使用單片機(jī)通過程序輸出方波信號(hào),來產(chǎn)生蜂鳴器需要的信號(hào),當(dāng)鬧鐘定時(shí)結(jié)束時(shí),就可以調(diào)用蜂鳴器程序,讓蜂鳴器發(fā)出聲音。當(dāng)然,我們的萬年歷再開機(jī)時(shí)會(huì)提醒用戶是否開啟按鍵時(shí),蜂鳴器是否聲音提醒,實(shí)現(xiàn)的方法是:我們?cè)诜澍Q器中設(shè)置了flag標(biāo)志位,當(dāng)開機(jī)時(shí),用戶的選擇會(huì)賦給flag標(biāo)志位,從而由單片機(jī)判斷是否讓蜂鳴器工作,為了記錄用戶的選擇,我們將flag標(biāo)志位放在了DS1302的空閑寄存器中,以保證用戶的選擇不會(huì)因?yàn)橄到y(tǒng)的掉電而消失,當(dāng)系統(tǒng)重新上電時(shí),系統(tǒng)還可以恢復(fù)用戶的選擇。(5)鍵盤模塊鍵盤模塊的軟件程序相對(duì)于溫度模塊和時(shí)鐘模塊比較簡單。鍵盤模塊的設(shè)計(jì),關(guān)鍵是消陡。通常的

21、按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動(dòng),為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖。按鍵的消抖,可用硬件或軟件兩種方法。因?yàn)橛布缎枰砑宇~外的硬件,故這里我們采用軟件消抖。軟件方法去抖,即檢測出鍵閉合后執(zhí)行一個(gè)延時(shí)程序,5ms10ms的延時(shí),讓前沿抖動(dòng)消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。當(dāng)檢測到按鍵釋放后,也要給5ms10ms的延時(shí),待后沿抖動(dòng)消失后才能轉(zhuǎn)入該鍵的處理程序。3.3電路的仿真及調(diào)試在定好方案后便可根

22、據(jù)各個(gè)模塊來仿真萬年歷電路,在仿真之前可以復(fù)習(xí)單片機(jī)的必要知識(shí)及端口的用法。連接電路只是一個(gè)簡單的過程,根據(jù)對(duì)單片機(jī)的了解,此次我們用了單片機(jī)的四個(gè)IO口。電路分為晶振電路、復(fù)位電路、時(shí)鐘電路、LCD顯示電路、蜂鳴器電路、溫度感應(yīng)電路、按鍵電路。P1口接上10k的上拉電阻,P2.02.6接受時(shí)鐘電路、溫度感應(yīng)電路、按鍵電路輸入信息,P2.7口控制蜂鳴器。P1口和P3口控制LCD12864,其中用了中斷及計(jì)時(shí)器。仿真電路如圖3-14所示。圖3-14 經(jīng)過數(shù)天的程序編寫,一步步解決問題后我們終于寫完了完整的程序,將其在KeilVision2 軟件的編譯下可得到hex文件,將其下載到仿真電路的單片機(jī)

23、中則可得到萬年歷的效果并可實(shí)現(xiàn)要求功能,效果圖如圖3-15所示。 圖3-154.總結(jié)在硬件電路焊接和軟件程序設(shè)計(jì)分別完成的基礎(chǔ)之上,進(jìn)行軟硬件的結(jié)合與調(diào)試。通過下載將在電腦上已完成的程序下載到單片機(jī)芯片中。在調(diào)試中發(fā)現(xiàn)軟件中存在的問題,及時(shí)解決問題,確保系統(tǒng)能正常工作并達(dá)到設(shè)計(jì)要求。通過反復(fù)的調(diào)試與實(shí)驗(yàn),可以證明該系統(tǒng)能夠較好地完成設(shè)計(jì)所需的基本要求。即能夠正確的顯示萬年歷。在完成軟件系統(tǒng)時(shí),對(duì)時(shí)間要求很精確,由于晶振的不同造成了讀數(shù)據(jù)的錯(cuò)誤,經(jīng)過這次調(diào)試,讓我更清晰的認(rèn)識(shí)到了時(shí)序?qū)υ骷闹匾?。在設(shè)計(jì)中,因?yàn)榭紤]到鬧鐘定時(shí)功能,我們希望我們?cè)O(shè)置的鬧鐘時(shí)刻不會(huì)因?yàn)橄到y(tǒng)的掉電而丟失,考慮到DS

24、1302是有鋰電池作為電源的,不會(huì)因?yàn)橹飨到y(tǒng)掉電丟失內(nèi)部數(shù)據(jù),所以我們將鬧鐘的定時(shí)時(shí)刻放到了DS1302內(nèi)的空余寄存器里面。經(jīng)過萬年歷的設(shè)計(jì),讓我學(xué)到了很多,讓我認(rèn)識(shí)到了學(xué)習(xí)基礎(chǔ)知識(shí)的重要性,當(dāng)設(shè)計(jì)完整的系統(tǒng)時(shí),要考慮到硬件和軟件兩者的結(jié)合,有時(shí)硬件的不足,我們可以用軟件程序來彌補(bǔ),從而節(jié)約硬件成本,在設(shè)計(jì)軟件程序時(shí)要模塊化,可以提高程序的可讀性。5.指導(dǎo)教師意見參考書目1 李群芳,肖看,單片機(jī)原理接口及應(yīng)用,北京,清華大學(xué)出版社,20072 譚浩強(qiáng),C語言程序設(shè)計(jì)北京,清華大學(xué)出版社,20063 張義和,王敏男,許宏昌等,例說51單片機(jī)北京,人民郵電出版社,20084 劉坤,宋戈,趙紅波等,

25、51單片機(jī)C語言應(yīng)用技術(shù)開發(fā)技術(shù)大全北京,人民郵電出版社,20085 白延敏,51單片機(jī)典型系統(tǒng)開發(fā)實(shí)例精講,北京,電子工業(yè)出版社,20096 周麗娜,Protel99SE電路設(shè)計(jì)技術(shù),北京,中國鐵道出版社,2009程序代碼/* * 萬年歷*/#include "main.h" /包含頭文件main.h#include "LCD.h"/包含頭文件LCD.h#include "DS1302.h"/包含頭文件DS1302.h#include "word.h"/包含頭文件word.h#include "luna

26、r_calendar.h" /包含頭文件lunar_calendar.h#include "buzz.h"/包含頭文件buzz.hTIME time, tmp_time; /時(shí)間變量ALARM alarm;/時(shí)間變量bit Alarm_flag=0;/時(shí)間變量bit Clock_flag=0;/時(shí)間變量bit flag=0;/時(shí)間變量sbit DQ=P26; /DS18B20 pin 溫度傳感器引腳/-18B20-unsigned char L_18B20,H_18B20,zhengshu,shangwen,xiawen; /溫度用變量unsigned int f

27、g=0,xiaoshu_a;/溫度用變量/-18B20-/-音樂-uint8 code SONG_TONE= /音樂數(shù)據(jù) 212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0;uint8 code SONG_LONG=/ 9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0;/-void delay(uint16 n)/延時(shí)us級(jí)while (n-);/*/ 函數(shù)

28、: LCD_Delay()/ 描述: 延時(shí)t ms函數(shù)/ 參數(shù): t / 返回: 無/ 備注: 11.0592MHZ t=1延時(shí)時(shí)間約1ms/ 版本: 2011/01/01 First version/*/void Delay_nms(unsigned int t)unsigned int i,j;for(i=0;i<t;i+) /循環(huán)t次for(j=0;j<113;j+) /循環(huán)113次 每次約3us;/-播放音樂-void PlayMusic() uint16 i =0,j,k;while(SONG_LONGi!=0|SONG_TONEi!=0) for(j=0;j<SO

29、NG_LONGi*20;j+) /讀取數(shù)據(jù) BEEP = BEEP;/蜂鳴器取反for(k=0;k<SONG_TONEi/3;k+); /讀取數(shù)據(jù)Delay_nms(10);/延時(shí)10msi+; /累加1BEEP =1;/關(guān)閉蜂鳴器/*-DS18B20-*/void delay_18B20(unsigned int i)while(i-);void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ復(fù)位 delay_18B20(8); /稍做延時(shí) DQ = 0; /單片機(jī)將DQ拉低 delay_18B20(80); /精確延時(shí) 大于 480

30、us DQ = 1; /拉高總線 delay_18B20(14); /延時(shí) x=DQ; /稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗 delay_18B20(20); /延時(shí)void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i>0; i-)/循環(huán)8次 DQ = 0;/DQ輸出0 DQ = dat&0x01; delay_18B20(5); /延時(shí) DQ = 1; /DQ輸出1 dat>>=1; /右移位 unsigned char ReadOneChar(void)unsig

31、ned char i=0;unsigned char dat = 0;for (i=8;i>0;i-) DQ = 0; / 給脈沖信號(hào) dat>>=1; /移位 DQ = 1; / 給脈沖信號(hào) if(DQ) /如果DQ=1,執(zhí)行下面的語句 dat|=0x80; delay_18B20(4);/延時(shí) return(dat);/返回?cái)?shù)據(jù) void read_18B20(void)Init_DS18B20();WriteOneChar(0xCC); / 跳過讀序號(hào)列號(hào)的操作WriteOneChar(0x44); / 啟動(dòng)溫度轉(zhuǎn)換delay_18B20(100); / this me

32、ssage is wery importantInit_DS18B20();/初始化DS18B20WriteOneChar(0xCC); /跳過讀序號(hào)列號(hào)的操作WriteOneChar(0xBE); /讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度delay_18B20(100);/延時(shí)L_18B20=ReadOneChar();/讀取低八位數(shù)據(jù)H_18B20=ReadOneChar();/讀取高八位數(shù)據(jù)zhengshu=L_18B20/16+H_18B20*16; /整數(shù)部分xiaoshu_a=(L_18B20&0x0f)*10/16; /小數(shù)第一位/-DS18B20-/* *

33、 按鍵掃描*/int8 scan_key(void)int8 val=-1; /初始化鍵值為-1if (KeyIn1 = 0) /判斷=0?有無按鍵按鍵val = 1; /鍵值=1while (KeyIn1 = 0); /等待按鍵釋放else if (KeyIn2 = 0) /判斷=0?有無按鍵按鍵val = 2;/鍵值=2while (KeyIn2 = 0);/等待按鍵釋放else if (KeyIn3 = 0)/判斷=0?有無按鍵按鍵val = 3;/鍵值=3while (KeyIn3 = 0);/等待按鍵釋放/if (val > 0)/buzzer_sound();return v

34、al;/返回鍵值/* * 主界面框架*/void main_frame(void)play32(80, 2, 10); /顯示數(shù)play32(32, 2, 10); /顯示數(shù)play8(16, 0, S_xie);/顯示斜線play8(40, 0, S_xie);/顯示斜線/play8(96, 0, RH);/play8(120, 0, S_percent);play8(120, 6, S_du);/顯示度/* * 主界面*/void main_show(bit refresh) uint8 lunar2;if (refresh)read_time(uint8 *)&time);/ 讀

35、時(shí)間函數(shù)/ 時(shí)間 if (refresh | (time.sec != tmp_time.sec) / 秒更新tmp_time.sec = time.sec; /讀取秒數(shù)據(jù) play8_num(104, 6,zhengshu); /溫度顯示play32_num(96, 2, time.sec);/顯示秒if (refresh)main_frame();/刷新界面if (refresh | (time.min != tmp_time.min) / 分更新if (!refresh)flag = 0;tmp_time.min = time.min;/讀取分play32_num(48, 2, time

36、.min); /顯示分if (refresh | (time.hour != tmp_time.hour) / 時(shí)更新if (!refresh)&&(Clock_flag)alarm_sound();tmp_time.hour = time.hour; /讀取時(shí)play32_num(0, 2, time.hour);/顯示時(shí)if (refresh | (time.day != tmp_time.day) /日更新tmp_time.day = time.day;/讀取日play8_num(48, 0, time.day);/顯示日/ 農(nóng)歷turn_lunar_calendar(&

37、amp;time, lunar);play_lunar_calendar(0, 6, lunar0, lunar1);if (refresh | (time.week != tmp_time.week) / 周更新tmp_time.week = time.week;/讀取周play_week(68, 0, time.week);/顯示周if (refresh | (time.mon != tmp_time.mon) / 月更新tmp_time.mon = time.mon;/讀取月play8_num(24, 0, time.mon);/顯示月/ 農(nóng)歷turn_lunar_calendar(&a

38、mp;time, lunar);/轉(zhuǎn)換農(nóng)歷月play_lunar_calendar(0, 6, lunar0, lunar1);/顯示農(nóng)歷月if (refresh | (time.year != tmp_time.year) / 年更新tmp_time.year = time.year;/讀取年數(shù)據(jù)play8_num(0, 0, time.year);/顯示年/ 農(nóng)歷turn_lunar_calendar(&time, lunar);/轉(zhuǎn)換農(nóng)歷年play_lunar_calendar(0, 6, lunar0, lunar1);/顯示農(nóng)歷年/* * 主機(jī)界面設(shè)置 */void main

39、_set(void)int8 key_val, state=1; /變量play32_num(96, 2|0x80, time.sec);/顯示秒while (1)key_val = scan_key();/鍵盤掃描if (key_val = 1) / 設(shè)置if (state >= 7)state = 0;elsestate+;/位置狀態(tài)加1set_time(uint8 *)&time);/設(shè)置時(shí)間main_show(1);/顯示主界面switch (state)case 0:set_time(uint8 *)&time); break;/設(shè)置時(shí)間case 1:play3

40、2_num(96, 2|0x80, time.sec); break;/顯示秒case 2:play32_num(48, 2|0x80, time.min); break;/顯示分case 3:play32_num(0, 2|0x80, time.hour); break;/顯示時(shí)case 4:play_week(68, 0|0x80, time.week); break;/顯示周case 5:play8_num(48, 0|0x80, time.day); break; /顯示日case 6:play8_num(24, 0|0x80, time.mon); break; /顯示月case 7

41、:play8_num(0, 0|0x80, time.year); break; /顯示年default: break;/退出循環(huán) else if (key_val > 1)/按鍵值大于1if (state = 1)/位置1設(shè)置秒if (key_val = 3)/加按下?time.sec+;/秒加1elsetime.sec-; /秒減1if (time.sec >= 60)time.sec = 0;else if (time.sec < 0)time.sec = 59; play32_num(96, 2|0x80, time.sec);/顯示秒else if (state =

42、 2)/位置2設(shè)置分if (key_val = 3)/加按下?time.min+;/加1elsetime.min-;/減1if (time.min >= 60)time.min = 0;else if (time.min < 0)time.min = 59;play32_num(48, 2|0x80, time.min);/顯示分else if (state = 3)/位置3設(shè)置時(shí)if (key_val = 3)/加按下?time.hour+;/加1elsetime.hour-;/減1if (time.hour >= 24)time.hour = 0;else if (tim

43、e.hour < 0)time.hour = 23;play32_num(0, 2|0x80, time.hour);/顯示時(shí)else if (state = 4)/位置4設(shè)置周if (key_val = 3)/加按下?time.week+;/加1elsetime.week-;/減1if (time.week >= 8)time.week = 1;else if (time.week < 1)time.week = 7;play_week(68, 0|0x80, time.week);/顯示周else if (state = 5)/位置5設(shè)置日if (key_val = 3)

44、/加按下?time.day+;/加1elsetime.day-;/減1if (time.day >= 32)time.day = 1;else if (time.day < 1)time.day = 31;play8_num(48, 0|0x80, time.day);/顯示日else if (state = 6)/位置6設(shè)置月if (key_val = 3)/加按下?time.mon+;/加1elsetime.mon-;/減1if (time.mon >= 13)time.mon = 1;else if (time.mon < 1)time.mon = 12;play

45、8_num(24, 0|0x80, time.mon);/顯示月else if (state = 7)/位置7設(shè)置年if (key_val = 3)/加按下?time.year+;/加1elsetime.year-;/減1if (time.year >= 100)time.year = 0;/0年else if (time.year < 0)time.year = 99;/99年play8_num(0, 0|0x80, time.year);/顯示年elsebreak;/退出循環(huán)if (state = 0)break;/退出循環(huán)/* * 鬧鐘界面顯示*/void alarm_sho

46、w(void)int8 key_val, state=1;uint32 t=0;play16(0, 0, nao);/顯示 鬧play16(16, 0, zhong);/鐘play16(32, 0, maohao);/冒號(hào):if (Alarm_flag)play16(48, 0, kai);/開elseplay16(48, 0, guan);/關(guān)play32_num(32, 2, alarm.hour);/時(shí)play32(64, 2, 10);/冒號(hào)play32_num(80, 2, alarm.min);/分play16(0, 6, zheng);/顯示 整play16(16, 6, dia

47、n);/顯示 點(diǎn)play16(32, 6, bao);/顯示 報(bào)play16(48, 6, shi);/顯示 時(shí)play16(64, 6, maohao);/顯示 冒號(hào)if (Clock_flag)play16(80, 6, kai);/顯示 開elseplay16(80, 6, guan);/顯示 關(guān)for (t=0; t<30000; t+)key_val = scan_key();/鍵盤掃描 獲取鍵值if (key_val > 1)/判斷數(shù)據(jù)break;else if (key_val = 1)/判斷數(shù)據(jù)if (Alarm_flag)play16(48, 0|0x80, kai);/顯示 開elseplay16(4

溫馨提示

  • 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. 人人文庫網(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)論