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

下載本文檔

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

文檔簡介

物理與電子工程學院2011級本科課程設計引言人類的日常生活離不開時間,任何具有周期變化的自然現(xiàn)象都可用來測量時間。而現(xiàn)在人們日常生活中廣泛使用的是機械表、電子表、電子中等。隨著科技的發(fā)展,電子技術和計算機應用領域不斷擴大,特別是單片機的出現(xiàn),是近代計算機技術發(fā)展史上的一個重要里程碑?;趩纹瑱C的萬年歷結合了時鐘和日立的功能,將其二者融為一體,在現(xiàn)實時間的同時還能顯示日期和年月,它主要通過單片機來讀取時鐘芯片的時間、日期,然后送給顯示設備顯示出來。本系統(tǒng)的萬年歷除了顯示年月日外還能準確顯示溫度它所處環(huán)境的溫度。本設計采用的測溫元件是美國DALLAS半導體公司生產(chǎn)的一種智能溫度傳感器DS18B21,測溫范圍為-55~125C,最高分辨率達到0.0625C。1.1研究的目的和意義隨著電子技術的迅速發(fā)展,特別是大規(guī)模集成電路出現(xiàn),給人類生活帶來了根本性的變化,尤其是單片機技術的應用產(chǎn)品已經(jīng)走進了千家萬戶。近年來,我國科技不斷發(fā)展,我國經(jīng)濟發(fā)展的支柱產(chǎn)業(yè)——電子產(chǎn)業(yè)獲得長足發(fā)展,各種電子產(chǎn)品琳瑯滿目,隨處可見,隨著電子產(chǎn)品的更新速度的加快,各種功能強大,款式新穎的電子產(chǎn)品不斷問世。萬年歷便是這一發(fā)展趨勢中的代表,萬年歷則順應了人們對時間方面的要求。它的出現(xiàn)給人們的生活帶來的諸多方便,在時間極顯寶貴的現(xiàn)代生活中,起作用更是不言而喻的。他在學校、車站、碼頭、劇院、醫(yī)院、辦公室等公共場所的應用非常廣泛。但傳統(tǒng)的萬年歷除了顯示時間之外,功能較為單一,逐漸失去了市場。順應技術發(fā)展和人們生產(chǎn)生活需求,各種功能的新式萬年歷不斷涌現(xiàn),且功能不斷更新。萬年歷作為電子類的小產(chǎn)品以其方便、實用等優(yōu)勢成為市場上的寵兒,同時也成為單片機設計培訓中一個很實用的課題。因為這個課題有很好的開發(fā)性和可發(fā)揮性,因此對設計者的要求比較高,不僅考察了隊單片機的掌握能力更加強調了對單片機擴展的應用。而且要求設計的萬年歷在操作上力求簡潔,功能上盡量齊全,顯示界面也要出色。所以萬年歷不論從實用角度還是培養(yǎng)能力角度都很有價值。1.2本系統(tǒng)主要研究的內容本系統(tǒng)的主要研究內容是:(1)選用電子萬年歷芯片時,應重點考慮功能實在、使用方便、單片存儲、低功耗、抗斷電的器件。(2)根據(jù)選用的電子萬年歷芯片設計外圍電路和單片機的接口電路。(3)在硬件設計時,結構要盡量簡單實用,易于實現(xiàn),是系統(tǒng)電路盡量簡單。(4)根據(jù)硬件電路,編寫控制AT89C51芯片的單片機程序。(5)通過編程、編譯、調試,把程序下載到單片機上運行,并實現(xiàn)本設計的功能。2系統(tǒng)方案論證2.1控制部分的選擇方案與論證方案一:用可編程邏輯器件設計可采用PLD器件,設計起來結構清晰,各個模塊從硬件上設計起來相對簡單,控制與顯示的模塊間連接也會比較方便。但是考慮到本設計的特點,EDA在能夠擴展上比較受局限,占用的資源也多。從成本上講,可編程邏輯器件價格比較高。方案二:用單片機設計用單片機芯片作為控制部分,單片機有豐富的中斷源,它的準確度相當高,并且C語言的靈活運用,給編程帶來了方便。單片機I/O功能也比較強大,容易對其進行擴展,使設計更加完善,此外單片機的成本也比較低。綜上所述,資源豐富,程序編寫也靈活簡單,可移植性強,性價比也高,所以選擇作為主控芯片。2.2顯示部分的選擇方案與論證方案一:采用點陣式數(shù)碼管顯示點陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對于顯示文字比較合適,但是基于電子萬年歷主要是顯示數(shù)字,就顯得太浪費了,且價格相對較高。方案二:采用LCD液晶顯示屏LCD液晶顯示屏的顯示功能特別強大,可以顯示大量文字、圖形,顯示多樣清晰可見,使得萬年歷的內容更加豐富,加上動態(tài)顯示效果,更加吸引觀眾的眼球。2.3時鐘芯片的選擇方案與論證方案一:直接采用單片機定時計數(shù)器直接采用單片機定時計數(shù)器提供時間單位秒,使用程序實現(xiàn)年、月、日、星期、時、分、秒計數(shù)。采用此種方案雖然減少芯片的使用,節(jié)約成本,但是,實現(xiàn)時間誤差較大,而且不具有實時性,必須用到斷電存貯資料,否則一斷電,時鐘就不會準確,誤差太大。 方案二:采用DS1302時鐘芯片實現(xiàn)時鐘DS1302時鐘芯片是一種高性能的時鐘芯片,可自動對秒、時、分、日、周、月、年以及閏年補償?shù)哪赀M行計數(shù),而且精度高的RAM作為數(shù)據(jù)暫存區(qū),工作電壓2.5V~5.5V范圍內,2.5V時耗電小于300mA。此外可以外接電池,具有實時性,斷電后時間還會走,比較精準。2.4溫度傳感器的選擇方案與論證 方案一:使用熱敏電阻作為傳感器 用熱敏電阻與一個相應該阻值相串聯(lián)分壓,用熱敏電阻隨溫度變化的特性,采集這兩個電阻變化的分壓值,并用A/D轉換。此設計方案需用A/D轉換電路,增加硬件成本而且熱敏電阻的溫性曲線并不是嚴格線性的,會產(chǎn)生較大測量誤差。方案二:采用數(shù)字式溫度傳感器DS18B20 此類傳感器為數(shù)字式傳感器,而且僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,易于與單片機連接,可以去除A/D模塊,降低硬件成本,簡化系統(tǒng)電路,測量溫度精度高。2.5電路設計最終方案系統(tǒng)原理及總體結構圖 本系統(tǒng)包括主控模塊,顯示模塊,時鐘模塊,溫度采集模塊,綜上各方案所述,電路設計最終方案:采用作為主控制系統(tǒng),1602LCD液晶作為顯示部分,DS1302作為時鐘模塊,DS18B20傳感器來采集溫度信息。根據(jù)上述電路設計最終方案,系統(tǒng)總體設計方案如圖2-1所示設計的電路主要由四大模塊構成:溫度傳感器電路,單片機控制電路,顯示電路以及校正電路。圖2-1系統(tǒng)總體結構圖當溫度傳感器接受到外面的信號,送入單片機,單片機將接受到的信號輸出,讓它在液晶上顯示。同時由單片機控制的萬年歷以及時間顯示,當時間及秒計數(shù)計滿60時就向分進位,分計數(shù)器計滿60分后向時計數(shù)器進位,小時計數(shù)器按“24翻1”規(guī)律計數(shù)。時、分、秒的計數(shù)結果經(jīng)過數(shù)據(jù)處理可直接送顯示器顯示。當計時發(fā)生誤差的時候可以用校時電路進行校正。時計數(shù)器計滿24小時后自動向日計數(shù)器進一,日計數(shù)器由平年、閏年的28/30/31對大、小月和二月的判斷應與當月相應的日期相一致,當日計數(shù)器計滿時,向月計數(shù)器進位,月計數(shù)器計滿12月向年計數(shù)器進位,當年計數(shù)器計滿100時所以計數(shù)器清零。設計采用的是年、月、日和時、分、星期顯示,所以在單片機通過對數(shù)據(jù)處理進行同時在液晶上顯示。3系統(tǒng)設計3.1系統(tǒng)硬件仿真原理圖本次設計是在Proteus軟件繪制的硬件圖,如下圖3-1所示圖3-1硬件仿真原理圖3.2單片機89C51控制模塊的設計AT89C51是美國ATMEL公司生產(chǎn)的低電壓、高性能CMOS8位單片機,片內含4KB的可反復擦除的只讀程序存儲器(PEROM)和128B隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產(chǎn)兼容標準MCS-51指令系統(tǒng),片內置通用8位中央處理器(CPU)和FLASH存儲單元,功能強大AT89C51單片機可為您提供許多高性價比的應用場合。主要性能參數(shù):①與MCS-51產(chǎn)品指令系統(tǒng)完全兼容②4K字節(jié)可重擦寫FLASH閃速存儲器③1000次擦寫周期④全靜態(tài)操作:0HZ-24MHZ⑤三級加密程序存儲器⑥1288字節(jié)內部RAM⑦32個可編程I/O口線⑧2個16位定時/計數(shù)器⑨6個中斷源⑩可編程串行UART通道圖3-2AT89C51引腳封裝圖芯片引腳介紹:(1)主電源引腳①VCC:+5V電源②VSS:地線。(2)時鐘電路引腳XTAL1和XTAL2:外接晶體引線端。當使用芯片內部時鐘時,此二引線端用于外接石英晶體和微調電容;當使用外部時鐘時,用于接外部時鐘脈沖信號。(3)控制信號引腳①RST/VPD:復位信號。當輸入的復位信號延續(xù)兩個機器周期以上的高電平時即為有效,用以完成單片機的復位初始化操作;當單片機掉電時,此引腳上可接備用電源,由VPD向片內RAM提供備用電源,一保持片內RAM中的數(shù)據(jù)不丟失。②ALE/PROG:地址鎖存控制信號。在系統(tǒng)擴展時,ALE用于控制把P0口輸出的低8位地址鎖存起來,以實現(xiàn)低位地址和數(shù)據(jù)的隔離。此外,由于ALE是以晶振1/6的固定頻率輸出的正脈沖,因此,可作為外部時鐘或外部定時脈沖使用。 對于EPROM型單片機,在EPRAM編程期間,此引腳接收編程脈沖。③PSEN:片外程序存儲器讀選通信號輸出端。④EA/VPP:訪問程序存儲控制信號。當EA信號為低電平時,對ROM的讀操作限定在外部程序存儲器;當EA信號為高電平時,對ROM的讀操作是從內部程序存儲器開始,并可延至外部程序存儲器。對于EPROM型單片機,在EPRAM編程期間,此引腳接上加21VEPROM編程電源VPP。(4)I/O引腳P0.0~P0.7:P0口8位雙向口線,P1.0~P1.7:P1口8位雙向口線,P2.0~P2.7:P2口8位雙向口線,P3.0~P3.7:P3口8位雙向口線。P3口線的第二功能。P3的8條口線都定義有第二功能,詳見表3-21。表3-1P3口各引腳與第二功能表引腳第二功能信號名稱P3.0RXD串行數(shù)據(jù)接收P3.1TXD串行數(shù)據(jù)發(fā)送P3.2INT0外部中斷0申請P3.3INT1外部中斷1申請P3.4T0定時/計數(shù)器0的外部輸入P3.5T1定時/計數(shù)器1的外部輸入P3.6WR外部RAM寫選通P3.7RD外部RAM讀選通以上把8051單片機的全部信號引腳分別以第一功能和第二功能的形式列出。對于各種型號的芯片,其引腳的第一功能信號是相同的,所不同的只在引腳的第二功能信號。對于9、30和31三個引腳,由于第一功能信號與第二功能信號是單片機在不同工作方式下的信號,因此不會發(fā)生使用上的矛盾。但是P3口的情況卻有所不同,它的第二功能信號都是單片機的重要控制信號。因此,在實際使用時,都是先按需要選用第二功能信號,剩下的才以第一功能的身份作數(shù)據(jù)位的輸入/輸出使用。圖3-3單片機控制模塊3.3LCD液晶顯示模塊設計顯示模塊主要是用來顯示公歷年、月、日以及時、分、秒、溫度、星期等信息。LCD智能型顯示模塊則是一種低功耗、低價值、低損耗的顯示器件,它不但可以顯示各式各樣的字符、漢子和圖形,同時具有可編程能力,且與單片機接口方便,基于以上優(yōu)點,LCD智能型顯示模塊獲得了廣泛的應用。1602LCD點陣液晶顯示模塊是由16*2個液晶顯示點組成的一個16列*2行的陣列。每個顯示點對應一位二進制數(shù),1表示亮,0表示滅。存儲這些點陣信息的RAM稱為顯示數(shù)據(jù)存儲器,要顯示某個圖形或漢字就是將相應的點陣信息寫入到相應的存儲單元中。圖形或漢字的點陣信息當然有自己設計,問題的關鍵就是顯示點在液晶屏上的位置(行或列)與其在存儲器中的地址之間的關系。每個存儲單元存儲8個液晶點的顯示信息。下面是關于1602LCD液晶相關信息:(1)引腳說明如下表所示表3-21602LCD引腳說明引腳符號功能說明1VSS一般接地2VDD接電源(+5V)3V0液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調整對比度)。4RSRS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。5R/WR/W為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。6EE(或EN)端為使能(enable)端,下降沿使能。7DB0底4位三態(tài)、雙向數(shù)據(jù)總線0位(最低位)8DB1底4位三態(tài)、雙向數(shù)據(jù)總線1位9DB2底4位三態(tài)、雙向數(shù)據(jù)總線2位10DB3底4位三態(tài)、雙向數(shù)據(jù)總線3位11DB4高4位三態(tài)、雙向數(shù)據(jù)總線4位12DB5高4位三態(tài)、雙向數(shù)據(jù)總線5位13DB6高4位三態(tài)、雙向數(shù)據(jù)總線6位14DB7高4位三態(tài)、雙向數(shù)據(jù)總線7位(最高位)(也是busyflag)15BLA背光電源正極16BLK背光電源負極①請在DB0~DB7數(shù)據(jù)線中加入10K上拉電阻,特別是使用單片機中的三態(tài)I/O口時。②V0需要一個外部的0V~10V負壓輸入,是液晶顯示,可串入電位器調整液晶灰度。下面為1602LCD的指令集表:表3-31602LCD指令集3.4DS1302時鐘模塊的設計DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時提供了對后備電源進行涓細電流充電的能力。⑴DS1302的引腳排列其中Vcc1為后備電源,VCC2為主電源。在主電源關閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細說明。SCLK為時鐘輸入端。下圖為DS1302的引腳功能圖:圖3-4DS1302的引腳功能圖⑵DS1302的控制字節(jié) DS1302的控制字如表3-4所示??刂谱止?jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為1表示進行讀操作,控制字節(jié)總是從最低位開始輸出。表3-4DS1302的控制字格式⑶DS1302數(shù)據(jù)的輸入輸出在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。圖3-5DS1302讀寫時序圖⑷DS1302的寄存器DS1302有12個寄存器,其中有7個寄存器與日歷、時鐘相關,存放的數(shù)據(jù)位為BCD碼形式,其日歷、時間寄存器及其控制字見下表。此外,DS1302還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與RAM相關的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內容。DS1302與RAM相關的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個字節(jié),命令控制字為FEH(寫)、FFH(讀)。表3-5DS1302的日歷、時鐘寄存器及其控制字寄存器名命令字取值范圍各位內容寫操作讀操作76543210秒寄存器80H81H00-59CH10SECSEC分鐘寄存器82H83H00-59010MINMIN小時寄存器84H85H12或00-2312/24010APHRHR日期寄存器86H87H01-28,29,30,310010DATEDATE月份寄存器88H89H01-12000IOMMONTH周日寄存器8AH8BH01-0700000DAY年份寄存器8CH8DH00-9910YEARYEARDS1302時鐘芯片與AT89C51的連接圖如下:圖3-6DS1302時鐘芯片與AT89C51的連接圖3.5DS18B20溫度采集模塊的設計采用數(shù)字式溫度傳感器DS18B20,有DALLAS半導體公司生產(chǎn)的DS18B20型單線智能溫度傳感器,屬于新一代適配微處理器的智能溫度傳感器,可廣泛用于工業(yè)、民用、軍事領域的溫度測量及控制儀器、測量系統(tǒng)和大型設備中。(1)DS18B20的性能特點可歸納如下:1)獨特的單線接口僅需一個端口引腳進行通信;2)DS18B20支持多點組網(wǎng)功能,多個DS18B20可以并聯(lián)在唯一的三線上,實現(xiàn)組網(wǎng)多點測溫;3)DS18B20在使用中不需要任何外圍元件,全部傳感元件及轉換電路集成在形如一只三極管的集成電路內;4)測溫范圍-55℃~+125℃,在-10~+85℃時精度為±0.5℃;5)可編程的分辨率為9~12位,對應的可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃,可實現(xiàn)高精度測溫;6)在9位分辨率時最多在93.75ms內把溫度轉換為數(shù)字,12位分辨率時最多在750ms內把溫度值轉換為數(shù)字,速度更快;7)測量結果直接輸出數(shù)字溫度信號,以"一線總線"串行傳送給CPU,同時可傳送CRC校驗碼,具有極強的抗干擾糾錯能力;8)負壓特性:電源極性接反時,芯片不會因發(fā)熱而燒毀,但不能正常工作。(2)電路設計如下圖所示。采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式溫度傳感器,具有測量精度高,電路連接簡單等特點,此類傳感器僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,使用AT89C51單片機芯片的P2.7端口與DS18B20的I/O口連接,加一個上拉電阻,Vcc接電源,Vss接地。圖3-7DS18B20溫度采集(3)DS18B20工作時序1.復位時序圖圖3-8復位時序圖2.讀時序圖圖3-9讀時序圖3.寫時序圖圖3-10寫時序圖4系統(tǒng)調試4.1硬件調試硬件調試是測試焊接完成后的成品的硬件電路的功能,發(fā)現(xiàn)及排除相關故障,主要包括主控芯片的調試以及各模塊電路的調試。由于本次設計僅僅處于軟件仿真階段,并沒有去設計焊接電路,故該部分略。在不久的畢業(yè)設計論文中一定會完善該部分。4.2軟件調試本設計的軟件編譯是在KeiluVision4上進行的,此軟件可以生成HEX文件用于下載到單片機上工作。生成HEX文件后可以在PROTEUS上進行仿真調試。5結論經(jīng)過將近三周的時間,課程設計終于完成了,心里頓時輕松不少,這段時間經(jīng)歷了從茫然不知從哪里下手到收集資料,小組討論,有了些頭緒再到理出思路,開始設計各部分電路,再到調試解決各個問題,期間經(jīng)過老師的指導又修改電路,最后完成整個電路設計,心情也跟著起起伏伏,有調試成功的喜悅,有試了好多次卻不知道哪兒出了問題的迷惑,也有突然有了新想法想嘗試的沖動,總之,從畏懼漸漸喜歡上了設計,從設計中學到了好多實用的知識。參考文獻[1]蔡美琴等.MCS-51系列單片機系統(tǒng)極其應用.北京:高等教育出版社,2004[2]林伸茂.8051單片機徹底研究實習篇.北京:人民郵電出版社,2004[3]胡學海.單片機原理極其應用系統(tǒng)設計.北京:電子工業(yè)出版社,2005[4]張毅剛.單片機原理極其應用.哈爾濱:哈爾濱工業(yè)大學出版社,2004[5]韓志軍等.單片機應用系統(tǒng)設計.北京:機械工業(yè)出版社,2005[6]舒懷林.單片機原理與接口技術.武漢:華中科技大學出版社,2001

附錄課程設計中的程序如下:#include<reg52.h>#include<intrins.h>#include"SoundPlay.h"#defineucharunsignedchar#defineuintunsignedintsbitSCK=P3^6;//時鐘sbitSDA=P3^4;//數(shù)據(jù)sbitRST=P3^5;//DS1302復位sbitlcdrs=P2^6;sbitlcdrw=P2^5;sbitlcden=P2^7;sbitkey1=P1^0;//開調時鍵sbitkey2=P1^1;//調時加鍵sbitkey3=P1^2;//調時減鍵sbitkey4=P1^3;//開設定鬧鈴鍵sbitkey5=P1^4;//返回正常顯示鍵sbitkey6=P1^5;//鬧鈴開關鍵sbitDQ=P3^7;//溫度傳感器數(shù)據(jù)通信位sbitbeep=P2^1;//蜂鳴器控制IO口sbitled1=P2^0;//led燈,鬧鈴響標志bitReadRTC_Flag,Display_Flag,Alarm_Flag,flag;//定義標志位ucharmiao,fen,shi,ri,yue,week,nian,T,C=0,k=0,m=0,n=0;ucharset_miao,set_fen,set_shi,set_ri,set_yue,set_nian,TempBuffer[5],temp_value;charl_tmpdate[7]={0x50,0x08,0x011,0x07,0x10,0x01,0x12};//設置初始時間,秒分時日月周年12-10-0701:08:50ucharcodewrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//秒分時日月周年最低位寫位ucharcoderead_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//秒分時日月周年最低位讀位ucharcodetable1[]="SUN";//星期字表ucharcodetable2[]="MON";ucharcodetable3[]="TUE";ucharcodetable4[]="WED";ucharcodetable5[]="THU";ucharcodetable6[]="FRI";ucharcodetable7[]="SAT";ucharcodetab1[]="20--";ucharcodetab2[]="::";ucharcodetab3[14]="SetAlarm!";chartab4[]={0,0,12};//兩只蝴蝶unsignedcharcodeMusic_Two[]={0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x15,0x03,0x16,0x01,0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x19,0x03,0x19,0x01,0x19,0x03,0x1A,0x03,0x19,0x03,0x17,0x01,0x16,0x03,0x16,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0D,0x15,0x00,0x19,0x03,0x19,0x03,0x1A,0x03,0x1F,0x03,0x1B,0x03,0x1B,0x03,0x1A,0x03,0x17,0x0D,0x16,0x03,0x16,0x03,0x16,0x0D,0x17,0x01,0x17,0x03,0x17,0x03,0x19,0x03,0x1A,0x02,0x1A,0x02,0x10,0x03,0x17,0x0D,0x16,0x03,0x16,0x01,0x17,0x03,0x19,0x03,0x19,0x03,0x17,0x03,0x19,0x02,0x1F,0x02,0x1B,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x17,0x02,0x1A,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x1A,0x03,0x19,0x03,0x17,0x03,0x16,0x03,0x17,0x0D,0x16,0x03,0x17,0x03,0x19,0x01,0x19,0x03,0x19,0x03,0x1A,0x03,0x1F,0x03,0x1B,0x03,0x1B,0x03,0x1A,0x03,0x17,0x0D,0x16,0x03,0x16,0x03,0x16,0x03,0x17,0x01,0x17,0x03,0x17,0x03,0x19,0x03,0x1A,0x02,0x1A,0x02,0x10,0x03,0x17,0x0D,0x16,0x03,0x16,0x01,0x17,0x03,0x19,0x03,0x19,0x03,0x17,0x03,0x19,0x03,0x1F,0x02,0x1B,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x17,0x02,0x1A,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x17,0x16,0x1A,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x1A,0x03,0x19,0x03,0x17,0x03,0x16,0x03,0x0F,0x02,0x10,0x03,0x15,0x00,0x00,0x00};/******************************************************************//*函數(shù)聲明*//******************************************************************/voidInit_DS18B20(void);unsignedcharReadOneChar(void);voidWriteOneChar(uchardat);voidReadTemp(void);voidtemp_to_str();//溫度數(shù)據(jù)轉換成液晶字符顯示voidWrite_Ds1302_byte(uchartemp);voidWrite_Ds1302(ucharaddress,uchardat);ucharRead_Ds1302(ucharaddress);voidRead_RTC(void);voidSet_RTC(void);voiddelay(uchara);voiddelay1(uchara);voiddi();voidlcd_mang();voidwrite_lcd1602(ucharcmd,uchari);voidini_lcd1602();voidwrite_week(ucharxq);voidwrite_nyr(ucharadd,uchardat);voidwrite_sfm(ucharadd,uchardat);voiddisplay();voidkeyscan();voidalarm();/******************************************************************//*主函數(shù)*//******************************************************************/voidmain(void){ini_lcd1602();Init_DS18B20();Set_RTC();//寫入時鐘值,如果使用備用電池時候,不需要沒每次上電寫入,此程序應該屏蔽while(1){ReadTemp();temp_to_str();keyscan();if(ReadRTC_Flag==0){Read_RTC();if(Display_Flag==0){display();}if(flag==1){alarm();}}}}/******************************************************************//*毫秒級延時函數(shù)*//******************************************************************/voiddelay(uchara){uchari;while(a--){for(i=0;i<250;i++){_nop_();_nop_();_nop_();_nop_();}}}voiddelay1(uchara){uchari;while(a--){for(i=0;i<5;i++){}}}/******************************************************************//*蜂鳴器發(fā)聲函數(shù)*//******************************************************************/voiddi(){uchari;while(key1==0||key2==0||key3==0||key4==0||key5==0||key6==0){for(i=0;i<50;i++){delay1(4);beep=~beep;}}}/******************************************************************//*ds18b20延遲子函數(shù)(晶振12MHz)*//******************************************************************/voiddelay_18B20(unsignedinti){while(i--);}/******************************************************************//*ds18b20初始化函數(shù)*//******************************************************************/voidInit_DS18B20(void){unsignedcharx=0;DQ=1;//DQ復位delay_18B20(8);//稍做延時DQ=0;//單片機將DQ拉低delay_18B20(80);//精確延時大于480usDQ=1;//拉高總線delay_18B20(14);x=DQ;//稍做延時后如果x=0則初始化成功x=1則初始化失敗delay_18B20(20);DQ=1;}/******************************************************************//*ds18b20讀一個字節(jié)*//******************************************************************/unsignedcharReadOneChar(void){uchari=0;uchardat=0;for(i=8;i>0;i--){DQ=0;//給脈沖信號dat>>=1;DQ=1;//給脈沖信號if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/******************************************************************//*ds18b20寫一個字節(jié)*//******************************************************************/voidWriteOneChar(uchardat){unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;delay_18B20(5);DQ=1;dat>>=1;}}/******************************************************************//*讀取ds18b20當前溫度*//******************************************************************/voidReadTemp(void){unsignedchara=0;unsignedcharb=0;unsignedchart=0;Init_DS18B20();WriteOneChar(0xCC);//跳過讀序號列號的操作WriteOneChar(0x44);//啟動溫度轉換delay_18B20(100);//thismessageisweryimportantInit_DS18B20();WriteOneChar(0xCC);//跳過讀序號列號的操作WriteOneChar(0xBE);//讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度delay_18B20(100);a=ReadOneChar();//讀取溫度值低位b=ReadOneChar();//讀取溫度值高位temp_value=b<<4;temp_value+=(a&0xf0)>>4;}/******************************************************************//*溫度數(shù)據(jù)轉換*//******************************************************************/voidtemp_to_str()//溫度數(shù)據(jù)轉換成液晶字符顯示{TempBuffer[0]=temp_value/10+'0';//十位TempBuffer[1]=temp_value%10+'0';//個位//TempBuffer[2]=0xdf;//溫度符號//TempBuffer[3]='C';//TempBuffer[4]='\0';}/******************************************************************//*LCD1602判忙函數(shù)*//******************************************************************/voidlcd_mang(){lcdrs=0;lcdrw=1;lcden=1;_nop_();_nop_();_nop_();_nop_();while(P0&0x80);lcden=0;}/******************************************************************//*LCD1602寫指令(i=0)、數(shù)據(jù)(i=1)函數(shù)*//******************************************************************/voidwrite_lcd1602(ucharcmd,uchari){lcd_mang();lcdrs=i;lcdrw=0;lcden=0;_nop_();_nop_();lcden=1;_nop_();_nop_();P0=cmd;_nop_();_nop_();_nop_();_nop_();lcden=0;}/******************************************************************//*LCD1602初始化函數(shù)*//******************************************************************/voidini_lcd1602(){uchari;led1=1;Alarm_Flag=0;write_lcd1602(0x38,0);delay(1);write_lcd1602(0x0c,0);delay(1);write_lcd1602(0x06,0);delay(1);write_lcd1602(0x01,0);delay(1);write_lcd1602(0x80+1,0);for(i=0;i<8;i++){write_lcd1602(tab1[i],1);}write_lcd1602(0x80+0x40+2,0);for(i=0;i<6;i++){write_lcd1602(tab2[i],1);}write_lcd1602(0x80+0x40+14,0);write_lcd1602(0xdf,1);write_lcd1602('C',1);}/******************************************************************//*BCD轉換成LCD1602能顯示的16進制數(shù),秒、分、時*//******************************************************************/voidwrite_sfm(ucharadd,uchardat){uchargw,sw;gw=dat%10;sw=dat/10;write_lcd1602(0x80+0x40+add,0);write_lcd1602(sw+'0',1);write_lcd1602(gw+'0',1);}/******************************************************************//*BCD轉換成LCD1602能顯示的16進制數(shù),日、月、年*//******************************************************************/voidwrite_nyr(ucharadd,uchardat){uchargw,sw;gw=dat%10;sw=dat/10;write_lcd1602(0x80+add,0);write_lcd1602(sw+'0',1);write_lcd1602(gw+'0',1);}/******************************************************************//*顯示星期*//******************************************************************/voidwrite_week(ucharxq){ucharx;write_lcd1602(0x80+12,0);switch(xq){case1:for(x=0;x<3;x++){write_lcd1602(table1[x],1);}break;case2:for(x=0;x<3;x++){write_lcd1602(table2[x],1);}break;case3:for(x=0;x<3;x++){write_lcd1602(table3[x],1);}break;case4:for(x=0;x<3;x++){write_lcd1602(table4[x],1);}break;case5:for(x=0;x<3;x++){write_lcd1602(table5[x],1);}break;case6:for(x=0;x<3;x++){write_lcd1602(table6[x],1);}break;case7:for(x=0;x<3;x++){write_lcd1602(table7[x],1);}break;}write_lcd1602(0x80+12,0);}/******************************************************************//*顯示函數(shù)*//******************************************************************/voiddisplay(){uchari;Read_RTC();write_sfm(8,miao);write_sfm(5,fen);write_sfm(2,shi);write_nyr(3,nian);write_nyr(6,yue);write_nyr(9,ri);write_week(week);ReadTemp();temp_to_str();write_lcd1602(0x80+0x40+12,0);for(i=0;i<2;i++){write_lcd1602(TempBuffer[i],1);}}/******************************************************************//*DS1302寫一個字節(jié)*//******************************************************************/voidWrite_Ds1302_Byte(uchartemp){uchari;for(i=0;i<8;i++)//循環(huán)8次寫入數(shù)據(jù){SCK=0;SDA=temp&0x01;//每次傳輸?shù)妥止?jié)temp>>=1;//右移一位SCK=1;}}/******************************************************************//*寫入DS1302*//******************************************************************/voidWrite_Ds1302(ucharaddress,uchardat){RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_();//啟動Write_Ds1302_Byte(address);//發(fā)送地址Write_Ds1302_Byte(dat);//發(fā)送數(shù)據(jù)RST=0;//恢復}/******************************************************************//*讀出DS1302數(shù)據(jù)*//******************************************************************/ucharRead_Ds1302(ucharaddress){uchari,temp=0x00;RST=0;_nop_();_nop_();SCK=0;_nop_();_nop_();RST=1;_nop_();_nop_();Write_Ds1302_Byte(address);for(i=0;i<8;i++)//循環(huán)8次讀取數(shù)據(jù){if(SDA)temp|=0x80;//每次傳輸?shù)妥止?jié)SCK=1;temp>>=1;//右移一位_nop_();_nop_();_nop_();SCK=0;}RST=0;_nop_();//以下為DS1302復位的穩(wěn)定時間_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return(temp);//返回}/******************************************************************//*讀時鐘數(shù)據(jù)*//******************************************************************/voidRead_RTC(void)//讀取日歷{uchari,*p;p=read_rtc_address;//地址傳遞for(i=0;i<7;i++)//分7次讀取秒分時日月周年{l_tmpdate[i]=Read_Ds1302(*p);p++;miao=((l_tmpdate[0]&0x70)>>4)*10+(l_tmpdate[0]&0x0f);fen=((l_tmpdate[1]&0x70)>>4)*10+(l_tmpdate[1]&0x0f);shi=((l_tmpdate[2]&0x70)>>4)*10+(l_tmpdate[2]&0x0f);ri=((l_tmpdate[3]&0x70)>>4)*10+(l_tmpdate[3]&0x0f);yue=((l_tmpdate[4]&0x70)>>4)*10+(l_tmpdate[4]&0x0f);week=((l_tmpdate[5]&0x70)>>4)*10+(l_tmpdate[5]&0x0f);nian=((l_tmpdate[6]&0x70)>>4)*10+(l_tmpdate[6]&0x0f);}}/******************************************************************//*設定時鐘數(shù)據(jù)*//******************************************************************/voidSet_RTC(void)//設定日歷{uchari,*p;/*for(i=0;i<7;i++){//BCD處理tmp=l_tmpdate[i]/10;l_tmpdate[i]=l_tmpdate[i]%10;l_tmpdate[i]=l_tmpdate[i]+tmp*16;}*/Write_Ds1302(0x8E,0X00);//允許寫,禁止寫保護p=write_rtc_address;//傳地址for(i=0;i<7;i++)//7次寫入秒分時日月周年{Write_Ds1302(*p,l_tmpdate[i]);p++;}Write_Ds1302(0x8E,0x80);//打開寫保護}/******************************************************************//*鍵盤掃描函數(shù)*//******************************************************************/voidkeyscan(){uchari;if(Display_Flag==0){if(key1==0)//調時功能鍵{delay(9);if(key1==0){di();while(!key1);//松手檢測++n;ReadRTC_Flag=1;//停止走時switch(n){case1:write_lcd1602(0x80+0x40+9,0);//按一次功能鍵秒閃爍write_lcd1602(0x0f,0);Write_Ds1302(0x8e,0x00);//允許寫,禁止寫保護Write_Ds1302(0x80,((miao/10)*16+miao%10));//寫入DS1302秒位Write_Ds1302(0x8e,0x80);//打開寫保護break;case2:write_lcd1602(0x80+0x40+6,0);//按兩次功能鍵分閃爍break;case3:write_lcd1602(0x80+0x40+3,0);//按三次功能鍵時閃爍break;case4:write_lcd1602(0x80+10,0);//按四次功能鍵日閃爍break;case5:write_lcd1602(0x80+7,0);//按五次功能鍵月閃爍break;case6:write_lcd1602(0x80+4,0);//按六次功能鍵年閃爍break;case7:write_lcd1602(0x80+12,0);//按七次功能鍵周閃爍break;case8:n=0;//按八次功能鍵開始走時,停止閃爍ReadRTC_Flag=0;write_lcd1602(0x0c,0);Write_Ds1302(0x8e,0x00);Write_Ds1302(0x80,((miao/10)*16+miao%10));Write_Ds1302(0x8e,0x80);C=0;break;}}}}if(key4==0)//鬧鈴功能鍵{delay(9);if(key4==0){di();while(!key4);m++;Display_Flag=1;//屏蔽調時功能鍵,進入調鬧鈴功能Alarm_Flag=0;

溫馨提示

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

評論

0/150

提交評論