單片機(jī)課程設(shè)計(jì)--電子時(shí)鐘_第1頁
已閱讀1頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  實(shí)驗(yàn)報(bào)告</b></p><p><b>  實(shí)驗(yàn)名稱:電子時(shí)鐘</b></p><p>  學(xué)院:電子信息工程學(xué)院</p><p>  班級(jí):通信1103班</p><p><b>  學(xué)號(hào): </b></p><p>&

2、lt;b>  姓名: </b></p><p><b>  指導(dǎo)老師: </b></p><p>  2013 12 15</p><p>  設(shè)計(jì)題目——電子時(shí)鐘</p><p><b>  實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  1.掌握單片機(jī)編程的流程,

3、Keil軟件的使用方法,以及程序的調(diào)試方式。</p><p>  2.了解LED動(dòng)態(tài)顯示原理及動(dòng)態(tài)顯示程序設(shè)計(jì)方法。</p><p>  3.學(xué)習(xí)8051定時(shí)器時(shí)間計(jì)時(shí)處理、按鍵掃描的設(shè)計(jì)方法。</p><p><b>  二、設(shè)計(jì)任務(wù)和要求</b></p><p>  利用實(shí)驗(yàn)平臺(tái)上4個(gè)LED數(shù)碼管, 設(shè)計(jì)帶有鬧鈴功能

4、的數(shù)字時(shí)鐘,要求:</p><p>  在4位數(shù)碼管上顯示當(dāng)前時(shí)間。顯示格式“時(shí)時(shí)分分”。</p><p>  由LED閃動(dòng)做秒顯示。</p><p>  利用按鍵可對(duì)時(shí)間及鬧玲進(jìn)行設(shè)置,并可顯示鬧玲時(shí)間。 </p><p>  當(dāng)鬧玲時(shí)間到由P1.7控制蜂鳴器發(fā)出聲響,并可通過按鍵使它停止。</p><p>  

5、三、設(shè)計(jì)原理與分析步驟</p><p><b>  數(shù)碼管的顯示:</b></p><p>  在ZKS-03實(shí)驗(yàn)儀上共有4位共陽LED數(shù)碼管,其標(biāo)號(hào)分別為LED1~LED4。為了節(jié)省MCU的I/O口,采用串行接口方式,它僅占用系統(tǒng)2個(gè)I/O口,一個(gè)用作數(shù)據(jù)線SDA,另一個(gè)用作時(shí)鐘信號(hào)線CLK。4位共陽LED數(shù)碼管與P87C52X2的連接如下圖所示,其中,KD_Q0~

6、KD_Q7為LED顯示器數(shù)據(jù)線即段碼線,EBIT1~EBIT4為LED顯示器的位碼掃描線,它們通過跳線選擇器JP1與P1.3~P1.6相連。由它們發(fā)送掃描信號(hào),低電平有效,且任何時(shí)候僅有1位輸出低電平。由于P1口的驅(qū)動(dòng)能力有限,在此采用9012三極管來增加其驅(qū)動(dòng)能力。</p><p>  由于采用共陽LED數(shù)碼管,它的陰極分別通過限流電阻R20~R27連接到控制端KD_Q0~KD_Q7。這樣控制8個(gè)發(fā)光二極管,就

7、需要8個(gè)I/O口。但由于單片機(jī)的I/O口資源是有限的,因此常采用實(shí)驗(yàn)電路所示的串并轉(zhuǎn)換電路來擴(kuò)充系統(tǒng)資源。串并轉(zhuǎn)換電路其實(shí)質(zhì)是一個(gè)串入并出的移位寄存器,串行數(shù)據(jù)在同步移位脈沖CLK的作用下經(jīng)串行數(shù)據(jù)線SDA把數(shù)據(jù)移位輸出到KD_Q0~KD_Q7端,這樣僅需2根線就可以分別控制8個(gè)發(fā)光二極管的亮滅。</p><p>  LED動(dòng)態(tài)顯示的原理:</p><p>  數(shù)碼管的動(dòng)態(tài)顯示利用視覺暫留

8、作用,使人眼看到的是靜態(tài)的顯示,視覺暫留時(shí)間約為0.01秒,因而每次顯示的時(shí)間間距要比較短。</p><p>  本實(shí)驗(yàn)選擇的是每5毫秒顯示一個(gè)比特。定時(shí)時(shí)間為t=(216 - EC78H)×1us = 5000 * 1us = 5 ms(其中機(jī)器周期為1us)即延時(shí)5ms。T=(213-計(jì)數(shù)初值x)機(jī)器周期</p><p>  首先以串行方式由SDA口向LED顯示器數(shù)據(jù)端口發(fā)送

9、第一個(gè)8位數(shù)據(jù),這時(shí)發(fā)送位碼數(shù)據(jù)0BFH到P1口,此時(shí)由于P1.6位低電平而其他口都為高電平,因此只有LED1數(shù)碼管顯示該數(shù)碼。這樣就可以發(fā)送第二個(gè)數(shù)據(jù),同時(shí)應(yīng)使其對(duì)應(yīng)的位碼為低電平且保證其他位為高電平。依次類推,對(duì)各顯示器進(jìn)行掃描,顯示器分時(shí)輪流工作。雖然每次只有一個(gè)顯示器顯示,但由于人的視覺暫留現(xiàn)象我們?nèi)詴?huì)感覺所有的顯示器都在同時(shí)顯示。它的優(yōu)點(diǎn)是硬件電路簡單,占用的I/O口較少,但其傳送速度相對(duì)較慢。</p><

10、p>  由數(shù)碼管顯示原理,數(shù)碼管上顯示的數(shù)字對(duì)應(yīng)一個(gè)八位的二進(jìn)制數(shù),0~9一共十個(gè),把這些數(shù)存到程序存儲(chǔ)器TABLE表中, DPTR作為指針,用R1~R4分別存儲(chǔ)實(shí)際的時(shí)和分的數(shù)字,寄存器存儲(chǔ)的數(shù)字作為偏移量,這樣就把實(shí)際的數(shù)字和數(shù)碼管中顯示的數(shù)字對(duì)應(yīng)起來了。</p><p><b>  軟件設(shè)計(jì)部分:</b></p><p>  1.鬧鈴設(shè)置:通過P3.2,P

11、3.4和3.5分別控制鬧鈴,分和時(shí)的設(shè)置,與邏輯開關(guān)連接,低電平有效,當(dāng)P3.2口變成低電平時(shí),進(jìn)入鬧鈴設(shè)置,當(dāng)P3.2變成高電平時(shí)回到主程序。</p><p>  2.時(shí)間設(shè)定:通過P3.3,P3.4和3.5分別控制時(shí)間,分和時(shí)的設(shè)置,與邏輯開關(guān)連接,低電平有效,當(dāng)P3.3口變成低電平時(shí),進(jìn)入時(shí)間設(shè)置,當(dāng)P3.3口變成高電平時(shí)回到主程序。</p><p>  3.蜂鳴:用四個(gè)地址50H-

12、53H存儲(chǔ)鬧鈴時(shí)間的偏移量,判斷當(dāng)前的時(shí)間R1-R4與鬧鈴時(shí)間50H-53H是否完全一樣,相同時(shí)驅(qū)動(dòng)鬧鈴,實(shí)驗(yàn)板上的蜂鳴器是交流驅(qū)動(dòng)的,因此當(dāng)?shù)竭_(dá)鬧鈴時(shí)刻時(shí),給P1.7口幾個(gè)脈沖,頻率控制在人耳可以聽到的范圍內(nèi)。</p><p><b>  I/O口的說明:</b></p><p>  1)P1口用來控制數(shù)碼管的顯示,其中未用到的P1.2作為秒脈沖輸出口,P1.7控制

13、蜂鳴器。</p><p>  2)P3口中的P3.2控制鬧鈴設(shè)定,與邏輯開關(guān)相連,低電平有效;3)P3.3控制時(shí)間設(shè)定,與邏輯開關(guān)相連,低電平有效;4)P3.4控制設(shè)定中的分鐘的設(shè)定,與邏輯開關(guān)相連,低電平有效;5)P3.5控制設(shè)定中的小時(shí)的設(shè)定,與邏輯開關(guān)設(shè)定,低電平有效</p><p><b>  寄存器說明:</b></p><p>  

14、R0作為秒計(jì)數(shù)寄存器;R1作為分的低位的偏移量存儲(chǔ)的寄存器;R2作為分的高位的偏移量存儲(chǔ)的寄存器;R3作為時(shí)的低位的偏移量存儲(chǔ)的寄存器;R4作為時(shí)的高位的偏移量存儲(chǔ)的寄存器。R5,R6,R7用來設(shè)定循環(huán)的次數(shù);DPTR用來作為TABLE表地址的指針.</p><p><b>  硬件設(shè)計(jì)部分:</b></p><p>  數(shù)碼管顯示的電路實(shí)驗(yàn)儀上已連接好,我們只需通過

15、跳線選擇器JP1將單片機(jī)的P1口的控制線與數(shù)碼管顯示電路相連,即將JP1中的P10、P11、P13、P14、P15、P16接至A位;P1.7控制蜂鳴器并且連接至C位。P1.2口作為秒脈沖輸出端,不接入跳線,將P1.2口連到LED數(shù)碼管,P3.2,P3.3,P3.4,P.5都與邏輯開關(guān)相接。</p><p><b>  四、實(shí)驗(yàn)電路圖</b></p><p><b

16、>  五、實(shí)驗(yàn)程序</b></p><p><b>  延時(shí)子程序</b></p><p>  DELAY: MOV TH1,#0ECH</p><p>  MOV TL1,#78H</p><p><b>  CLR TF1</b></p><p><

17、;b>  SETB TR1</b></p><p>  WAIT: JNB TF1,WAIT</p><p><b>  RET</b></p><p><b>  實(shí)驗(yàn)程序:</b></p><p><b>  ORG 4000H</b></p>

18、<p>  MAIN: CLR EA ;程序初始化</p><p>  CLR PSW.3 ;選擇寄存器組0</p><p>  CLR PSW.4 ;PSW.4和PSW.3同時(shí)為零,則為寄存器0組</p><p>  MOV TMOD,#10H ;定時(shí)器1,方式1,定時(shí)方

19、式</p><p>  MOV 50H,#00H ;鬧鈴初始時(shí)間 08:00</p><p>  MOV 51H,#00H ;分別對(duì)應(yīng)分的低、高位,時(shí)的低、高位</p><p>  MOV 52H,#08H ;時(shí)的低位</p><p>  MOV 53H,#00H ;時(shí)的高位</p

20、><p>  MOV R0,#00H ;設(shè)置時(shí)間初值 07:59</p><p>  MOV R1,#09H ;分別對(duì)應(yīng)分的低、高位,時(shí)的低、高位</p><p>  MOV R2,#05H ;分的高位</p><p>  MOV R3,#07H ;時(shí)的低位</p>&

21、lt;p>  MOV R4,#00H ;時(shí)的高位</p><p>  CLR TF1 ;清標(biāo)志</p><p>  START: ACALL ALARM ;判斷是否鬧鈴</p><p>  MOV R5,#02H ;兩層外循環(huán),每層循環(huán)500ms</p><p> 

22、 START1: MOV R7,#20 ;20次內(nèi)循環(huán),20*25ms=500ms</p><p>  START2: ACALL DELAY ;調(diào)用延時(shí) 5ms</p><p>  ACALL DISPLAY ;調(diào)用延時(shí) 20ms</p><p>  M0: JB P3.2,M1 ;是否設(shè)鬧鈴,查詢3

23、.2口,為一轉(zhuǎn)到M1,為0設(shè)置鬧鈴</p><p>  ACALL SETALARM ;調(diào)用設(shè)置鬧鈴子程序</p><p>  M1: JB P3.3,M2 ;是否設(shè)時(shí)間</p><p>  ACALL SETCLOCK ;調(diào)用設(shè)置時(shí)間子程序</p><p>  M2: DJNZ R7,START2

24、 ;R7=20減1循環(huán)</p><p>  CPL P1.2 ;每500ms給P1.2一個(gè)正負(fù)交替的電平信號(hào)</p><p>  DJNZ R5,START1 ;R5為2,循環(huán)兩次后為1s</p><p>  INC R0 ;R0加1</p><p>  CJNE R0,#60,S

25、TART ;判斷R0為60,跳轉(zhuǎn)</p><p>  MOV R0,#00H ;R0清零</p><p>  M3: CJNE R1,#09H,L1 ;時(shí)間邏輯,如果為23:59分,則全部清零</p><p>  CJNE R2,#05H,L2 ;分的十位為5</p><p>  CJNE R4,#02H,

26、L3 ;時(shí)的十位為5</p><p>  CJNE R3,#03H,L4 ;時(shí)的個(gè)位為9</p><p>  MOV R1,#00H ;將分的個(gè)位清零</p><p>  MOV R2,#00H ;將分的十位清零</p><p>  MOV R3,#00H ;將時(shí)的個(gè)位清零<

27、;/p><p>  MOV R4,#00H ;將時(shí)的十位清零</p><p>  AJMP START ;絕對(duì)轉(zhuǎn)移到START</p><p>  L1: INC R1 ;上面的幾個(gè)分支,分的個(gè)位加一</p><p>  AJMP START ;絕對(duì)轉(zhuǎn)移到START&l

28、t;/p><p>  L2: INC R2 ;分的十位加一</p><p>  MOV R1,#00H ;分的個(gè)位置0</p><p>  AJMP START ;絕對(duì)轉(zhuǎn)移到START</p><p>  L3: CJNE R3,#09H,L4 ;時(shí)的個(gè)位為9跳轉(zhuǎn)</p

29、><p>  INC R4 ;時(shí)的十位加一</p><p>  MOV R3,#00H ;將時(shí)的個(gè)位清零</p><p>  MOV R2,#00H ;將分的十位清零</p><p>  MOV R1,#00H ;將分的個(gè)位清零</p><p&g

30、t;  AJMP START ;絕對(duì)轉(zhuǎn)移到START</p><p>  L4: INC R3 ;時(shí)的個(gè)位加一</p><p>  MOV R2,#00H ;將分的十位清零</p><p>  MOV R1,#00H ;將分的個(gè)位清零</p><p>  AJ

31、MP START ;絕對(duì)轉(zhuǎn)移到START</p><p>  DISPLAY: MOV DPTR,#TABLE ;顯示子程序,把TABLE的首地址送給DPTR</p><p>  MOV A,R1 ;將偏移量給A</p><p>  MOVC A,@A+DPTR ;將對(duì)應(yīng)地址中的量給A</p>

32、<p>  ACALL BIT1 ;顯示第一個(gè)字節(jié),也就是分的低位</p><p>  MOV A,R2 ;顯示第二個(gè)字節(jié),分的高位</p><p>  MOVC A,@A+DPTR ;將對(duì)應(yīng)地址中的量給A</p><p>  ACALL BIT2 ;顯示第二個(gè)字節(jié),分的高位</p

33、><p>  MOV A,R3 ;顯示第三個(gè)字節(jié),時(shí)的低位</p><p>  MOVC A,@A+DPTR ;將對(duì)應(yīng)地址中的量給A</p><p>  ACALL BIT3 ;顯示第三個(gè)字節(jié),時(shí)的低位</p><p>  MOV A,R4 ;顯示第四個(gè)字節(jié),時(shí)的高位<

34、/p><p>  MOVC A,@A+DPTR ;將對(duì)應(yīng)地址中的量給A</p><p>  ACALL BIT4 ;顯示第四個(gè)字節(jié),時(shí)的高位</p><p><b>  RET</b></p><p>  BIT1: MOV R6,#08H ;顯示第一個(gè)字節(jié)(分的低位)的子程序&l

35、t;/p><p>  LOOP1: RLC A ;A帶進(jìn)位左移,移出的最高位存到C中</p><p>  MOV P1.0,C ;把C的值給P1.0口</p><p>  CLR P1.1 ;在P1.1產(chǎn)生一個(gè)上升沿,將P1.0的值輸入</p><p>  SETB P1.1

36、 ;置位</p><p>  DJNZ R6,LOOP1 ;8次循環(huán),輸入第一個(gè)字節(jié)8段的值</p><p>  CLR P1.3 ;給P1.3一個(gè)低電平,點(diǎn)亮對(duì)應(yīng)的數(shù)碼管 </p><p>  ACALL DELAY ;延時(shí) 5ms</p><p>  SETB P1.3

37、 ;置位</p><p><b>  RET</b></p><p>  BIT2: MOV R6,#08H ;顯示第二個(gè)字節(jié)(分的高位)的子程序</p><p>  LOOP2: RLC A ;A帶進(jìn)位左移,移出的最高位存到C中</p><p>  MOV P

38、1.0,C ;把C的值給P1.0口</p><p>  CLR P1.1 ;在P1.1產(chǎn)生一個(gè)上升沿,將P1.0的值輸入</p><p>  SETB P1.1 ;置位</p><p>  DJNZ R6,LOOP2 ;8次循環(huán),輸入第一個(gè)字節(jié)8段的值</p><p> 

39、 CLR P1.4 ;給P1.4一個(gè)低電平,點(diǎn)亮對(duì)應(yīng)的數(shù)碼管</p><p>  ACALL DELAY ;延時(shí) 5ms</p><p>  SETB P1.4 ;置位</p><p><b>  RET</b></p><p>  BIT3: MOV R6,#0

40、8H ;顯示第三個(gè)字節(jié)(時(shí)的低位)的子程序</p><p>  LOOP3: RLC A ;A帶進(jìn)位左移,移出的最高位存到C中</p><p>  MOV P1.0,C ;把C的值給P1.0口</p><p>  CLR P1.1 ;在P1.1產(chǎn)生一個(gè)上升沿,將P1.

41、0的值輸入</p><p>  SETB P1.1 ;置位</p><p>  DJNZ R6,LOOP3 ;8次循環(huán),輸入第一個(gè)字節(jié)8段的值</p><p>  CLR P1.5 ;給P1.5一個(gè)低電平,點(diǎn)亮對(duì)應(yīng)的數(shù)碼管</p><p>  ACALL DELAY

42、 ;延時(shí) 5ms</p><p>  SETB P1.5 ;置位</p><p><b>  RET</b></p><p>  BIT4: MOV R6,#08H ;顯示第四個(gè)字節(jié)(時(shí)的高位)的子程序</p><p>  LOOP4: RLC A

43、 ;A帶進(jìn)位左移,移出的最高位存到C中</p><p>  MOV P1.0,C ;把C的值給P1.0口</p><p>  CLR P1.1 ;在P1.1產(chǎn)生一個(gè)上升沿,將P1.0的值輸入</p><p>  SETB P1.1 ;置位</p><p>  D

44、JNZ R6,LOOP4 ;8次循環(huán),輸入第一個(gè)字節(jié)8段的值</p><p>  CLR P1.6 ;給P1.6一個(gè)低電平,點(diǎn)亮對(duì)應(yīng)的數(shù)碼管</p><p>  ACALL DELAY ;延時(shí) 5ms</p><p>  SETB P1.6 ;置位</p><p

45、><b>  RET </b></p><p>  ALARM: MOV A,R1 ;鬧鈴判斷子程序,判斷鬧鈴是否與時(shí)間各位相等</p><p>  CJNE A,50H,RETURN ;分別判斷,若不等則跳出</p><p>  MOV A,R2 ;把分的十位給A</

46、p><p>  CJNE A,51H,RETURN ;判斷分的十位是否相等,若不等則跳出</p><p>  MOV A,R3 ;把時(shí)的個(gè)位給A</p><p>  CJNE A,52H,RETURN ;判斷時(shí)的個(gè)位是否相等,若不等則跳出</p><p>  MOV A,R4 ;

47、把時(shí)的時(shí)位給A</p><p>  CJNE A,53H,RETURN ;判斷時(shí)的十位是否相等,若不等則跳出</p><p>  MOV R6,#03H ;預(yù)置循環(huán)次數(shù)三次</p><p>  MING: ;若各位都相等,則驅(qū)動(dòng)鬧鈴,激活蜂鳴器</p><p>  SETB

48、 P1.7 ;P1.7控制蜂鳴器,置位</p><p>  ACALL DELAY ;延時(shí) 5ms</p><p>  CLR P1.7 ;P1.7清零</p><p>  ACALL DELAY ;再延時(shí)5ms,使頻率為100赫茲,可調(diào)</p><p>

49、;  DJNZ R6,MING ;循環(huán)三次</p><p>  RETURN:RET</p><p>  TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H</p><p>  RET </p><p>  ;將數(shù)碼管中顯示的0~9分別

50、對(duì)應(yīng)的數(shù)存入TABLE開始的一段程序存儲(chǔ)器中</p><p>  SETALARM:MOV 40H,R1 ;鬧鈴設(shè)定子程序,保存當(dāng)前時(shí)間</p><p>  MOV 41H,R2 ;把分的十位保存在41H</p><p>  MOV 42H,R3 ;把時(shí)的個(gè)位保存在42H</p><

51、;p>  MOV 43H,R4 ;把時(shí)的十位保存在43H</p><p>  MOV R1,50H ;將初始設(shè)定的鬧鈴時(shí)間賦給偏移量R1~R4</p><p>  MOV R2,51H ;將分的十位的鬧鈴時(shí)間給偏移量R1</p><p>  MOV R3,52H ;將

52、時(shí)的個(gè)位的鬧鈴時(shí)間給偏移量R2</p><p>  MOV R4,53H ;將時(shí)的十位的鬧鈴時(shí)間給偏移量R3</p><p>  ACALL DISPLAY ;顯示鬧鈴時(shí)間</p><p>  KS: JB P3.4,LK0 ;鬧鈴設(shè)置邏輯,當(dāng)P3.4口為低電平時(shí),設(shè)定分(LK0為DISPLAY子程序)

53、</p><p>  CJNE R1,#09H,LL0 ;當(dāng)分的個(gè)位不為9時(shí),跳轉(zhuǎn)到子程序LL0</p><p>  MOV R1,#00H ;清零分的個(gè)位</p><p>  CJNE R2,#05H,LL1 ;當(dāng)分的十位不為5時(shí),跳轉(zhuǎn)到子程序LL1</p><p>  MOV R2,#00H

54、 ;當(dāng)為59分時(shí),清零</p><p>  AJMP LK0 ;絕對(duì)轉(zhuǎn)移到LK0</p><p>  LL1: INC R2 ;分的十位加一</p><p>  AJMP LK0 ;絕對(duì)轉(zhuǎn)移到LK0</p><p>  LL0: INC

55、 R1 ;分的個(gè)位加一</p><p>  LK0: ACALL DISPLAY ;設(shè)定一次顯示一次時(shí)間</p><p>  JB P3.5,LK1 ;P3.5口為低電平時(shí),設(shè)定時(shí)(LK1為子程序)</p><p>  CJNE R4,#02H,KK0 ;當(dāng)時(shí)的十位不為2時(shí),跳轉(zhuǎn)到子

56、程序KK0</p><p>  CJNE R3,#03H,KK1 ;當(dāng)時(shí)的個(gè)位不為3時(shí),跳轉(zhuǎn)到子程序KK1</p><p>  MOV R3,#00H ;當(dāng)時(shí)為23時(shí),清零</p><p>  MOV R4,#00H ;清零時(shí)的十位</p><p>  AJMP LK1

57、 ;絕對(duì)轉(zhuǎn)移到LK1</p><p>  KK1: INC R3 ;時(shí)的個(gè)位加一</p><p>  AJMP LK1 ;絕對(duì)轉(zhuǎn)移到LK1</p><p>  KK0: CJNE R3,#09H,KK1 ;當(dāng)時(shí)的個(gè)位不為9時(shí),跳轉(zhuǎn)到子程序KK1</p><p>

58、  MOV R3,#00H ;將時(shí)的個(gè)位清零</p><p>  INC R4 ;時(shí)的十位加一</p><p>  AJMP LK1 ;絕對(duì)轉(zhuǎn)移到LK1</p><p>  LK1: ACALL DISPLAY ;設(shè)定結(jié)束,顯示設(shè)定時(shí)間</p><

59、p>  JNB P3.2,KS ;當(dāng)控制鬧鈴設(shè)置的P3.2口變?yōu)楦唠娖綍r(shí),退出設(shè)定</p><p>  MOV 50H,R1 ;保存鬧鈴時(shí)間</p><p>  MOV 51H,R2 ;將分的十位保存到51H</p><p>  MOV 52H,R3 ;將時(shí)的個(gè)位保存

60、到52H</p><p>  MOV 53H,R4 ;將時(shí)的十位保存到53H</p><p>  MOV R1,40H ;恢復(fù)時(shí)間</p><p>  MOV R2,41H ;將分的十位還回給R2</p><p>  MOV R3,42H ;將時(shí)的

61、個(gè)位還回給R3</p><p>  MOV R4,43H ;將時(shí)的十位還回給R4</p><p>  ACALL DISPLAY ;顯示時(shí)間</p><p><b>  RET </b></p><p>  SETCLOCK:JB P3.4,MN0 ;

62、用P3.4口設(shè)定分,原理同鬧鈴設(shè)定,低電平有效</p><p>  CJNE R1,#09H,MM0 ;當(dāng)分的個(gè)位不為9時(shí),跳轉(zhuǎn)到子程序MM0</p><p>  MOV R1,#00H ;將分的個(gè)位清零</p><p>  CJNE R2,#05H,MM1 ;當(dāng)分的十位不為5時(shí),跳轉(zhuǎn)到子程序MM1</p>

63、<p>  MOV R2,#00H ;將分的十位清零</p><p>  AJMP MN0 ;絕對(duì)轉(zhuǎn)移到MN0</p><p>  MM1: INC R2 ;分的十位加一</p><p>  AJMP MN0 ;絕對(duì)轉(zhuǎn)移到MN0</

64、p><p>  MM0: INC R1 ;分的個(gè)位加一</p><p>  MN0: ACALL DISPLAY ;調(diào)用顯示子程序</p><p>  JB P3.5,MN1 ;用P3.5口設(shè)定時(shí),低電平有效</p><p>  CJNE R4,#02H,NN0

65、 ;當(dāng)時(shí)的十位不為2時(shí),跳轉(zhuǎn)到子程序MN0</p><p>  CJNE R3,#03H,NN1 ;當(dāng)時(shí)的個(gè)位不為3時(shí),跳轉(zhuǎn)到子程序MN1</p><p>  MOV R3,#00H ;將時(shí)的個(gè)位清零</p><p>  MOV R4,#00H ;將時(shí)的十位清零</p><p&g

66、t;  AJMP MN1 ;絕對(duì)轉(zhuǎn)移到MN1</p><p>  NN1: INC R3 ;時(shí)的個(gè)位加一</p><p>  AJMP MN1 ;絕對(duì)轉(zhuǎn)移到MN1</p><p>  NN0: CJNE R3,#09H,NN1 ;當(dāng)時(shí)的個(gè)位不為9時(shí),跳轉(zhuǎn)到子程

67、序MN1</p><p>  MOV R3,#00H ;將時(shí)的個(gè)位清零</p><p>  INC R4 ;時(shí)的十位加一</p><p>  AJMP MN1 ;絕對(duì)轉(zhuǎn)移到MN1</p><p>  MN1: ACALL DISPLAY

68、 ;調(diào)用顯示子程序</p><p>  JNB P3.3,SETCLOCK ;若P3.3口仍處于低電平,繼續(xù)處于時(shí)間設(shè)定狀態(tài)</p><p><b>  RET</b></p><p>  DELAY: MOV TH1,#0ECH ;5ms延時(shí)子程序</p><p>  MOV TL1,#

69、78H ;賦初值60536,實(shí)現(xiàn)5000次計(jì)數(shù),歷時(shí)5ms</p><p><b>  CLR TF1</b></p><p><b>  SETB TR1</b></p><p>  WAIT: JNB TF1,WAIT</p><p><b>  RET <

70、/b></p><p><b>  END</b></p><p><b>  六、實(shí)驗(yàn)連接圖</b></p><p><b>  七、實(shí)驗(yàn)調(diào)試</b></p><p><b>  八、實(shí)驗(yàn)程序?qū)懭?lt;/b></p><p>&

71、lt;b>  九、實(shí)驗(yàn)誤差分析</b></p><p>  由于實(shí)驗(yàn)程序中過多地使用軟件定時(shí),使用查詢方式定時(shí),而不是采用中斷方式,所以在實(shí)驗(yàn)程序執(zhí)行過程中,語句執(zhí)行占用了一些時(shí)間,所以導(dǎo)致時(shí)間計(jì)算上存在誤差,在數(shù)碼顯示時(shí)也存在一些不理想的因素。</p><p>  以下為各程序段的誤差分析。</p><p>  程序開始就判斷鬧鈴時(shí)間是否到,子程

72、序中判斷時(shí)間大約為3us到12us,若響鈴,就還會(huì)有每秒30ms的延時(shí),即30ms加12us.</p><p>  判斷P3.2和P3.3口需要4us,但如果進(jìn)入設(shè)置時(shí)間,則時(shí)間計(jì)時(shí)停止,不計(jì)入誤差。而每個(gè)1s里面的兩次循環(huán)里有3us*2=6us的誤差。1秒結(jié)束到判斷秒數(shù)是否為60中還有3us,所以共13us.</p><p>  顯示子程序延時(shí),因?yàn)橛兴膫€(gè)字節(jié)的顯示,除去4個(gè)5ms的延遲

73、,誤差粗略估計(jì)為:2us + 6us * 4 = 26us.</p><p>  如果秒數(shù)等于60,則進(jìn)入時(shí)間邏輯,根據(jù)各位數(shù)字的不同情況,產(chǎn)生5us~33us的誤差。</p><p><b>  綜上所述:</b></p><p>  若不響鬧鈴且秒不到60,誤差為每秒42us~51us;</p><p>  若不響鬧

74、鈴,秒剛到60,誤差為每秒47us~84us;</p><p>  綜合①②,大概每5.4到6.6小時(shí)產(chǎn)生1秒誤差;</p><p>  若響鬧鈴,剛在上面兩種情況下每秒再加30ms,即響鬧鈴的1分鐘60秒其實(shí)是61.8秒,誤差頗大。</p><p><b>  十、實(shí)驗(yàn)總結(jié)與體會(huì)</b></p><p>  開始,看到

75、題目感覺什么都不會(huì),后來上網(wǎng)上找了一些資料,再加上自己不斷摸索,最終終于出來了;起初,打開那個(gè)Keil軟件,不知道怎么用,不知道是自己笨還是資料不夠詳細(xì),看了半天,試了半天,不知道怎樣把.C和.A文件導(dǎo)進(jìn)去,進(jìn)去后又慢慢生成.HEX文件,最后又猶豫把文件導(dǎo)到FLASH里邊; </p><p>  之后是電路板連線問題,剛開始我們就接了幾根線,在實(shí)驗(yàn)室測,可怎么都不出結(jié)果,剛開始我們懷疑是程序有問題,因?yàn)槲覀兊某绦?/p>

76、有一部分是從網(wǎng)上下載的,去問問老師,問了老師才知道,不能只簡單的接那幾根線,還得接端口的跳線。后來,我又研究怎么接跳線,將單片機(jī)的P1口中的控制線與數(shù)碼管顯示電路相連,我們只需通過跳線選擇器JP1即可將JP1中的P10、P11、P13、P14、P15、P16接至A位,P1.7連接至C位.(如下圖照片)</p><p>  最開始也不知道跳線開關(guān)的接法,所以隨便選擇I/O口,后來知道可以用于自由查詢的只有四個(gè)端口:

77、P3.2~P3.5,而P1口控制數(shù)碼管的顯示,P1.7口控制蜂鳴器,P2口作為地址線等,P1.2做為秒脈沖輸出口,或者無法實(shí)驗(yàn)顯示結(jié)果。這次試驗(yàn),我從中收獲了很多。不僅是實(shí)驗(yàn)程序,更是實(shí)驗(yàn)板的使用方法和基本程序?qū)懭?</p><p>  此次課程設(shè)計(jì),培養(yǎng)了實(shí)際動(dòng)手的能力以及綜合運(yùn)用知識(shí)解決實(shí)際問題的能力,掌握單片機(jī)的應(yīng)用并熟悉單片機(jī)系統(tǒng)的開發(fā)、研制過程以及對(duì)KEIL軟件和MCS-51芯片有了一個(gè)更詳細(xì)的了解,對(duì)

78、數(shù)碼顯示、延時(shí)、時(shí)間設(shè)置等程序有了更深刻的了解.相信回對(duì)以后的學(xué)習(xí)和生活有很大的幫助. </p><p><b>  十一、實(shí)驗(yàn)參考文獻(xiàn)</b></p><p>  1. 單片機(jī)原理與應(yīng)用 </p><p>  戴勝華 蔣大明 楊世武 趙俊慧 編著 北京交通大學(xué)出出版社 2005</p><p>  

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲(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)論