版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計實習(xí)報告</b></p><p> 課程名稱:語音鬧鐘及定時器</p><p><b> 組員:** **</b></p><p> 學(xué)號: ****** </p><p> 專業(yè)班級:*****</p><p> 指導(dǎo)老師:*
2、*****</p><p> 學(xué)院:信息科學(xué)與技術(shù)學(xué)院</p><p> 完成時間:2011年7月30日</p><p> 一、課程設(shè)計題目要求</p><p> 自己焊接凌陽十六位單片機實驗板;</p><p> 利用實驗板完成以下電路設(shè)計;</p><p> 外圍電路實現(xiàn)以下功能
3、:</p><p> a、定時器功能:(1)、能設(shè)置定時時間并語音播報;(2)、外擴電路顯示定時時間。</p><p> b、語音鬧鐘:在原有萬年歷程序基礎(chǔ)上,修改程序使之具有如下功能:開機時間為當(dāng)前日期和時間;設(shè)置鬧鐘時間;語音或音樂鬧鈴。</p><p><b> 二、設(shè)計方案與論證</b></p><p>&
4、lt;b> 2.1系統(tǒng)原理框圖</b></p><p> 本課題是基于凌陽十六位單片機的語音鬧鐘定時器的開發(fā),由于之前我們組員都未曾接觸過單片機知識,我們首先通過查閱凌陽單片機的相關(guān)資料學(xué)習(xí)單片機相關(guān)知識。由于凌陽十六位單片機自帶了語音錄放功能,這在很大程度上減小了我們的課題難度,我們首先考慮到實現(xiàn)鬧鐘定時器功能分兩個部分,即軟件部分和硬件部分,通過編程可以實現(xiàn)對單片機外圍接口的定義,將想要
5、傳送的內(nèi)容(包括語音部分和顯示部分)傳輸出去,而外圍電路的設(shè)計包括語音部分、顯示部分以及輸入部分(鍵盤);由于要求只顯示年月日時分秒,我們采用數(shù)碼管即可實現(xiàn)顯示功能。此外我們還要做的就是語音采集及時間顯示和鬧鐘的切換。系統(tǒng)設(shè)計框圖如下</p><p> 圖2.1.1、系統(tǒng)設(shè)計框圖</p><p> SPCE061A最小系統(tǒng)框圖:</p><p><b>
6、; 圖2.1.2</b></p><p> 2.2主要電路設(shè)計與參數(shù)計算</p><p> 61板硬件框圖如圖所示:</p><p> 圖2.2.1、 61硬件板框圖</p><p><b> 框圖說明:</b></p><p> 表2.2.2、框圖說明</p>
7、<p><b> 61板接口說明圖:</b></p><p> 圖2.2.3、61板接口說明</p><p><b> 2.2.1基本參數(shù)</b></p><p> 工作電壓:4.5V(三節(jié)干電池);</p><p> 時間采用24小時制;</p><p&
8、gt; 采用六位數(shù)碼管動態(tài)顯示年月日/時分秒。</p><p> 2.2.2所需元件及元件參數(shù)</p><p> 凌陽十六位單片機組套;</p><p> 三節(jié)1.5V干電池;</p><p> 一片SR420561K四位數(shù)碼管和兩片SM420501K一位數(shù)碼管;</p><p> 20位插排、數(shù)據(jù)傳輸線、
9、一些導(dǎo)線和焊錫。</p><p><b> 2.2.3注意事項</b></p><p> 將61板上的J5跳線選擇3.3V;</p><p> 在安裝電池時注意正負極,否則容易燒壞芯片;</p><p> 在印制電路板上的焊接元器件前要認真對照原理圖,仔細查看印制電路板,找到對應(yīng)的元器件功能區(qū);</p>
10、;<p> 在電源測試期間請勿將單片機芯片插入座中,以免電源部分有問題造成芯片燒壞。</p><p> 連接外接電路時一定要注意端口對應(yīng)關(guān)系,以免連接錯誤不能正常顯示;</p><p> 在焊接外圍電路時,要仔細認真,以免造成個別焊點焊接不良。</p><p> 2.3輸入/輸出(I/O)接口</p><p> 61板
11、將SPCE061A的IOB端口引出,IOB的所有端口均設(shè)置為輸出端口,IOA的低八位端口設(shè)置為輸入端口,其中IOA端口的IOA0~IOA2為默認的Key1、Key2、Key3按鍵接口,IOB端口的IOB7~IOB2設(shè)置為數(shù)碼管的位選端口,高八位IOB15~IOB8設(shè)置為數(shù)碼管的段選接口。</p><p><b> 調(diào)試步驟</b></p><p><b>
12、 3.1 軟件部分</b></p><p> 3.1.1時間顯示函數(shù)</p><p> 題目要求我們在原有的萬年歷的基礎(chǔ)上更改程序使之滿足鬧鐘定時器功能,而原有萬年歷程序部分并未給出外圍顯示部分,因此我們小組在此基礎(chǔ)上添加了時鐘時間顯示函數(shù)display(),程序如下:</p><p> //===========================
13、===========================</p><p> // 文件名稱:Clock_Display.c</p><p> // 功能描述:調(diào)整日期和時間的函數(shù)集</p><p> //======================================================</p><p> #
14、include"spce061a.h"</p><p> #include "Key.h"</p><p> static int LED1[10] = {0xfcfb,0x60fb,0xdafb,0xf2fb,0x66fb,0xb6fb,0xbefb,0xe0fb,0xfefb,0xf6fb};</p><p> st
15、atic int LED2[10] = {0xfcf7,0x60f7,0xdaf7,0xf2f7,0x66f7,0xb6f7,0xbef7,0xe0f7,0xfef7,0xf6f7};</p><p> static int LED3[10] = {0xfdef,0x61ef,0xdbef,0xf3ef,0x67ef,0xb7ef,0xbfef,0xe1ef,0xffef,0xf7ef};</p>
16、<p> static int LED4[10] = {0xfcdf,0x60df,0xdadf,0xf27f,0x66df,0xb6df,0xbedf,0xe07f,0xfedf,0xf6df};</p><p> static int LED5[10] = {0xfdbf,0x61bf,0xdbbf,0xf3bf,0x67bf,0xb7bf,0xbfbf,0xe1bf,0xffbf,0xf7b
17、f};</p><p> static int LED6[10] = {0xfc7f,0x607f,0xda7f,0xf27f,0x667f,0xb67f,0xbe7f,0xe07f,0xfe7f,0xf67f};</p><p> //IOB口的高八位接段選,低六位接位選</p><p> //共陰接法'0''1''2
18、''3''4''5''6''7''8''9'的代碼</p><p> void display(unsigned Hour,unsigned Min,unsigned Sec)</p><p><b> {</b></p><
19、p><b> int i;</b></p><p> unsigned int Fir_hour;</p><p> unsigned int Sec_hour;</p><p> unsigned int Fir_min;</p><p> unsigned int Sec_min;</p>
20、<p> unsigned int Fir_sec;</p><p> unsigned int Sec_sec; </p><p> Fir_hour=Hour/10;//時鐘十位要顯示的數(shù)字</p><p> Sec_hour=Hour%10;//時鐘個位要顯示的數(shù)字</p><p> Fir_min=Min/
21、10; //分鐘十位要顯示的數(shù)字</p><p> Sec_min=Min%10; //分鐘個位要顯示的數(shù)字</p><p> Fir_sec=Sec/10; //秒鐘十位要顯示的數(shù)字</p><p> Sec_sec=Sec%10; //秒鐘個位要顯示的數(shù)字</p><p> *P_IOB_Attrib = 0xffff;
22、 //初始化IOB0~IOB15帶數(shù)據(jù)緩存的高電平輸出口 </p><p> *P_IOB_Dir = 0xffff;</p><p> *P_IOB_Data = 0xffff; </p><p> *P_IOB_Data = LED1[Sec_sec];</p><p> *P_Watchdog_Clea
23、r = 0x0001;</p><p> for(i=0;i<0x00ef;i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; }</p><p> *P_IOB_Data = LED2[Fir_sec];</p><p> *P_Wat
24、chdog_Clear = 0x0001;</p><p> for(i=0;i<0x00ef;i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; } </p><p> *P_IOB_Data = LED3[Sec_min];</p><p&
25、gt; *P_Watchdog_Clear = 0x0001;</p><p> for(i=0;i<0x00ef;i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; }</p><p> *P_IOB_Data = LED4[Fir_min];</p&g
26、t;<p> *P_Watchdog_Clear = 0x0001;</p><p> for(i=0;i<0x00ef;i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; }</p><p> *P_IOB_Data = LED5[Sec_hou
27、r];</p><p> *P_Watchdog_Clear = 0x0001;</p><p> for(i=0;i<0x00ef;i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; } </p><p> *P_IOB_Data
28、= LED6[Fir_hour];</p><p> *P_Watchdog_Clear = 0x0001;</p><p> for(i=0;i<0x0011;i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; }</p><p>&l
29、t;b> } </b></p><p> 3.1.1日期顯示函數(shù)</p><p> 但是題目要求我們還要顯示日期,這樣既要求顯示日期又要求顯示時間,如果我們選擇12個數(shù)碼管當(dāng)然理論上是可以實現(xiàn)的,但是一方面這樣太浪費資源,另一方面在引腳控制上也過于繁瑣(要至少有12個位選端口8個段選端口共20個端口),因此我們考慮添加日期顯示函數(shù)displaydata
30、(),具體程序如下:</p><p> void displaydata(unsigned Year,unsigned Mon,unsigned Day)</p><p><b> {</b></p><p><b> int i;</b></p><p> unsigned int Fir
31、_year;</p><p> unsigned int Sec_year;</p><p> unsigned int Fir_mon;</p><p> unsigned int Sec_mon;</p><p> unsigned int Fir_day;</p><p> unsigned int S
32、ec_day; </p><p> Fir_year=Year/10%10;//年十位要顯示的數(shù)字</p><p> Sec_year=Year%10;//年個位要顯示的數(shù)字</p><p> Fir_mon=Mon/10; //月十位要顯示的數(shù)字</p><p> Sec_mon=Mon%10; //月個位要顯示的數(shù)字<
33、;/p><p> Fir_day=Day/10; //日十位要顯示的數(shù)字</p><p> Sec_day=Day%10; //日個位要顯示的數(shù)字</p><p> *P_IOB_Attrib = 0xffff; //初始化IOB0~IOB15帶數(shù)據(jù)緩存的高電平輸出口 </p><p> *P_IOB_Di
34、r = 0xffff;</p><p> *P_IOB_Data = 0xffff; </p><p> *P_IOB_Data = LED1[Sec_day];</p><p> *P_Watchdog_Clear = 0x0001;</p><p> for(i=0;i<0x00ef;i++)
35、 //延時</p><p> { *P_Watchdog_Clear = 0x0001; }</p><p> *P_IOB_Data = LED2[Fir_day];</p><p> *P_Watchdog_Clear = 0x0001;</p><p> for(i=0;i<0x00ef;i++)
36、 //延時</p><p> { *P_Watchdog_Clear = 0x0001; }</p><p> *P_IOB_Data = LED3[Sec_mon];</p><p> *P_Watchdog_Clear = 0x0001;</p><p> for(i=0;i<0x00ef;
37、i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; }</p><p> *P_IOB_Data = LED4[Fir_mon];</p><p> *P_Watchdog_Clear = 0x0001;</p><p> for(i=0;i&
38、lt;0x00ef;i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; }</p><p> *P_IOB_Data = LED5[Sec_year];</p><p> *P_Watchdog_Clear = 0x0001;</p><p>
39、 for(i=0;i<0x00ef;i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; } </p><p> *P_IOB_Data = LED6[Fir_year];</p><p> *P_Watchdog_Clear = 0x0001;</p&g
40、t;<p> for(i=0;i<0x00ef;i++) //延時</p><p> { *P_Watchdog_Clear = 0x0001; }</p><p><b> }</b></p><p> 3.1.1時間日期實現(xiàn)交替</p><p&g
41、t; 然而我們會發(fā)現(xiàn)在主程序中要想調(diào)用這兩個函數(shù)顯示日期和時間并不是那么容易的,那么如何讓數(shù)碼管既能顯示日期又能顯示時間呢?我們考慮到兩種方案:1、通過按鍵設(shè)置來實現(xiàn)日期和時間的切換顯示;2、通過時間條件來交替顯示日期和時間。這里我們選擇了第二種方案。調(diào)用程序如下:</p><p> if(Clock_GetSec()/5)</p><p> display(Clock_GetHou
42、r(),Clock_GetMin(),Clock_GetSec());</p><p><b> else</b></p><p> displaydata(Clock_GetYear(),Clock_GetMon(),Clock_GetDay();</p><p> 即每隔一分鐘顯示一次日期,日期的顯示時間長度為5s。</p>
43、;<p> 其他部分這里就不贅述了,完整程序見附錄8.1。</p><p><b> 3.2硬件部分</b></p><p> 硬件部分主要是六位數(shù)碼管,在連接數(shù)碼管時要分清位選端和片選段,對數(shù)碼管的各個引腳應(yīng)該熟悉。我們采用的是SR420561K四位數(shù)碼管和兩個SM420501K數(shù)碼管,他們都是共陰極數(shù)碼管,他們的引腳圖如下:</p>
44、<p> 圖3.2.1、SM420501K數(shù)碼管 圖3.2.2、SR420561K四位數(shù)碼管</p><p> 外圍電路接口控制圖如下:</p><p> 圖3.2.3、IOB端口引腳連接圖</p><p> 圖3.2.4、六位數(shù)碼管動態(tài)顯示原理圖</p><p> 圖3.2.5、按鍵控制電路</p&
45、gt;<p><b> 總體電路圖:</b></p><p> 圖3.2.6 總體電路圖</p><p><b> 實物圖連接圖如下:</b></p><p> 圖3.2.7 實物連接圖</p><p><b> 測試結(jié)果</b></p>
46、<p> 測試步驟及結(jié)果如下:</p><p> 連接好電路并檢查無誤后,打開電源開關(guān),此時顯示的時間為程序設(shè)定的初始時間和日期;</p><p> 按Key1第一次,播報時間(Clock_Speech.c);</p><p> 按Key1第二次,調(diào)整鬧鐘(main.c);再按Key2鍵為加,按Key3鍵為減;</p><p&g
47、t; Key1鍵長按,調(diào)整日期和時間(Clock_Adjust.c);再按Key2鍵為加,按Key3鍵為減;</p><p> 按Key2鍵,播報日期(Clock_Speech.c);</p><p> 按Key3鍵,播報鬧鐘時間;</p><p> 如果達到設(shè)定時間 鬧鈴響最長一分鐘,若在鬧鐘時間按Key1鍵,停止鬧鈴。</p><p
48、><b> 結(jié)論</b></p><p><b> 5.1本方案的特點</b></p><p> 本方案設(shè)計思路簡單易懂,非常適合新手入門;</p><p> 數(shù)碼管顯示采用動態(tài)顯示方法,便于理解和掌握;</p><p> 程序中對輸入輸出端口的定義對剛剛接觸單片機的同學(xué)在理解上有很
49、大幫助;</p><p> 外圍電路簡單實用,沒有過多的器件;</p><p> 凌陽單片機自帶的語音功能幫助我們很好的實現(xiàn)了語音播報鬧鈴等。</p><p><b> 5.2本方案的缺點</b></p><p> 外圍電路數(shù)碼管顯示亮度不均較暗,這是由于我們程序采用的是循環(huán)延時方式,使得各個數(shù)碼管的亮滅時間長短
50、不同;</p><p> 鬧鈴與數(shù)碼管顯示沖突,不能同時進行;</p><p> 按鍵過少,使得初次實用者操作不便;</p><p> 5.3本方案的改進擴展部分</p><p> 如果仍采用循環(huán)延時顯示方法,需要改進的是將各個數(shù)碼管延時時間調(diào)成一致,從而使數(shù)碼管亮度均勻;</p><p> 可以減小外電路的
51、保護電阻阻值,或者通過加入三極管放大電路放大電流,從而提高數(shù)碼管的亮度;</p><p> 可以采用中斷機制,從而達到亮度均勻,以及鬧鈴與數(shù)碼管顯示互不干擾的目的;</p><p> 可以外接鍵盤組模,從而更加便于操作;</p><p> 語音鬧鐘部分可以拓展為音樂盒,鬧鐘鈴聲可以外接鍵盤選擇;</p><p> 數(shù)碼管顯示畢竟不如液
52、晶顯示更為先進,因此可以考慮改用液晶做外接顯示;</p><p><b> 5.5 小結(jié)</b></p><p> 雖然以上改進部分可以使我們的課程設(shè)計更加完美,但是由于時間有限,并</p><p> 且我們組員都是初學(xué)者,沒有那么多時間補充完整,因此這部分我們將在以后的學(xué)習(xí)中繼續(xù)學(xué)習(xí)補充。此外,本方案設(shè)計也基本符合課程設(shè)計題目要求,達到
53、了預(yù)期目的。</p><p><b> 六、本作品使用說明</b></p><p><b> 操作說明:</b></p><p> 首先檢查焊接電路是否有問題,確定連接線路無誤后方可打開電源開關(guān),此時顯示初始時間和日期;</p><p> 圖6.1 時分秒 (9:40:29)
54、 圖6.2 年月日(2011.7.26)</p><p> 2、按Key1第一次,播報時間——小時、分鐘;</p><p> 3、按Key1第二次,語音提示調(diào)整鬧鐘;再按Key2鍵為加,按Key3鍵為減;同時有語音提示;</p><p> 4、Key1鍵長按,語音提示調(diào)整日期和時間;再按Key2鍵為加,按Key3鍵為減;同時有語音提示;</p&
55、gt;<p> 5、按Key2鍵,語音播報日期——年、月、日;</p><p> 6、按Key3鍵,播報鬧鐘時間;</p><p> 7、如果達到設(shè)定時間 鬧鈴響最長一分鐘,鬧鈴為本組錄制,可通過程序更改鈴聲;若在鬧鐘時間按Key1鍵一次,停止鬧鈴。</p><p><b> 課程設(shè)計心得體會</b></p>
56、<p> 7.1馬守江的心得體會:</p><p> 通過本次課程設(shè)計我學(xué)到了很多東西,單片機方面的知識我們在之前接觸較少,因此在剛開始做這個課程設(shè)計時,我感覺有些吃力,但是經(jīng)過一個星期左右的學(xué)習(xí),我基本上掌握了單片機的基本原理和利用單片機做硬件開發(fā)的相關(guān)思路。</p><p> 我們這次選的課題是利用凌陽十六位單片機實習(xí)鬧鐘和定時器功能,可以說這對于單片機開發(fā)者來說是
57、最基礎(chǔ)最簡單的課題了,然而我在學(xué)習(xí)的過程中卻四處碰壁,對于網(wǎng)上的很多解答都不能想得很透徹,這樣郁悶的狀態(tài)大概持續(xù)了五六天的樣子,這期間我不斷的問,雖然有時候?qū)τ谒麄兪呛芎唵蔚膯栴},有時候心里也確實有所顧忌,然而我知道不懂必須要問,即使被別人看不起也要厚著臉皮去問去學(xué)。還好這樣最終我還是把課題的知識體系理清楚了,結(jié)合C語言知識,后面我已經(jīng)可以自己對程序進行調(diào)試修改補充了,直到昨天我還在對程序進行最后的修正補充,我相信功夫不負有心人,最終我
58、們還是順利完成了課程設(shè)計。</p><p> 說說在做課程設(shè)計過程中遇到的問題吧,我不想說的太繁瑣,只想提一點,那就是單片機的輸入輸出(IO)接口問題,這個問題是我在做課程設(shè)計時一直困擾我的,如果把端口定義端口連接機制搞清楚了,那么我認為這個單片機就已經(jīng)是你的了,你就可以隨心所欲的對外圍電路進行控制了。我們鬧鐘定時器的外圍電路相當(dāng)簡單,復(fù)雜一點也就是鍵盤組模、三極管放大電路、數(shù)碼管顯示三個部分而已,但是如果對外
59、圍接口不清楚,那就完全失去方向了,當(dāng)我搞清楚IO端口定義時,這時我們的課題設(shè)計才有了實質(zhì)性的進步,然后我們才設(shè)計出了數(shù)碼管的動態(tài)顯示電路,鍵盤控制操作等等。因此我個人認為,雖然我們做的是硬件,但是更多的知識卻是儲存在軟件編程里的,所以我認為學(xué)習(xí)單片機不僅要學(xué)會設(shè)計各種電路系統(tǒng),還應(yīng)該掌握編程技術(shù),軟件與硬件結(jié)合起來,就好比真理與實踐結(jié)合起來一樣的道理。</p><p> 可以說這次實習(xí)的時間還是不夠用的,畢竟我
60、們既是在學(xué)習(xí)又是在實踐,短短的十多天時間畢竟不能完全掌握一門知識,但是通過這種鍛煉學(xué)習(xí),我們卻掌握了硬件開發(fā)的基本思路框架,這對于我們在以后的學(xué)習(xí)和工作都是非常有用的。在這次的課程設(shè)計過程中,我還學(xué)到的一點就是,多一個人多一份力,原本是打算一個人做的,但是到現(xiàn)在看來,如果一個人的話中間會有多少不便就難說了,就拿外圍電路來說,雖然說軟件部分是我做的,但是我做硬件方面卻欠缺的很,電路連接布線布局很不美觀,最后的電路板是由我的隊友賀鵬同學(xué)全程
61、焊接的,在此謝謝他,辛苦了。實習(xí)即將結(jié)束,暑假即將開始,真是一個充實的暑假生活。</p><p> 7.2賀鵬的心得體會:</p><p> 本次課程設(shè)計,我們組選的課題是:基于凌陽61單片機可顯示時間的語音鬧鐘??傮w而言,此課題不算復(fù)雜。</p><p> 本課題的核心有兩部分:一是凌陽單片機,這是最為核心的部件;二是顯示時間的外圍電路,這一部分是需要我們動
62、手設(shè)計的。</p><p> 焊接單片機是本次課程設(shè)計的第一步。當(dāng)時,領(lǐng)到的器件有:①小個子元器件(20個),包括晶振(1個)、二極管(3個)、SPY0029A(1個)、電阻(18個);②中個子元器件(45個),包括瓷片電容(5個)、獨石電容(19個)、電解電容(12個)、按鍵(4個)、發(fā)光二級管(2個)、芯片座(3個);③大個子元器件(13個),包括排針(9個)、接座(3個)、電位器(1個);④成型的PCB板
63、一塊;⑤芯片(3個)。面對這一大堆凌亂的元器件,給我的感覺是無從著手。好在之前看過師兄師姐的單片機成品,并且我從互聯(lián)網(wǎng)上也查過單片機的資料,再加上跟隨器件一起的使用手冊,于是我摸索著焊接自己的單片機。</p><p> 焊接61板,首先,需要進行61裸板檢測。這一步很簡單,也很重要,如果裸板存在問題,那么以后的工作都將是徒勞。然后是檢測元器件,并做元器件的整形。這樣做的目的是確保以后用到的每一個元器件都是完整并
64、且正常工作的,否則某個元器件出了問題,查找起來也不是件容易的事兒。再就是對元器件進行分類,這樣做是為了后面進行焊接工作時更為清晰,不容易遺漏元器件。最后是按照焊接單片機的18個步驟進行焊接。這一步很復(fù)雜,花費的時間也是最多的,往往一不小心就出錯了。最終導(dǎo)致的結(jié)果是整個單片機無法工作。我在這個步驟中就犯了不少錯誤。一是我將兩個電解電容的位置弄錯了,修正時不得不把兩個電容重新拔出來對換位置,這樣一折騰,電容的性能就很讓人擔(dān)心了;二是我將兩個
65、發(fā)光二極管的正負極性接反了,究其緣由是我當(dāng)初焊接電路是想當(dāng)然,沒有去查資料,也沒有用萬用表檢測其極性,完全是憑著自己的主觀臆斷去焊接發(fā)光二極管,折騰一番后,兩個發(fā)光二極管都被我弄壞了,不得不用新的發(fā)光二極管替換;三是我將單排插針焊在了五針座的位置上,結(jié)果又是一番折騰。不過最后我焊接的單片機還是成功的運行了自檢程序。</p><p> 對于單片機的焊接,我犯的這些錯誤都是由于我不夠細心而造成的。不過我更為欣慰的是
66、:雖然錯誤犯了不少,但經(jīng)過我的修正,最終我的單片機還是正常運行起來了。正所謂,知識有時候是在不斷犯錯誤中積累起來的。</p><p> 外圍電路的設(shè)計是本次課程設(shè)計的意義所在。第一步焊接單片機時有現(xiàn)成的原理圖可以參照,而外圍電路的每一個步驟都需要自己動手完成。這是真正意義上從無到有的過程。因為之前對單片機的整體構(gòu)造有了了解,所以在設(shè)計外圍電路時,能夠大致確定外圍電路所需要的器件。</p><
67、p> 首先,數(shù)碼管是顯示電路必不可少的部件;其次,為了保證數(shù)碼管的亮度,我們曾設(shè)想使用三極管作為驅(qū)動電路,但最后,經(jīng)過實踐發(fā)現(xiàn),增加三極管對于電路的布局有諸多的不利:第一,電路板的面積很有限;第二,數(shù)碼管采用的是一個四合一數(shù)碼管和兩個一位的數(shù)碼管,其引腳總共達到了32個!在有限的電路板上焊接32個引腳,并且引腳間的連接采用的是導(dǎo)線,這使得電路布局十分緊湊。如果再加上三極管和相應(yīng)的保護電阻,這無疑會增加焊接難度。更為重要的是,在不
68、使用三極管和保護電阻的情況下,數(shù)碼管的顯示亮度已經(jīng)達到了預(yù)定效果。因此,我們選擇舍棄了這些雞肋部件,就這樣焊接好了外圍電路。</p><p> 當(dāng)然在焊接外圍電路時也遇到過麻煩,究其原因是焊接的密度太大。另一方面,在焊接之前,我在紙上對電路進行了詳細布局,所以在查找問題時,很容易就解決了。</p><p> 此次實習(xí),從其整個過程來看,是一次硬件設(shè)計的初體驗。于我而言,硬件設(shè)計不是我最
69、佳的追求,但這的確是一次美好的體驗,至少讓我知道,有些東西注定要親身嘗試,沒有去嘗試,你永遠不知道你的潛力有多大。</p><p><b> 附錄</b></p><p><b> 8.1主要程序</b></p><p><b> Main()函數(shù):</b></p><p&g
70、t; //=======================================================</p><p> // 工程名稱:61_BardianClock</p><p> // 功能描述:個性鬧鐘,用按鍵設(shè)定鬧鐘時間,到達設(shè)定時間揚聲器發(fā)出音樂。</p><p> //Key1 - 按一下,報時;再按一下,定
71、時;</p><p> //長按Key1鍵達到1.5秒,則進入調(diào)時模式</p><p> //Key2 - 在調(diào)時/定時模式下,使年、月、日、時、分、秒增加; </p><p> //Key3 - 在調(diào)時/定時模式下,使年、月、日、時、分、秒減小</p><p> // 涉及的庫:SacmV26e.li
72、b</p><p> // 組成文件:main.c, Sound.c, Clock.c, Clock_Speech.c, Clock_Adjust.c,</p><p> // Clock_Display.c</p><p> //Key.asm, hardware.asm, ISR.asm</p><
73、p> // A2000.h, Sound.h, Clock.h, Clock_Speech.h, Clock_Adjust.h, </p><p> // Key.h, SPCE061A.h </p><p> //硬件連接:61板自帶的三個按鍵已經(jīng)連接在IOA0~IOA2上</p><p> //
74、 IOB的高八位接數(shù)碼管的段選,低四位的IOB7~4接位選</p><p> //======================================================</p><p> //======================================================</p><p> //
75、文件名稱:main.c</p><p> // 功能描述:主程序</p><p> //======================================================</p><p> #include "spce061a.h"</p><p> #include "So
76、und.h"</p><p> #include "Key.h"</p><p> #include "Clock.h"</p><p> #include "Clock_Speech.h"</p><p> #include "Clock_Adjust.
77、h"</p><p> #include "Clock_display.h"</p><p> typedef struct STR_ALARM// 定義鬧鐘結(jié)構(gòu)體</p><p><b> {</b></p><p> unsigned int Hour;</p
78、><p> unsigned int Min;</p><p> unsigned int Sec;</p><p><b> }ALARM;</b></p><p> ALARM Alarm = {9, 41, 0};// 鬧鐘初始值9點41分0秒</p><p> //=====
79、========================================================</p><p> // 語法格式:unsigned int SetHour(unsigned int Hour);</p><p> // 實現(xiàn)功能:設(shè)置小時</p><p> // 參數(shù):Hour - 設(shè)置前的時</p>&
80、lt;p> // 返回值:設(shè)置后的時</p><p> //=============================================================</p><p> unsigned int SetHour(unsigned int Hour)</p><p><b> {</b></
81、p><p> unsigned int KeyCode;</p><p> unsigned int TempHour = Hour;</p><p> PlayHour(TempHour);// 播報設(shè)置小時數(shù)</p><p><b> while(1)</b></p><p&g
82、t;<b> {</b></p><p> *P_Watchdog_Clear = 0x01;</p><p> KeyCode = Key_Get();</p><p> switch(KeyCode)</p><p><b> {</b></p><p> c
83、ase KEY_1:</p><p> return TempHour;// Key1,返回設(shè)置后的小時</p><p> case KEY_2:</p><p> TempHour++;// Key2,時數(shù)加1,到23后回復(fù)為0</p><p> if(TempHour>23) TempHour = 0
84、;</p><p> PlayHour(TempHour);</p><p><b> break;</b></p><p> case KEY_3:</p><p> if(TempHour==0) TempHour = 23;// Key3,時數(shù)減1,到0后回復(fù)為23</p><p&g
85、t; else TempHour--;</p><p> PlayHour(TempHour);</p><p><b> break;</b></p><p><b> default:</b></p><p><b> break;</b></p>
86、<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //=============================================================</p><
87、p> // 語法格式:unsigned int SetMin(unsigned int Min);</p><p> // 實現(xiàn)功能:設(shè)置分</p><p> // 參數(shù):Min - 設(shè)置前的分</p><p> // 返回值:設(shè)置后的分</p><p> //===========================
88、==================================</p><p> unsigned int SetMin(unsigned int Min)</p><p><b> {</b></p><p> unsigned int KeyCode;</p><p> unsigned int Tem
89、pMin = Min;</p><p> PlayNum(TempMin);// 播報調(diào)整前的分鐘數(shù)</p><p> PlaySnd(S_Fen);</p><p><b> while(1)</b></p><p><b> {</b></p><p&
90、gt; *P_Watchdog_Clear = 0x01;</p><p> KeyCode = Key_Get();</p><p> switch(KeyCode)</p><p><b> {</b></p><p> case KEY_1:</p><p> return Te
91、mpMin;// Key1,返回調(diào)整后的分</p><p> case KEY_2:</p><p> TempMin++;// Key2,分鐘數(shù)加1,到59后變?yōu)?</p><p> if(TempMin>59) TempMin = 0;</p><p> PlayNum(TempMin);</
92、p><p> PlaySnd(S_Fen);</p><p><b> break;</b></p><p> case KEY_3:</p><p> if(TempMin==0) TempMin = 59;// Key3,分鐘數(shù)減1,到0后變?yōu)?9</p><p> else Tem
93、pMin--;</p><p> PlayNum(TempMin);</p><p> PlaySnd(S_Fen);</p><p><b> break;</b></p><p><b> default:</b></p><p><b> break
94、;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //======================================================
95、=======</p><p> // 語法格式:unsigned int SetSec(unsigned int Sec);</p><p> // 實現(xiàn)功能:設(shè)置秒</p><p> // 參數(shù):Sec - 設(shè)置前的秒</p><p> // 返回值:設(shè)置后的秒</p><p> //====
96、=========================================================</p><p> unsigned int SetSec(unsigned int Sec)</p><p><b> {</b></p><p> unsigned int KeyCode;</p><
97、p> unsigned int TempSec = Sec;</p><p> PlaySec(TempSec);// 播報調(diào)整前的秒數(shù)</p><p><b> while(1)</b></p><p><b> {</b></p><p> *P_Watchdog
98、_Clear = 0x01;</p><p> KeyCode = Key_Get();</p><p> switch(KeyCode)</p><p><b> {</b></p><p> case KEY_1:</p><p> return TempSec;// K
99、ey1,返回調(diào)整后的秒</p><p> case KEY_2:</p><p> TempSec++;// Key2,秒加1,到59后變?yōu)?</p><p> if(TempSec>59) TempSec = 0;</p><p> PlaySec(TempSec);</p><p>&l
100、t;b> break;</b></p><p> case KEY_3:</p><p> if(TempSec==0) TempSec = 59;// Key3,秒減1,到0后變?yōu)?9</p><p> else TempSec--;</p><p> PlaySec(TempSec);</p>
101、<p><b> break;</b></p><p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b&g
102、t;</p><p><b> }</b></p><p> //=============================================================</p><p> // 語法格式:void Adjust(void);</p><p> // 實現(xiàn)功能:設(shè)置時間<
103、;/p><p><b> // 參數(shù):無</b></p><p> // 返回值:無</p><p> //=============================================================</p><p> void Set()</p><p>
104、;<b> {</b></p><p> Alarm.Hour = SetHour(Alarm.Hour);// 設(shè)置時</p><p> Alarm.Min = SetMin(Alarm.Min); // 設(shè)置分</p><p> Alarm.Sec = SetSec(Alarm.Sec); // 設(shè)置
105、秒</p><p> PlaySnd(S_DING);// 播報設(shè)置后的時間(Clock_Speech.c)</p><p> PlayHour(Alarm.Hour);</p><p> PlayMin(Alarm.Min);</p><p> PlaySec(Alarm.Sec);</p><
106、p><b> }</b></p><p> //=============================================================</p><p> // 語法格式:int main(void);</p><p> // 實現(xiàn)功能:主函數(shù)</p><p><
107、b> // 參數(shù):無</b></p><p> // 返回值:無</p><p> //=============================================================</p><p> int main()</p><p><b> 3{</b&g
108、t;</p><p> unsigned int KeyCode;</p><p> unsigned int Flag = 0;</p><p> unsigned int Flag1 = 0;</p><p> Key_Init();// 初始化按鍵掃描程序(Key.asm)</p><p&
109、gt; Clock_Start();// 初始化計時程序(Clock.c)</p><p><b> while(1)</b></p><p><b> {</b></p><p> KeyCode = Key_Get();// 獲取按鍵值(Key.asm)</p>&l
110、t;p> switch(KeyCode)</p><p><b> {</b></p><p> case KEY_1:</p><p> if(Flag==0)</p><p><b> {</b></p><p> PlayTime();
111、 //按Key1第一次,播報時間(Clock_Speech.c)</p><p><b> Flag = 1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {<
112、;/b></p><p> Set(); //按Key1第二次,調(diào)整鬧鐘(main.c) </p><p><b> Flag = 0;</b></p><p><b> }</b></p><p><b> break;&l
113、t;/b></p><p> case KEY_LONG_1:// Key1鍵長按,調(diào)整日期和時間(Clock_Adjust.c)</p><p><b> Adjust();</b></p><p><b> break;</b></p><p> case KEY_2:
114、 </p><p> { //按Key2鍵,播報日期(Clock_Speech.c)</p><p> PlayDate();</p><p><b> }</b></p><p><b> break;</b><
115、/p><p> case KEY_3: //按Key3鍵,播報鬧鐘時間</p><p><b> {</b></p><p> PlaySnd(S_DING);</p><p> PlayHour(Alarm.Hour);</p><p>
116、; PlayMin(Alarm.Min);</p><p> PlaySec(Alarm.Sec);</p><p><b> }</b></p><p><b> break;</b></p><p><b> default:</b></p>&
117、lt;p><b> break;</b></p><p><b> }</b></p><p> if(Clock_GetSec()/5)</p><p> display(Clock_GetHour(),Clock_GetMin(),Clock_GetSec());</p><p>
118、<b> else</b></p><p> displaydata(Clock_GetYear(),Clock_GetMon(),Clock_GetDay());</p><p> if(Alarm.Hour==Clock_GetHour()) //如果達到設(shè)定時間 鬧鈴響最長一分鐘</p><p> if
119、(Alarm.Min==Clock_GetMin())</p><p> if(Alarm.Sec==Clock_GetSec())</p><p> for(Flag1=0;Flag1<=25;Flag1++)</p><p><b> {</b></p><p> PlaySnd(S_s);</p
120、><p> if(Key_Get()==KEY_1) //如果按Key1鍵,停止鬧鈴</p><p><b> Flag1=26;</b></p><p> *P_Watchdog_Clear = 0x01;</p><p><b> }</b></p>&l
121、t;p> *P_Watchdog_Clear = 0x01;// 清看門狗</p><p> *P_SystemClock = 0x001F;// 進入睡眠模式</p><p><b> }</b></p><p><b> }</b></p><p><b&
122、gt; 顯示函數(shù)部分:</b></p><p> //======================================================</p><p> // 文件名稱:Clock_Display.c</p><p> // 功能描述:調(diào)整日期和時間的函數(shù)集</p><p> //====
123、==================================================</p><p> #include"spce061a.h"</p><p> #include "Key.h"</p><p> static int LED1[10] = {0xfcfb,0x60fb,0xdafb,0
124、xf2fb,0x66fb,0xb6fb,0xbefb,0xe0fb,0xfefb,0xf6fb};</p><p> static int LED2[10] = {0xfcf7,0x60f7,0xdaf7,0xf2f7,0x66f7,0xb6f7,0xbef7,0xe0f7,0xfef7,0xf6f7};</p><p> static int LED3[10] = {0xfdef,0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論