硬件課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第1頁
硬件課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第2頁
硬件課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第3頁
硬件課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第4頁
硬件課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、硬件課程設(shè)計(jì)報(bào)告班級(jí): 信科09-3姓名: 學(xué)號(hào): 指導(dǎo)老師:完成日期:2011年12月20日課程設(shè)計(jì)指導(dǎo)老師評(píng)閱書指導(dǎo)老師評(píng)語:指導(dǎo)老師簽字:年 月 日目錄目錄3stc89c52單片機(jī)引腳圖.4實(shí)驗(yàn)電路原理圖5實(shí)驗(yàn)要求5概要6焊接工藝總結(jié)7編程思想.8程序框圖9核心代碼.12體會(huì)與建議.15附源代碼.16stc89c52引腳圖電路原理圖實(shí)驗(yàn)要求1, 完成電路板的焊接。2, 完成對(duì)兩個(gè)測(cè)試程序的代碼恢復(fù)。概要大學(xué)里面大多數(shù)課程是理論課程,但對(duì)于我們對(duì)動(dòng)手能力要求較強(qiáng)的信科專業(yè),只學(xué)習(xí)理論知識(shí)遠(yuǎn)遠(yuǎn)不夠。學(xué)校里以前安排的一些實(shí)驗(yàn)課程,一直沒有引起自己的足夠注意,大多數(shù)都是課上應(yīng)付一下,然后草草交一

2、篇報(bào)告就了事了。以至于把寫報(bào)告當(dāng)成了實(shí)驗(yàn)的主要內(nèi)容,這是本末倒置的。隨著時(shí)間的積累,這種狀態(tài)在使我發(fā)虛。雖然大多數(shù)人仍是這種狀態(tài)。單片機(jī)是信科專業(yè)的核心課程,是和各種競(jìng)賽,以及以后工作聯(lián)系最緊密的課程,是鍛煉動(dòng)手能力的絕佳機(jī)會(huì)。因此在最開始我就給予了它足夠的重視,雖然進(jìn)展并不是一帆風(fēng)順,但我感覺收獲是豐富的,甚至可以說,這門課是我上大學(xué)以來讓我收獲最大的一門課程??粗陌傩凶约簩懙脑创a和運(yùn)行流暢時(shí)鐘,鬧鈴,以及別人羨慕的眼神,我感到一絲絲快意。整個(gè)課程設(shè)計(jì)分成兩個(gè)部分,第一個(gè)部分是電路板的焊接與調(diào)通,這是純硬件的,雖然技術(shù)含量比較低,但由于以前焊的少,還是碰到了好多問題,具體感受將在接下來

3、的說。第二個(gè)部分是程序設(shè)計(jì),這是實(shí)驗(yàn)的主要部分,是軟硬件結(jié)合的部分,也是最要技術(shù)的部分,要想寫出可運(yùn)行的程序,必須對(duì)每個(gè)電子器件和整個(gè)電路圖的布局引腳足夠熟悉。程序的設(shè)計(jì)是可以讓人入迷的,我記得好幾個(gè)晚上,我為了解決程序運(yùn)行過程中存在的問題而無法入睡。當(dāng)然,這次實(shí)驗(yàn)只是一個(gè)開端,電子設(shè)計(jì)還有很長的路要走,而留給我的時(shí)間已經(jīng)不多了,我會(huì)利用本次課程給我的知識(shí),在這條路上走下去,相對(duì)于一些同學(xué),我可能晚了一步,但我相信,我會(huì)迅速追趕上來的。下面,我將寫出實(shí)驗(yàn)的具體內(nèi)容。焊接工藝總結(jié)這次焊接只是將直插的端口用焊錫封堵上,不涉及電路的連接,因此對(duì)知識(shí)的要求比較低。依我所見,如果焊接一帆風(fēng)順的話,反倒不

4、利于學(xué)習(xí),因?yàn)槿绻麤]有排錯(cuò)的過程,人就不會(huì)關(guān)注電路板的內(nèi)部結(jié)構(gòu),及元器件的布局。我以前焊電路板比較少,因此焊接過程中出了很多問題,這才迫使我關(guān)注電路板的布線,甚至動(dòng)用了萬用表去排錯(cuò),這使得我在編程之前已經(jīng)對(duì)電路很熟悉了,因此編程的時(shí)候比較順利。結(jié)合自己和周圍的同學(xué)焊接時(shí)遇到的問題,我得到了很多焊接電路板時(shí)的經(jīng)驗(yàn),具體總結(jié)如下:1. 焊接時(shí)心態(tài)一定要放平穩(wěn),不要著急,欲速則不達(dá)。2. 焊接時(shí)對(duì)有極性,有方向的器件一定要注意,比如發(fā)光二級(jí)管,數(shù)碼管,排阻等,不要安反。3. 焊接前最好保證器件本身是好的,這樣可以保證出現(xiàn)的問題是電路問題而不是器件本身的問題。雖然電子器件損壞得可能性比較小,但不是沒有

5、可能的。一旦裝上去再檢測(cè)器件本身的好壞就不是那么容易了。4. 對(duì)引腳比較多的器件一定要注意,確保安裝是正確的,因?yàn)檫@些器件一旦安裝錯(cuò)誤想拆下來是很麻煩的。5. 對(duì)于同種器件一定要注意型號(hào),這次兩個(gè)不同型號(hào)的排阻讓人吃盡了苦頭。6. 一定要注意安裝的順序,因?yàn)橛行┢骷坏┫劝惭b上另外一些器件就不好安裝或不能安裝了。編程思想這個(gè)程序是我到現(xiàn)在為止個(gè)人完成的最長的一個(gè)程序。程序一旦變長就會(huì)出現(xiàn)很多問題,比如說思維上容易混亂,查找錯(cuò)誤困難,解決這些問題的核心編程思想就是使各個(gè)部分獨(dú)立出來,也就是使用模塊化的編程思想。這個(gè)程序,我主要分為六個(gè)模塊:全局變量的定義模塊,ds1302的初始化模塊,蜂鳴器音樂

6、播放模塊,時(shí)間顯示模塊,時(shí)間調(diào)節(jié)模塊和主函數(shù)調(diào)用模塊。當(dāng)然這些模塊并不是完全孤立的,他們存在相互調(diào)用,有一定耦合度。這是不可避免的。比如說要實(shí)現(xiàn)鬧鈴功能,即在顯示時(shí)間的同時(shí)顯示鬧鈴,就必須在顯示時(shí)間的代碼時(shí)延作為音符的延時(shí)。當(dāng)然我盡力做到各模塊的獨(dú)立性盡可能高。這樣做的好處有兩個(gè),一個(gè)是使程序看起來清晰易懂,另外一個(gè)就是當(dāng)程序執(zhí)行和自己想的不一樣時(shí)容易判定哪一部分出了問題。當(dāng)然解決這些問題的另一個(gè)問題是必須有良好的編程風(fēng)格,恰當(dāng)利用空格換行和注釋。我想這一點(diǎn)我做到了。編程的基礎(chǔ)是對(duì)cpu工作原理的深刻理解和對(duì)電路結(jié)構(gòu)的明確把我。這要求把硬件和軟件結(jié)合起來,是最有難度,最要水平的地方,經(jīng)過這次訓(xùn)

7、練的洗禮,我感覺到我的能力有了質(zhì)的飛躍。程序設(shè)計(jì)框圖1,整體結(jié)構(gòu)框圖(主函數(shù)部分和時(shí)間調(diào)節(jié)部分)開始key6=1?讀取時(shí)間讀取時(shí)間是否顯示時(shí)分秒顯示年月日檢測(cè)鬧鈴檢測(cè)鬧鈴檢測(cè)按鍵檢測(cè)按鍵2,檢測(cè)按鍵調(diào)時(shí)部分程序框圖(以時(shí)分秒部分說明,年月日部分類似)開始key1是否按下?s1=s1+1s1=s1 s1%3=?012哪個(gè)鍵被按下?哪個(gè)鍵被按下?哪個(gè)鍵被按下?將小時(shí)加1后寫入ds1302將小時(shí)減1后寫入ds1302將 分鐘加1 后寫入ds1302將分鐘減1后寫入ds1302將秒加1后寫入ds1302將秒減1后寫入ds1302與左邊類似,這里略去沒有鍵按下key2key3key2key3key2ke

8、y33,鬧鐘部分程序流程圖:開始hour=12?(可調(diào))否是播放音樂哪個(gè)鍵被按下?換音樂停止播放音樂key4key5核心代碼音樂播放部分(鬧鈴部分)核心代碼:void delay(unsigned char t) /延時(shí)程序,控制發(fā)音的時(shí)間長度 unsigned char t1; unsigned long t2; for(t1 = 0; t1 t; t1+) /雙重循環(huán), 共延時(shí)t個(gè)半拍 for(t2 = 0; t2 20; t2+) read_time(); display1(); ; /延時(shí)期間, 可進(jìn)入t0中斷去顯示時(shí)間 tr0 = 0; /關(guān)閉t0, 停止發(fā)音這一部分是音符的延時(shí),是

9、利用讀取時(shí)間和顯示時(shí)間完成延時(shí)的,保證了在響鬧鈴的同時(shí)還能顯示時(shí)間。void sound(void) if(hour=0x12) /12點(diǎn)時(shí)響鬧鐘 unsigned char k, i; tmod = 1; /置t0定時(shí)工作方式1 et0 = 1; /開t0中斷 ea = 1; /開cpu中斷 while(flag%2=0&flag30000) i = 0; time1 = 1; while(time1) k = sszymmh1i + 7 * sszymmh1i + 1 - 1; /第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度 timer0h = freqhk; /從數(shù)據(jù)表中讀出頻率數(shù)值 time

10、r0l = freqlk; /實(shí)際上, 是定時(shí)的時(shí)間長度 time1 = sszymmh1i + 2; /讀出時(shí)間長度數(shù)值 i += 3; song(); if(key4=0|key5=0) break; +flag;if(key5=0)flag=30000; while(flag%2=1&flag30000) i = 0; time1 = 1; while(time1) k = sszymmh2i + 7 * sszymmh2i + 1 - 1; /第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度 timer0h = freqhk; /從數(shù)據(jù)表中讀出頻率數(shù)值 timer0l = freqlk; /實(shí)際

11、上, 是定時(shí)的時(shí)間長度 time1 = sszymmh2i + 2; /讀出時(shí)間長度數(shù)值 i += 3; song(); if(key4=0|key5=0) break; +flag;if(key5=0)flag=30000;break; 這一部分是音樂播放的主函數(shù),有幾個(gè)方面需要注意,第一,利用if語句完成了定時(shí)功能,要想修改鬧鈴時(shí)間只需修改if語句里的內(nèi)容。第二,利用flag和按鍵共同完成了鬧鈴的控制,flag起初置0(上電后置0),按一下key4加1,當(dāng)它除以2余0時(shí)且小于一個(gè)特別大地?cái)?shù)時(shí)播放第一首樂曲,當(dāng)它除以2余1且小于一個(gè)特別大的數(shù)時(shí)播放第二首樂曲,當(dāng)檢測(cè)到key5按下時(shí),把fla

12、g置成那個(gè)非常大的數(shù),此時(shí)播放結(jié)束,跳出循環(huán)。這就實(shí)現(xiàn)了用key4換音樂,用key5斷鬧鈴的功能。時(shí)間顯示部分:p2=0x80;p0=tabhour/16;delayms(3);p2=0x00;這里以小時(shí)的顯示說明,有三個(gè)問題需要注意。第一,共陽極和共陰數(shù)碼管的區(qū)別,對(duì)于每段數(shù)碼管,共陽極給0時(shí)發(fā)光,共陰極給1時(shí)發(fā)光,所以它們的編碼是不同的。對(duì)于每位而言,共陽極給1時(shí)導(dǎo)通,共陰極導(dǎo)通,所以編碼也是不同的。第二,從ds1302讀到的時(shí)間是用bcd碼表示的,所以對(duì)16求整和求余才能得到相應(yīng)的編碼。第三,我們看起來8位同時(shí)顯示利用的是視覺暫留。其實(shí)不是一直在顯示的.時(shí)間調(diào)節(jié)部分核心地嗎:if(key

13、2=0) delayms(100); if(key2=0)/key2按下表示加 write_ds1302(0x8e,0x00);/寫保護(hù)寄存器的使用if(hour0x23) write_ds1302(0x84,( hour=(hour/16*10+hour%16)+1)/10*16+(hour/16*10+hour%16)+1)%10 );/16進(jìn)制與十進(jìn)制轉(zhuǎn)換else write_ds1302(0x84,(0x00);/如果到了23點(diǎn)再加1應(yīng)寫入0點(diǎn),如果還照常加1,將會(huì)出現(xiàn)亂碼,以下類似write_ds1302(0x8e,0x80);/寫保護(hù)寄存器的使用這里以修改小時(shí)的代碼來說明問題,有三

14、個(gè)問題要注意。第一,利用按鍵控制加減,必須有足夠的延時(shí),這里用了100毫秒,如果時(shí)間過短,程序會(huì)好幾次檢測(cè)到按下。第二,調(diào)試時(shí)必須首先將從ds1302讀到的bcd碼轉(zhuǎn)換成十進(jìn)制再加1,再轉(zhuǎn)換成bcd碼,然后寫入ds1302,要不然會(huì)出現(xiàn)亂碼。第三,調(diào)時(shí)的過程必須注意邊界,例如小時(shí)加到23應(yīng)歸零,小時(shí)減到0應(yīng)歸23,否則會(huì)出現(xiàn)亂碼。調(diào)節(jié)哪一位用的是全局變量,和鬧鈴中換音樂的方法類似,就不再羅嗦了。主函數(shù)部分核心代碼:while(1) changetime();/不斷循環(huán)掃描顯示,確定key6有沒有被按下主函數(shù)最好簡短,我做到了,但主函數(shù)非常重要。這里需要注意的是while(1)這個(gè)死循環(huán)是很重要

15、的,只有不斷循環(huán),才能檢測(cè)到key6有沒有被按下,依次確定是在年月日狀態(tài)下工作還是時(shí)分秒狀態(tài)下工作。至于,顯示時(shí)間,檢測(cè)鬧鈴都放時(shí)間調(diào)節(jié)函數(shù)changetime()中了。體會(huì)與建議通過這次試驗(yàn),我感覺到了在動(dòng)手能力上和知識(shí)綜合運(yùn)用上的巨大提升。這些體會(huì)已在概要部分有了說明,這里不再贅述。當(dāng)然,直到驗(yàn)收的時(shí)刻,程序在設(shè)計(jì)上仍有一定不足,有待提升。事后,我比較了一下自己寫的程序和別的同學(xué)寫的程序。找出了自己的優(yōu)點(diǎn)和缺點(diǎn),優(yōu)點(diǎn)是使用方便,操作便捷,缺點(diǎn)是還有些可以擴(kuò)展的功能沒寫上。首先表現(xiàn)在,鬧鈴的時(shí)間只能在軟件上修改,不能用鍵盤調(diào)節(jié)鬧鈴時(shí)間。當(dāng)時(shí)把精力集中在利用擴(kuò)展鬧鈴的功能上,最終使數(shù)字鐘的鬧鈴

16、有了切換音樂的功能,結(jié)果是程序太長了,我刪掉了一部分樂譜才把程序裝下,當(dāng)時(shí)想再擴(kuò)展功能肯定裝不下了,所以也就沒再想怎么擴(kuò)展。其實(shí)數(shù)字鐘可以擴(kuò)展的功能很多,比如可以設(shè)置倒計(jì)時(shí)功能,可以利用紅外線遙控控制調(diào)節(jié),可以安裝溫度傳感器顯示溫度,等等,當(dāng)然這就太多了,內(nèi)存肯定不夠用?,F(xiàn)在我在準(zhǔn)備參加電子設(shè)計(jì)競(jìng)賽,做的也是數(shù)字鐘,不過這次用的avr單片機(jī),內(nèi)存要大,這就可以盡全力擴(kuò)展功能了。關(guān)于對(duì)本課程的建議,我覺得應(yīng)該繼續(xù)這樣開硬件課程設(shè)計(jì)這門課給每個(gè)同學(xué)配一套零件,讓同學(xué)們自己焊板子。同時(shí),要加強(qiáng)監(jiān)管,尤其是平時(shí),我個(gè)人覺得不能等到最后驗(yàn)收,而應(yīng)該將驗(yàn)收分幾次完成,貫穿于整個(gè)課程設(shè)計(jì),這樣不至于使一些同

17、學(xué),平時(shí)不努力,最后什么也做不出來,只能弄個(gè)程序草草交差了事。附:程序源代碼/*包含頭文件*/#include #include /*端口定義*/sbit ds1302_clk = p10;sbit ds1302_io = p11;sbit ds1302_rst = p12;/ds1302端口sbit key6=p17;sbit key5=p16;sbit key1=p32;sbit key2=p33;sbit key3=p34;sbit key4=p35;/鍵盤端口sbit speaker=p14;/蜂鳴器端口int s1=0,s2=0; /控制調(diào)節(jié)哪一位的變量int flag=0; /控制

18、蜂鳴器int day1; /記憶時(shí)間,以便每天可以使用鬧鈴/*共陽led段碼表*/unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/*定義全局變量*/unsigned char second,minute,hour,day,month,year;/秒,分,時(shí),天,月,年變量定義/*延時(shí)程序*/void delayms(int xms)int i,j;for(i=xms;i0;i-)for(j=110;j0;j-);/*函數(shù)功能:數(shù)碼管顯示子程序*/*顯示時(shí)分秒*/void display1(voi

19、d)p2=0x80;p0=tabhour/16;delayms(3);p2=0x00;p2=0x40;p0=tabhour%16;delayms(3);p2=0x00;p2=0x20;p0=0xbf;/顯示-delayms(3);p2=0x00;p2=0x10;p0=tabminute/16;delayms(3);p2=0xff;p2=0x08;p0=tabminute%16;delayms(3);p2=0x00;p2=0x04;p0=0xbf;/顯示-delayms(3);p2=0x00;p2=0x02;p0=tabsecond/16;delayms(3);p2=0x00;p2=0x01;p

20、0=tabsecond%16;delayms(3);p2=0x00;/*顯示年月日*/void display2(void)p2=0x80;p0=tabyear/16;delayms(3);p2=0x00;p2=0x40;p0=tabyear%16;delayms(3);p2=0x00;p2=0x20;p0=0xbf;/顯示-delayms(3);p2=0x00;p2=0x10;p0=tabmonth/16;delayms(3);p2=0xff;p2=0x08;p0=tabmonth%16;delayms(3);p2=0x00;p2=0x04;p0=0xbf;/顯示-delayms(3);p2

21、=0x00;p2=0x02;p0=tabday/16;delayms(3);p2=0x00;p2=0x01;p0=tabday%16;delayms(3);p2=0x00;/*以下為ds1302基本操作程序*/*函數(shù)功能:向ds1302送一字節(jié)數(shù)據(jù)子程序入口參數(shù):出口參數(shù):*/void inputbyte(unsigned char byte1)char i;for(i=8;i0;i-)ds1302_io=(bit)(byte1&0x01);ds1302_clk=1;_nop_();ds1302_clk=0;byte1=1;return;/*函數(shù)功能:讀ds1302一個(gè)字節(jié)子程序入口參數(shù):出口

22、參數(shù):*/unsigned char outputbyte() unsigned char i;unsigned ucdat=0;for(i=8;i0;i-)ds1302_io=1;ucdat=1;if(ds1302_io)ucdat|=0x80;ds1302_clk=1;_nop_();ds1302_clk=0; return(ucdat);/*函數(shù)功能:向ds1302某地址寫一字節(jié)數(shù)據(jù)子程序入口參數(shù):addr,tdat出口參數(shù):*/void write_ds1302(unsigned char addr,unsigned char tdat)ds1302_rst=0;_nop_();ds1

23、302_clk=0;_nop_();ds1302_rst=1; inputbyte(addr);_nop_();inputbyte(tdat);ds1302_clk=1;_nop_();ds1302_rst=0;/*函數(shù)功能:讀ds1302地址子程序入口參數(shù):add出口參數(shù):timedata*/unsigned char read_ds1302(unsigned char addr)unsigned char timedata;ds1302_rst=0;_nop_();ds1302_clk=0;_nop_();ds1302_rst=1;inputbyte(addr);timedata=outp

24、utbyte();ds1302_clk=1;_nop_();ds1302_rst=0;return(timedata);/*函數(shù)功能:讀ds1302時(shí)間子程序入口參數(shù):出口參數(shù):全局變量(second,minute,hour,week,day,month,year)*/void read_time()second=read_ds1302(0x81);/秒寄存器minute=read_ds1302(0x83);/分hour=read_ds1302(0x85);/時(shí)day=read_ds1302(0x87);/日month=read_ds1302(0x89);/月year=read_ds1302(

25、0x8d);/年 /*以下為蜂鳴器程序,作為鬧鐘*/unsigned char timer0h, timer0l, time1;/-/單片機(jī)晶振采用11.0592mhz/ 頻率-半周期數(shù)據(jù)表 高八位 本軟件共保存了四個(gè)八度的28個(gè)頻率數(shù)據(jù)code unsigned char freqh = 0xf2, 0xf3, 0xf5, 0xf5, 0xf6, 0xf7, 0xf8, /低音1234567 0xf9, 0xf9, 0xfa, 0xfa, 0xfb, 0xfb, 0xfc, 0xfc,/1,2,3,4,5,6,7,i 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, /

26、高音 234567 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff; /超高音 1234567/ 頻率-半周期數(shù)據(jù)表 低八位code unsigned char freql = 0x42, 0xc1, 0x17, 0xb6, 0xd0, 0xd1, 0xb6, /低音1234567 0x21, 0xe1, 0x8c, 0xd8, 0x68, 0xe9, 0x5b, 0x8f, /1,2,3,4,5,6,7,i 0xee, 0x44, 0x6b, 0xb4, 0xf4, 0x2d, /高音 234567 0x47, 0x77, 0xa2, 0xb6, 0xda,

27、 0xfa, 0x16; /超高音 1234567/-/樂譜1 世上只有媽媽好數(shù)據(jù)表 要想演奏不同的樂曲, 只需要修改這個(gè)數(shù)據(jù)表code unsigned char sszymmh1 = 6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, /一個(gè)音符有三個(gè)數(shù)字。前為第幾個(gè)音、中為第幾個(gè)八度、后為時(shí)長(以半拍為單位)。/6, 2, 3 分別代表:, 中音, 個(gè)半拍;/5, 2, 1 分別代表:, 中音, 個(gè)半拍;/3, 2, 2 分別代表:, 中音, 個(gè)半拍;/5, 2, 2 分別代表:, 中音, 個(gè)半拍;/1, 3, 2

28、 分別代表:, 高音, 個(gè)半拍;/6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,6, 1, 1, 5, 2, 1, 3, 2, 1,;/-/樂譜2祝你生日快樂code unsigned char sszymmh2= 5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4, 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, ;/限于內(nèi)存,樂譜沒有寫完void t0int() interrupt 1 /t0中斷程序,控制發(fā)音的音調(diào) tr0 = 0; /先關(guān)閉t0 speake

29、r = !speaker; /輸出方波, 發(fā)音 th0 = timer0h; /下次的中斷時(shí)間, 這個(gè)時(shí)間, 控制音調(diào)高低 tl0 = timer0l; tr0 = 1; /啟動(dòng)t0/-void delay(unsigned char t) /延時(shí)程序,控制發(fā)音的時(shí)間長度 unsigned char t1; unsigned long t2; for(t1 = 0; t1 t; t1+) /雙重循環(huán), 共延時(shí)t個(gè)半拍 for(t2 = 0; t2 20; t2+) read_time(); display1(); ; /延時(shí)期間, 可進(jìn)入t0中斷去顯示時(shí)間 tr0 = 0; /關(guān)閉t0, 停止

30、發(fā)音/-void song() /演奏一個(gè)音符 th0 = timer0h; /控制音調(diào) tl0 = timer0l; tr0 = 1; /啟動(dòng)t0, 由t0輸出方波去發(fā)音delay(time1); /控制時(shí)間長度/-void sound(void) if(hour=0x12) /12點(diǎn)時(shí)響鬧鐘 unsigned char k, i; tmod = 1; /置t0定時(shí)工作方式1 et0 = 1; /開t0中斷 ea = 1; /開cpu中斷 while(flag%2=0&flag30000) i = 0; time1 = 1; while(time1) k = sszymmh1i + 7 *

31、sszymmh1i + 1 - 1; /第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度 timer0h = freqhk; /從數(shù)據(jù)表中讀出頻率數(shù)值 timer0l = freqlk; /實(shí)際上, 是定時(shí)的時(shí)間長度 time1 = sszymmh1i + 2; /讀出時(shí)間長度數(shù)值 i += 3; song(); if(key4=0|key5=0) break; +flag;if(key5=0)flag=30000; while(flag%2=1&flag30000) i = 0; time1 = 1; while(time1) k = sszymmh2i + 7 * sszymmh2i + 1 - 1

32、; /第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度 timer0h = freqhk; /從數(shù)據(jù)表中讀出頻率數(shù)值 timer0l = freqlk; /實(shí)際上, 是定時(shí)的時(shí)間長度 time1 = sszymmh2i + 2; /讀出時(shí)間長度數(shù)值 i += 3; song(); if(key4=0|key5=0) break; +flag;if(key5=0)flag=30000;break; /*以下為時(shí)間變換函數(shù)*/ void changetime() while(key6=1) /如果key6未被按下,則顯示時(shí)分秒 day1=day;/讀取時(shí)間 display1(); /顯示使時(shí)間 sound(

33、); /檢測(cè)鬧鈴 if(key1=0) delayms(100); if(key1=0) /確認(rèn)按下 s1+;switch(s1%3) /分情況通論,按一下調(diào)時(shí),再按一下調(diào)分,再按一下調(diào)秒,如此循環(huán)往復(fù) case 0: if(key2=0) delayms(100); if(key2=0)/key2按下表示加 write_ds1302(0x8e,0x00);/寫保護(hù)寄存器的使用if(hour0x00) write_ds1302(0x84,( hour=(hour/16*10+hour%16)-1)/10*16+(hour/16*10+hour%16)-1)%10 );elsewrite_ds1302(0x84,0x23);write_ds1302(0x8e,0x80);break; case 1: if(key2=0) delayms(100); if(key2=0) write_ds1302(0x8e,0x00);if(minute0x00) write_ds1302(0x82,( minute=(minute/16*10+minute%16)-1)/10*16+(minute/16*10+minute%16)-1)%10 ) ;elsewrite_ds1302(0x82,0x59);write_ds1302(0x8e,0x80);bre

溫馨提示

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