




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
基于STC單片機的多功能電子鐘的設計摘要:隨著科技的越來越發達,我們的生活也越來越方便,在這個快速發展的社會,我們在現在的生活里面已經不可以忽視掉多功能電子鐘的作用了,本文闡述了數字集成電路的發展促使了多功能電子鐘的廣泛使用,其功能有很多,比如定時廣播、定時自動報警還有就是各種定時電氣的自動啟動等等,通過實物裝置的檢測實驗結果表明了系統工作的效果優良,也完成了預期的功能,是可以用在家庭、教室或者營業廳等不同的場合。Abstract:Withtherapiddevelopmentofmodernsociety,people'squalityoflifearealsoconstantlyincreased,thedailylifeinanincreasinglyhighdemand.However,therapiddevelopmentofsocietywillinevitablyleadtoenvironmentalpollutionanddestruction,environmentalproblemsarebeginningmoreandmorepeople'sattention.Peoplethroughvariousmeanstotrytoimprovethelivingenvironmentandreducepollutionemissions,afforestation,andsoon,butweknowfrompractice,vigorouslydevelopthelandscapeofoursolutionstoenvironmentalproblemsisthemosteffectiveway.
Landscapinghasbecomethestandardtomeasurethelevelofurbandevelopmentanimportantindicator.Landscapinginthebuilding,howtheregionwillbelimitedPoemdesignedpicturesquelandscapeistheconcernofeveryone,buthowtocontrolthecultivationoflandscapeplantsshouldbemorequalityissuesofconcerntoeveryone.
目錄TOC\o"1-6"\h\u一:緒論 3二單片機介紹 4三:總體方案及原理 5四、系統硬件電路 64.1:最小系統 64.2時鐘模塊電路 74.3溫度傳感器模塊 74.4液晶顯示模塊 84.5按鍵模塊 8五、系統軟件設計 95.1main模塊 95.2lcd12864模塊 165.3key模塊 185.4DS18B20模塊.19六、軟件調試與實驗分析 20總結 23致謝 24參考文獻 25
一:緒論現在,“時間”這個詞對我們來說越來越重要了,也是人們越來越珍惜的東西,我們可以很認真的對待時間,遵守時間是現在在社會上立足的根本。所以說,時間的重要性是別的東西無法比擬的。那么這樣,就引起了一系列的發展,關于時間鐘表的發展。隨著這個科技的發展,我們也越來越離不開它們。社會在高速發展,人類也越來越進步,所有的存在都要一步一步的進化,隨之發展的,當然也少不了鐘表,一個會提高人類效率的東西。時間正在一點點的過去,留下的是人們生活過的痕跡。這些一點一滴都要提醒著我們,我們一定要時刻保持清醒和時間觀念,這是非常非常重要的。所以現在在哪里都已經離不開時間了,隨處可見。那么我們現在是不是需要更加方便,簡潔,準確的來顯示時間,這樣我們的生活效率才會更加的高。那我們需要怎么做才可以達到這樣的效果呢?這就成為了我們需要研究的方向。準確度特別高的那些可以用來計算時間的工具一般都是用的那種叫做石英晶體的振蕩器的東西,這個就是那些電子鐘、石英表還有石英鐘都是利用的石英技術的原理,而利用這種原理,就可以讓鐘表的指針在走的時間就會更加的精確了,而且也可以保證很好的穩定,不會搖搖晃晃的,松松坦坦的。還有一個好處就是,這樣就不用一直去調時間了,它一般不會走亂的,這樣的話,它用起來就非常簡便了。還有一種就是那種使用數字式電子鐘的鐘表,通常使用集成電路在計算時間的時候,,就換了一種方式,采用那種譯碼來替代傳統的方法方式,而且還會使用LCD顯示器來替代傳統使用的指針,這樣呢也是可以用來把時間給顯出來,這樣的也會有一個好處,那就是這樣顯示出來的時間,一般情況下,它的誤差就比較小,基本上沒什么誤差,而且這種表真的很方便,它不僅僅顯示小時和分鐘,它還顯示秒,這樣的好處是什么?那就是可以更加準確的得到我們想要的時間,而且對于在調對時間的時候就更加方便了,這是不是大大增加了它的靈活性呢?很顯然,是的。而且鐘表還便利好多好多的應用,小小的它在電腦里面也是有很大的作用的,也是電腦里面比較重要的應用了,不可忽視,因為它保證了就是計算機的正常的工作運行,也算是計算機中超級超級重要的功能了。不過大家口中經常談論的鐘表,一般不是指單片機里面的時間,應用系統中,尤其是單片機里面的系統中,時鐘一般會有不同的內涵,通常可以分成兩類:第一種就是說它是為了保障某種程序可以好好的進行的,所以它會發生出一種信號,這種信號大致由一種叫做晶振的東西還有一種就是外圈的組成電路的東西給結合成的,而這個晶振肯定會有頻率這一個說法,而這個的頻率就會把單片機運行的快或者是慢給決定了。還有就是這個系統里面的定時時間,也可以說是標準定時時間,這個時間也是可以有不同的形成方法的,去其中一種是用軟件來完成,就是說軟件肯定由程序組成吧,我們就可以把單片機的運行給編程比較簡便的程序,程序里面是有指令計數器的,這樣就可以實現了;第二個就是專門買一個計算機中使用的時鐘芯片來完成,這兩種方法都是可以實現的。二單片機介紹單片機簡單地說,它就是一個集成在一塊芯片上面的完整的計算機系統。雖然它的絕大多數的功能都是集成在一塊小的芯片上的,不過這也不會妨礙它可以擁有很多的功能,這就叫“麻雀雖小,五臟俱全”,單片機擁有一個完整計算機里面所必要的基本上可以說是通盤的功能,它里面有CPU、內存、內部總線系統和外部總線系統,目前大多數還有外存這個功能。而且它還集成了許多比方通話接口、定時時鐘等等的外部的功能器件。而且如今的最強大的單片機系統有的都可以把聲響、圖像、復雜的系統等這些高難度的不太容易的功能也都集成在了這一塊小小的芯片上面。單片機還有一個名字,它也可以叫做微控制器。它并不是為了可以解決某一個邏輯功能的芯片,而是把一整個計算機系統都集成在一個芯片上面。總的來說,就是指這一塊小小的芯片就是一臺計算機了。單片機有以下幾個優點:體積比較小,重量比較輕,價格方面也比較便宜,還為學習、工作、應用和開發等都供應了好多好多的便利條件。單片機是在20世紀70年代末的時候產生的,它經歷了SCM、MCU和SC這三個過程。STC單片機現在已經完完全全的包含了51單片機,而且還有了它們比較特殊的用途,它的抗干擾能力很強,加密性也很強,功耗也非常非常的低,而且還能夠遠程的升級,這個內部還有專用的復位電路,價格也不貴,就是因為這樣優點,這些特點讓STC系列的單片機變得非常的搶手,它的適用范圍也越來越寬泛了。基于STC單片機的多功能電子鐘憑借著其特有的那些優勢,比如能夠設置00:00:00到23:59:59的計時功能,而且在控制電路的控制下還有保持、清零、快速校時、快速校分、整點報時等等方面的功能。在本次設計里面,電路通常有具有顯示日期、時間、溫度的基本功能,還可以實現對它們的調整。本次設計要達到的目的是:時間顯示和手動校對的功能,并且用的是二十四小時制;同時還有年、月、日展現和不是自動調整的功能,可以手動調整;有周的展現功能;有鬧鐘的功能;有室內室外環境的檢測功能;比如突然停電之后也不需要再次調整時間或者日期等等的功能。三:總體方案及原理這個設計主要的想達到的效果和目標是:運用書本上的理論知識,并且在結合自己的理解之后,使用實際存在的物體來表達,并且解決我們實際上需要解決的一系列問題。從而來實現單片機的功能,然后好好的使用它并且發揮出它的最大的性能和優勢。這就需要大家可以很好的理解其原理和很好的掌控它其中一些重要的運用方法和存在的一些設計理念。掌握了這些具體方法以后,就可以為之后在電子電路設計中做一些提前的準備措施,這樣就可以在一定情況下保證實驗的正確可行性,然后會為探究實驗、研發電子系列的產品做鋪墊并且打下一個勞勞的根基、地基。功能方面的要求說明是:這個多功能數字電子鐘通常情況下使用三個為兩位一體的共陽極LED數碼管用來顯示這其中的時、分、秒。然后當電子鐘一通上電的時候,就可以把它給顯示出來了。它分別使用三個按鈕來調時間或者是鬧鐘,這三個按鈕分別是K1、K2、K3,這里面K1的鍵是功能選擇鍵,按一下它就可以調節小時,按兩回的話就是調分鐘的了,如果按三回的話,那就是調鬧鐘里面的小時了,還可以連續按四回,按四回的話就是調節鬧鐘里面的分鐘,按五回之后時鐘就可以開始工作了。而K2鍵的功能是在數值上加一鍵,K3鍵就是在數值上減一鍵。總體方案及工作原理說明:這個設計使用的是STC單片機芯片及LED顯示器,獨立式按鍵組成的多功能電子鐘。在這個設計里面是采用單片機的內部定時器定時,程序框圖如下圖所示:設計原理這個設計采用STC單片機其中一個型號來作這個系統的控制模塊。單片機可把別的型號里面的數據利用各種計算機中的軟件來進行操作,這樣就會把需要的數據傳送到顯示模塊,從而就完成了時間、鬧鈴和溫度等方面的顯示。把LCD液晶顯示器作為顯示模塊,這樣就用它來把單片機里面傳出了的那些數據一五一十的給顯示出來,而且再把這些展現出來的數據給豐富化。而這些操作,在顯示電路的里面,基本上最關鍵的就是依靠按鍵來完成不同的展現要求中的不同的挑選和轉換。四、系統硬件電路4.1:最小系統最小系統是指能進行正常工作的最簡單電路。以STC89C52為例,它的最小系統電路如圖下所示。這個一共有五個部分的電路結構:電源電路等五個,而在這個中間電源電路、時鐘電路、復位電路這三個電路是最最底層的電路了,不可或缺的電路。如果少了這三個,那么整個電路肯定就不能運行了,所以說,這三個是里面最根本的電路了。①電源電路的芯片引腳通常接在直流穩壓電源+5V,另一個引腳接入到電源+5V的負極,電源電壓的范圍通常在4~5.5的之間,這樣就可以確保單片機系統可以正常的運行了。為了增強電路的抵抗干擾的能力,一般就在引角Vcc與GND的中間接入一個差不多10uF的電解電容還有一個0.1uF的陶片電容,然后就可以很好的抵擋那些雜波對它經行的干擾了,這樣就可以很高效的、很準確的保證了電路的穩定性能。②這此中時鐘電路的單片機引腳18再有引腳19的外接晶振和電容,這個芯片的運行頻率通常都是在2~33MHz的范疇之內選擇,然后單片機運作的頻率一般都是由晶振XT的頻率來定奪的,一般都是選擇的11.0592MHz晶振。而后這兩個的小電容一般的取定數值的范圍為3pF,這樣就可以保證振蕩器的電路可以穩定而又快速的進行了。③復位電路每每情況下,假如說在引腳RST上維持了24個工作主頻周期的高電平,那么這個單片機就能夠順利的解決復位的問題了,不外又為了確保系統可以很準確的、沒有紕漏的完成復位,復位電路應該讓引腳RST維持在10ms以上的高電平上。如下圖,復位電路上面本身就有上電的自動復位的功能,那么當電路上電的時候,因為C1電容兩端的電壓值并不可以進入突然的變化,電源+5V就會使用電容向RST供應充電的電流,所以就會在RST引腳上面產生一個高電平,從而就可以讓單片機進入到復位的狀態。不過由于電容C1的持續充電,它兩側的電壓迅速的上升然后就會讓RST電位持續下降,最后就讓單片機慢慢的退出了復位的狀態。在正常工作的時候,也不妨按下復位按鈕這樣也可以使單片機恢復成復位的狀態。4.2時鐘模塊電路這個設計里的DS12887芯片中的引腳和STC89C52芯片里面的接口連到一塊,然后再讓第一個芯片里面的另一個引腳接地,然后作為INTEL總線的其中一個方法,就是以時間順序的方法給連起來,這樣這兩個就也是以對應的INTEL的運作方式給操作起來的。時鐘模塊電路如圖下所示:4.3溫度傳感器模塊這個的接入的方法十分的簡單,一點都不復雜,就是把它的其中一個引腳和STC89C52芯片里面的其中PL.7的引腳給連接起來。而這個里面也只是使用到其中一個溫度傳感器,所以所還是比較簡單的,那比如說想要用好多個溫度傳感器,,那么就只需要把所用的接口都和這個芯片連接到一起就可以了。不過在具體的操作的時候,需要使用一種方法,那就是從讀道德每一個芯片里面的內部設置好的序號來進行一個個的辨別。溫度傳感器模塊電路如圖下所示:4.4液晶顯示模塊液晶顯示模塊就是把LCD1602里面其中的一個引腳和STC89C52芯片的P2接口連接起來,然后在把幾個控制引腳也分別接入到相應的接口中。之后引腳在通過連接一個叫做1K的電位器,用來調整顯示器的對比度,這樣就可以找到合適的背光燈的所需要的對比度了。液晶顯示模塊電路如圖下所示:4.5按鍵模塊1)這個電子鐘一個有五個按鈕S0、S1、S2、S3和S4,它們的功能分為是鬧鐘停止鍵、時間設置和鬧鐘設置鍵,加一鍵、減一鍵、移動鍵。他們這些按鈕詳細的說明情況為:S0鬧鐘停止鍵:就是如果鬧鐘的聲音突然響起來的時候,然后按一下這個按鈕,這樣就可以把鬧鐘給關掉了。S1時間校準鍵、鬧鐘設置鍵:按一下這個按鈕以后,整個的LCD液晶屏就開始呈現,按下這個按鈕,就可以讓顯示屏進到預先設置時間的狀態,連續按兩回就可以調成鬧鐘的設置狀態。通過上面的兩種狀態,在這樣的情況下,可以設置我們想要設置的小時,分鐘或者秒,這些都是可以進行設定的。然后我們調完了以后,我們可以再次按一下這個按鈕,這個時候就是我們已經設置成功了,并且順利的推出來了。這個時鐘的時針、分針、秒針就按照正常的情況走了。S2加1鍵:這個按鈕就是在設置年、月、日、星期、小時、分、秒等時間方面的數字的時候按一下這個按鈕就可以讓相對應的的數字加上一個一。S3減1鍵:這個按鈕就是在設置年、月、日、星期、小時、分、秒等時間方面的數字的時候按一下這個按鈕就可以讓相對應的的數字減去一個一。S4移動鍵:如果時鐘是在預先設定時間的狀態的時候或者是在鬧鐘設置的狀態的時候,按照順序按下這個按鈕來進行年、月、日、星期、小時、分、秒的位置的移動變化,然后就可以調整需要的時間,調整完了以后,再按一下S1的按鈕就可以退出這個狀態了,然后就是正常的走時狀態了。系統軟件設計5.1main模塊30/54#include<at89x52.h>#include<intrins.h>#include<Delayh>#include<Key_Scanh>#include<LCD1602h>#include<DS18B20h>sbitBuzz=P2^3,//定義蜂鳴器的接口unsignedcharK1_cnt=0,//記錄K1連續按下的次數unsignedcharHint.cnt=-0,unsignedcharcodeHint1[]-"PressSETtoch-//PressK1toset,unsignedcharcodeHint2]-"angeTime&Alarml',unsignedcharcodeHint3]="AlarmsettingunsignedcharcodeHint4]=",十個空格unsignedintYear2010,Year_tmp,unsignedcharMonth=4,Day=30,WeekHour=9,Min=59,Sec=50,/復位的時間初值unsignedcharAHour=10,AMin=1;unsignedcharMonthtmp,Day.tmp,Hour_tmp,unsignedcharMintmp;unsignedcharSec_tmp,unsignedcharAHourtmp,AMintmp,unsignedcharkey,bitAlarmF=1;/鬧鐘開狀態標志位unsignedcharbsstile(unsignedinty),//函數聲明判斷是否閏年unsignedchartemp_bisextil(unsignedinty),//圖數聲明,判斷是否閏年unsignedchartemp_Day_Max(unsignedcharm)//函數聲明,判斷當月天數unsignedcharDay_Max(unsignedcharm);//函數聲明,判斷當月天數unsignedcharWeekCalculate(unsignedinty,unsignedcharm,unsignedchard)//函數聲明,計算星期voidTimer0_InitO;//函數聲明,定時器TO初始化voidNormalDisplayO,/函數聲明,正常顯示模式voidAarmJudgeO,//函數聲明,判斷鬧鈴狀態voidSettingMenuO,/函數聲明,進入設定菜單voidstting_Displayunsignedchar)/函數聲明,顯示設定模式voidKey_Action(unsignedchare),/函數聲明,響應鍵盤輸入voidAlarmO,/函數聲明,啟動鬧鈴mainO{<
iE0
E
XIK
Q
31/54TimerO_
InitO,
1/?8t88
0
1Jb61L
DS18B20_
init(,
/?.
E
It
?E8
DS18B20
5J$61CLCD_
InitQ;,
HTE
LCD602
IJ361C
User_
Defined_
CharO,
1/tEáèX
FFEà
LCD1602
é'J
CGRAMwhile(1)
Alarm_
JudgeO;
ReadtemperatureO,
i#
DS18B20
t8Ckey=Key_
_ScanQ;
###
if(key=
=K2)
118↑##Т
К2,
J?JТF
gХЖ?#ф
tb?tAlarm_
F=~Alarm_
F,
if(key=
=K3)
#3#T
K3,
J1Jt#1
LCD1602
(
?LH#
LCDEt??)
LCD_
InitO,
User_
Defined_
_CharO,
if(keyK1)
/1↑#K1
tX1T
K1_
_cnt++;
.
//?K1_
cnt
iaR
K1
39T69X5if(K1_
_cnt=
=10)K1_
_cnt=2;
if(K1_
cnt1)
1/#K1_
cnt
#F
1Setting_
MenuQ,
#AiE#$
if(K1_
cnt>1)
1/#RK1_
cnttf
1Setting_
Display(K1_
_cnt);#/
i#àBt+'?]
i?#
t
Key_
Action(K1_
cnt);,_
//#
K1_
cnt
B)íü
iè
Qj
2B
dmàETif(K1_
cnt=0)
//#K1_
cnt#foNormal_
DisplayO;
//i#.
AiE
5
s7#t
void
Timer0_
InitQ
/EBHtE
0
3JtAYL
TMOD=0x11,
i*5dJfI
0x4C00·//幵源中斷EI0-1;幵定吋器o中斷nMOD-0x11;/沒置定肘器oエ作在方式1(16位〉THO=0x3c,/it數初値カ655360000-15536,即3cb0HTL0-0xb0,TR0=1;后劫定肘器o32/54voidTimer0IntOnterrupt1using3./定吋器o中斷服努程序staticunsignedcharcounto=0,TR0=0,TH0+-0x3G,1L0+-0xb0+7,/ト信肘囘俁差,此裃信値是通辻調試得知TR0=1,count0+t,ffcout=-20/満--秒courto=0;Sectt;fSeo-60/溝--分狆Sec=0,Mintt,ifQMin=-60/満一小肘Min-O,Hourt+;iRHour-24)/満一天HourD,Day+t;ifODay>Day_MexMorth》/満一個月(先判斷當月最大天數)Day-1;Montht+;ifQMonth>12)/溝一年}Month-l;Yeartt;}}voidNormalDisplayO1正常且示狀恣{Set_Positionco,o);/沒亶濕示地址Write_Datac0x04〉,/墨示空格Write_DataCYer10000x30,/昆示年的千位數(數字+30H等于所対座ASCI礙》Write_DatCYeu910001000x30,/晝示年的百位數WriteDaCar610006100y100x30/晝示年的十位數Write_DtCar:61000910010030/昆示年的個位數Write_Data-9,/昆示-Wrte.DataQMorth1040x30;/濕示月的十位數WriteDataQMonth96100x30),昆示月的個位數WriteDataCり;/濕示.Wrte,DataDay1040x30〉晝示日的十位數WriteDataCDay9610+0x30,/品示日的個位數Write_Data(0x04〉,/昆示空格Write_Data(0x02〉I1濕示-個心形圏案Week-Week.CalculateCYearMonthDay;switchCWeek)//昆示星期數{caseo:Write.DataCM,Write_DataCoO,WriteDataCnybreak,1/昆示星期一caseIWrileDataTWriteDataCu》.WriteDataCe9.breaks/昆示星期ニcase2:Write.Data"W'yWriteDataCeWrite_DataCdyjbreak,/昆示星期三case3:Write_Data(T>,Write_Data(t)Write.Data(upbreaks,濕示星期四case4:Write.Datc'F》Write.Datacr;Write_DataGib,break,/濕示星期五cases:WriteDatacCSyWriteDataca,Write_Dtactb,break,/昆示星期六case6:Write,Data(SWriteDatau)WriteDataChy.brek,/顯示星期天default:
break,
Set
Position(1,0);
/設
置顯示地址Write_
Data(0x04>.
1顯示空格
Wrte_
DataHour/10+0x30),
1顯
示時的十位數Wnte_
DataHour%10+0x30)
/顯示時的個位數Write_
Data(");
/顯示
Write,
DataQMin/10+0x30).
/顯示分的十位數Wrte_
DataQMir%610+0x30),
/顯示分的個位數Write
DataC'),//顯示,
Write_
Data(Sec/10+0x30).
/顯示秒的十位數Write
Data(Sec%610+0x30),//顯示秒的個
位數if(Alarm
F
//如果鬧鐘開啟Write
Data(0x01),
1/顯示開鬧鐘符號else
Write_
Data(0x04)
/顯示空格Write_
Data(0x04>顯示空格
Write_
Data(tens+0x30),
1/顯示溫度的十位數Write_
Data(units+0x30),
11
顯示溫度的個位數Write
Data(0x2e),
/顯示小數點
Wrte,
Dataldecile+0x30)
//顯示溫度的十分位Write_
Daita(0x00),/顯示攝氏度符號》
void
Sting,
MeruO
Set_
Position(0,0),
/設置
顯示地址write
StringHint1);
Set_
Position(1,0),
1設置顯示地址Write
String(Hint2).
Year
tmp-Year,Month
tmp-Month,Day_
tmp=-Day,Hour_
tmp-=HourMin
tmp=
Min,Sec
tmp=Sec;
A
Hour
tmp=A
Hour,A
Min
tmp=A
Min,
1/使用過渡數據
void
stting.
Displayunsigned
chre)
1間設定模式,
被選到的數據前出現右方向三角
if(c<8)
Set.
Position(0,0,
/指向ICD
第-
-行首地址Write_
String(Hn3);
1顯示提示語
"Alam
stting
,Set_
Positioc(,0),
/設置
顯示地址if(c-
-8)
Write_
Data(0x03>,
/顯示右三角符號if(c=
-9)
Wite_
Data(0x04);
1/顯示空格
Write_
Data(A
Houwr_
tmp/10+0x30).
/顯示鬧鐘時的十
位數Write_
Data(A
Hour.
tmp%610+0x30)顯示閑鐘時的個位數
if(B
Wite
DataC),
//顯示.:if(==9)
Write_
Data(Ox03),
1/顯示右三角符號
Write
DataCA
Min
tmp/10+0x30),顯示鬧鐘
分的十位數Wte
DataCA
Mn
tmp%10+0x30),顯示鬧鐘分的個位數Write_
StingHin4)/后面的位置顯示空格,避免使用清屏指令}
void
Key
Acton(unsigned
char
。/執行鍵盤輸入
ifkey-
=K3)
/如果按K3,
則被選中對象自加1,//保持數據變化范圍合乎實際
switch(c)
case2
Year
_tmp++
jif(Tear_
tmp>2100)Year
tmp=
2008,Setting
Display(K1_
cn);Delay1mS(200)break,
case3;
Month
tmp++
;fQMonth
tmp>12)Month
tmp-1,Setting.
Display(K1
cn)Delay1m(200>;break,case4:{Day
tmp++,
if(Day_
tmp>temp_
Day.
MaxQMonth
tm))Day_
tnp=1,
Setting
Display(K1
cn)Delay1m(200),breax,Hourtmp+,ifHourtmp>23)Hourtmp=0,SettingDisplay(K1_cnt),Delay1mS(200),break,case6:Mintmp++;ifQMintmp>59)Mintmp=0;Setting.DisplayK1cn)Delay1mS(200)break,case7:Sectmp+,;ifSectmp>59)Sectmp=0;SettingDisplay(K1cnt),DelayImS(200),break}case8:AHourtmp++;if(AHourtmp>23)AHourtmp=0;SettingDisplay(K1.cn)Delay1mS(200)break,}case9:AMintp++,if(AMin_tmp>59)A.Mintmp=0,SettingDisplayKIcn)Delay1mS(200);break,defaultbreak,fkey-K4)//如果按K4,則被選中對象自減1,1/保持數據變化范圍合乎實際switch(c)case2Yeartmp--i(Yeartmp--1900>Yeartmp-2008;Setting.Display(K1_cmD),Delay1mS(200);break,case3:Monthtnp-.fQM4onthtmp-=0)Morthtmp=12,SettingDisplay(K1cn)Delaym(200),brak,case
4:
{Day_
tmp-i.Da_
tmp-
0)
Day
tmp
temp,
Day,
Max(Month
tmp),Setting
DisplayCK1
cn),Delay1m(20)break,
case5:
Hour_
tmp++;if(Hour
tmp--
255)Hour.
tmp-23;Setting.
Display/K1_
cnt),Delay1mS(200)break;
case6:
Min
tmp++;jf0Mdin
tmp-
255)Min
tmp=59,Setting
DisplayCK1
cn),Delay1mS(200)break,
case
7:
Sec_
tm--,if(Sec.
tmp=
255)See
tmp=59,
Setting
DisplayCK1_
cnt);
Delay1mSC200),break
case8:
A
Hour,
t--.i_.
Hour
tmp-
255)A
Hou,
tmp=23,Setting
DisplayKI
cnt),Delay1mS(200),break
case9:
A
Min
tmp--if(.
Min
tmp-
255)
Min
tmp=23,Setting
Display(Ki
cn),Delay1m(200)breakx
default
beaik
ifakey-
KS&&K1_
cnt=-0)/
如果按下K5,則退出時間設定模式,設定生效
Year-Year
tmp,Month
Month
tmp,Day=-Day_
tmp,Hour-Hour
tmp,Min=Min
tmp,Sec=Sec
tmp,A
Hour=A
Hour
tmpA
Min=A
Min
tmp,KI_
_cnt=0;
else
ifkey-K6)
/如果按下
K6,則退出時間設定模式,設定無效K1_
cnt=0,unsignedcharbssteunsignedeintg)11判斷是否閏年unsignedcharFeb_day,ify%4-0&&y961001=0)Febday=29;elsef(6100-0&y94000)Feb_day-2%;eiseFeb_day=28,returnFeb_dey,unsignedchartemp.bstil(unsinedeimty)1判斷是否閏年unsignedcharFeb_day,ifyY%4=-0&xy%61001=0)Feb_day=29,eiseif96100-0&&x9%400-0)Feb_day=29,eiseFeb_day=28,retumFeb_day,}unsignedchartemp.Day,Max(unsignedcharm)1判斷當月天數unsignedchard,switch(m)case1:d=31;case2:d-temp_bsextile(Year),csse3:d=31;case4:d=30;caseS:d=31;case6.d=30;case7:d=31,case8.d=31,case9:
d=30;case10
d-31,case11:
d=30;case12.
d=31;default
break,}retum
d
unsigned
char
Day
Max(unsigned
char
m)
11判斷當月天數
unsigned
char
d,switch(m)
case1:d=31,
case
2.
d=issetile(Yer),case3;
d=31;case4:
d=30;case5
d=31;case6:
d=30,case7:d=31,case8.d=31,case9
d=30,case10:
d=31;case
11:d=30;
Icase
12:d=31;default
break,}rebum
d,}
/*計算星期幾用基姆拉爾森計算公式:
W=
(d+2*m+3*(m+
)/5+y+y/4-y/100+y400)67
在公式中d表示日期中的日數,m表示月份數,y表示年數。注意:在公式中有個與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例如果是2004-1-10則換算成2003-13-10來代入公式計算。*/
,
unsigned
char
Week
Calculate(unsigned
int
y,unsigmned
char
myunsigmed
char
d
unsigned
char
w,if(m-1lm=-2)>
y-m+=12,)
w=(d+2*m+3*(m+
1)y5+y+y/4
y/100+y/400)%7.return
w,
void
Alarm,
JudgeO
1判斷鬧鈴是否
應該響
1fAlam_F一1
&&
HourA_
Hour
&&
MinA
Min
&&
Sec<10>//用鐘響十秒鐘
Buzz=0,
Delay1mS(00,Buzz=1,
Delay1mS(100),Buzz=0;
ifMin-0
&&
Sec-0》
//整點發出提示音
Buz=0,
Delay1mS(100),Buzz=1;
DelayimS(00)5.2lcd12864模塊finclude<intrinsh>#defineLCD
DATA
POsbit
R8-P2r0,sbit
RW=P2^1;sbit
EN=P2^2,
bit
Check_
BusyO
//讀BF標志位,檢查LCD是否就緒
RS=0;RW=1;EN=1;_nop_O,
iLCD
DATA&0x80)retum
1;else
retum
0,
)
woid
WaitO
11等待LCD就緒
11
while(Check
BusyO-
-1)
1如果是實際器件則必須查詢忙狀態位BFDelay1mS(3);
//如果是protues仿真,因為無法查詢BF,所以用//
I延時代替查詢忙狀態
void
Wite_
Data(unsigned
char
dat)
5-一個字節數據
WaitO,RS-1;RW=0;EN=1,_nop_O,
LCD
DATA=dat,
EN=0,
1下降沿寫入_nop_O,)
woid
Write_
Command(unsigned
char
dat)
11寫
命令
WaitO,RS-0,
RW=0,
.
nop_0.EN=1,_nop_0,LCD_DATA=dat,EN-0,下降沿寫入_nop_O,)voidWiteString(unsignedchar*p)1/寫字符串charcnz=0;while(*(p+cnt)l-^0Write_Data(*(p+cnD)cntt,voidLCDInitO0/LCD1602初始化Write_Command(0x38),18位數據線,兩行顯示,5*7點陣Delay1mS(5),Write_Command(0x38),Delay1mS(5),Write_Command(0x38),/初始化3次Delay1mS(6),Wile_Command(0x01),/清屏Write_Command(0x06),/AC自增,畫面無平移Write_Command(Ox0c),/開顯示,無光標voidSetPositionunsignedcharx,unsignedchary)/設置顯示的位置if(x0)Write_Command(yf0x80),if(x==1)WrileCommadyOoxc0),voidUserDefined.CharO//自定義字符Write_Command(0x40),/設置自定義字符(攝氏度符號)的CGRAM地址,放在第0個位置Write_Data(0x10);/響CGRAM寫入自定義字符的第I行數據WriteData(0x06),/寫入第2行數據WriteData(0x09);/寫入第3行數據WriteData(Ox08),1/寫入第4行數據WriteData(0x08),/寫入第5行數據WriteData(0x09);1寫入第6行數據WriteData(0x06>,1寫入第7行數據Write_Data(0x00),/寫入第8行數據Write_Command(0x4>)/設置自定義字符(鬧鐘符號)的CGRAM地址,放在第1個位置Wite_Data(0x00);響CGRAM寫入自定義字符的第1行數據Write_Data(0x04),1/寫入第2行數據Write_Data(OxDe),1/寫入第3行數據Write_Data(Ox0e),寫入第4行數據Write_Data(0x0e),/1寫入第5行數據Write_Data(Ox10);/寫入第6行數據Write_Data(0x16),1/寫入第7行數據Write_Data(0x0O),/寫入第8行數據WriteCommand(0x50),/設置自定義字符(心形符號)的CGRAM地址,放在第2個位置Wite_Dat(ox00);/響CORAM寫入自定義字符的第1行數據Wite_Data(x0a),11寫入第2行數據WriteData(0x10,/寫入第3行數據WhiteData(0x16);/寫入第4行數據WriteData(Ox1t),寫入第5行數據Write_Data(0x0e),/寫入第6行數據Write_Data(0x04),/寫入第7行數據Write_Data(0x00),/寫入第8行數據Wite_Command0x58>,/設置自定義字符(向右的三角符號)的CORAM地址放在第3個位置Write_Data(0ox08);/響CGRAM寫入自定義字符的第1行數據WriteData(Ooxc),1寫入第2行數據Write_Data(0x0e),/寫人第3行數據Write_Data(0xOD,1寫入第4行數據Write_Data(0x0e),1寫入第5行數據Write_Data(0x0e),1寫入第6行數據Write_Data(0x08),/寫入第7行數據Write_Data(0x00),/寫入第8行數據WriteComand(0x60),/設置自定義字符(空白)的CGRAM地址,敢在第4個位置Wrile_Data(Ox0o)/響CGRAM寫入自定義字符的第1行數據Write_Data(0x00);1寫入第2行數據Write_Data(0x00),1寫入第3行數據WriteData(0x00),/寫入第4行數據WriteData(Ox00),1/寫入第5行數據WriteData(0x00),/寫入第6行數據5.3key模塊“KEY_SGAN.H”#defineKI0xfe1定義按鍵的鍵值#defineK20xfd#defineK30xfb#defineK40xf7#defineKS0xef#defimeK60xdf#defineNoKey0xfdefineKeyDATAP1unsignedcharKeyF=0;有按鍵按下狀態標志位unsignedcharKeytmp-0//鍵值暫存變量43/54umsignedcharKey,ScanOif(KeyDATAI=NOKey)Key_tmp-Key.DATA,ifKey.tmp-KIKey_tmp=-K2)/如果按下的是K1或者K2,則技鍵松開才生效whileCKey_DATA-Key_tmp);/等得按鍵松開returmKeytmp;else.//如果按下的是其他按鍵,只需更按鍵消抖Dely1msS(5),/延時5ms后再次判斷按健是否松開ifKey_DATA=-Key.tmp)returmKey.tmp,IelsereburnNoKey,elseretumNo_Key,5.4DS18B20模塊finclude
<intrins
h>sbitDQ-P2^4,bit
flag.
init=0;
unsigned
int
tensuitsdecile,tmp;float
tmprt,
void
DS18B20_
initOflag_int=1;1初始化成功杯志位,oカ成功DQ-l;/DQ夏位Delay_us(8》DQ=0,/拉低DQDelay_u8C0)/52》I挺吋484us(此信號要求480us~960us)DQ=1;釋放DQDelay_us(8);,1延吋6lus(在測到IO引腳上的_上升沿之后DS18B20等待l5us-6ous并且接著岌送存在脈沖160-240u的低鬼平信號〉flag_init-DQ,Delay_usC10125X誕吋241usDS18B20友送存在脈神的/低鬼平信號60-240us)unsignedcharReadonechao/洟一-↑字蘆unsignedchari=0;unsignedchardat=0,fori-8ji0ji-DQ-0;dab>=1;DQ=1;iDQdatl-0x80,Delay_usG5)砥肘6lus(所有獎肘伺片的最短持綾期限カ6us,各個遠肘恂片之向必須有最短カ1us的恢夏肘囘)retumdat;}voidWnteonecharlunsignedchardat〉/寫--個宇蘆{unsignedchari=0;fori-8jio0ji-DQ=0;DQ=dat&0x01;Dely_us65〉/1延吋61us(在IO銭由高鬼平交カ低鬼平之后DS1820在15us-6ous之囘対JO銭采祥》DQ=1;dat>>=1;DelayuB(5),)unsignedcharReademperatureOtens=0;units=0;decile=0,tmp=0,tnprt=0,DS18B20initO,Weteoncaroce)//跳過讀序列號的操作Wrteonechar(0x44)J1啟動溫度轉換Delay.uS(100),DS18B20_initO,weritenechac0xce://跳過讀序號列號的操作Witeonecharo0xbe)//讀取溫度寄存器Delay_uS(100),units=ReadonecharO,讀低八位tens=ReadonecharO,/讀高八位DS18B20initO,Weteoncharoxe)/跳過讀序號列號的操作Writeonecarx44)//讀取溫度寄存器tens<<=8,tensl-units;//高低位合并tmprtotens*0.0625,1/計算溫度值tmp=tmprt*10+0.5,1放大10倍輸出并四舍五入tens=tmp/10011+位unitstmp/10%610,1個位decile-tmp%610,小數位retumtmp,3.3.5液晶顯示子程序“LCD1602H"finclude<intrinsh>六、軟件調試與實驗分析軟件調試通常都是在仿真圖的上面來做的,因為在仿真圖上做要比別的便捷好多好多,這樣不僅僅能夠非常快的察覺到犯的錯誤,然后進行冷靜的析查這個錯誤,而且還可以直接方便快速的在源程序上面改就好了,之后就可以再一次仿真,如果還有錯誤,那就再改,一直該到完成正確了,再把我們需要的程序下載下來,下載到開發板上面,然后再去查詢這個程序是不是真的和我們的需要的是一樣的,因為有的時候他可能在仿真的時候查的是全部都對了,但是等我們下載下來的時候說不準了,或者也有可能是在仿真圖上面的端口和我們自己的開發板上面的端口是不一致的,這樣也會導致程序的錯誤,這個時候就需要我們來檢查這些端口有哪些不一樣,有可能是接口接錯了,也有可能是連線的時候連錯了,這些都用可能會導致編寫的程序不可以正確的使用,這些問題可能都是一些不足掛齒的問題,但是它也是會造成大問題的。所以不可以小看這些細節。需要我們很認真,用很端正的態度來對待它們,不可粗心,還要有耐心,慢慢來,一點點嘗試,總是會找到我們所需要的答案的。不過這次的設計在剛剛進入調試階段的時候,我們就發現這些結果在液晶顯示器上面展現的地址不正確,還有一些壓根就沒有展示出來,然后在我們一點點的努力下,慢慢的找到了根源所在,原理是因為從DS1302上面讀出的字符在液晶顯示器上的對應位置寫錯了,造成不能正常顯示,相應的改過之后就可以了;有時顯示正確了,但按鍵的加減沒作用,不能進行正常的加或減,這時又得修改程序中相關的部分有時是因為C語言掌握得不牢固,造成寫程序的語法錯誤,這種錯誤很難找,邏輯上看似很簡單的幾句程序也要反復的找很久。軟件調試一般是在仿真圖上進行,這樣比較方便,可以及時發現錯誤,分析錯誤,以便快捷的在程序上進行修改,再進行仿真,直到結果正確了,才把程序下到開發板上去看是否符合我們的要求,有時雖然仿真完全正確了,但到開發板上就不一定了,有時是因為仿真圖和開發板的端口不對,所以需要檢查后修改端口,有時是因為開發板上需要連線的端口連錯了,也造成不能正確顯示,這些雖然看似小問題,但檢錯起來一點都不容易,需要反復的分析,不斷的試驗。就這樣不斷的試驗,再修改,在試驗,直到程序完全正確,可以顯示出我們想要的答案為止我們需要對每一個模塊進行調試,在這里包括:顯示年、月、日,時、分、秒,星期,溫度和鬧鐘的模塊。先分別調試,直到所有分模塊都調試出來了,再進行統調,這樣更容易檢錯,可以及時查找出錯誤,減小調試的難度在本次設計中,我們最終完成本次智能化電子系統設計系的基本要求及功能,并在此基礎了對系統功能作了擴展,增加了鬧鐘設置以及溫度報警部分。在設計開始前我們對各個模塊進行了詳細的分析和設計準備工作,設計過程中,并且在老師的指導下,在實驗室幾位同學耐心的幫助下,我們組的成員相互協調,積極參與完成各個技術實現的難點,更進一步地熟悉了芯片的結構及掌握了各芯片的工作原理和具體的使用方法。通過本次設計,我們對單片機有了更深刻的認識,也從實踐的例子中去感受到了單片機設
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025直播流量獲客:策略與實操指南
- 漏電測試試題題目及答案
- 有趣的冷知識試題及答案
- 廣告設計案例分析試題及答案
- 全國甲卷試題及答案英語
- 無線網組建試題及答案
- 2024年紡織品開發流程試題及答案
- 廣告設計中的創作靈感來源考察試題及答案
- mri檢查技術期末試題及答案
- 2024年廣告設計師考試輔導書試題及答案
- 2025年江西金融租賃股份有限公司招聘筆試參考題庫含答案解析
- 臺達DELTA變頻器VFD-EL系列使用說明書和手冊(完整中文版)VFD007EL23A
- 湖南省長沙市2024-2025學年高三上學期新高考適應性考試數學試題 含答案
- 課題申報書:“四新”建設背景下教育創新與課程數字化實踐研究
- 年加工2萬噸再生鋁項目可行性研究報告建議書
- 2025年公司各部門管理規章制度(4篇)
- 2025年應急管理部信息研究院招聘高頻重點提升(共500題)附帶答案詳解
- 2025版《VOCs廢氣處理設施安全檢查表》(全)
- 普通話水平測試朗讀50篇
- 【MOOC】外國教育史-河南大學 中國大學慕課MOOC答案
- 電氣工程中的電力系統設計
評論
0/150
提交評論