多功能數(shù)字電子表 總結(jié)報(bào)告_第1頁
多功能數(shù)字電子表 總結(jié)報(bào)告_第2頁
多功能數(shù)字電子表 總結(jié)報(bào)告_第3頁
多功能數(shù)字電子表 總結(jié)報(bào)告_第4頁
多功能數(shù)字電子表 總結(jié)報(bào)告_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

./電子技術(shù)綜合設(shè)計(jì)總結(jié)報(bào)告:王功臣、聰學(xué)號(hào):04101686、04101680專業(yè)與班級(jí):電氣工程與自動(dòng)化10-7班設(shè)計(jì)題目:多功能數(shù)字電子表時(shí)間:2011~2012學(xué)年第〔1學(xué)期指導(dǎo)教師:成績(jī):日期:緒論:隨著計(jì)算機(jī)在社會(huì)各領(lǐng)域的滲透和大規(guī)模集成電路的發(fā)展,單片機(jī)的應(yīng)用正不斷的走向深入。單片機(jī)是一種集成在電路里的芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)時(shí)器等功能集成到一塊硅片上構(gòu)成的一個(gè)小而完善的計(jì)算機(jī)系統(tǒng)。隨著單片機(jī)的不斷發(fā)展,現(xiàn)已應(yīng)用領(lǐng)域十分廣泛。。本文介紹的多功能數(shù)字電子鐘的控制核心是單片機(jī)〔STC89C52,以單片機(jī)部定時(shí)計(jì)數(shù)器在計(jì)數(shù)滿1s時(shí)產(chǎn)生一次中斷,從而計(jì)數(shù)變量增加1,采用蜂鳴器、數(shù)碼管顯示器、語音報(bào)時(shí)電路以及其他電路構(gòu)成。實(shí)現(xiàn)了時(shí)間顯示、電子日歷、時(shí)間預(yù)置、秒表、倒計(jì)時(shí)、鬧鈴、語音報(bào)時(shí)和復(fù)位等功能;通過對(duì)多功能時(shí)鐘的設(shè)計(jì),加深對(duì)單片機(jī)的理解,熟悉了單片機(jī)的部硬件資源,掌握單片機(jī)的編程方法,學(xué)會(huì)對(duì)單片機(jī)各部分硬件資源的控制方法。此外,還要學(xué)會(huì)怎么利用所學(xué)單片機(jī)知識(shí)獨(dú)立設(shè)計(jì)系統(tǒng)的能力,達(dá)到學(xué)于致用的目的,要學(xué)會(huì)發(fā)創(chuàng)設(shè)計(jì)編程思想,要學(xué)會(huì)開發(fā)系統(tǒng)的一般過程,并不斷創(chuàng)新.一課題任務(wù)名稱:多功能數(shù)字電子表基本要求:計(jì)時(shí)功能:顯示時(shí)、分、秒,定鬧功能,秒表功能,倒計(jì)時(shí)功能。提高要求:增加"語音報(bào)時(shí)"功能,增加"電子日歷"功能。二方案比較與選擇方案一:采用中規(guī)模集成電路,由電容、電阻、CMOS非門、晶體組成震蕩電路提供一個(gè)頻率穩(wěn)定的方波信號(hào),分頻器電路將高頻方波信號(hào)經(jīng)若干次分頻后得到1Hz的方波信號(hào)供秒計(jì)數(shù)器進(jìn)行計(jì)數(shù),秒位、分位、時(shí)位計(jì)數(shù)器分別為60、60、24進(jìn)制計(jì)數(shù)器,譯碼驅(qū)動(dòng)電路將計(jì)數(shù)器輸出的8421BCD碼轉(zhuǎn)換為數(shù)碼管需要的邏輯狀態(tài),并且為保證數(shù)碼管正常工作提供足夠的工作電流。整點(diǎn)報(bào)時(shí)、校時(shí)等功能也可以通過與非門組成的邏輯電路來實(shí)現(xiàn)。方案二:采用單片機(jī)部定時(shí)計(jì)數(shù)器中斷,控制計(jì)數(shù)變量,將計(jì)數(shù)變量通過單片機(jī)引腳送至總線驅(qū)動(dòng),為數(shù)碼管提供足夠的電流,通過程序控制每位數(shù)碼管,實(shí)現(xiàn)動(dòng)態(tài)顯示。通過7個(gè)按鍵來實(shí)現(xiàn)時(shí)間預(yù)置、秒表、倒計(jì)時(shí)、鬧鐘設(shè)置、復(fù)位的功能。在沒有中斷,沒有按鍵按下的時(shí)候,單片機(jī)循環(huán)執(zhí)行顯示程序,當(dāng)中斷發(fā)生時(shí)、有按鍵按下時(shí),單片機(jī)進(jìn)入相應(yīng)的子程序執(zhí)行。語音報(bào)時(shí)電路采用isd1420語音芯片,用麥克風(fēng)錄下人聲,單片機(jī)控制語音芯片在適當(dāng)?shù)臅r(shí)候通過喇叭播放事先錄好的聲音。附加功能都可以通過單片機(jī)程序來實(shí)現(xiàn)。方案比較:方案一重要用邏輯電路來實(shí)現(xiàn),需要的芯片較多,集成化低,功能越多,硬件電路越復(fù)雜,需要的芯片比較多,成本也較高,故障率高,而且技術(shù)相對(duì)落后。方案二采用單片機(jī)控制,可以方便地控制外圍的器件,所有的功能都可以通過編程來實(shí)現(xiàn),實(shí)現(xiàn)的功能也更加豐富,需要的芯片數(shù)少,電路相對(duì)簡(jiǎn)單。綜合比較兩種方案,本設(shè)計(jì)決定采用方案二。三電路設(shè)計(jì)3.1系統(tǒng)總體框圖3.2各部分電路設(shè)計(jì)3.2.1復(fù)位電路在RST復(fù)位引腳接一個(gè)電容到VCC,接一個(gè)電阻到地就可以了。在給系統(tǒng)上電時(shí),復(fù)位電路通過電容加到RST復(fù)位引腳一個(gè)短暫的高電平信號(hào),這個(gè)復(fù)位信號(hào)隨著VCC對(duì)電容的充電過程而回落,所以RST引腳復(fù)位的高電平維持時(shí)間取決于電容的充電時(shí)間。為了保證系統(tǒng)安全可靠的復(fù)位,RST引腳的高電平信號(hào)必須維持足夠長(zhǎng)的時(shí)間。電路圖如圖。3.2.2時(shí)鐘電路時(shí)鐘是單片機(jī)的心臟,單片機(jī)各功能部件的運(yùn)行都是以時(shí)鐘頻率為基準(zhǔn),MCS-51單片機(jī)部有一個(gè)用于構(gòu)成振蕩器的高增益反相放大器,該高增益反向放大器的輸入端為芯片引腳XTAL1,輸出端為引腳XTAL2。這兩個(gè)引腳跨接石英晶體振蕩器和微調(diào)電容,就構(gòu)成一個(gè)穩(wěn)定的自激振蕩器。電路中的C1、C2的選擇在30PF左右,但電容太小會(huì)影響振蕩的頻率、穩(wěn)定性和快速性。晶振頻率為在1.2MHZ~12MHZ之間,頻率越高單片機(jī)的速度就越快,但對(duì)存儲(chǔ)器速度要求就高。為了提高穩(wěn)定性我們采用溫度穩(wěn)定性好的NPO電容,采用的晶振頻率為12MHZ。本次系統(tǒng)的時(shí)鐘電路設(shè)計(jì)如圖。3.2.3數(shù)碼管顯示電路用六個(gè)共陽極7段數(shù)碼管動(dòng)態(tài)掃描顯示時(shí)間變量,單片機(jī)P3口和P0口分別給數(shù)碼管送位碼和字型碼,由于P0口沒有置上拉電阻,它輸出不了高電平,所以要先給P0口加上上拉電阻。由于數(shù)碼管輸出電流比較小,由P3經(jīng)過總線驅(qū)動(dòng)器74ls573<或245>給需要顯示的數(shù)碼管的陽極高電平,為數(shù)碼管提供足夠的電流,這樣相應(yīng)的數(shù)碼管就會(huì)點(diǎn)亮,延時(shí)一段時(shí)間接著顯示下一位,循環(huán)顯示。數(shù)碼管管壓降3.5v左右靜態(tài)顯示時(shí)工作電流大約5mA,動(dòng)態(tài)顯示時(shí)工作電流大約20mA,這里動(dòng)態(tài)顯示六個(gè)數(shù)碼管,電流取30mA,所以,流過數(shù)碼管的的限流電阻計(jì)算為:R=〔5v-3.5v/0.03A=50歐姆。3.2.4語音芯片電路采用ISD1420語音芯片,它是美國ISD公司出品的優(yōu)質(zhì)單片語音錄放電路,由振蕩器、語音存儲(chǔ)單元、前置放大器、自動(dòng)增益控制電路、抗干擾濾波器、輸出放大器組成。一個(gè)最小的錄放系統(tǒng)僅由一個(gè)麥克風(fēng)、一個(gè)喇叭、兩個(gè)按鈕、一個(gè)電源、少數(shù)電阻電容組成。使用方便的單片錄放系統(tǒng),外部元件少,信息可保存100年,可反復(fù)錄放10萬次。錄音端/REC和下降沿觸發(fā)放音端/PLAYE分別接開關(guān),用于手動(dòng)錄放音測(cè)試。按下開關(guān),此端為低電平,開始錄音或放音。此外,錄音端口/REC還接到了三極管的集電極,三極管的基極由單片機(jī)的P1.0口控制,用于軟件控制錄音,每當(dāng)P1.0為高電平時(shí),按照事先設(shè)定好的錄音時(shí)間和存放地址開始錄音。三極管的發(fā)射極接了一個(gè)led,用于提示錄音〔錄音期間led亮,錄音結(jié)束led滅,集電極接了開關(guān),不錄音時(shí)關(guān)斷開關(guān),防止單片機(jī)影響引起誤錄音。3.2.5按鍵電路P1口通過10K的電阻接+5v電源,同時(shí)通過開關(guān)接地,開關(guān)沒按下時(shí)P1口為高電平,當(dāng)按鍵按下時(shí)P1口為低電平。3.2.6蜂鳴器驅(qū)動(dòng)電路由于蜂鳴器額定電流較大,所以單片機(jī)無法直接驅(qū)動(dòng),這里用npn三極管驅(qū)動(dòng),電路圖如圖,由單片機(jī)控三極管基極來控制三極管的導(dǎo)通與關(guān)斷。蜂鳴器兩端電壓按照1.5v計(jì)算,三極管集電極限流電阻計(jì)算公式為R=〔5v-0.3v-1.5v/50mA=64歐姆。四程序設(shè)計(jì)4.1總體思路采用定時(shí)計(jì)數(shù)器中斷T0,10ms中斷一次,秒表計(jì)時(shí)變量m[0]加1,依次往下進(jìn)位。m[0]滿100,計(jì)時(shí)變量a[7]的秒變量a[0]加1,依次向下進(jìn)位。延時(shí)函數(shù)主函數(shù)為一個(gè)大的while<1>循環(huán),在這個(gè)循環(huán)里先進(jìn)行初始化,然后進(jìn)入第二個(gè)while〔1循環(huán),在沒有按鍵按下時(shí)一直顯示當(dāng)前時(shí)間變量,當(dāng)有按鍵按下時(shí),進(jìn)入按鍵函數(shù),再次返回后判斷復(fù)位變量restar是否為1,為1則跳出小的while〔1循環(huán),在大循環(huán)中進(jìn)行初始化然后再進(jìn)入小的while〔1循環(huán)中。顯示函數(shù)分為普通顯示函數(shù)和時(shí)間預(yù)置狀態(tài)下的顯示函數(shù)。時(shí)間預(yù)置狀態(tài)下的顯示函數(shù)通過兩個(gè)形參來確定要顯示的變量以及要顯示小數(shù)點(diǎn)的位〔用于標(biāo)示可調(diào)位。按鍵函數(shù)keyscan〔分為7個(gè)子功能函數(shù),通過判斷分別進(jìn)入不同的功能函數(shù)執(zhí)行。4.2程序框圖〔總體五測(cè)試方案5.1仿真測(cè)試各個(gè)按鍵功能的程序分別編寫,一個(gè)功能的程序編好后,在protues里仿真,出現(xiàn)問題回去分析修改程序直到仿真成功。然后開始接著寫下一個(gè)功能程序,按照同樣的方法測(cè)試仿真各個(gè)功能程序。5.2語音電路部分測(cè)試a不用單片機(jī)控制,給語音芯片的地址端接低電平,從0x00開始錄音,上電,按下錄音按鍵,說一段語音,松開錄音鍵,按下播放按鍵,看喇叭是否正常播放剛才錄下的語音。b通過錄音程序,由單片機(jī)控制,上電,錄音指示燈開始亮滅閃爍,指示燈亮?xí)r開始錄入"1"、"2"、"3"、"4"、"5"·····的語音。然后通過放音按鍵看播放是否正確。5.3數(shù)字鐘部分測(cè)試a將程序燒進(jìn)單片機(jī),上電運(yùn)行,觀察數(shù)碼管是否從00.00.00開始計(jì)時(shí)。b按下按鍵3,看數(shù)碼管顯示是否進(jìn)入時(shí)間預(yù)置狀態(tài)。各個(gè)可調(diào)位的移動(dòng)是否正確,各個(gè)位的增減是否可以,進(jìn)率是否正確。設(shè)置好時(shí)間,再次進(jìn)入時(shí)間預(yù)置狀態(tài),看年月日十分秒星期是否正確,退出狀態(tài)是否順利。c按下按鍵4,看數(shù)碼管顯示是否進(jìn)入秒表狀態(tài),通過按鍵1〔開始暫停鍵和按鍵2〔清零鍵觀察秒表是否正確,退出狀態(tài)是否順利。d按下按鍵5,應(yīng)該進(jìn)入倒計(jì)時(shí)狀態(tài),按照"b"的方法進(jìn)行倒計(jì)時(shí)初始時(shí)間設(shè)置的測(cè)試。然后再按下按鍵5,觀察倒計(jì)時(shí)狀態(tài),觀察計(jì)到零時(shí)是否停止在00.00.00,退出狀態(tài)是否順利。e按下按鍵6,看是否進(jìn)入鬧鐘時(shí)間設(shè)置狀態(tài),按照"b"的方法進(jìn)行鬧鐘時(shí)間預(yù)置測(cè)試。退出此狀態(tài),等待時(shí)間到達(dá)鬧鐘時(shí)間觀察語音芯片是否報(bào)時(shí)。f在任意狀態(tài)下按下按鍵7觀察數(shù)碼管是否復(fù)位清零從00.00.00開始顯示。g測(cè)試整點(diǎn)報(bào)時(shí)??梢韵葘r(shí)間設(shè)置在靠近整點(diǎn)前,然后觀察到整點(diǎn)時(shí)蜂鳴器、語音芯片是否都能正常報(bào)時(shí)。六測(cè)試結(jié)果與系統(tǒng)調(diào)試a在各個(gè)按鍵功能的仿真測(cè)試上,每個(gè)功能按鍵的程序上都浪費(fèi)了很長(zhǎng)時(shí)間,出現(xiàn)了很多問題比如:進(jìn)率錯(cuò)誤、復(fù)位按鍵不靈、顯示不穩(wěn)定、顯示亂碼、狀態(tài)跳不出來等等。最終,數(shù)字鐘顯示功能包括時(shí)間顯示〔包括年月日星期、時(shí)間預(yù)置、秒表、倒計(jì)時(shí)、鬧鐘、蜂鳴器整點(diǎn)報(bào)時(shí)、復(fù)位都能較好地實(shí)現(xiàn)。b一開始,功能正確,但數(shù)碼管顯示非常暗,幾乎看不清,一位是限流電阻太大了,改成小的還是不行,有把限流電阻短路掉,數(shù)碼管顯示仍然很暗,最后反復(fù)檢查電路后發(fā)現(xiàn)我們使用的是共陽極數(shù)碼管,而電路中總線驅(qū)動(dòng)器74ls573接在了字型碼信號(hào)輸出端,將573改接到位選信號(hào)線上數(shù)碼管顯示就正常了。c>語音電路一直沒有反應(yīng),錄音之后放不出音,后來發(fā)現(xiàn)ISD1420芯片根本買有焊到電路里去,由于芯片沒有封裝,所以沒有引腳,只有28個(gè)焊點(diǎn),要認(rèn)為地用插針將它固定在電路板上,然后插針的兩端分別和電路板和芯片焊在一起。這個(gè)問題解決之后電路也檢查了幾遍語音功能還是沒有成功。我覺得是不是有原件壞了。八總結(jié)通過實(shí)踐,基本完成了多功能數(shù)字鐘的設(shè)計(jì)制作,它可以實(shí)現(xiàn)時(shí)間顯示〔包括年月日星期、時(shí)間預(yù)置、秒表、倒計(jì)時(shí)、鬧鐘、蜂鳴器整點(diǎn)報(bào)時(shí)、復(fù)位的功能,基本功能實(shí)現(xiàn)得比較充分、豐富。從最初的選題、方案選擇、查資料、電路設(shè)計(jì)、程序設(shè)計(jì)、原件參數(shù)的計(jì)算、焊接,整個(gè)過程下來,自己的基本的能力有了很大的提高。數(shù)字鐘這個(gè)選題,電路不是很復(fù)雜,主要是編程麻煩點(diǎn),很多功能的實(shí)現(xiàn)都需要比較復(fù)雜的程序來實(shí)現(xiàn),程序的邏輯性比較強(qiáng),所以,感覺最有收獲的應(yīng)該是C語言編程得到了很好的鍛煉。為了美觀同時(shí)也鍛煉焊接技術(shù),我們?cè)诤附訒r(shí)盡量少用排線多用焊錫。另外,通過一起努力,也鍛煉了我們的團(tuán)隊(duì)合作能力。我們的設(shè)計(jì)也存在著一些不足:<1>語音電路沒有實(shí)現(xiàn),時(shí)間有限,檢測(cè)調(diào)試也沒有出結(jié)果。<2>焊錫的走線存在浪費(fèi)的現(xiàn)象,可能原件布局不是很合理。另外,有的原件焊錯(cuò)了之后有的線就成了"廢線"。<3>程序太長(zhǎng),一些功能應(yīng)該還有更好更簡(jiǎn)潔的算法來實(shí)現(xiàn)。這些不足也是以后應(yīng)該努力的地方。九參考文獻(xiàn)[1].夏蘭,等.語音芯片ISD1420在軸位移監(jiān)控表中的應(yīng)用[J].自動(dòng)化技術(shù)與應(yīng)用.2004,23〔11[2].周潤(rùn)景,等.單片機(jī)電路設(shè)計(jì)分析與制作[M].:機(jī)械工業(yè),2010.5[3].胡漢才,單片機(jī)原理及接口技術(shù),清華大學(xué),1996十附錄A電路設(shè)計(jì)圖a原理圖bPCB圖B程序主程序:.#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharvoidplaysound<uchara[7]>;sbitkey1=P1^0; //key1~key7為數(shù)字鐘功能按鍵sbitkey2=P1^1;sbitkey3=P1^2;sbitkey4=P1^3;sbitkey5=P1^4;sbitkey6=P1^5;sbitkey7=P1^6;sbitPLAYLE=P2^7;//語音芯片放音控制位sbitbaoshi=P1^7; //整點(diǎn)報(bào)時(shí)控制位ucharrestar=0,count=0;//restar:復(fù)位標(biāo)志位count:中斷次數(shù)記錄變量uchara[7]={0}; //存放計(jì)時(shí)變量星期、年、月、日、時(shí)、分、秒ucharm[3]={0}; //存放秒表計(jì)時(shí)變量分鐘、秒、毫秒ucharg[3]={0};//存放鬧鐘時(shí)間變量存放時(shí)、分鐘、秒ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽數(shù)碼管段碼ucharcodetable1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //帶小數(shù)點(diǎn)的段碼//*********************************************延時(shí)函數(shù)******************************************************//voiddelay<uintms>//延時(shí)函數(shù){uchari;while<ms-->for<i=0;i<110;i++>;}//*********************************************中斷函數(shù)*****************************************************//voidTimer0<void>interrupt1{TH0=<65535-10000>/256;TL0=<65535-10000>%256;m[0]++; //每10ms中斷一次,秒表計(jì)數(shù)變量的毫秒位加1if<m[0]==100> {m[0]=0; //毫秒位滿100置0,秒位加1m[1]++; a[0]++; //計(jì)時(shí)變量秒位加1baoshi=0; //整點(diǎn)報(bào)時(shí)蜂鳴器響1s結(jié)束PLAYLE=1; //語音控制端置高,為下一次下降沿觸發(fā)放音做準(zhǔn)備if<<a[0]==g[0]&&a[1]==g[1]&&a[2]==g[2]>||<a[2]==g[2]&&g[1]==1&&g[0]==0&&a[1]==0&&a[0]==60>>//若當(dāng)前時(shí)間和鬧鐘預(yù)置時(shí)間相等,則://若鬧鐘預(yù)置時(shí)間為01:01:00或00:01:00,則判斷a[0]是否為60P2=0x4b; //給送語音芯片送播放地址PLAYLE=0; // 開始播放"起床起床起床起床"的聲響if<m[1]==100> //秒位滿100置0,更高位加1{m[1]=0;m[2]++;if<m[2]==100>m[2]=0;}if<a[0]==60> //秒變量滿{a[0]=0;a[1]++;if<!<g[1]==1&&g[0]==0>> //如果特殊情況〔鬧鐘預(yù)置時(shí)間為01:01:00或00:01:00不滿足,if<a[1]==60> //分鐘變量滿{a[1]=0; a[2]++;baoshi=1;//若分鐘變量滿則蜂鳴器整點(diǎn)報(bào)時(shí)<P1.7輸出高電平>,維持1秒 playsound<a>;//調(diào)用放音函數(shù)進(jìn)行語音整點(diǎn)報(bào)時(shí)if<a[2]==24>{a[2]=0; a[3]++; if<a[3]==31&&<a[4]==4||a[4]==6||a[4]==9||a[4]==11>> //日變量加到31溢出〔4、6、9、11月 {a[3]=0; a[4]++; } elseif<a[3]==32&&<a[4]==1||a[4]==3||a[4]==5||a[4]==7||a[4]==8||a[4]==10||a[4]==12>> //日變量加到32溢出〔1、3、5、7、8、10、12月 {a[3]=0; a[4]++; } elseif<a[3]==29&&a[4]==2&&a[5]%4!=0> //日變量加到29溢出〔平年的2月 {a[3]=0; a[4]++; } elseif<a[3]==30&&a[4]==2&&a[5]%4==0> //日變量加到30溢出〔潤(rùn)年的2月 {a[3]=0; a[4]++; } else;}}}}}//************************************顯示函數(shù)********************************************************************//voiddisp<uchara[7]>{P3=0x20;P0=table[a[0]%10];delay<2>;P3=0x10;P0=table[a[0]/10];delay<2>;P3=0x08;P0=table1[a[1]%10];delay<2>;P3=0x04;P0=table[a[1]/10];delay<2>;P3=0x02;P0=table1[a[2]%10];delay<2>;P3=0x01;P0=table[a[2]/10];delay<2>;}//*************************************語音整點(diǎn)報(bào)時(shí)函數(shù)*********************************************************************//voidplaysound<uchara[7]>{uchari; ucharad; if<a[2]<=10> { P2=0x41; //語音"現(xiàn)在時(shí)間"的地址, PLAYLE=0; for<i=0;i<10;i++>disp<a>;//放音期間顯示時(shí)間 PLAYLE=1; ad=a[2]*5; //語音"*"的地址 P2=ad; PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; P2=0x55; //語音"點(diǎn)整"的地址 PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; } if<a[2]>10&&a[2]<=19> { P2=0x41; //語音"現(xiàn)在時(shí)間"的地址 PLAYLE=0; for<i=0;i<10;i++>disp<a>; PLAYLE=1; P2=0x32; //語音"十"的地址 PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; ad=a[2]*5%10; //語音"*"的地址 P2=ad; PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; P2=0x55; //語音"點(diǎn)整"的地址 PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; } if<a[2]==20> { P2=0x41; //語音"現(xiàn)在時(shí)間"的地址 PLAYLE=0; for<i=0;i<10;i++>disp<a>; PLAYLE=1; P2=0x0a; //語音"二"的地址 PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; P2=0x32; //語音"十"的地址 PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; P2=0x55; //語音"點(diǎn)整"的地址 PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; } if<a[2]>20&&a[2]<24> { P2=0x41; //語音"現(xiàn)在時(shí)間"的地址 PLAYLE=0; for<i=0;i<10;i++>disp<a>; PLAYLE=1; P2=0x0a; //語音"二"的地址 PLAYLE=0; for<i=0;i<5;i++>disp<a>; P2=0x32; //語音"十"的地址 PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; ad=a[2]*5%10; //語音"*"的地址 P2=ad; PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; P2=0x55; //語音"點(diǎn)整"的地址 PLAYLE=0; for<i=0;i<5;i++>disp<a>; PLAYLE=1; }}//*****************************時(shí)間預(yù)置顯示函數(shù)〔使用小數(shù)點(diǎn)區(qū)別預(yù)置位和其他位*******************************************//voiddisp1<ucharf[7],ucharn> {if<n<4> //n小于4表示,key3按下的次數(shù)小于4,數(shù)碼管顯示時(shí)分秒,預(yù)置位為時(shí)、分或秒位 { P3=0x20;//顯示秒 if<n==1> //若n等于1,表示key3只按一次,預(yù)置位為秒位 P0=table1[f[0]%10]; else P0=table[f[0]%10]; delay<2>;P3=0x10; //顯示秒 if<n==1> P0=table1[f[0]/10]; else P0=table[f[0]/10]; delay<2>; P3=0x08; //顯示分 if<n==2> P0=table1[f[1]%10]; else P0=table[f[1]%10]; delay<2>; P3=0x04; //顯示分 if<n==2> P0=table1[f[1]/10]; else P0=table[f[1]/10]; delay<2>; P3=0x02; //顯示時(shí) if<n==3> P0=table1[f[2]%10]; else P0=table[f[2]%10]; delay<2>; P3=0x01; //顯示時(shí) if<n==3> P0=table1[f[2]/10]; else P0=table[f[2]/10]; delay<2>; } if<n>3&&n<7> //表示key3按下的次數(shù)為4、5或6,數(shù)碼管顯示年月日,預(yù)置位為年、月或日位 { P3=0x20;if<n==4> P0=table1[f[3]%10]; else P0=table[f[3]%10]; delay<2>; P3=0x10; if<n==4> P0=table1[f[3]/10]; else P0=table[f[3]/10]; delay<2>; P3=0x08; if<n==5> P0=table1[f[4]%10]; else P0=table[f[4]%10]; delay<2>; P3=0x04; if<n==5> P0=table1[f[4]/10]; else P0=table[f[4]/10]; delay<4>; P3=0x02; if<n==6> P0=table1[f[5]%10]; else P0=table[f[5]%10]; delay<2>; P3=0x01; if<n==6> P0=table1[f[5]/10]; else P0=table[f[5]/10]; delay<2>; } if<n>6> //顯示星期,預(yù)置位為星期位 { P3=0x20; P0=table1[f[6]%10]; delay<2>; }}//*****************************************按鍵函數(shù)*************************************************************************// voidkeyscan<> { ucharnum=1; //num表示要預(yù)置的計(jì)時(shí)變量的序號(hào),按一下,預(yù)置位移動(dòng)一位 uchart=1; //t用在倒計(jì)時(shí)設(shè)置初始時(shí)間中,功能類似num ucharb[3]={0} ;//用于存放秒表正在運(yùn)行時(shí)的時(shí)間變量〔調(diào)用秒表顯示函數(shù)的實(shí)參 ucharc[3]={0}; //用于存放秒表開始時(shí)刻的m[]值 uchard[3]={0}; //用于存放上一次暫停時(shí)的b[]值 uchare[3]={0}; uchari=0,j=0; //*******************時(shí)間預(yù)置程序********************//if<key3==0> //key3:進(jìn)入時(shí)間預(yù)置狀態(tài) {delay<10>; if<key3==0> {EA=0; while<!key3>disp1<a,num>; while<num<8> { while<key1&&key2&&key3&&key7> disp1<a,num>; if<key3==0> //調(diào)整預(yù)置變量序號(hào) { delay<10>; if<key3==0> num++; } while<!key3>disp1<a,num>; if<key2==0> { delay<10>; if<key2==0> if<a[num-1]==0> switch<num> { case1:a[num-1]=60;break; //若秒變量減到零,則置60 case2:a[num-1]=60;break; //若秒變量減到零,則置60 case3:a[num-1]=24;break; //若小時(shí)變量減到零,則置24 case4:a[num-1]=31;break; //若日變量減到零,則置31 case5:a[num-1]=13;break; //若月變量減到零,則置13 case6:a[num-1]=100;break; //若年變量減到零,則置100〔只顯示年份的后兩個(gè)數(shù)字 case7:a[num-1]=8;break; //若星期變量減去到零,則置7 } a[num-1]--; //放在后面,防止計(jì)時(shí)變量一開始就0溢出 } while<!key2>disp1<a,num>; if<key1==0> { delay<10>; if<key1==0> a[num-1]++; switch<a[num-1]> //判斷計(jì)時(shí)變量有沒有達(dá)到溢出值 { case13:if<num==5>a[num-1]=1;break; case24:if<num==3>a[num-1]=0;break; case31:if<num==4>a[num-1]=1;break; case60:if<num==1||num==2>a[num-1]=0;break; case100:if<num==6>a[num-1]=0;break; case8:if<num==7>a[num-1]=1;break; } } while<!key1>disp1<a,num>; if<key7==0> //整機(jī)復(fù)位檢測(cè) {delay<5>; if<key7==0> {restar=1;break;} } } } EA=1; while<!key7>disp<a>;//復(fù)位鍵松手檢測(cè) } //******************秒表程序******************//if<key4==0> //進(jìn)入秒表狀態(tài){delay<5>; if<key4==0> {while<!key4>disp<b>;while<1> {if<key4==0> //若key4按下,退出抄表狀態(tài) {delay<5>; if<key4==0> while<!key4>disp<b>;break; } if<key2==0> //若key2復(fù)位鍵按下,顯示000000 {delay<5>; if<key2==0> {for<j=0;j<3;j++> {b[j]=0; d[j]=0; } while<!key2>disp<b>; while<key1&&key4&&key7>disp<b>; } } while<key2&&key4&&key7>//若key2、key4、key7鍵沒按下,則執(zhí)行下面程序 { if<key1==0> //若秒表啟停位key1按下 { delay<5>; if<key1==0> { //狀態(tài)變量i加1 i++; if<i%2==1> //若i為奇,啟動(dòng)秒表 { for<j=0;j<3;j++> c[j]=m[j]; while<!key1> { for<j=0;j<3;j++> b[j]=m[j]-c[j]+d[j];disp<b>; } while<key2&&key4&&key1> //若無按鍵按下,顯示 { for<j=0;j<3;j++> b[j]=m[j]-c[j]+d[j]; disp<b>; } } else //否則,暫停秒表 { while<!key1>disp<b>; while<key2&&key4&&key1&&key7>disp<b>; for<j=0;j<3;j++> d[j]=b[j]; //記錄暫停時(shí)b[]的值 } } } disp<b>; } if<key7==0> //整機(jī)復(fù)位檢測(cè) {delay<5>; if<key7==0> break; }disp<b>; } } } //***************倒計(jì)時(shí)程序******************// if<key5==0> //進(jìn)入倒計(jì)時(shí)狀態(tài) {delay<5>; if<key5==0> { while<!key5>disp1<e,t>; while<t<5> //若按滿5次退出秒表 { while<key1&&key2&&key5&&key7> disp1<e,t>; if<key1==0> //如果key1按下,初始值加1 {delay<5>; if<key1==0> { e[t-1]++; //相應(yīng)的倒計(jì)初始值變量加1 if<e[t-1]==60&&<t==1||t==2>> //加到60,置0,進(jìn)1 e[t-1]=0; if<e[t-1]==24&&t==3> //加到24,置0,進(jìn)1 e[t-1]=0; while<!key1>disp1<e,t>; while<key1&&key2&&key5&&key7>disp1<e,t>; //若無按鍵按下,顯示當(dāng)前值 } } if<key2==0> //如果key2按下,初始值減1 {delay<5>; if<key2==0> { if<e[t-1]==0&&<t==1||t==2>> e[t-1]=60; if<e[t-1]==0&&t==3> e[t-1]=24; e[t-1]--; while<!key2>disp1<e,t>; while<key1&&key2&&key5&&key7>disp1<e,t>; } } if<key5==0> //如果key5按下 {delay<5>; if<key5==0> {t++; //記錄按下次數(shù)變量加1 if<t==1||t==2||t==3> //按下次數(shù)為1、2或3,處于初始值預(yù)置狀態(tài) { while<!key5>disp1<e,t>; while<key1&&key2&&key5&&key7>disp1<e,t>; } if<t==4> //如果key5按下4次,則進(jìn)入倒計(jì)時(shí)程序 { if<e[0]==0&&e[1]==0&&e[2]==0>//若倒計(jì)時(shí)變量為0就進(jìn)入倒計(jì)時(shí)狀態(tài),則 while<key1&&key2&&key5&&key7>//一直顯示000000 disp<e>; for<j=0;j<3;j++> {c[j]=a[j]; //c記錄此刻計(jì)時(shí)變量 d[j]=e[j]; //d記錄倒計(jì)時(shí)初始值 } while<!key5> {for<j=0;j<3;j++> {e[j]=d[j]-a[j]+c[j]; //做減法運(yùn)算 disp<e>; }} while<key5&&key7> {for<j=0;j<3;j++> e[j]=d[j]-a[j]+c[j]; if<e[0]==0&&<e[1]!=0||e[2]==0>> //減到60時(shí)向高位借位 {e[0]=59; e[1]--; } if<e[0]==0&&<e[1]==0||e[2]!=0>> { e[0]=59; e[1]=59; e[2]--; } if<e[0]==0&&<e[1]!=0||e[2]!=0>> {e[0]=59; e[1]--; if<e[1]==0> e[2]--; } if<e[0]==0&&e[1]==0&&e[2]==0> //若倒計(jì)時(shí)時(shí)間減到0,則一直顯示000000 while<key5&&key7>disp<e>; disp<e>; } while<!key5>disp<e>; //key5按下了5次,跳出程序前松手檢測(cè) t++; //,t加1,使循環(huán)條件不滿足,跳出倒計(jì)時(shí)函數(shù) } } } if<key7==0> //整機(jī)復(fù)位檢測(cè) {delay<5>; if<key7==0> {t=5;} } } } } //*********************鬧鐘程序**************************// if<key6==0> //key6:進(jìn)入鬧鐘時(shí)間預(yù)置狀態(tài) {delay<5>; if<key6==0> { while<!key6>disp1<g,num>; while<num<4> { while<key1&&key2&&key6&&key7> disp1<g,num>; if<key6==0> //調(diào)整預(yù)置變量序號(hào) { delay<5>; if<key6==0> num++; } while<!key6>disp1<g,num-1>; if<key2==0> { delay<10>; if<key2==0> if<g[num-1]==0> switch<num> { case1:g[num-1]=60;break; //若秒變量減到零,則置60 case2:g[num-1]=60;break; //若秒變量減到零,則置60 case3:g[num-1]=24;break; //若小時(shí)變量減到零,則置24 } g[num-1]--; //放在后面,防止計(jì)時(shí)變量一開始就0溢出 } while<!key2>disp1<g,num>; if<key1==0> { delay<5>; if<key1==0> g[num-1]++; switch<g[num-1]> //判斷計(jì)時(shí)變量有沒有達(dá)到溢出值 { case25:if<num==3>g[num-1]=0;break; case61:if<num==1||num==2>g[num-1]=0;break; } } while<!key1>disp1<g,num>; if<key7==0> { delay<5>; if<key7==0> { restar=0;num=4; } } } } }//****************復(fù)位程序**********

溫馨提示

  • 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)論