一、實驗題目
秒表系統設計——用AT89C51設計一個2位LED數碼顯示“秒表”,顯示時間為00~99秒,每秒自動加一。另設計一個“開始”按鍵和一個“復位”按鍵。
二、增加功能
增加一個“暫停”按鍵和一個“快加”按鍵(每10ms快速加一)
三、實驗內容提要
本實驗利用單片機的定時器/計數器定時和記數的原理,結合dvcc實驗箱上的集成電路芯片8032、LED數碼管以及實驗箱上的按鍵來設計計時器。將軟、硬件有機地結合起來,使得系統能夠正確地進行計時,數碼管能夠正確地顯示時間。其中本實驗設計了四個開關按鍵:其中一個按鍵按下去時以1秒加一開始計時,即秒表開始鍵(本實驗中當開關從1變為0時開始計時),另一個按鍵按下去時暫停計時,使秒表停留在原先的計時(本實驗中當相應開關從1變為0時即停止計時),第三個按鍵按下去時清0(本實驗中當相應開關從1變為0時即停止計時),第四按鍵按下去則是以每10ms秒快速加一計時(本實驗中當開關從1變為0時開始計時)。本實驗中開始時都要使各按鍵回到各初始位置,即都處于1狀態。
三、實驗目的
1、 通過本次課程設計加深對單片機課程的全面認識復習和掌握,對單片機課程的應用進一步的了解。
2、 掌握定時器、外部中斷的設置和編程原理。
3、 通過此次課程設計能夠將單片機軟硬件結合起來,對程序進行編輯,校驗。
四、意義
該實驗通過單片機的定時器/計數器定時和計數原理,設計簡單的計時器系統,擁有正確的計時、暫停、清零、快加功能,并同時可以用數碼管顯示,在現實生活中應用廣泛,具有現實意義。
五、本人所做工作
根據相關的單片機材料,利用所學的單片機知識,結合DVCC系列單片機微機仿真實驗系統中的軟件和硬件(集成電路芯片8032,七段數碼管,開關電路及時鐘信號電路,按鍵等),編寫能夠實現該項目的軟件程序,最后將軟、硬件有機的結合起來,進行有效的調試,達到完成該實驗課程設計的目的要求。
六、實驗內容
用AT89C51設計一個2位LED數碼顯示“秒表”,顯示時間為00~99秒,每秒自動加一。另設計一個“開始”按鍵和一個“復位”按鍵。再增加一個“暫停”按鍵和一個“快加”按鍵(每10ms快速加一)。
按鍵說明:按“開始”按鍵,開始計數,數碼管顯示從00開始每秒自動加一;按“復位”按鍵,系統清零,數碼管顯示00;按“暫停”按鍵,系統暫停計數,數碼管顯示當時的計數;按“快加”按鍵,系統每10ms快速加一,即數碼顯示管在原先的計數上快速加一。
七、設計思路及描述
該實驗要求進行計時并在數碼管上顯示時間,則可利用DVCC系列單片機微機仿真實驗系統中的芯片8032(芯片的功能類似于芯片AT89C51,其管腳功能也和AT89C51的管腳功能類似)中的P3.2管腳做為外部中斷0的入口地址,并實現“開始”按鍵的功能;將P3.3做為外部中斷1的入口地址,并實現“清零”按鍵的功能;將P3.0做為數據信號DATA輸入的入口地址;將P3.1做為時鐘信號CLK輸入的入口地址。定時器T0作為每秒加一的定時器;定時器T1作為“快加”鍵的定時器。其中“開始”按鍵當開關由1撥向0(由上向下撥)時開始計時;“清零”按鍵當開關由1撥向0(由上向下撥)時數碼管清零,此時若再撥“開始”按鍵則又可重新開始計時。
八、原理圖
十、實驗程序
;******************************************************************
; 設計選題:實驗五-----秒表系統設計
; 描述: 2位LED數碼顯示"秒表",顯示時間為00~99秒,每秒自動加1,
; 一個"開始"鍵,一個"復位"鍵,一個"暫停"鍵,一個“快加”鍵。
; 調用子程序:暫停鍵子程序,計時鍵子程序,清0鍵子程序,加一子程序
; 顯示子程序,定時子程序
;所用特殊寄存器:寄存器A,寄存器C
;所用中斷:外部中斷INT0、INT1,定時器T0、T1
; 實驗作者: 吳呤--2號,方曉瑛--10號
;***************************************************************************
org 0000h
ajmp main ;主程序入口地址
org 0003h
ajmp zhongduan0 ;中斷0入口地址
org 000bh
ajmp yanshi ;定時器T0入口地址
org 0013h
ajmp zhongduan1 ;中斷1入口地址
org 001bh
ajmp dingshi1 ;定時器T1入口地址
org 0030h
;***********************************************************
; 主程序
;***********************************************************
main: mov tcon,#05h ;主程序開始 外部中斷跳變模式
mov tmod,#11h ;定時器0,1模式1
mov ie,#8fh ;開總中斷,中斷0,1,定時器0,1
mov dptr,#tab
mov r1,#00h
mov r2,#00h
mov r3,#40 ;循環次數40
mov tl0,#2Ch ;置初值,定時25MS
mov th0,#0CFh
mov tl1,#78h ;置初值,定時10MS
mov th1,#0ech
clr tr0 ;關定時器
clr tr1
;***********************************************************
; 暫停鍵K3,快加鍵K4程序
;***********************************************************
here:jb p1.0,here
show:clr tr1
clr tr0
acall xianshi
kuaijia:jb p1.2,kuaijia ;等待P1.2為0 快加
clr tr0
setb tr1
here3:jnb p1.2,here3
ajmp here
;***********************************************************
; 外部中斷INT0子程序-----計時按鍵K1子程序
;***********************************************************
zhongduan0: setb tr0 ;計時按鍵
reti
;***********************************************************
; 外部中斷INT1子程序----復位按鍵K2子程序
;***********************************************************
zhongduan1:clr tr0 ;復位按鍵
clr tr1
mov 12h,#00h
mov 11h,#00h
acall xianshi ;調用顯示子程序
mov r1,#00h
mov r2,#00h
reti
;***********************************************************
; 加一子程序
;***********************************************************
jia1: inc r1 ;加1子程序
cjne r1,#0ah ,loop ;判斷是否到表尾
mov r1,#00h
inc r2
cjne r2,#0ah,loop
mov r2,#00h
loop: mov 12h,r1 ;重新賦值
mov 11h,r2
ret
;***********************************************************
; 顯示子程序
;***********************************************************
xianshi:mov r7,#02h ;2個數碼管顯示子程序
mov r0,#12h
loop5: mov r6,#08h ;8位2進制數
mov a,@r0
movc a,@a+dptr
loop6:rlc a ;循環左移
clr p3.1
mov p3.0,c
setb p3.1
djnz r6,loop6
dec r0
djnz r7,loop5
ret
;***********************************************************
; 定時器T0子程序
;***********************************************************
yanshi: mov tl0,#2Ch ;定時子程序
mov th0,#0CFh
djnz r3,loop7
acall jia1 ;調用加1子程序
acall xianshi ;調用顯示子程序
mov r3,#40
loop7: reti
;***********************************************************
;定時器T1子程序
;***********************************************************
dingshi1:mov tl1,#78h ;置初值,定時10MS
mov th1,#0ech
clr tr0
setb tr1
mov 12h,r1
mov 11h,r2
jnb p1.0,show
acall jia1
acall xianshi
lop7:reti
;***********************************************************
tab:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
end
十一、課程設計心得體會
1、 認真審題,看懂題目的要求!選擇適當的課題,不益太簡單或者太難。做到既能把課題完成又能鍛煉自己的能力!
2、 根據課題要求,復習相關的知識,查詢相關的資料。
3、 根據實驗條件,找到適合的方案,找到需要的元器件及工具,準備實驗。
4、 根據課程設計的要求和自己所要增加的功能寫好程序流程圖,在程序流程圖的基礎上,根據芯片的功能寫出相應的程序。然后再進行程序調試和相應的修改,以達到能夠實現所要求的功能的目的。
5、 還要根據實驗的實際情況,添加些額外程序來使系統更加的穩定,如開關的消震蕩(采用延遲)。
6、 程序要盡量做到由各個子程序組成,在有些程序后面最好加注釋,這樣在程序出錯的檢查過程中可以更容易查找的到,也更簡潔,更明白易懂。
7、 該實驗的程序可以參考DVCC系列單片機微機仿真實驗系統實驗指導書中的串并轉換實驗,也可自己根據自己熟悉的方法來編程。
8、 在設計控制開關時,注意2個中斷的打開和關閉的先后順序,否則就會出錯。
9、 這次的單片機課程設計重點是理論與實際的相結合。不再只讀書了。
10、 該設計從頭到尾都要自己參與,熟悉了對整個設計的過程,更系統的鍛煉了自己。
此設計完畢!!
-------------------------------------------------------
下面提供一個程序(供參考的)
;開機初始化
MOV P3,#0FFH;對P3口初始化,設置為高電平,用于按鍵輸入
MOV P0,#0FFH;使顯示時間數碼管熄滅
CLR F0
CLR F1
MOV DPTR,#NUMTAB ;指定查表啟始地址
;等待按鍵輸入
;根據按鍵的輸入判斷執行什么功能
;按鍵1按下則執行功能1
MOV P3,#0FFH;對P3口初始化,設置為高電平,用于按鍵輸入
MOV P0,#0FFH;使顯示時間數碼管熄滅
START:JB P3.6,START1;循環判斷開始按鈕K1是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.6,START;如果是干擾就返回
JNB P3.6,$;等待按鍵松開
LJMP GN1
;按鍵2按下則執行功能2
START1: JB P3.7,START;循環判斷開始按鈕K2是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.7,START1;如果是干擾就返回
JNB P3.7,$
LJMP GN2
;數碼管顯示秒表時間的程序
GN1: ;先初始化
S1:MOV A,#0
MOV TEMP,A
GOON1: MOV R2,#2
JS1: MOV R3,#250
TIME1: MOV A,TEMP ;將TEMP中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;個位在B
LCALL DPLOP1
;插入一段判斷定時過程中是否有按鍵輸入的程序段
C1: JB P3.6,B1
ACALL DELAY10;延時10毫秒消抖
JB P3.6,C1
JNB P3.6,$;等待按鍵松開
CPL F0
ZT1: ; MOV P3,#0FFH;對P3口初始化,設置為高電平,用于按鍵輸入
JB P3.6,$;循環判斷開始按鈕K1是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.6,ZT1;如果是干擾就返回
JNB P3.6,$;等待按鍵松開
LCALL DPLOP1
B1: JB P3.7,LOOP1
ACALL DELAY10;延時10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按鍵松開
AJMP OVER
LOOP1: DJNZ R3,TIME1 ;2毫秒循環執行250次,時間約0.5秒
DJNZ R2,JS1 ;循環執行2次,時間為1 秒鐘
INC TEMP;滿一秒鐘對時間加1
MOV A,TEMP
CLR C
SUBB A,#60
JNZ GOON1;判斷TEMP的數值是否為60?不為60循環
ACALL OVER
RET
GN2: MOV A,#14H ; 設定倒計時的時間20S
MOV TEMP,A
;數碼管顯示倒計時時間的程序
;初始化
MOV P3,#0FFH;對P3口初始化,設置為高電平,用于按鍵輸入
MOV P0,#14H;使顯示時間為設定的倒計時時間
GOON2: MOV R2,#2
JS2: MOV R3,#250
TIME2: MOV A,TEMP ;將TEMP中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;個位在B
MOV DPTR,#NUMTAB ;指定查表啟始地址
DPLOP2: MOV A,A_BIT ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P0,A ;送出個位的7段代碼
CLR P2.5 ;開個位顯示
ACALL DELY1;顯示1毫秒
SETB P2.5;關閉個位顯示,防止鬼影
MOV A,B_BIT ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P0,A ;送出十位的7段代碼
CLR P2.6 ;開十位顯示
ACALL DELY1;顯示1毫秒
SETB P2.6;關閉十位顯示,防止鬼影
;插入一段判斷定時過程中是否有按鍵輸入的程序段
C2: JB P3.6,B2
ACALL DELAY10;延時10毫秒消抖
JB P3.6,C2
JNB P3.6,$;等待按鍵松開
ZT2: MOV P3,#0FFH;對P3口初始化,設置為高電平,用于按鍵輸入
JB P3.6,$;循環判斷開始按鈕K1是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.6,ZT2;如果是干擾就返回
JNB P3.6,$;等待按鍵松開
B2: JB P3.7,LOOP2
ACALL DELAY10;延時10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按鍵松開
AJMP OVER
LOOP2: DJNZ R3,TIME2 ;2毫秒循環執行250次,時間約0.5秒
DJNZ R2,JS2 ;循環執行2次,時間為1 秒鐘
DEC TEMP;滿一秒鐘對時間減1
MOV A,TEMP
JNZ GOON2;判斷TEMP的數值是否為0?不為0循環
ACALL OVER
RET
;結束定時
OVER: AJMP START;退到開機初始化狀態
;1毫秒延時子程序
DELY1: MOV R4,#2
D1:MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
;10毫秒延時子程序
DELAY10: MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
;實驗板上的兩位一體的數碼管0~9各數字的顯示代碼
NUMTAB: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
DPLOP1: MOV A,A_BIT ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P0,A ;送出個位的7段代碼
CLR P2.5 ;開個位顯示
ACALL DELY1;顯示1毫秒
SETB P2.5;關閉個位顯示,防止鬼影
MOV A,B_BIT ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P0,A ;送出十位的7段代碼
CLR P2.6 ;開十位顯示
ACALL DELY1;顯示1毫秒
SETB P2.6;關閉十位顯示,防止鬼影
RET
END