基于at89c51單片機的多功能秒表系統(tǒng)設計畢業(yè)論文_第1頁
已閱讀1頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  目錄</b></p><p><b>  1 概述3</b></p><p>  1.1單片機簡介……………………………………………………………………3</p><p>  1.2設計任務………………………………………………………………………3</p><p>  

2、1.3設計要求………………………………………………………………………3</p><p>  2 系統(tǒng)總體方案及硬件設計4</p><p>  2.1、復位電路5</p><p>  2.2、晶體振蕩電路6</p><p>  2.3、鍵盤電路6</p><p>  2.4、顯示電路7</p>

3、<p><b>  3 軟件設計7</b></p><p>  3.1、設計思想7</p><p>  3.2、系統(tǒng)流程圖8</p><p>  3.3源程序代碼及注解 ……………………………………………………10</p><p>  4 Proteus軟件仿真15</p>&

4、lt;p>  5 課程設計體會 ……………………………………………… ………… ………………16</p><p>  6 參考文獻 ……………………………… ………………………………… …… ….17</p><p>  附錄1:源程清單18</p><p>  附錄2:系統(tǒng)原理圖24</p><p><b>

5、;  1 概述</b></p><p><b>  1.1單片機簡介</b></p><p>  單片機是性能價格比高、體積小、對國民經(jīng)濟滲透力大、最有前途的微控制器。單片機自20世紀70年代初研制成功并發(fā)展至今,已進入第四代。它主要是在一塊芯片上集成了CPU、存儲器以及輸入輸出電路,在工業(yè)過程中被廣泛應用在控制電路中。從單片機的系列來看,國內(nèi)外已超過50

6、個系列、近500個品種,當前正處于更新?lián)Q代、百花齊放的時期。新的系列和專用系列正在不斷涌現(xiàn)。按位數(shù)分類有4位、8位、16位以及32位單片機等,4位單片機由于價格低和出現(xiàn)的早得到了廣泛的應用,特別是在家電應用領域中其還有很大的優(yōu)勢,為了抵御8位機的競爭,4位機在結(jié)構和功能上都有很大的改進。8位機的生產(chǎn)廠家以及品種都很多,在實際的生產(chǎn)中應用也最為廣泛,其中Intel公司的8051系列單片機在我國應用最為廣泛,另外8位單片機也在其功能和內(nèi)部結(jié)

7、構上不斷的進行改進,目前功能是越來越強大。16位單片機在數(shù)據(jù)處理以及單片機的性能上有了很大的改進。32位單片機是隨著高科技產(chǎn)業(yè)的發(fā)展而產(chǎn)生的。</p><p><b>  1.2設計任務:</b></p><p>  設計一個單片機控制的多功能秒表系統(tǒng),利用單片機的定時器/計數(shù)器定時和記數(shù)的原理,結(jié)合顯示電路、用兩個陰極LED數(shù)碼管以及按鍵來設計00~99秒計時器。將

8、軟、硬件有機地結(jié)合起來,使得系統(tǒng)能夠正確地進行加計時,同時數(shù)碼管能夠正確地顯示時間。</p><p><b>  1.3設計要求:</b></p><p>  1、能同時記錄四個相對獨立的時間并分別顯示 。 </p><p>  2、兩位LED動態(tài)顯示,顯示時間為00~99秒。 </p><p>  3、每秒自動加1。

9、</p><p>  4、一個開始按鍵、一個復位按鍵、一個暫停按鈕 </p><p><b>  2 系統(tǒng)總體方案</b></p><p>  本設計的最主要的元器件就是MCS-51單片機。MCS-51單片機在一塊芯片上集成了CPU,存儲器RAM,ROM以及輸入與輸出接口電路,這種芯片習慣上被稱為單片微型計算機,簡稱單片機。MCS-51單片機是

10、INTEL公司在1980年推出的高檔8位單片機。它的典型產(chǎn)品有:8051,8031,8751,80C51,80C31,87C51。</p><p>  AT89C51(圖1)單片機由CPU,振蕩器與時序電路, 4個8位的I/O端口(P0,P1,P2,P3),串行口等組成。</p><p><b>  P0口有三個功能:</b></p><p>

11、  1、外部擴展存儲器時,當做數(shù)據(jù)總線(如圖中的D0~D7為數(shù)據(jù)總線接口)。</p><p>  2、外部擴展存儲器時,當作地址總線(如圖中的A0~A7為地址總線接口)。</p><p>  3、不擴展時,可做一般的I/O使用,但內(nèi)部無上拉電阻,作為輸入或輸出時應在外部接上拉電阻。</p><p>  P1口只做I/O口使用:其內(nèi)部有上拉電阻。</p>

12、<p><b>  P2口有兩個功能:</b></p><p>  1、擴展外部存儲器時,當作地址總線使用;</p><p>  2、做一般I/O口使用,其內(nèi)部有上拉電阻;</p><p><b>  P3口有兩個功能:</b></p><p>  除了作為I/O使用外(其內(nèi)部有上拉電阻

13、),還有一些特殊功能,由寄存器來設置。</p><p>  ALE:地址鎖存控制信號</p><p>  PSEN:外部程序存儲器讀選通信號</p><p>  EA/VPP:訪問和序存儲器控制信號</p><p>  RST:復位信號XTAL1和XTAL2 外接晶振引腳VCC:電源+5V輸入VSS:GND接地。</p><

14、;p><b>  圖2:整體設計框圖</b></p><p>  2.1 復位電路:采用上電加按鈕復位。</p><p>  這個系統(tǒng)中的復位電路是采用上電加按鈕來實現(xiàn)的。因為MCS-51單片機的復位是靠外部電路實現(xiàn)的。MCS-51單片機工作之后,只要在他的RST引線上加載10ms以上的高點平,單片機就能有效地進行復位。MCS-51單片機通常采用上電自動復位、按

15、鍵復位、以及上電加按鍵復位等,我們采用的是上電加按鍵復位方式,這樣做的優(yōu)點是上電后可以直接進入復位狀態(tài),當程序出現(xiàn)錯誤時,可以隨時使電路復位。</p><p><b>  圖3:復位電路</b></p><p>  2.2晶體振蕩電路: 通過XTAL1和XTAL2外接晶體振蕩器構成內(nèi)部振蕩方式。</p><p>  由于單片機內(nèi)部有一個高增益反

16、相放大器,當外接晶振后,就構成了自激振蕩器并產(chǎn)生振蕩時鐘脈沖。MCS--51單片機內(nèi)部的振蕩電路是一個高增益反相放大器,引線 XTAL1和XTAL2分別為 反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入和來自反向振蕩器的輸出,該反向放大器可以配置為片內(nèi)振蕩器。</p><p><b>  圖4:晶振震蕩電路</b></p><p>  2.3鍵盤電路:用部分P1口做開始

17、開關,P2口開始,P3口復位, </p><p><b>  圖5:鍵盤電路</b></p><p>  2.4顯示電路:采用LED動態(tài)顯示,用P2口驅(qū)動顯示。</p><p><b>  圖6:顯示電路</b></p><p><b>  3 軟件設計</b></p&

18、gt;<p><b>  3.1 設計思想</b></p><p>  因為秒表設計相對較為簡單,因此在軟件設計中我們一般采用模塊化程序設計的方法。模塊是一個具有獨立功能的程序,可以單獨設計、調(diào)試與管理,模塊可分為功能模塊和控制模塊兩類。我們通過模塊化程序設計可按適當?shù)脑瓌t把一個情況復雜、規(guī)模較大的程序系統(tǒng)劃分為一個個較小的、功能相關而又相對獨立的模塊。每個小的模塊完成一個確定

19、的功能,在這些小的模塊之間建立必要的聯(lián)系,互相協(xié)作完成整個程序要完成的功能。它具有明顯的優(yōu)點,把一個多功能的復雜的程序劃分為若干個簡單的、功能單一的程序模塊,有利于程序的設計和調(diào)試,有利于程序的優(yōu)化和分工,提高了程序的閱讀性和可靠性,使程序的結(jié)構層次一目了然。</p><p>  其中的模塊即為子程序,子程序是功能獨立的程序段。子程序的基本思想是編寫一次,可以重復使用。子程序的形式可以是一個程序文件,也可以是一個

20、過程或函數(shù)。子程序總被其他程序調(diào)用而不單獨執(zhí)行,這與主程序相對。</p><p>  這個主程序也是由多個子程序模塊組成,各程序模塊都要完成一個明確的任務,實現(xiàn)某個具體的功能,、快加、復位,計數(shù)和顯示等,在具體需要時調(diào)用相應的模塊即可。</p><p>  3.2、程序流程圖:</p><p><b>  定時器流程圖</b></p>

21、;<p><b>  加1子程序流程圖:</b></p><p>  3.3程序代碼及注解</p><p>  ORG 0000H ;程序開始</p><p>  AJMP START ;跳轉(zhuǎn)到主程序START </p><p>  ORG 000BH ;

22、定時器0中斷的地址入口</p><p>  AJMP TIME0 ;定時器0溢出,跳轉(zhuǎn)到中斷程序TIME0</p><p>  START: ;主程序</p><p>  MOV P3,#0FFH ;輸入端口P3全寫1</p><p>  MOV P0,#3FH ;</p

23、><p>  MOV P1,#3FH ;</p><p>  MOV P2,#0BFH ;數(shù)碼管初始化</p><p>  MOV 30H,#00H ;</p><p>  MOV R0,#00H ;</p><p>  MOV R1,#0AH ;</

24、p><p>  MOV R2,#00H ;工作寄存器初始化</p><p>  MOV TMOD,#01H ;定時器0工作于方式1</p><p>  MOV TH0,#0D8H ;</p><p>  MOV TL0,#0FEH ;定時器0預置數(shù)(D8FEH=55550D)</p>&

25、lt;p>  SETB EA ;開總中斷允許</p><p>  SETB ET0 ;開定時器0中斷允許</p><p>  READ: ;讀鍵程序</p><p>  L1:JB P3.2,L2 ;</p><p>  LCALL DELAY

26、;按鍵延時防抖</p><p>  JB P3.2,L1 ;</p><p>  AJMP RUN ;確認計時鍵被按下,開始/繼續(xù)計時</p><p>  L2:JB P3.3,L3 ;</p><p>  LCALL DELAY ;按鍵延時防抖</p><p&g

27、t;  JB P3.3,L2 ;</p><p>  AJMP PAUSE ;確認暫停鍵被按下,暫停計時</p><p>  L3:JB P3.4,L1 ;</p><p>  LCALL DELAY ;按鍵延時防抖</p><p>  JB P3.4,L3 ;</

28、p><p>  AJMP STOP ;確認清零鍵被按下,秒表重置</p><p>  RUN: ;計時鍵按下,跳轉(zhuǎn)至此</p><p>  SETB TR0 ;定時器0開始/繼續(xù)運行</p><p>  AJMP READ ;</p><p&g

29、t;  PAUSE: ;暫停鍵按下,跳轉(zhuǎn)至此</p><p>  CLR TR0 ;</p><p>  AJMP READ ; </p><p>  TIME0: ;定時器0溢出,中斷,跳轉(zhuǎn)至此</p><p>  INC 30H

30、 ;</p><p>  MOV A,30H ;</p><p>  CJNE A,#0AH,TIME1 ;30H單元中的值到10了嗎?(計時到10毫秒了嗎,也就是說,該向毫秒位送數(shù)了嗎?)</p><p>  MOV DPTR,#TAB ;30H中的值到10了,順序執(zhí)行</p><p>  MOV A,R0

31、 ;</p><p>  INC R0 ;</p><p>  CJNE R0,#0AH,GET ;R0中的值到10了嗎?(該向秒位進位了嗎?)</p><p>  MOV R0,#00H ;</p><p>  LCALL SECOND ;到了,R0清零,調(diào)用進位子程

32、序SECOND,向秒位進位</p><p>  GET: ;沒到,跳過進位子程序</p><p>  MOVC A,@A+DPTR ;</p><p>  MOV P1,A ;查表并向數(shù)碼管毫秒位送數(shù)</p><p>  MOV 30H,#00H ;重置30H單元</p

33、><p>  TIME1: ;</p><p>  MOV TH0,#0D8H ;</p><p>  MOV TL0,#0FEH ;給定時器0重新預置數(shù)</p><p>  RETI ;中斷返回</p><p>  SECOND:

34、 ;秒位進位子程序</p><p>  PUSH ACC ;</p><p>  PUSH PSW ;將ACC和PSW推入堆棧保護</p><p>  MOV A,R1 ;</p><p>  INC R1 ;</p><p>  

35、CJNE R1,#14H,GET1 ;R1中的值到20了嗎,也就是說,該向十秒位進位了嗎?</p><p>  MOV R1,#0AH ;</p><p>  LCALL SECOND1 ;到了。R1重置,調(diào)用進位子程序SECOND1,向十秒位進位</p><p>  GET1: ;沒到,跳過進位子程序</p

36、><p>  MOVC A,@A+DPTR ;</p><p>  MOV P2,A ;查表并向數(shù)碼管秒位送數(shù)</p><p>  POP PSW ;</p><p>  POP ACC ;PSW,ACC出棧</p><p>  RET

37、 ;子程序返回</p><p>  SECOND1: ;十秒位進位子程序</p><p>  PUSH ACC ;</p><p>  PUSH PSW ;將ACC和PSW推入堆棧保護</p><p>  MOV A,R2 ;</p>

38、<p>  INC R2 ;</p><p>  CJNE R2,#0AH,GET2 ;R2中的值到10了嗎,也就是說,該將此位歸零了嗎?</p><p>  MOV R2,#00H ;到了,R2清零</p><p>  GET2: ;沒到,跳過清零程序</p><p&g

39、t;  MOVC A,@A+DPTR ;</p><p>  MOV P0,A ;查表并向數(shù)碼管十秒位送數(shù)</p><p>  POP PSW ;</p><p>  POP ACC ;PSW,ACC出棧</p><p>  RET ;子程序

40、返回</p><p>  STOP: ;清零鍵按下,跳轉(zhuǎn)至此</p><p>  MOV P3,#0FFH ;</p><p>  MOV P0,#3FH ;</p><p>  MOV P1,#3FH ;</p><p>  MOV P2,#0BFH

41、 ;數(shù)碼管清零</p><p>  MOV 30H,#00H ;</p><p>  MOV R0,#00H ;</p><p>  MOV R1,#0AH ;</p><p>  MOV R2,#00H ;工作寄存器初始化</p><p>  CLR T

42、R0 ;計時器0停止計時</p><p>  MOV TH0,#0D8H ;</p><p>  MOV TL0,#0FEH ;定時器0預置數(shù)</p><p>  AJMP READ ;</p><p>  DELAY: ;延時10ms子程序</p&g

43、t;<p>  MOV R3,#50D ;</p><p>  D1:MOV R4,#100D ;</p><p>  D2:DJNZ R4,D2 ;</p><p>  DJNZ R3,D1 ;</p><p>  RET ;子程序返回</p&g

44、t;<p>  TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,0BFH ;數(shù)碼管段選碼數(shù)表</p><p>  END ;程序結(jié)束</p><p>  4 ISIS7Professionl軟件仿真</p&

45、gt;<p>  利用Keilu Vision軟件對源程序進行編譯,編譯成功后,把編譯結(jié)果保存。然后根據(jù)我們的軟件在PROTEUS中設計出相應的硬件電路,并將該電路保存到與WAVE程序相同的文件夾中,最后將程序裝載到單片機中,通過ISIS7Professionl仿真,看程序是否能夠?qū)崿F(xiàn)預想的功能.</p><p><b>  仿真圖如下圖所示:</b></p>&

46、lt;p>  ORG 0000H ;程序開始</p><p>  AJMP START ;跳轉(zhuǎn)到主程序START </p><p>  ORG 000BH ;定時器0中斷的地址入口</p><p>  AJMP TIME0 ;定時器0溢出,跳轉(zhuǎn)到中斷程序TIME0</p><

47、;p>  START: ;主程序</p><p>  MOV P3,#0FFH ;輸入端口P3全寫1</p><p>  MOV P0,#3FH ;</p><p>  MOV P1,#3FH ;</p><p>  MOV P2,#0BFH ;數(shù)碼管初始化&l

48、t;/p><p>  MOV 30H,#00H ;</p><p>  MOV R0,#00H ;</p><p>  MOV R1,#0AH ;</p><p>  MOV R2,#00H ;工作寄存器初始化</p><p>  MOV TMOD,#01H

49、;定時器0工作于方式1</p><p>  MOV TH0,#0D8H ;</p><p>  MOV TL0,#0FEH ;定時器0預置數(shù)(D8FEH=55550D)</p><p>  SETB EA ;開總中斷允許</p><p>  SETB ET0 ;開定時器0中斷允許

50、</p><p>  READ: ;讀鍵程序</p><p>  L1:JB P3.2,L2 ;</p><p>  LCALL DELAY ;按鍵延時防抖</p><p>  JB P3.2,L1 ;</p><p>  AJMP RUN

51、 ;確認計時鍵被按下,開始/繼續(xù)計時</p><p>  L2:JB P3.3,L3 ;</p><p>  LCALL DELAY ;按鍵延時防抖</p><p>  JB P3.3,L2 ;</p><p>  AJMP PAUSE ;確認暫停鍵被按下,暫停計時</p&g

52、t;<p>  L3:JB P3.4,L1 ;</p><p>  LCALL DELAY ;按鍵延時防抖</p><p>  JB P3.4,L3 ;</p><p>  AJMP STOP ;確認清零鍵被按下,秒表重置</p><p>  RUN:

53、 ;計時鍵按下,跳轉(zhuǎn)至此</p><p>  SETB TR0 ;定時器0開始/繼續(xù)運行</p><p>  AJMP READ ;</p><p>  PAUSE: ;暫停鍵按下,跳轉(zhuǎn)至此</p><p>  CLR TR0 ;</p>

54、<p>  AJMP READ ; </p><p>  TIME0: ;定時器0溢出,中斷,跳轉(zhuǎn)至此</p><p>  INC 30H ;</p><p>  MOV A,30H ;</p><p>  CJNE A,#0AH,TIME1

55、 ;30H單元中的值到10了嗎?(計時到10毫秒了嗎,也就是說,該向毫秒位送數(shù)了嗎?)</p><p>  MOV DPTR,#TAB ;30H中的值到10了,順序執(zhí)行</p><p>  MOV A,R0 ;</p><p>  INC R0 ;</p><p>  CJNE R0,#0

56、AH,GET ;R0中的值到10了嗎?(該向秒位進位了嗎?)</p><p>  MOV R0,#00H ;</p><p>  LCALL SECOND ;到了,R0清零,調(diào)用進位子程序SECOND,向秒位進位</p><p>  GET: ;沒到,跳過進位子程序</p><p> 

57、 MOVC A,@A+DPTR ;</p><p>  MOV P1,A ;查表并向數(shù)碼管毫秒位送數(shù)</p><p>  MOV 30H,#00H ;重置30H單元</p><p>  TIME1: ;</p><p>  MOV TH0,#0D8H ;</p&g

58、t;<p>  MOV TL0,#0FEH ;給定時器0重新預置數(shù)</p><p>  RETI ;中斷返回</p><p>  SECOND: ;秒位進位子程序</p><p>  PUSH ACC ;</p><p>  PUSH PSW

59、 ;將ACC和PSW推入堆棧保護</p><p>  MOV A,R1 ;</p><p>  INC R1 ;</p><p>  CJNE R1,#14H,GET1 ;R1中的值到20了嗎,也就是說,該向十秒位進位了嗎?</p><p>  MOV R1,#0AH

60、;</p><p>  LCALL SECOND1 ;到了。R1重置,調(diào)用進位子程序SECOND1,向十秒位進位</p><p>  GET1: ;沒到,跳過進位子程序</p><p>  MOVC A,@A+DPTR ;</p><p>  MOV P2,A ;查表并向數(shù)碼管秒

61、位送數(shù)</p><p>  POP PSW ;</p><p>  POP ACC ;PSW,ACC出棧</p><p>  RET ;子程序返回</p><p>  SECOND1: ;十秒位進位子程序</p><p>  

62、PUSH ACC ;</p><p>  PUSH PSW ;將ACC和PSW推入堆棧保護</p><p>  MOV A,R2 ;</p><p>  INC R2 ;</p><p>  CJNE R2,#0AH,GET2 ;R2中的值到10了嗎,也就是

63、說,該將此位歸零了嗎?</p><p>  MOV R2,#00H ;到了,R2清零</p><p>  GET2: ;沒到,跳過清零程序</p><p>  MOVC A,@A+DPTR ;</p><p>  MOV P0,A ;查表并向數(shù)碼管十秒位送數(shù)</p>

64、;<p>  POP PSW ;</p><p>  POP ACC ;PSW,ACC出棧</p><p>  RET ;子程序返回</p><p>  STOP: ;清零鍵按下,跳轉(zhuǎn)至此</p><p>  MOV P3,#0F

65、FH ;</p><p>  MOV P0,#3FH ;</p><p>  MOV P1,#3FH ;</p><p>  MOV P2,#0BFH ;數(shù)碼管清零</p><p>  MOV 30H,#00H ;</p><p>  MOV R0,#00

66、H ;</p><p>  MOV R1,#0AH ;</p><p>  MOV R2,#00H ;工作寄存器初始化</p><p>  CLR TR0 ;計時器0停止計時</p><p>  MOV TH0,#0D8H ;</p><p> 

67、 MOV TL0,#0FEH ;定時器0預置數(shù)</p><p>  AJMP READ ;</p><p>  DELAY: ;延時10ms子程序</p><p>  MOV R3,#50D ;</p><p>  D1:MOV R4,#100D ;</p>

68、<p>  D2:DJNZ R4,D2 ;</p><p>  DJNZ R3,D1 ;</p><p>  RET ;子程序返回</p><p>  TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0

69、FDH,87H,0FFH,0EFH,0BFH ;數(shù)碼管段選碼數(shù)表</p><p>  END ;程序結(jié)束</p><p>  圖7:系統(tǒng)仿真結(jié)果1</p><p><b>  5 課程設計體會</b></p><p>  經(jīng)過一周的不懈努力,單片機的課程設計終于完成了。在這期間我們學會了很多

70、,也學到了很多,同時,對單片機這門課程有了更深一步的理解和掌握。</p><p>  1、本次課程設計使我加深了對單片機課程的全面認識,復習和掌握,對MC-51單片機有了更深入的了解,對I/O口的使用,晶振電路的接法,以及復位電路等的掌握都有了很大程度的提高,這為以后的實踐打下了良好的基礎。</p><p>  2、掌握了定時器、外部中斷的設置和編程原理。</p><p

71、>  3、通過此次課程設計能夠?qū)纹瑱C軟硬件結(jié)合起來,對程序進行編輯,校驗。</p><p>  4、還要根據(jù)實驗的實際情況,添加些額外程序來使系統(tǒng)更加的穩(wěn)定,如開關的消震蕩(采用延遲)。</p><p>  5、程序要盡量做到由各個子程序組成,在有些程序后面最好加注釋,這樣在程序出錯的檢查過程中可以更容易查找的到,也更簡潔,更明白易懂。</p><p>  

72、6、我在編程過程中還有好多不理解的地方,經(jīng)過同學的幫助終于完成了這次設計。在這個過程中體會到了合作的好處,更了解的互相幫助的重要性。</p><p>  由于編程能力的有限和所學知識的局限性,在這個程序和設計系統(tǒng)中雖然實現(xiàn)了所有的基本要求和部分的高級要求,但是這其中還有許多不完善的地方,有時在上翻和下翻時會出現(xiàn)一些問題,這說明我在這方面還存在著很多不足,知識不夠完備和系統(tǒng),在以后的學習中還有待提高。另外,在實踐中

73、雖然焊接好了硬件電路,卻沒能實踐成功,希望老師能在以后的學習和生活中對我多加指導,促使我能取得更大的進步。</p><p><b>  6參考文獻</b></p><p>  【1】余發(fā)山編著.單片機原理及應用技術徐州:中國礦業(yè)大學出版社,2003年</p><p>  【2】楊凌霄編著.微型計算機原理及應用.徐州:中國礦業(yè)大學出版社,2004

74、年</p><p>  【3】楊寧編著.單片機與控制技術.北京:北京航空航天大學出版社,2004年</p><p>  【4】王閃編著.AT89系列單片機原理與接口技術.北京:北京航空航天大學出版社,2004年</p><p><b>  附錄:程序清單:</b></p><p>  ORG 0000H

75、 ;程序開始</p><p>  AJMP START ;跳轉(zhuǎn)到主程序START </p><p>  ORG 000BH ;定時器0中斷的地址入口</p><p>  AJMP TIME0 ;定時器0溢出,跳轉(zhuǎn)到中斷程序TIME0</p><p>  START: ;

76、主程序</p><p>  MOV P3,#0FFH ;輸入端口P3全寫1</p><p>  MOV P0,#3FH ;</p><p>  MOV P1,#3FH ;</p><p>  MOV P2,#0BFH ;數(shù)碼管初始化</p><p>  MOV 30H

77、,#00H ;</p><p>  MOV R0,#00H ;</p><p>  MOV R1,#0AH ;</p><p>  MOV R2,#00H ;工作寄存器初始化</p><p>  MOV TMOD,#01H ;定時器0工作于方式1</p><p

78、>  MOV TH0,#0D8H ;</p><p>  MOV TL0,#0FEH ;定時器0預置數(shù)(D8FEH=55550D)</p><p>  SETB EA ;開總中斷允許</p><p>  SETB ET0 ;開定時器0中斷允許</p><p>  READ:

79、 ;讀鍵程序</p><p>  L1:JB P3.2,L2 ;</p><p>  LCALL DELAY ;按鍵延時防抖</p><p>  JB P3.2,L1 ;</p><p>  AJMP RUN ;確認計時鍵被按下,開始/繼續(xù)計時</p&

80、gt;<p>  L2:JB P3.3,L3 ;</p><p>  LCALL DELAY ;按鍵延時防抖</p><p>  JB P3.3,L2 ;</p><p>  AJMP PAUSE ;確認暫停鍵被按下,暫停計時</p><p>  L3:JB P3.4,L1

81、 ;</p><p>  LCALL DELAY ;按鍵延時防抖</p><p>  JB P3.4,L3 ;</p><p>  AJMP STOP ;確認清零鍵被按下,秒表重置</p><p>  RUN: ;計時鍵按下,跳轉(zhuǎn)至此</p>

82、<p>  SETB TR0 ;定時器0開始/繼續(xù)運行</p><p>  AJMP READ ;</p><p>  PAUSE: ;暫停鍵按下,跳轉(zhuǎn)至此</p><p>  CLR TR0 ;</p><p>  AJMP READ

83、 ; </p><p>  TIME0: ;定時器0溢出,中斷,跳轉(zhuǎn)至此</p><p>  INC 30H ;</p><p>  MOV A,30H ;</p><p>  CJNE A,#0AH,TIME1 ;30H單元中的值到10了嗎?(計時到10毫秒了嗎,也

84、就是說,該向毫秒位送數(shù)了嗎?)</p><p>  MOV DPTR,#TAB ;30H中的值到10了,順序執(zhí)行</p><p>  MOV A,R0 ;</p><p>  INC R0 ;</p><p>  CJNE R0,#0AH,GET ;R0中的值到10了嗎?(該向秒位進位

85、了嗎?)</p><p>  MOV R0,#00H ;</p><p>  LCALL SECOND ;到了,R0清零,調(diào)用進位子程序SECOND,向秒位進位</p><p>  GET: ;沒到,跳過進位子程序</p><p>  MOVC A,@A+DPTR ;</p&

86、gt;<p>  MOV P1,A ;查表并向數(shù)碼管毫秒位送數(shù)</p><p>  MOV 30H,#00H ;重置30H單元</p><p>  TIME1: ;</p><p>  MOV TH0,#0D8H ;</p><p>  MOV TL0,#0FEH

87、 ;給定時器0重新預置數(shù)</p><p>  RETI ;中斷返回</p><p>  SECOND: ;秒位進位子程序</p><p>  PUSH ACC ;</p><p>  PUSH PSW ;將ACC和PSW推入堆棧保護</

88、p><p>  MOV A,R1 ;</p><p>  INC R1 ;</p><p>  CJNE R1,#14H,GET1 ;R1中的值到20了嗎,也就是說,該向十秒位進位了嗎?</p><p>  MOV R1,#0AH ;</p><p>  LCAL

89、L SECOND1 ;到了。R1重置,調(diào)用進位子程序SECOND1,向十秒位進位</p><p>  GET1: ;沒到,跳過進位子程序</p><p>  MOVC A,@A+DPTR ;</p><p>  MOV P2,A ;查表并向數(shù)碼管秒位送數(shù)</p><p>  PO

90、P PSW ;</p><p>  POP ACC ;PSW,ACC出棧</p><p>  RET ;子程序返回</p><p>  SECOND1: ;十秒位進位子程序</p><p>  PUSH ACC ;</p&g

91、t;<p>  PUSH PSW ;將ACC和PSW推入堆棧保護</p><p>  MOV A,R2 ;</p><p>  INC R2 ;</p><p>  CJNE R2,#0AH,GET2 ;R2中的值到10了嗎,也就是說,該將此位歸零了嗎?</p><p

92、>  MOV R2,#00H ;到了,R2清零</p><p>  GET2: ;沒到,跳過清零程序</p><p>  MOVC A,@A+DPTR ;</p><p>  MOV P0,A ;查表并向數(shù)碼管十秒位送數(shù)</p><p>  POP PSW

93、 ;</p><p>  POP ACC ;PSW,ACC出棧</p><p>  RET ;子程序返回</p><p>  STOP: ;清零鍵按下,跳轉(zhuǎn)至此</p><p>  MOV P3,#0FFH ;</p><p&

94、gt;  MOV P0,#3FH ;</p><p>  MOV P1,#3FH ;</p><p>  MOV P2,#0BFH ;數(shù)碼管清零</p><p>  MOV 30H,#00H ;</p><p>  MOV R0,#00H ;</p><p&

95、gt;  MOV R1,#0AH ;</p><p>  MOV R2,#00H ;工作寄存器初始化</p><p>  CLR TR0 ;計時器0停止計時</p><p>  MOV TH0,#0D8H ;</p><p>  MOV TL0,#0FEH ;定時器0預置

96、數(shù)</p><p>  AJMP READ ;</p><p>  DELAY: ;延時10ms子程序</p><p>  MOV R3,#50D ;</p><p>  D1:MOV R4,#100D ;</p><p>  D2:DJNZ R4,D2

97、 ;</p><p>  DJNZ R3,D1 ;</p><p>  RET ;子程序返回</p><p>  TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,0BFH ;數(shù)碼管段

溫馨提示

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

評論

0/150

提交評論