語音鬧鐘及定時器(完整版附圖)_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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

提交評論