一、實驗題目
秒表系統(tǒng)設(shè)計——用AT89C51設(shè)計一個2位LED數(shù)碼顯示“秒表”,顯示時間為00~99秒,每秒自動加一。另設(shè)計一個“開始”按鍵和一個“復(fù)位”按鍵。
二、增加功能
增加一個“暫停”按鍵和一個“快加”按鍵(每10ms快速加一)
三、實驗內(nèi)容提要
本實驗利用單片機的定時器/計數(shù)器定時和記數(shù)的原理,結(jié)合dvcc實驗箱上的集成電路芯片8032、LED數(shù)碼管以及實驗箱上的按鍵來設(shè)計計時器。將軟、硬件有機地結(jié)合起來,使得系統(tǒng)能夠正確地進行計時,數(shù)碼管能夠正確地顯示時間。其中本實驗設(shè)計了四個開關(guān)按鍵:其中一個按鍵按下去時以1秒加一開始計時,即秒表開始鍵(本實驗中當(dāng)開關(guān)從1變?yōu)?時開始計時),另一個按鍵按下去時暫停計時,使秒表停留在原先的計時(本實驗中當(dāng)相應(yīng)開關(guān)從1變?yōu)?時即停止計時),第三個按鍵按下去時清0(本實驗中當(dāng)相應(yīng)開關(guān)從1變?yōu)?時即停止計時),第四按鍵按下去則是以每10ms秒快速加一計時(本實驗中當(dāng)開關(guān)從1變?yōu)?時開始計時)。本實驗中開始時都要使各按鍵回到各初始位置,即都處于1狀態(tài)。
三、實驗?zāi)康?br /> 1、 通過本次課程設(shè)計加深對單片機課程的全面認識復(fù)習(xí)和掌握,對單片機課程的應(yīng)用進一步的了解。
2、 掌握定時器、外部中斷的設(shè)置和編程原理。
3、 通過此次課程設(shè)計能夠?qū)纹瑱C軟硬件結(jié)合起來,對程序進行編輯,校驗。
四、意義
該實驗通過單片機的定時器/計數(shù)器定時和計數(shù)原理,設(shè)計簡單的計時器系統(tǒng),擁有正確的計時、暫停、清零、快加功能,并同時可以用數(shù)碼管顯示,在現(xiàn)實生活中應(yīng)用廣泛,具有現(xiàn)實意義。
五、本人所做工作
根據(jù)相關(guān)的單片機材料,利用所學(xué)的單片機知識,結(jié)合DVCC系列單片機微機仿真實驗系統(tǒng)中的軟件和硬件(集成電路芯片8032,七段數(shù)碼管,開關(guān)電路及時鐘信號電路,按鍵等),編寫能夠?qū)崿F(xiàn)該項目的軟件程序,最后將軟、硬件有機的結(jié)合起來,進行有效的調(diào)試,達到完成該實驗課程設(shè)計的目的要求。
六、實驗內(nèi)容
用AT89C51設(shè)計一個2位LED數(shù)碼顯示“秒表”,顯示時間為00~99秒,每秒自動加一。另設(shè)計一個“開始”按鍵和一個“復(fù)位”按鍵。再增加一個“暫停”按鍵和一個“快加”按鍵(每10ms快速加一)。
按鍵說明:按“開始”按鍵,開始計數(shù),數(shù)碼管顯示從00開始每秒自動加一;按“復(fù)位”按鍵,系統(tǒng)清零,數(shù)碼管顯示00;按“暫停”按鍵,系統(tǒng)暫停計數(shù),數(shù)碼管顯示當(dāng)時的計數(shù);按“快加”按鍵,系統(tǒng)每10ms快速加一,即數(shù)碼顯示管在原先的計數(shù)上快速加一。
七、設(shè)計思路及描述
該實驗要求進行計時并在數(shù)碼管上顯示時間,則可利用DVCC系列單片機微機仿真實驗系統(tǒng)中的芯片8032(芯片的功能類似于芯片AT89C51,其管腳功能也和AT89C51的管腳功能類似)中的P3.2管腳做為外部中斷0的入口地址,并實現(xiàn)“開始”按鍵的功能;將P3.3做為外部中斷1的入口地址,并實現(xiàn)“清零”按鍵的功能;將P3.0做為數(shù)據(jù)信號DATA輸入的入口地址;將P3.1做為時鐘信號CLK輸入的入口地址。定時器T0作為每秒加一的定時器;定時器T1作為“快加”鍵的定時器。其中“開始”按鍵當(dāng)開關(guān)由1撥向0(由上向下?lián)埽⿻r開始計時;“清零”按鍵當(dāng)開關(guān)由1撥向0(由上向下?lián)埽⿻r數(shù)碼管清零,此時若再撥“開始”按鍵則又可重新開始計時。
八、原理圖
十、實驗程序
;******************************************************************
; 設(shè)計選題:實驗五-----秒表系統(tǒng)設(shè)計
; 描述: 2位LED數(shù)碼顯示"秒表",顯示時間為00~99秒,每秒自動加1,
; 一個"開始"鍵,一個"復(fù)位"鍵,一個"暫停"鍵,一個“快加”鍵。
; 調(diào)用子程序:暫停鍵子程序,計時鍵子程序,清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 ;循環(huán)次數(shù)40
mov tl0,#2Ch ;置初值,定時25MS
mov th0,#0CFh
mov tl1,#78h ;置初值,定時10MS
mov th1,#0ech
clr tr0 ;關(guān)定時器
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子程序----復(fù)位按鍵K2子程序
;***********************************************************
zhongduan1:clr tr0 ;復(fù)位按鍵
clr tr1
mov 12h,#00h
mov 11h,#00h
acall xianshi ;調(diào)用顯示子程序
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個數(shù)碼管顯示子程序
mov r0,#12h
loop5: mov r6,#08h ;8位2進制數(shù)
mov a,@r0
movc a,@a+dptr
loop6:rlc a ;循環(huán)左移
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 ;調(diào)用加1子程序
acall xianshi ;調(diào)用顯示子程序
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
十一、課程設(shè)計心得體會
1、 認真審題,看懂題目的要求!選擇適當(dāng)?shù)恼n題,不益太簡單或者太難。做到既能把課題完成又能鍛煉自己的能力!
2、 根據(jù)課題要求,復(fù)習(xí)相關(guān)的知識,查詢相關(guān)的資料。
3、 根據(jù)實驗條件,找到適合的方案,找到需要的元器件及工具,準(zhǔn)備實驗。
4、 根據(jù)課程設(shè)計的要求和自己所要增加的功能寫好程序流程圖,在程序流程圖的基礎(chǔ)上,根據(jù)芯片的功能寫出相應(yīng)的程序。然后再進行程序調(diào)試和相應(yīng)的修改,以達到能夠?qū)崿F(xiàn)所要求的功能的目的。
5、 還要根據(jù)實驗的實際情況,添加些額外程序來使系統(tǒng)更加的穩(wěn)定,如開關(guān)的消震蕩(采用延遲)。
6、 程序要盡量做到由各個子程序組成,在有些程序后面最好加注釋,這樣在程序出錯的檢查過程中可以更容易查找的到,也更簡潔,更明白易懂。
7、 該實驗的程序可以參考DVCC系列單片機微機仿真實驗系統(tǒng)實驗指導(dǎo)書中的串并轉(zhuǎn)換實驗,也可自己根據(jù)自己熟悉的方法來編程。
8、 在設(shè)計控制開關(guān)時,注意2個中斷的打開和關(guān)閉的先后順序,否則就會出錯。
9、 這次的單片機課程設(shè)計重點是理論與實際的相結(jié)合。不再只讀書了。
10、 該設(shè)計從頭到尾都要自己參與,熟悉了對整個設(shè)計的過程,更系統(tǒng)的鍛煉了自己。
此設(shè)計完畢!!
-------------------------------------------------------
下面提供一個程序(供參考的)
;開機初始化
MOV P3,#0FFH;對P3口初始化,設(shè)置為高電平,用于按鍵輸入
MOV P0,#0FFH;使顯示時間數(shù)碼管熄滅
CLR F0
CLR F1
MOV DPTR,#NUMTAB ;指定查表啟始地址
;等待按鍵輸入
;根據(jù)按鍵的輸入判斷執(zhí)行什么功能
;按鍵1按下則執(zhí)行功能1
MOV P3,#0FFH;對P3口初始化,設(shè)置為高電平,用于按鍵輸入
MOV P0,#0FFH;使顯示時間數(shù)碼管熄滅
START:JB P3.6,START1;循環(huán)判斷開始按鈕K1是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.6,START;如果是干擾就返回
JNB P3.6,$;等待按鍵松開
LJMP GN1
;按鍵2按下則執(zhí)行功能2
START1: JB P3.7,START;循環(huán)判斷開始按鈕K2是否按下?
ACALL DELAY10;延時10毫秒觸點消抖
JB P3.7,START1;如果是干擾就返回
JNB P3.7,$
LJMP GN2
;數(shù)碼管顯示秒表時間的程序
GN1: ;先初始化
S1:MOV A,#0
MOV TEMP,A
GOON1: MOV R2,#2
JS1: MOV R3,#250
TIME1: MOV A,TEMP ;將TEMP中的十六進制數(shù)轉(zhuǎn)換成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口初始化,設(shè)置為高電平,用于按鍵輸入
JB P3.6,$;循環(huán)判斷開始按鈕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毫秒循環(huán)執(zhí)行250次,時間約0.5秒
DJNZ R2,JS1 ;循環(huán)執(zhí)行2次,時間為1 秒鐘
INC TEMP;滿一秒鐘對時間加1
MOV A,TEMP
CLR C
SUBB A,#60
JNZ GOON1;判斷TEMP的數(shù)值是否為60?不為60循環(huán)
ACALL OVER
RET
GN2: MOV A,#14H ; 設(shè)定倒計時的時間20S
MOV TEMP,A
;數(shù)碼管顯示倒計時時間的程序
;初始化
MOV P3,#0FFH;對P3口初始化,設(shè)置為高電平,用于按鍵輸入
MOV P0,#14H;使顯示時間為設(shè)定的倒計時時間
GOON2: MOV R2,#2
JS2: MOV R3,#250
TIME2: MOV A,TEMP ;將TEMP中的十六進制數(shù)轉(zhuǎn)換成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 ;取個位數(shù)
MOVC A,@A+DPTR ;查個位數(shù)的7段代碼
MOV P0,A ;送出個位的7段代碼
CLR P2.5 ;開個位顯示
ACALL DELY1;顯示1毫秒
SETB P2.5;關(guān)閉個位顯示,防止鬼影
MOV A,B_BIT ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
MOV P0,A ;送出十位的7段代碼
CLR P2.6 ;開十位顯示
ACALL DELY1;顯示1毫秒
SETB P2.6;關(guān)閉十位顯示,防止鬼影
;插入一段判斷定時過程中是否有按鍵輸入的程序段
C2: JB P3.6,B2
ACALL DELAY10;延時10毫秒消抖
JB P3.6,C2
JNB P3.6,$;等待按鍵松開
ZT2: MOV P3,#0FFH;對P3口初始化,設(shè)置為高電平,用于按鍵輸入
JB P3.6,$;循環(huán)判斷開始按鈕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毫秒循環(huán)執(zhí)行250次,時間約0.5秒
DJNZ R2,JS2 ;循環(huán)執(zhí)行2次,時間為1 秒鐘
DEC TEMP;滿一秒鐘對時間減1
MOV A,TEMP
JNZ GOON2;判斷TEMP的數(shù)值是否為0?不為0循環(huán)
ACALL OVER
RET
;結(jié)束定時
OVER: AJMP START;退到開機初始化狀態(tài)
;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
;實驗板上的兩位一體的數(shù)碼管0~9各數(shù)字的顯示代碼
NUMTAB: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
DPLOP1: MOV A,A_BIT ;取個位數(shù)
MOVC A,@A+DPTR ;查個位數(shù)的7段代碼
MOV P0,A ;送出個位的7段代碼
CLR P2.5 ;開個位顯示
ACALL DELY1;顯示1毫秒
SETB P2.5;關(guān)閉個位顯示,防止鬼影
MOV A,B_BIT ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
MOV P0,A ;送出十位的7段代碼
CLR P2.6 ;開十位顯示
ACALL DELY1;顯示1毫秒
SETB P2.6;關(guān)閉十位顯示,防止鬼影
RET
END