單片機(jī)應(yīng)用課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告-電子時(shí)鐘_第1頁(yè)
已閱讀1頁(yè),還剩24頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  單片機(jī)應(yīng)用課程設(shè)計(jì)</b></p><p><b>  ——電子時(shí)鐘</b></p><p><b>  一、設(shè)計(jì)任務(wù)及要求</b></p><p><b>  【電子時(shí)鐘】</b></p><p>  利用實(shí)驗(yàn)板上4個(gè)LED

2、數(shù)碼管,設(shè)計(jì)帶有鬧鈴功能的數(shù)字時(shí)鐘,要求:</p><p>  1、在4位數(shù)碼管上顯示當(dāng)前時(shí)間。顯示格式“時(shí)時(shí)分分”;”</p><p>  2、由LED閃動(dòng)做秒顯示;</p><p>  3、利用按鍵可對(duì)時(shí)間及鬧玲進(jìn)行設(shè)置,并可顯示鬧玲時(shí)間。當(dāng)鬧玲時(shí)間到蜂鳴器發(fā)出聲響,按停止鍵使可使鬧玲聲停止。</p><p><b>  拓展設(shè)

3、計(jì):</b></p><p>  用數(shù)碼管的小數(shù)點(diǎn)閃動(dòng)替代二極管顯示秒,使之成為一個(gè)“完整的時(shí)鐘”;</p><p>  2、使數(shù)字時(shí)鐘的鬧鐘鈴聲為音樂(lè)。</p><p><b>  二、設(shè)計(jì)思路</b></p><p>  【工作原理及設(shè)計(jì)思路】</p><p>  計(jì)時(shí)功能利用單片

4、機(jī)的定時(shí)器來(lái)完成,由于定時(shí)器定時(shí)的時(shí)長(zhǎng)有限,所以要利用中斷程序才能定時(shí)1秒,若中斷程序每隔5ms中斷一次并當(dāng)作一個(gè)計(jì)數(shù),則每中斷一次計(jì)數(shù)加1,當(dāng)計(jì)數(shù)200次時(shí),則表示1s到了,秒變量加1,同理再判斷1min是否到了,再判斷1h是否到了。</p><p>  為了將時(shí)間在LED數(shù)碼管上顯示,可采用靜態(tài)顯示法和動(dòng)態(tài)顯示法,由于靜態(tài)顯示法需要數(shù)據(jù)鎖存器等較多硬件,可采用動(dòng)態(tài)顯示法實(shí)現(xiàn)LED顯示。</p>

5、<p>  鬧鈴聲由交流蜂鳴器產(chǎn)生,所以當(dāng)鬧鈴時(shí)間和當(dāng)前時(shí)間相等時(shí),可以對(duì)蜂鳴器輸入方波信號(hào),蜂鳴器就會(huì)發(fā)出聲音。</p><p><b>  三、設(shè)計(jì)分析</b></p><p><b>  【系統(tǒng)的主要功能】</b></p><p>  本實(shí)驗(yàn)實(shí)際是設(shè)計(jì)一個(gè)電子表,可以顯示時(shí)和分,并且用一個(gè)二極管顯示秒。另外

6、,還可以對(duì)它進(jìn)行時(shí)間調(diào)整,還要有鬧鈴功能。</p><p><b>  【所作題目的意義】</b></p><p>  時(shí)鐘電路在各個(gè)系統(tǒng)中都起著十分重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。同時(shí)時(shí)鐘電路整體的設(shè)計(jì)及其工作原理涉及到了單片機(jī)基礎(chǔ)課程中各章節(jié)的內(nèi)容,是對(duì)單片機(jī)理論基礎(chǔ)課程的一個(gè)綜合實(shí)踐,通過(guò)本課題不僅讓我對(duì)電子時(shí)鐘這一課題有更深入的了解,更加深了自己對(duì)單片機(jī)

7、課程整體知識(shí)的把握,將理論所學(xué)用于實(shí)踐,將知識(shí)綜合,達(dá)到融會(huì)貫通的高度。</p><p>  【硬件電路設(shè)計(jì)及描述】</p><p>  實(shí)驗(yàn)用JD51開(kāi)發(fā)板完成,本實(shí)驗(yàn)的硬件包括顯示部分、鬧鈴部分、開(kāi)關(guān)部分。</p><p><b>  ·顯示部分</b></p><p>  JD51上用于顯示部分的電路如下

8、圖:</p><p>  JD51上有四位共陽(yáng)LED數(shù)碼管,其標(biāo)號(hào)分別為L(zhǎng)ED1—LED4,低電平選通,且任何時(shí)候僅有一位輸出低電平,顯示時(shí)對(duì)各顯示器進(jìn)行動(dòng)態(tài)掃描,顯示器分時(shí)輪流工作。雖然每次只有一個(gè)顯示器顯示,但是由于人的視覺(jué)暫留現(xiàn)象我們?nèi)詴?huì)感覺(jué)所有的顯示器都在同時(shí)顯示。P0口作為輸出口控制8個(gè)發(fā)光二極管的亮滅,控制數(shù)碼管的顯示。</p><p><b>  ·鬧鈴部

9、分</b></p><p>  蜂鳴器與P2.4口相連。</p><p><b>  ·開(kāi)關(guān)部分</b></p><p>  本實(shí)驗(yàn)中的開(kāi)關(guān)是實(shí)驗(yàn)儀上的四個(gè)邏輯開(kāi)關(guān),它們分別與P3.2、P3.3、P3.4、P3.5相連。其總P3.2用于調(diào)整時(shí)鐘或鬧鐘的時(shí),P3.3用于調(diào)整時(shí)鐘或鬧鐘的分,P3.5用于控制顯示時(shí)鐘還是顯示鬧鐘

10、,并且同時(shí)控制調(diào)整時(shí)鐘還是調(diào)整鬧鐘,按任意鍵(SW1、SW2、SW4)時(shí)停止鬧鐘。</p><p>  【軟件設(shè)計(jì)流程及描述】</p><p><b>  ·顯示部分</b></p><p>  顯示部分分為時(shí)鐘顯示、鬧鐘顯示和秒顯示三部分,主要由時(shí)鐘顯示子程序和鬧鐘顯示子程序構(gòu)成,鬧鐘顯示與時(shí)鐘顯示編程流程大致相同。</p&g

11、t;<p><b>  流程圖如下:</b></p><p><b>  ·鬧鈴部分</b></p><p>  設(shè)計(jì)思路及原理:音節(jié)由不同頻率的方波產(chǎn)生,音節(jié)與頻率的關(guān)系如下表所示。要產(chǎn)生音頻方波,設(shè)計(jì)利用延時(shí)來(lái)建立音符表NOTE,表格中的數(shù)存R3*20us,其倒數(shù)1/(R3*2*10us)對(duì)應(yīng)相應(yīng)音符的頻率。</

12、p><p>  另外,音樂(lè)的節(jié)拍是由延時(shí)實(shí)現(xiàn)的,如果1拍為0.4秒,1/4拍是0.1秒。只要設(shè)定延時(shí)時(shí)間,就可求得節(jié)拍的時(shí)間。延時(shí)作為基本延時(shí)時(shí)間,節(jié)拍值只能是它的整數(shù)倍。設(shè)計(jì)利用T1中斷產(chǎn)生10ms延時(shí),取1/4拍為10H*10ms,相應(yīng)產(chǎn)生所需延時(shí)。 </p><p>  鬧鐘鈴聲選取情景比較合適的《豬之歌》,其曲譜如下圖:</p><p>  其相應(yīng)的音符和節(jié)拍表

13、NOTE和METRE如下:</p><p>  NOTE:DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72H</p><p>  DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FH</p><p>  DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,7

14、2H</p><p>  DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,72H,4CH,55H,00H</p><p>  METRE:DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H</p><p>  DB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H

15、,80H</p><p>  DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H</p><p>  DB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40H</p><p>  ·開(kāi)關(guān)掃描及處理部分</p><p>  本實(shí)驗(yàn)用到了三個(gè)開(kāi)關(guān),其中涉及開(kāi)關(guān)

16、的掃描及處理。開(kāi)關(guān)4控制數(shù)碼管當(dāng)前顯示的是時(shí)鐘還是鬧鐘,顯示時(shí)鐘時(shí),可通過(guò)開(kāi)關(guān)1和開(kāi)關(guān)2調(diào)整時(shí)鐘的時(shí)和分;顯示鬧鐘時(shí),也可以通過(guò)開(kāi)關(guān)1和開(kāi)關(guān)2調(diào)整時(shí)和分。開(kāi)關(guān)4控制鬧鈴的開(kāi)和關(guān)。</p><p>  按鍵調(diào)整鬧鐘與按鍵調(diào)整時(shí)鐘編程流程基本一致,按鍵掃描及處理流程圖如圖:</p><p>  ·T0中斷服務(wù)程序:</p><p>  采用定時(shí)器T0計(jì)時(shí),中斷

17、程序每隔50ms中斷一次計(jì)數(shù)加1,當(dāng)計(jì)數(shù)20次時(shí),則表示1s到了,秒變量加1,同理再判斷是否1分鐘到了,再判斷是否1小時(shí)到了,再判斷是否24小時(shí)到了。</p><p><b>  程序流程圖如下:</b></p><p>  三、源程序代碼及注釋</p><p>  ;**************************************

18、**************</p><p>  ;/******電子時(shí)鐘程序******/ </p><p>  ;程序主要包括MAIN函數(shù),T0、T1中斷程序,時(shí)間、鬧鐘顯示程序 ,按鍵掃描、處理程序</p><p>  ;**************************************************** </p>

19、<p><b>  ORG 0000H</b></p><p>  AJMP MAIN ;跳轉(zhuǎn)到主程序MAIN執(zhí)行</p><p><b>  ORG 000BH</b></p><p>  AJMP INTT0 ;跳到INTT0執(zhí)行</p>

20、<p><b>  ORG 001BH</b></p><p>  LJMP INTT1 ;跳到INTT1執(zhí)行</p><p><b>  ORG 0300H</b></p><p>  ;/******主函數(shù)******/預(yù)置T0\T1工作方式,置初值,預(yù)置時(shí)鐘、鬧鐘,置位數(shù)碼管<

21、;/p><p>  MAIN:MOV SP,#80H</p><p>  MOV TMOD,#11H ;設(shè)置定時(shí)器T0、T1工作于方式1</p><p>  MOV TH0,#3CH ;裝入時(shí)鐘定時(shí)初值(50ms)</p><p>  MOV TL0,#0B0H </p><p&g

22、t;  MOV TH1,#0D8H ;裝入鬧鈴定時(shí)初值(10ms)</p><p>  MOV TL1,#0F0H</p><p>  MOV R1,#00H ;確保首次默認(rèn)鬧鈴工作</p><p>  MOV 20H,#00H </p><p>  MOV 21H,#00H

23、 </p><p>  MOV 22H,#00H ;預(yù)置時(shí)鐘分分</p><p>  MOV 23H,#00H ;預(yù)置時(shí)鐘時(shí)時(shí)</p><p>  MOV 30H,#30H ;預(yù)置鬧鈴分分</p><p>  MOV 31H,#08H ;預(yù)置鬧鈴時(shí)時(shí)</p><

24、p>  SETB P2.0 ;數(shù)碼管接P2口,置位數(shù)碼管,使其全滅</p><p><b>  SETB P2.1</b></p><p><b>  SETB P2.2</b></p><p>  SETB P2.3</p><p>  CLR P1.7

25、 ;發(fā)光二極管LED7\LED8用于顯示秒,清P1.7,發(fā)光二極管LED8亮</p><p>  SETB P1.6 ;置位P1.6,發(fā)光二極管LED7滅</p><p>  SETB EA ;開(kāi)放總中斷</p><p>  SETB ET0

26、 ;允許T0中斷</p><p>  SETB TR0 ;開(kāi)啟定時(shí)器T0</p><p>  LOOP:LCALL DISPT ;調(diào)用時(shí)間顯示子程序</p><p>  LCALL RING ;調(diào)用鬧鈴處理子程序</p><p>  LCALL KEY ;調(diào)用按鍵掃描子

27、程序</p><p>  JZ LOOP ;無(wú)鍵按下則循環(huán)</p><p>  LCALL CASE ;有鍵按下則轉(zhuǎn)按鍵處理子程序執(zhí)行</p><p>  SJMP LOOP ;循環(huán)</p><p>  ;/******T0一秒定時(shí)中斷程序INTT0******/正常時(shí)

28、鐘計(jì)時(shí)</p><p>  INTT0:PUSH PSW ;狀態(tài)字入棧保護(hù)</p><p>  PUSH ACC ;累加器入棧保護(hù)</p><p>  MOV TL0,#0B0H ;裝入計(jì)數(shù)初值,12MHZ晶振,形成1S中斷</p><p>  MOV TH0,

29、#3CH</p><p><b>  INC 20H</b></p><p><b>  MOV A,20H</b></p><p>  CJNE A,#20,RETURN</p><p>  CPL P1.7 ;一秒到發(fā)光二極管輪流亮,用于顯示秒</p>

30、<p><b>  CPL P1.6</b></p><p>  MOV 20H,#00H ;一秒到清20H</p><p><b>  MOV A,21H</b></p><p>  ADD A,#01H</p><p><b>  DA A</b>&l

31、t;/p><p><b>  MOV 21H,A</b></p><p>  CJNE A,#60H,RETURN</p><p>  MOV 21H,#00H ;一分到,21H單元清零</p><p><b>  MOV A,22H</b></p><p>  ADD

32、 A,#01H</p><p><b>  DA A</b></p><p><b>  MOV 22H,A</b></p><p>  CJNE A,#60H,RETURN</p><p>  MOV 22H,#00H ;一小時(shí)到,22H單元清零</p><p>

33、;<b>  MOV A,23H</b></p><p>  ADD A,#01H</p><p><b>  DA A</b></p><p><b>  MOV 23H,A</b></p><p>  CJNE A,#24H,RETURN</p><p&

34、gt;  MOV 23H,#00H ;滿(mǎn)24,23H單元清零</p><p>  RETURN:POP ACC</p><p><b>  POP PSW</b></p><p><b>  RETI</b></p><p>  ;/******時(shí)間顯示子程序******/</p

35、><p>  DISPT:MOV A,22H</p><p>  ANL A,#0FH</p><p>  MOV 2AH,A ;時(shí)鐘分的低位</p><p><b>  MOV A,22H</b></p><p>  ANL A,#0F0H</p><p&g

36、t;<b>  SWAP A</b></p><p>  MOV 2BH,A ;時(shí)鐘分的高位</p><p><b>  MOV A,23H</b></p><p>  ANL A,#0FH</p><p>  MOV 2CH,A ;時(shí)鐘時(shí)的低位</p&

37、gt;<p><b>  MOV A,23H</b></p><p>  ANL A,#0F0H</p><p><b>  SWAP A</b></p><p>  MOV 2DH,A ;時(shí)鐘時(shí)的高位</p><p>  LED1:SETB P2.3</p

38、><p><b>  MOV A,2DH</b></p><p>  MOV DPTR,#TAB</p><p>  MOVC A,@A+DPTR </p><p>  CLR P2.0 ;選通數(shù)碼管1</p><p>  MOV P0,A

39、;顯示時(shí)鐘時(shí)的十位部分</p><p>  LCALL DELAY</p><p>  LED2:SETB P2.0</p><p><b>  MOV A,2CH</b></p><p>  MOV DPTR,#TAB</p><p>  MOVC A,@A+DPTR </p>

40、<p>  CLR P2.1 ;選通數(shù)碼管2</p><p>  MOV P0,A ;顯示時(shí)鐘時(shí)的個(gè)位部分</p><p>  LCALL DELAY </p><p>  LED3:SETB P2.1</p><p><b>  MOV A,2BH&l

41、t;/b></p><p>  MOV DPTR,#TAB</p><p>  MOVC A,@A+DPTR </p><p>  CLR P2.2 ;選通數(shù)碼管3</p><p>  MOV P0,A ;顯示時(shí)鐘分的十位部分</p><p>  LCA

42、LL DELAY</p><p>  LED4:SETB P2.2</p><p><b>  MOV A,2AH</b></p><p>  JB P1.7,TA2</p><p>  TA1: ADD A,#10 ;用于利用數(shù)碼管的小數(shù)點(diǎn)來(lái)表示秒</p><p&g

43、t;  TA2: MOV DPTR,#TAB</p><p>  MOVC A,@A+DPTR</p><p>  CLR P2.3 ;選通數(shù)碼管4</p><p>  MOV P0,A ;顯示時(shí)鐘分的個(gè)位部分</p><p>  LCALL DELAY</p>

44、<p><b>  RET</b></p><p>  TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共陽(yáng)數(shù)碼管的不帶小數(shù)點(diǎn)的時(shí)間顯示碼</p><p>  DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;共陽(yáng)數(shù)碼管的帶小數(shù)點(diǎn)的時(shí)間顯示碼</p>

45、<p>  ;/******按鍵掃描程序******/開(kāi)關(guān)接P3口,判斷按鍵情況</p><p>  KEY: MOV P3,#0FFH </p><p><b>  MOV A,P3</b></p><p><b>  CPL A</b></p><p>  ANL A,#2CH<

46、;/p><p>  JZ RETK ;無(wú)鍵按下則返回</p><p>  LCALL DELAY ;延時(shí)消抖</p><p><b>  MOV A,P3</b></p><p><b>  CPL A</b></p><p>  ANL A,#2C

47、H</p><p>  JZ RETK ;鍵盤(pán)去抖動(dòng)</p><p>  MOV R6,A ;將鍵值存入R6</p><p>  LOOP1:LCALL DISPT;</p><p><b>  MOV A,P3</b></p><p><b>  CP

48、L A</b></p><p>  ANL A,#2CH</p><p>  JNZ LOOP1 ;等待鍵釋放</p><p><b>  MOV A,R6</b></p><p><b>  RETK:RET</b></p><p>  ;/

49、******按鍵處理子程序******/根據(jù)按鍵情況進(jìn)行處理</p><p>  CASE:MOV A,R6</p><p>  CLR P1.0 ;發(fā)光二極管LED1亮</p><p>  JB ACC.2,SETH ;轉(zhuǎn)調(diào)整時(shí)</p><p>  JB ACC.3,SETM ;轉(zhuǎn)調(diào)整分&

50、lt;/p><p>  JB ACC.5,SETR ;轉(zhuǎn)鬧鈴設(shè)置</p><p>  WAITCASE:LCALL DISPT ;無(wú)鍵按下時(shí)等待</p><p><b>  LCALL KEY</b></p><p>  JZ WAITCASE</p><p>  ;/******

51、時(shí)間調(diào)整程序******/按鍵調(diào)整時(shí)間</p><p>  SETT:LCALL DISPT</p><p><b>  LCALL KEY</b></p><p><b>  JZ SETT</b></p><p><b>  MOV A,R6</b></p>

52、<p>  JB ACC.2,SETH</p><p>  JB ACC.3,SETM</p><p>  JB ACC.5,KEYGO ;第二次按為確認(rèn)離開(kāi)</p><p>  KEYGO: SETB P1.0 ;發(fā)光二極管LED1、LED2滅</p><p><b>

53、  SETB P1.1</b></p><p><b>  RET</b></p><p>  SETH:MOV A,23H ;調(diào)整時(shí)鐘時(shí),時(shí)加1</p><p>  ADD A,#01H</p><p>  DA A ;十進(jìn)制調(diào)整<

54、;/p><p><b>  MOV 23H,A</b></p><p>  CJNE A,#24H,HD ;判斷是否到24,不到繼續(xù)</p><p>  MOV 23H,#00H ;到24時(shí)清零</p><p>  HD:LJMP SETT</p>&l

55、t;p>  SETM:MOV A,22H ;分加1</p><p>  ADD A,#01H</p><p>  DA A ;十進(jìn)制調(diào)整 </p><p><b>  MOV 22H,A</b></p><p>  CJNE A,#60H,MD

56、 ;判斷是否到1小時(shí),不到繼續(xù)</p><p>  MOV 22H,#00H ;到1小時(shí)則清零</p><p>  MD:LJMP SETT</p><p>  ;/******鬧鈴時(shí)間調(diào)整按鍵掃描及處理子程序******/</p><p>  KEYR: MOV P3,#0FFH

57、</p><p><b>  MOV A,P3</b></p><p><b>  CPL A</b></p><p>  ANL A,#2CH</p><p>  JZ RETK ;無(wú)鍵按下則返回</p><p>  LCALL DISPR

58、 ;延時(shí)消抖</p><p><b>  MOV A,P3</b></p><p><b>  CPL A</b></p><p>  ANL A,#2CH</p><p>  JZ RETK ;鍵盤(pán)去抖動(dòng)</p><p>  MOV R6,A

59、 ;將鍵值存入R6</p><p>  LJMP LOOPR</p><p>  LOOPR:LCALL DISPR</p><p><b>  MOV A,P3</b></p><p><b>  CPL A</b></p><p>  ANL A,#2CH&l

60、t;/p><p>  JNZ LOOPR ;等待鍵釋放</p><p><b>  MOV A,R6</b></p><p><b>  AJMP RETK</b></p><p>  ;/******設(shè)置鬧鈴時(shí)間******/</p><p>  SETR:

61、SETB P1.0 ;發(fā)光二極管LED1滅</p><p>  CLR P1.1 ;發(fā)光二極管LED2亮,改顯示狀態(tài)</p><p>  LCALL DISPR</p><p>  MOV R1,#00H ;設(shè)置鬧鐘時(shí)重設(shè)R1,用于檢測(cè)鬧鈴播放與否</p><

62、p>  MOV 53H,#03H ;重設(shè)鬧鈴次數(shù)</p><p>  LCALL KEYR ;鬧鈴時(shí)間調(diào)整按鍵檢測(cè)</p><p><b>  JZ SETR</b></p><p><b>  MOV A,R6</b></p><p>  JB A

63、CC.2,SETRH</p><p>  JB ACC.3,SETRM</p><p>  JB ACC.5,KEYGO ;第二次按為確認(rèn)離開(kāi)</p><p>  SETRH:MOV A,31H ;鬧鐘時(shí)加1</p><p>  ADD A,#01H</p><p>  DA A

64、 ;十進(jìn)制調(diào)整</p><p><b>  MOV 31H,A</b></p><p>  CJNE A,#24H,RHD ;判斷是否到24,不到繼續(xù)</p><p>  MOV 31H,#00H ;到24時(shí)則清零</p><p

65、>  RHD:LJMP SETR</p><p>  SETRM:MOV A,30H ;鬧鐘分加1</p><p>  ADD A,#01H</p><p>  DA A ;十進(jìn)制調(diào)整</p><p><b>  MOV 30H,A</b><

66、/p><p>  CJNE A,#60H,RMD ;判斷是否到1小時(shí),不到繼續(xù)</p><p>  MOV 30H,#00H ;到1小時(shí)則清零</p><p>  RMD:LJMP SETR</p><p>  ;/******鬧鐘設(shè)置顯示子程序******/</p><

67、p>  DISPR:MOV A,30H</p><p>  ANL A,#0FH ;屏蔽高四位</p><p>  MOV 3AH,A ;保留低位送3AH</p><p><b>  MOV A,30H</b></p><p>  ANL A,#0

68、F0H ;屏蔽低四位 </p><p>  SWAP A ;高四位與第四位交換</p><p>  MOV 3BH,A ;將保留的高4位送3BH</p><p><b>  MOV A,31H</b></p><p>  

69、ANL A,#0FH</p><p>  MOV 3CH,A ;低位</p><p><b>  MOV A,31H</b></p><p>  ANL A,#0F0H</p><p><b>  SWAP A</b></p><p>  MOV 3DH,A

70、 ;高位</p><p>  LEDR1:SETB P2.3</p><p><b>  MOV A,3DH</b></p><p>  MOV DPTR,#TAB</p><p>  MOVC A,@A+DPTR </p><p><b>  CLR P2.

71、0</b></p><p><b>  MOV P0,A</b></p><p>  LCALL DELAY</p><p>  LEDR2:SETB P2.0</p><p><b>  MOV A,3CH</b></p><p>  MOV DPTR,#TA

72、B</p><p>  MOVC A,@A+DPTR </p><p><b>  CLR P2.1</b></p><p><b>  MOV P0,A</b></p><p>  LCALL DELAY</p><p>  LEDR3:SETB P2.1</p&g

73、t;<p><b>  MOV A,3BH</b></p><p>  MOV DPTR,#TAB</p><p>  MOVC A,@A+DPTR </p><p><b>  CLR P2.2</b></p><p><b>  MOV P0,A</b><

74、;/p><p>  LCALL DELAY</p><p>  LEDR4:SETB P2.2</p><p><b>  MOV A,3AH</b></p><p>  MOV DPTR,#TAB</p><p>  MOVC A,@A+DPTR </p><p><

75、b>  CLR P2.3</b></p><p><b>  MOV P0,A</b></p><p>  LCALL DELAY</p><p><b>  RET</b></p><p>  ;/******延時(shí)子程序******/</p><p>  

76、DELAY:MOV R5,#2 </p><p>  D1:MOV R4,#250</p><p>  D2:DJNZ R4,D2</p><p>  DJNZ R5,D1</p><p><b>  RET</b></p><p>  ;/******鬧鈴

77、檢測(cè)程序******/</p><p>  RING:MOV A,23H ;比較時(shí)</p><p>  CJNE A,31H,RETR</p><p>  MOV A,22H ;比較分</p><p>  CJNE A,30H,RETR </p&g

78、t;<p>  LCALL SING</p><p><b>  RETR:RET</b></p><p>  ;/******定時(shí)器T1中斷子程序******/</p><p>  INTT1:PUSH PSW ;狀態(tài)字入棧保護(hù)</p><p>  PUSH AC

79、C ;累加器入棧保護(hù)</p><p>  INC 50H ;中斷服務(wù)程序,中斷計(jì)數(shù)器加1</p><p>  MOV TH1,#0D8H ;裝入計(jì)數(shù)初值,12M晶振,形成10MS中斷</p><p>  MOV TL1,#0F0H </p>

80、;<p><b>  POP ACC</b></p><p><b>  POP PSW</b></p><p><b>  RETI </b></p><p>  ;/******響鈴子程序******/</p><p>  SING:CJNE R1,#01

81、H,SING1 ;判斷是否已經(jīng)鬧鈴過(guò)一次</p><p><b>  LJMP RETS</b></p><p>  SING1:SETB ET1</p><p>  MOV 50H,#00H ;中斷計(jì)數(shù)器清0</p><p>  MOV 51H,#00H ;音符指針&l

82、t;/p><p>  MOV 52H,#00H ;節(jié)拍碼指針</p><p>  MOV 53H,#03H ;設(shè)置鬧鐘不退出響鈴次數(shù)</p><p>  GETNOT:MOV A,51H</p><p>  MOV DPTR,#NOTE ;表頭地址送DPTR</p>

83、;<p>  MOVC A,@A+DPTR ;查表取音符碼</p><p>  JZ ENDP ;是00H,則結(jié)束</p><p>  MOV R6,A ;存R6 </p><p><b>  INC 51H</b

84、></p><p>  CJNE A,#0FFH,GETMET ;不為0FFH,轉(zhuǎn)取節(jié)拍碼</p><p>  LJMP PAUSE ;轉(zhuǎn)休止播放</p><p>  LJMP GETNOT ;取音符碼</p><p>  GETMET:MOV

85、A,52H</p><p>  MOV DPTR,#METRE ;取節(jié)拍碼首地址</p><p>  MOVC A,@A+DPTR ;取節(jié)拍代碼送R7</p><p><b>  MOV R7,A</b></p><p><b>  INC 52H&l

86、t;/b></p><p>  PLAY:SETB TR1 ;啟動(dòng)計(jì)數(shù)</p><p><b>  CPL P2.4</b></p><p><b>  LCALL KEY</b></p><p><b>  JNZ RETS</b></p

87、><p>  MOV A,R6 </p><p>  MOV R3,A ;音符碼存R3</p><p>  LCALL DELAY1</p><p>  MOV A,R7 ;取節(jié)拍碼放A與中斷計(jì)數(shù)比較</p><p>

88、;  CJNE A,50H,PLAY ;斷計(jì)數(shù)器(50H)=R7否,不等繼續(xù)循環(huán)</p><p>  MOV 50H,#00H ;等于,則取下一代碼</p><p>  LCALL DISPT</p><p>  LCALL DISPT</p><p>  LCAL

89、L DISPT</p><p>  LCALL DISPT</p><p><b>  CLR TR1</b></p><p>  LJMP GETNOT</p><p>  RETS:SETB P2.4 ;置位蜂鳴器,否則可能產(chǎn)生嘯叫</p><p>  MOV R1,#01H

90、 ;表明播放過(guò)一次</p><p>  CLR A ;清除A,防止進(jìn)入按鍵處理子程序</p><p><b>  LJMP RETR</b></p><p>  PAUSE:CLR TR1 ;休止100毫秒</p><p>  MOV R2

91、,#0DH</p><p>  DELAY2: MOV R3,#0FFH</p><p>  LCALL DELAY1</p><p>  DJNZ R2,DELAY2</p><p><b>  RET</b></p><p>  ENDP:SETB P2.4</p><p

92、>  MOV R2,#0C7H ;歌曲結(jié)束,延時(shí)1秒后繼續(xù)</p><p>  END1M: MOV R3,#00H</p><p>  LCALL DELAY1</p><p>  DJNZ R2,END1M</p><p>  DJNZ 53H,SING</p><p><b> 

93、 RET</b></p><p>  DELAY1:NOP ;R3為01H時(shí),DELAY延時(shí)為20uS</p><p>  DELAY3: MOV R4,#02H </p><p>  DELAY4: DJNZ R4,DELAY4</p><p>  DJNZ R3,DELAY3</p>

94、<p><b>  RET</b></p><p>  NOTE:DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72H</p><p>  DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FH</p><p>  DB 7FH,7FH,7FH,60H

95、,65H,72H,72H,72H,7FH,72H</p><p>  DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,72H,4CH,55H,00H</p><p>  METRE:DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H</p><p>  DB 20H,20H,20H,20H,40H,2

96、0H,20H,20H,20H,20H,20H,80H</p><p>  DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H</p><p>  DB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40H</p><p><b>  END</b></p>

97、<p><b>  四、調(diào)試分析過(guò)程</b></p><p>  1、建立一個(gè)Keil51應(yīng)用程序</p><p>  首先新建一個(gè)工程項(xiàng)目文件zj,再為工程選擇目標(biāo)器件P80\P87C52X2,如圖所示。</p><p>  然后把源程序文件(.asm)添加到項(xiàng)目中.</p><p>  2、程序文件的編譯

98、、連接</p><p>  單擊工具欄Project選項(xiàng),在彈出的下拉菜單中選擇“Option For Target ‘Target1’”命令為目標(biāo)設(shè)置工具選項(xiàng),在Debug欄內(nèi)選中Use Simulator選項(xiàng),單擊確定命令按鈕,此時(shí)配置為軟件仿真,在Output欄中選擇Create HEX Fi選項(xiàng),用于生成HEX文件。</p><p>  經(jīng)過(guò)上述設(shè)置,就可以編譯程序了。單擊工具欄P

99、roject選項(xiàng),在彈出的下拉菜單中選擇Build Target命令對(duì)源程序文件進(jìn)行編譯,若出現(xiàn)下圖所示窗口,</p><p>  顯示無(wú)錯(cuò)誤,繼續(xù)進(jìn)行Rebuild all target fiels, 在信息輸出窗口會(huì)輸出一些相關(guān)的信息。第五行“Creating hex file from zj”說(shuō)明已生成目標(biāo)文件zj.hex,最后一行說(shuō)明在編譯過(guò)程中不存在錯(cuò)誤和警告,編譯連接成功。若在編譯過(guò)程中出現(xiàn)錯(cuò)誤,系統(tǒng)

100、會(huì)給出錯(cuò)誤所在的行和該錯(cuò)誤提示信息,我們可以根據(jù)這些提示信息更正程序中出項(xiàng)的錯(cuò)誤,重新編譯調(diào)試程序,直至完全正確為止。</p><p>  3、將生成的目標(biāo)文件last.hex下載到Flash中</p><p> ?、?運(yùn)行可執(zhí)行文件“SSTFlashFlex51.exe”。打開(kāi)界面如圖2所示。</p><p> ?、邳c(diǎn)擊菜單“DetectChip/RS232”-&

101、gt;“Detect Target MCU…and RS232 Config”。打開(kāi)界面如圖所示。</p><p> ?、鄹鶕?jù)板載單片機(jī)型號(hào)選擇“SST98C58”或“SST89E/V58RD2”。存儲(chǔ)器模式選“Internal Memory”。點(diǎn)擊確定。</p><p> ?、茉O(shè)置串行口參數(shù),如圖4所示。注意串口號(hào)應(yīng)選擇與學(xué)習(xí)板連接的端口,波特率選默認(rèn)值38400。其他不用改動(dòng)。按“De

102、tect MCU”。</p><p>  ⑤根據(jù)彈出的對(duì)話(huà)框操作:先按下“確定”,然后按一下學(xué)習(xí)板的復(fù)位按鈕SW1。(如果MCU已經(jīng)復(fù)位,可以不用按SW1,應(yīng)視乎軟件能否檢測(cè)到MCU決定)。如果軟件檢測(cè)到MCU則界面如圖5所示(因MCU狀況不同可能有差異)。</p><p> ?、撄c(diǎn)擊“IAP Function”中的“Dnload/Run UserCode”,在彈出對(duì)話(huà)框中輸入要下載的程序

103、名(hex后綴)。</p><p> ?、邚棾鰧?duì)話(huà)框問(wèn)是否覆蓋原來(lái)代碼,點(diǎn)擊“是”,程序代碼即下載到學(xué)習(xí)板的單片機(jī)中并開(kāi)始運(yùn)行。時(shí)鐘開(kāi)始運(yùn)行(預(yù)置的是00:00,用于顯示秒的LED7\8開(kāi)始閃爍)。</p><p><b>  4、在線(xiàn)調(diào)試</b></p><p> ?、龠x擇菜單“Project”->“Open Project”。選擇打開(kāi)

104、項(xiàng)目文件zj.Uv2。</p><p> ?、诖蜷_(kāi)項(xiàng)目后可看到源代碼。點(diǎn)擊左邊Project Workspace窗口的目錄樹(shù)最頂端的Target 1。</p><p>  然后選擇菜單“Project”->“Options for Target ‘Target 1’”。打開(kāi)窗口如圖所示。</p><p>  ③點(diǎn)擊“Debug”選項(xiàng)卡。打開(kāi)如圖所示界面,選擇右

105、邊“Use Keil Monitor-51 Driver”。選擇下面“Run to main()”復(fù)選框。然后點(diǎn)擊“Settings”按鈕。</p><p> ?、軓棾鰧?duì)話(huà)框中選擇串口號(hào)和波特率,串口號(hào)選擇與上文使用SST下載軟件時(shí)相同(如果串口連接沒(méi)有改變的話(huà)),波特率選擇38400。完成后點(diǎn)擊“確定”。再次點(diǎn)擊“確定”退出項(xiàng)目設(shè)置窗口。</p><p> ?、菰谥鹘缑嫔戏綀D標(biāo)按鈕處點(diǎn)擊

106、 按鈕。軟件即進(jìn)入仿真調(diào)試狀態(tài)。</p><p> ?、撄S色光標(biāo)停留在main函數(shù)的第一語(yǔ)句處。光標(biāo)下方紅色方塊為運(yùn)行斷點(diǎn),可以自行設(shè)置(雙擊黃色光標(biāo)下方的深灰色區(qū)域即可設(shè)置或取消斷點(diǎn))。</p><p>  ⑦按全速執(zhí)行按鈕 執(zhí)行程序,光標(biāo)將停留在預(yù)設(shè)的斷點(diǎn)處。接著可</p><p>  按單步執(zhí)行按鈕執(zhí)行斷點(diǎn)處的語(yǔ)句。</p><p> 

107、?、嗤?,可繼續(xù)設(shè)置斷點(diǎn)或全速執(zhí)行全部程序??稍谧雍瘮?shù)內(nèi)部設(shè)置斷點(diǎn),亦可使用 按鈕進(jìn)入某個(gè)子函數(shù)。</p><p> ?、崛绻酉聛?lái)沒(méi)有其他斷點(diǎn)而按全速運(yùn)行按鈕,MCU將全速運(yùn)行,軟件將不能再實(shí)時(shí)觀(guān)察到MCU的狀態(tài),此時(shí)可以觀(guān)察學(xué)習(xí)板的硬件運(yùn)行情況是否和設(shè)想的一致。</p><p> ?、膺M(jìn)入全速運(yùn)行后要停止操作須按停止按鈕 。彈出對(duì)話(huà)框中選擇“Stop Debugging”。退出仿真調(diào)試

108、狀態(tài)后若須重新仿真調(diào)試,請(qǐng)先復(fù)位學(xué)習(xí)板MCU(按學(xué)習(xí)板的SW1按鈕)。</p><p><b>  五、課程設(shè)計(jì)體會(huì)</b></p><p>  【實(shí)驗(yàn)中遇到的問(wèn)題及解決方案】</p><p>  1、首先是定時(shí)的問(wèn)題,一開(kāi)始我用的是查詢(xún)方式,但是查詢(xún)方式得不斷查詢(xún)TF0的值,很繁瑣。后來(lái)我改用了中斷方式,較簡(jiǎn)單。</p><

109、;p>  2、實(shí)驗(yàn)中按鍵掃描及處理部分困擾了我很久。我直接用JD51上的四個(gè)按鍵,其中三個(gè)用于調(diào)整時(shí)、分、顯示變化,它們分別接在P3.2、P3.3、P3.5口,第一個(gè)問(wèn)題是調(diào)整出現(xiàn)誤差,開(kāi)關(guān)存在抖動(dòng)現(xiàn)象,通過(guò)調(diào)用延時(shí)子程序、確認(rèn)按鍵程序消除開(kāi)關(guān)抖動(dòng)現(xiàn)象;同時(shí),由于延時(shí)太長(zhǎng),導(dǎo)致顯示出現(xiàn)閃爍或滅掉,最后解決的方法是在延時(shí)程序內(nèi)部也加入調(diào)用顯示程序的語(yǔ)句,這樣,顯示問(wèn)題也解決了。</p><p>  3、在數(shù)碼

110、管選通的問(wèn)題上一直很納悶,一直無(wú)法實(shí)現(xiàn)四個(gè)數(shù)碼管同時(shí)顯示的問(wèn)題,后拉試驗(yàn)以后才發(fā)現(xiàn)原來(lái)還存在視差問(wèn)題,可以讓四個(gè)數(shù)碼管在一一選通的條件下也能四個(gè)同時(shí)顯示。</p><p>  4、基本功能實(shí)現(xiàn)后,我繼續(xù)實(shí)現(xiàn)兩個(gè)拓展功能,在鬧鈴中加入了音樂(lè)、用數(shù)碼管小數(shù)點(diǎn)顯示秒,之后發(fā)現(xiàn)在響鈴過(guò)程中計(jì)時(shí)混亂,后來(lái)才發(fā)現(xiàn), T0本是用于秒計(jì)時(shí)的,結(jié)果在音樂(lè)子程序中又用了T0,造成了計(jì)時(shí)混亂。改用T1后,問(wèn)題便得到了修正。再有就是音樂(lè)

111、的實(shí)現(xiàn)通過(guò)在網(wǎng)上搜索相關(guān)資料,用頻率對(duì)應(yīng)的初值來(lái)產(chǎn)生相應(yīng)方波來(lái)翻譯曲譜,通過(guò)學(xué)長(zhǎng)的指導(dǎo)發(fā)現(xiàn)直接用延時(shí)來(lái)實(shí)現(xiàn)效果也很好,改用這個(gè)以后 比較適合鬧鐘鈴聲的《豬之歌》編程最終音樂(lè)。</p><p>  5、答辯時(shí)老師要求我加入用最后一位數(shù)碼管的小數(shù)點(diǎn)閃動(dòng)表示秒,為了更好的了解數(shù)碼顯示,我翻開(kāi)了微機(jī)原理書(shū),發(fā)現(xiàn)共陽(yáng)的數(shù)碼管,最高位為低電平時(shí)小數(shù)點(diǎn)就會(huì)亮,因此只要在程序中屏蔽或不屏蔽最高位,就能實(shí)現(xiàn)小數(shù)點(diǎn)的亮與滅。<

112、/p><p>  5、最后一步是時(shí)鐘的校準(zhǔn),起初時(shí)鐘走得較快,通過(guò)逐步調(diào)整延時(shí)數(shù)值,雖最終與理論值有所偏差,但實(shí)現(xiàn)了使誤差保持在1s之內(nèi)。</p><p>  6、在調(diào)試過(guò)程中很多語(yǔ)句總是出現(xiàn)一樣的錯(cuò)誤,后來(lái)發(fā)現(xiàn)是輸入法的問(wèn)題,通過(guò)修改很快通過(guò)了調(diào)試。</p><p><b>  【心得體會(huì)】</b></p><p>  通

113、過(guò)本次做單片機(jī)課程設(shè)計(jì),不僅對(duì)單片機(jī)理論課程的整體知識(shí)進(jìn)行了全面的認(rèn)識(shí)與深入的學(xué)習(xí),通過(guò)實(shí)踐將理論與實(shí)際進(jìn)行契合,真正的全面理解單片機(jī)的功能。</p><p>  最開(kāi)始準(zhǔn)備編程時(shí)一點(diǎn)思路都沒(méi)有,通過(guò)后來(lái)在網(wǎng)上查找了相關(guān)編程,通過(guò)與實(shí)驗(yàn)要求相比對(duì),開(kāi)始理清程序大致需要那幾部分,基本確定編程思想后,我就開(kāi)始著手程序。通過(guò)老師FTP上的相關(guān)資料對(duì)JD51板進(jìn)行了系統(tǒng)的了解,并通過(guò)羅列的方式找出自習(xí)所需信息,方便編程時(shí)

114、查找。其中整個(gè)過(guò)程中也遇到了很多問(wèn)題,但本著遇到問(wèn)題解決問(wèn)題的原則,一一通過(guò)翻查書(shū)本和詢(xún)問(wèn)同學(xué)最終基本解決了所以問(wèn)題。整個(gè)課程設(shè)計(jì)過(guò)程學(xué)到了不少通過(guò)理論學(xué)習(xí)沒(méi)法學(xué)到的東西,真正增加了自己的一種能力。</p><p>  整個(gè)程序的邏輯性很強(qiáng),通過(guò)一一分類(lèi)理清,每一步程序的執(zhí)行都要非常的清晰,只要有一步出錯(cuò),整個(gè)程序都可能會(huì)受到影響,所以在構(gòu)思和查找資料方面就花了很長(zhǎng)的時(shí)間。但是只要嚴(yán)謹(jǐn)?shù)木幊?,一步一步的認(rèn)真分析,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論