8、
■
F22M1D 、
P5CN
4lLF
■
a
F2SR13 1 ?2泌14
?酊內(nèi)IS ■
P11
卻M?汨■
31J
PJ.I/T3CDI -
011
P1IJ
Q 加 IMT1 !
P1J.
PWTO
即 15fLl -
口 1
P3jUIR!;
HTjffB
在本實驗中主要用用P3口輸入按鍵信號,還用到了特殊的
由于其存在高阻狀態(tài),為了實現(xiàn)開關(guān)功能,給其添加上拉電阻,具體如下圖所示:
2.2 輸出部分
本電路的輸出信號為7段數(shù)碼管的位選和段選信號,鬧鈴脈沖信號,提示燈 信號。
本實驗的數(shù)碼管是共陰
9、的,為了防止段選信號不能驅(qū)動數(shù)碼管,故在 P1 口連接 上拉電阻后,再送段選信號,以提高驅(qū)動,位選信號直接從 P2 口接入,如下圖:
鬧鈴由P2.6端輸出,模塊如下:
2.3 晶振與復(fù)位電路
本實驗單片機時鐘用內(nèi)部時鐘,模塊如下:
C2
——. I
l—Jl I Q592
C3
II~~-
22UF
復(fù)位電路為手動復(fù)位構(gòu)成,模塊如下:
各模塊拼接組合,電路總體設(shè)計圖如下
“ KjuI tIw. 1
Dail-MUJmYgnr
1rUMI叩l-uluFniuFn
*?IULJU -111.
B.程序設(shè)計
8.1 程
10、序總體設(shè)計
本實驗用匯編程序完成
程序總的流程圖如下:
8.2 程序主要模塊
8.2.1 延時模塊
數(shù)碼管顯示動態(tài)掃描時, 用到延時程序, 這里使用延遲 1ms 的程序, 此程序
需反復(fù)調(diào) , 除數(shù)碼管動態(tài)掃描外,數(shù)碼管的閃爍提示,以及音樂模塊也用到了延
時,只是延時的長短不同罷了,在此不再贅述。
8.2.2 中斷服務(wù)程序
本實驗中,計數(shù)器T0,T1中斷都有運用,其中T0中斷為時鐘定時所用,T1中 斷用于音樂播放。T0的定時長度為0.01s,工作于方式1,計數(shù)1次,時長1us,故 計數(shù)器計數(shù)1000畋,進入中斷,計數(shù)初值為 65536-10000=55536=#0D8F
11、0裝滿 定時器需要 0.01s 的時間,從而 100次中斷為一秒,一秒之后,判斷是否到 60秒,
若不到則秒加一,然后返回,若到,則秒賦值為 0,分加一,依次類推。包括日
期顯示的功能也是如此。 另外, 由于要實現(xiàn)倒計時功能, 因此在中斷程序中還要 加入減一的寄存器,需要時將其進行顯示?;谝陨峡紤],以R刻倒計時中的秒, R4為倒計時的分,當秒加1時RGS一,減到0之后,秒賦值為59,分減一,直到分 為 0。
計數(shù)器 T1 工作于方式 1, 當調(diào)用響鈴程序時,其計數(shù)功能開啟,為音樂音
調(diào)不同頻率的方波的形成, 提供延時。 其中斷服務(wù)程序就是根據(jù)音調(diào)改變音樂方 波輸出口電平的高低,用語句
12、 CPL實現(xiàn)。
中斷服務(wù)程序中日歷的實現(xiàn)較為復(fù)雜,要考慮平年,閏年,特殊的 2月,每
月的天數(shù)的不盡相同。具體的邏輯判斷方法為:首先,要考慮年份是不是閏年,
閏年的判斷方法是: 將年份除以 100, 若能整除, 則將年份除以 400, 若還能整除,
則為閏年, 若不能, 則為平年; 若不能被 100整除, 則判斷是否能被 4整除, 若能,
則為閏年,若不能則為平年。只有 2月與平、閏年相關(guān),因此在閏年和平年的子
程序中,要判斷是不是 2月,若是則在相應(yīng)的年中進行日期的增加,若不是則轉(zhuǎn)
入平時的月份。其中 1、 3、 5、 7、 8、 10、 12月是每月 31天, 4、 6、 9
13、、 11月為每
月 30天。
日歷進位判斷流程圖如下:
本實驗用8個數(shù)碼管,剛好能顯示年,月,日,掃描顯示與時間的掃描顯示 類似。年比較特殊,由兩個寄存器存儲,個位,十位為 0時,表明年數(shù)能被100 整除,若此時千位,百位
組成兩位數(shù)能被4整除,則年數(shù)被400整除,為閏年。若十位,個位組成兩位數(shù) 能被4整除,則年數(shù)能被4整除,為閏年。
8.2.3 主程序
主程序主要對按鍵進行掃描,以及判斷定時和鬧鈴時間是否已到, 若到則調(diào) 用相關(guān)程序。
8.2.4 顯小子程序
8個數(shù)碼管輪流進行顯示,分別顯示1ms依賴人的視覺 暫留效應(yīng),給人以 數(shù)碼管持續(xù)高亮的錯覺。
日期的顯示,秒
14、表的顯示,倒計時的顯示,調(diào)鬧鈴,調(diào)定時的顯示,閃爍的 顯示程序與以上的的掃描相似,有的以子程序的方式出現(xiàn),通過子程序調(diào)用語句 ACAL碉用;有點直接嵌套在相應(yīng)的程序里面,順序執(zhí)行,或者用調(diào)轉(zhuǎn)語句 AJMP
調(diào)用。
C程序調(diào)試及仿真
本程序通過Keil單片機開發(fā)平臺實現(xiàn)程序的編譯,鏈接,生成 HEXC件。通 過Keil和硬件仿真平臺Proteus的聯(lián)合,可以將設(shè)計效果仿真出來,根據(jù)效果, 有目的的改變設(shè)計,優(yōu)化程序。
利用Proteus仿真實驗過程截圖:
普通時間顯示模式仿真圖,表示:星期一 9點10分38秒
五、總結(jié)
通過本次設(shè)計,我深深體會到了掌握知識的重要性, 本次設(shè)
15、計也使我熟悉了 單片機的硬件特點和編程方法,并成功將學(xué)到的知識變成了實際的成果,雖然在 設(shè)計過程中遇到了很多問題,例如知識的融會貫通、調(diào)試遇到的BUG^,但通過 努力都一一得到了克服,從而也提高了我學(xué)習的信心,堅定了我繼續(xù)深入學(xué)習的 決心。
按下 0鍵, 顯示日期并可對日期進行
按下 1鍵,顯示時間,并可調(diào)時
按下 2鍵,進行鬧鈴設(shè)置
按下 3鍵,進行定時設(shè)置
鬧鈴測試
按下 6鍵,進入秒表方式
調(diào)用時鐘顯示子程序
判斷是否開啟鬧鈴重響功能
判斷是否開啟鬧鈴功能,沒開則去
判斷定時值R4,R3是否到零、鬧鈴時
判斷小時數(shù)是否到鬧鈴所定時間, 若到,則對分進行判斷;若不到,
16、 則對定時進行判斷
附錄: 延時程序:
D_1MS:
MOV R7,#2
D_5:
MOV R2,#250
DJNZ R2,$
DJNZ R7,D_5
RET
主程序:
MAIN:
JNBP3.0,DATETZ
調(diào)整
JNB P3.1,ZSTZ1
JNB P3.2,NLTZZ
JNB P3.3,DSTZ
JNB P3.4,CESHI
JNB P3.6,STOPWATCHTZ
ACALL DISP
JNB P0.6,RERING
RE: JNB P2.7,DSPDKQ
判斷定時
FMQPD:
刻是否已到
MOV A,HOUR;
SUBB A,
17、38H;
JZ FEN ;
AJMP DSPDKQ
FEN:
MOV A,MINUTE;
SUBB A,37H;
JZ MIAO ; 判斷分是否到鬧鈴所定時間,若到,
則對秒進行判斷;若不到,則對定
時進行判斷
AJMP DSPDKQ
MIAO:
MOV A,SECOND
SUBB A,#0
JZ SHENGYIN1 ; 判斷秒是否到鬧鈴所定時間,若到,
則時,分,秒都到達鬧鈴時刻,進
入響鈴子程序;若不到則判斷定時
AJMP DSPDKQ
RERING: ; 鬧鈴重響判斷程序
JNB F0, RE ; 標志位F0為0,不進行鬧鈴重響設(shè)
定
CPL F0
18、
MOV3CH,#1 ; 定時判斷標志位賦 1, 定時判斷功
能開啟
JNB P0.7,M1 ; 鬧鈴重響間隔時間選取
MOV R4,#0 ; 鬧鈴重響間隔 30秒
MOV R3,#30
AJMP MAIN
M1: ; 鬧鈴重響間隔 60秒
MOV R4,#1
MOV R3,#0
AJMP MAIN
DSPDKQ:
判斷是否應(yīng)該進行定時判斷
MOVA,3CH ;3CH
JNZ DSPD2 ;
序
AJMP MAIN
DSPD2:
MOV A,R4;
JZ S_PD ;R4
AJMP MAIN;
S_PD:
MOV A,R3;
JNZMAIN ;R4
19、,R3
到
JNB P0.6,SHENGYIN2
序
AJMP TISHI ;
AJMP MAIN
CESHI:
ACALL RING
AJMP MAIN
SHENGYIN1: ;
LCALL RING
AJMP MAIN
SHENGYIN2:
SETB F0 ;
是引入的判斷因子,當其為 0時,
不對定時時間是否到 0進行判斷
當3CHP是0時,跳轉(zhuǎn)到定時判斷程
所存定時分數(shù)為 0, 則轉(zhuǎn)而判斷 R3
所存定時秒數(shù)
所存參數(shù)減為 0, 定時長度已
鬧鈴重響功能開啟時,跳入響鈴程
不是鬧鈴重響定時,則定時時間到
時,跳入提示程序
調(diào)用響鈴子程序
20、鬧鈴重響標志位設(shè)定
LCALL RING ; 響鈴
標志位復(fù)位
跳入鬧鈴調(diào)整程序
跳入定時調(diào)整程序
跳入日期調(diào)整程序
跳入秒表程序
時間顯示子程序
判斷節(jié)能開關(guān) 7是否按下,按下則
數(shù)碼管不顯示,延長其壽命
顯示當前時間秒位
存十位,B存?zhèn)€位
顯示當前時間秒十位
CLR F0
AJMP MAIN
NLTZZ:
AJMP NLT
21、Z1
DSTZ:
AJMP DSTZ1
DATETZ:
AJMP DATETZ1
STOPWATCHTZ:
AJMP STOPWATCHTZ1
顯示子程序:
DISP: ;
JNB P3.7,OUT1
MOV DPTR,#LEDTAB
MOV A,SECOND
MOV B,#10
DIV AB ;A
MOVC A,@A+DPTR
MOV P1,A
CLR SEC_S
ACALL D_1MS
SETB SEC_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR SECG
ACALL D_1MS J 顯示當前時間秒個位
顯
22、示當前時間分位
SETB SEC_G
MOV A,MINUTE
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR MIN_S
ACALL D_1MS
SETB MIN_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR MIN_G
ACALL D_1MS
SETB MIN_G
顯示當前時間時位
MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#LEDTAB
MOVC A,@A+DPTR
MOV P1,A
CLR HOU_S
ACALL D_1MS
SETB HOU_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR HOU_G
SETB HOU_G
MOV A,WEEK
MOVC A,@A+DPTR
MOV P1,A
CLR Y_S
ACALL D_1MS
SETB Y_S
OUT1:
RET
ACALL D_1MS