第一篇:單片機(jī)課程設(shè)計(jì)電子時鐘說明書
《電子時鐘》 課程設(shè)計(jì)說明書
專業(yè)班級:
11級自動化<3>班
姓
名: 歐陽明長 李徐軍
陳龍
指導(dǎo)教師:
郭
玉
設(shè)計(jì)時間:
2013--12--17
物理與電氣工程學(xué)院
2013年12月17日
摘要
電子鐘在生活中應(yīng)用非常廣泛,而一種簡單方便的數(shù)字電子鐘則更能受到人們的歡迎。所以設(shè)計(jì)一個簡易數(shù)字電子鐘很有必要。本電子鐘采用STC公司的AT89S52單片機(jī)為核心,使用12MHz 晶振與單片機(jī)AT89S52 相連接,通過軟件編程的方法實(shí)現(xiàn)以24小時為一個周期,同時8位7段LED數(shù)碼管(兩個四位一體數(shù)碼管)顯示小時、分鐘和秒的要求,并在計(jì)時過程中具有定時功能,當(dāng)時間到達(dá)提前定好的時間進(jìn)行蜂鳴報時。該電子鐘設(shè)有四個按鍵S12、S13、S14和S15鍵,進(jìn)行相應(yīng)的操作就可實(shí)現(xiàn)小時調(diào)整、分鐘調(diào)整和啟停功能。具有時間顯示、整點(diǎn)報時、校正等功能。走時準(zhǔn)確、顯示直觀、運(yùn)行穩(wěn)定等優(yōu)點(diǎn)。
關(guān)鍵詞 電子鐘;AT89S52;硬件設(shè)計(jì);軟件設(shè)計(jì)
目錄 設(shè)計(jì)課題任務(wù)、功能要求說明及方案介紹……………………………………3 1.1 設(shè)計(jì)課題任務(wù)………………………………………………………………3 1.2 功能要求說明………………………………………………………………3 1.3 設(shè)計(jì)總體方案介紹及原理說明……………………………………………3 2 設(shè)計(jì)課題硬件系統(tǒng)的設(shè)計(jì)………………………………………………………3 2.1 設(shè)計(jì)課題硬件系統(tǒng)各模塊功能簡要介紹…………………………………4 3 設(shè)計(jì)課題軟件系統(tǒng)的設(shè)計(jì)………………………………………………………4 3.1 設(shè)計(jì)課題軟件系統(tǒng)各模塊功能簡要介紹…………………………………4 3.2 設(shè)計(jì)課題軟件系統(tǒng)程序流程框圖…………………………………………4 4 設(shè)計(jì)結(jié)論、仿真結(jié)果、誤差分析………………………………………………7 4.1 設(shè)計(jì)課題的設(shè)計(jì)結(jié)論及使用說明…………………………………………4 4.2 設(shè)計(jì)課題的誤差分析………………………………………………………7 4.3 設(shè)計(jì)體會……………………………………………………………………7 參考文獻(xiàn) ……………………………………………………………………………7 附 錄 ……………………………………………………………………………8 1 設(shè)計(jì)課題任務(wù)、功能要求說明及方案介紹
1.1 設(shè)計(jì)課題任務(wù)
設(shè)計(jì)一個具有特定功能的電子鐘。具有啟停、時間顯示、報時等功能。并有時間設(shè)定,時間調(diào)整功能。
1.2 功能要求說明
設(shè)計(jì)一個具有特定功能的電子鐘。電子鐘上電從12時0分0秒開始運(yùn)行,按下啟停鍵進(jìn)入時鐘運(yùn)行狀態(tài);再按啟停鍵暫停運(yùn)行,并且再次按下時能夠在原來的時間上繼續(xù)計(jì)時;運(yùn)行到整點(diǎn)是能夠自動響鈴,通過外部按鍵可以進(jìn)行實(shí)踐的調(diào)整,并且在運(yùn)行時相應(yīng)的LED燈等同步亮滅。
1.3 設(shè)計(jì)課題總體方案介紹及工作原理說明
本電子鐘主要由單片機(jī)、4*4獨(dú)立鍵盤、顯示接口電路和電源電路構(gòu)成,設(shè) 計(jì)課題的總體方案如圖1.1所示:
圖1.1 總體設(shè)計(jì)方案圖
本電子鐘的所有的程序、參數(shù)均存放在AT89S52的內(nèi)部RAM中。鍵盤采用動態(tài)掃描方式。利用單片機(jī)定時器產(chǎn)生定時效果通過編程形成數(shù)字鐘效果,再利用數(shù)碼管動態(tài)掃描顯示單片機(jī)內(nèi)部處理的數(shù)據(jù),同時通過端口讀入當(dāng)前外部控制狀態(tài)來改變程序的不同狀態(tài),實(shí)現(xiàn)不同功能。設(shè)計(jì)課題硬件系統(tǒng)的設(shè)計(jì) 2.1 設(shè)計(jì)課題硬件系統(tǒng)各模塊功能簡要介紹
本設(shè)計(jì)的硬件系統(tǒng)主要采用以下基本模塊來實(shí)現(xiàn),單片機(jī)最小系統(tǒng)模塊,輸入模塊、輸出模塊、電源模塊。
(1)單片機(jī)最小系統(tǒng)模塊:包括8位微控制器AT89S52;電源復(fù)位電路;晶振電路。本模塊AT89S52系統(tǒng)控制核心,單片機(jī)系統(tǒng)復(fù)位由電源上電完成。
(2)輸入模塊:本模塊共用到了4個按鍵(S12、S13、S14、S15),分別完成時間的調(diào)整、啟停。1個電源開關(guān)(具有復(fù)位功能)。
(3)輸出模塊:本次設(shè)計(jì)顯示為8位,采用兩個四位一體數(shù)碼管(共陽極)8個PNP三極管驅(qū)動,并且還有蜂鳴器模塊。(4)電源模塊:USB供電及下載器。
設(shè)計(jì)課題軟件系統(tǒng)的設(shè)計(jì)
3.1 設(shè)計(jì)課題軟件系統(tǒng)個模塊功能簡要介紹
本設(shè)計(jì)的軟件系統(tǒng)主要采用以下基本模塊來實(shí)現(xiàn),主程序、中斷服務(wù)程序、鍵盤輸入程序模塊、數(shù)碼管及其驅(qū)動模塊和延時模塊。
主程序:主要是用于對輸入信號的處理、輸出信號的控制和對各個功能程序模塊的控制。
中斷服務(wù)程序:主要是用于電子鐘的1S延時。鍵盤輸入程序模塊:主要是用于完成特定時間調(diào)整。
數(shù)碼管及其驅(qū)動模塊:主要是用于驅(qū)動數(shù)碼管及利用數(shù)碼管顯示時間。延時模塊:短延時用于數(shù)據(jù)的動態(tài)顯示,按鍵的判斷。
3.2 設(shè)計(jì)課題軟件系統(tǒng)程序流程框圖
系統(tǒng)程序采用匯編語言按模塊化方式進(jìn)行設(shè)計(jì),然后通過Keil軟件開發(fā)平臺將程序轉(zhuǎn)變成可燒寫文件。
主循環(huán)程序框圖如3.1所示;判斷進(jìn)位程序如3.2所示; 計(jì)時一秒中斷程序如3.3所示; 啟停中斷框圖如3.4所示; 延時子程序框圖如3.5所示; 圖3.1 主循環(huán)程序 5
圖3.2 判斷進(jìn)位子程序
圖3.3 計(jì)時一秒中斷
圖3.4 啟停中斷程序
圖3.5 延時子程序 設(shè)計(jì)結(jié)論、運(yùn)行結(jié)果、誤差分析
4.1 設(shè)計(jì)課題的設(shè)計(jì)結(jié)論及使用說明
本設(shè)計(jì)為基于單片機(jī)的電子鐘的設(shè)計(jì)。剛開始,我們很多地方理不清頭緒,無從下手,只能從平時的實(shí)驗(yàn)中得到一些方法,但通過認(rèn)真研究設(shè)計(jì)課題,找書上網(wǎng)查資料,確定基本設(shè)計(jì)方案,對所用芯片功能進(jìn)行查找、調(diào)試,設(shè)計(jì)中有四個按鍵,其中S12為分鐘加1調(diào)整,S13為小時加1調(diào)整,S14為外部響鈴按鍵,S15為啟停按鍵,另外當(dāng)整點(diǎn)時間到時,蜂鳴器報警。這樣的結(jié)果與設(shè)計(jì)基本相符,基本上完成了設(shè)計(jì)任務(wù)。
4.2 設(shè)計(jì)課題的誤差分析
該電子鐘在運(yùn)行中存在一定的誤差,誤差產(chǎn)生有三種原因,首先是采用的計(jì)時利用中斷來實(shí)現(xiàn)。而當(dāng)電子鐘運(yùn)行時間1秒時,又得去執(zhí)行中斷程序,這個過程需要幾個機(jī)器周期。第二,硬件系統(tǒng)有一定的影響。第三,設(shè)計(jì)用到12MHz晶振,計(jì)算是滿20次為一秒鐘,實(shí)際會慢很多。
4.3 設(shè)計(jì)體會
本次課程設(shè)計(jì),讓我們?nèi)耸芤娣藴\,認(rèn)識到了自己的許多缺點(diǎn)和不足,使我深深的感受到了理論聯(lián)系實(shí)際的必要性及其重要性。
參考文獻(xiàn)
[1] 李全利.單片機(jī)原理與接口技術(shù)[M].高等教育出版社.2009.1.[2] 劉文秀.單片機(jī)應(yīng)用系統(tǒng)仿真的研究[J].現(xiàn)代電子技術(shù).2005, 第286 期.[3] 胡學(xué)海.單片機(jī)原理及應(yīng)用系統(tǒng)設(shè)計(jì)[M],北京:電子工業(yè)出版社,2005.[4] 李廣第.單片機(jī)基礎(chǔ)[M],北京航空航天大學(xué)出版社,2006.7.附錄
程序代碼為:
ORG 0000H LJMP START ORG 0003H LJMP INTT0 ORG 0013H LJMP INTT1 ORG 000BH LJMP INTT ORG 0100H START:SETB EA SETB ET0 SETB IT0 SETB EX0 SETB IT0 SETB EX1 SETB IT1 MOV R7,#16 MOV TMOD,#01H MOV TH0,#15536/256 MOV TL0,#15536 MOD 256 MOV R0,#12 MOV R1,#0 MOV R2,#0 MOV R6,0FEH CLR TR0 L1:
LCALL PANDUAN;*****************
;記秒
MOV A,R2
MOV B,#10
DIV AB
MOV P2,#0FDH
LCALL XIANSHI
LCALL DELAY
MOV A,B
MOV P2,#0FEH
LCALL XIANSHI
LCALL DELAY;***************
;調(diào)分
JB P3.0,L40 L41:JB P3.0,L42 LJMP L41 L42:INC R1
;計(jì)分
L40: MOV A,R1
MOV B,#10
DIV AB
MOV P2,#0EFH
LCALL XIANSHI
LCALL DELAY
MOV A,B
MOV P2,#0F7H
LCALL XIANSHI
LCALL DELAY
MOV P2,#0FBH
MOV P0,#0BFH
LCALL DELAY;******************
;調(diào)時
JB P3.1,L45 L47:JB P3.1,L46 LJMP L47 L46:INC R0
;計(jì)時
L45: MOV A,R0
MOV B,#10
DIV AB
MOV P2,#07FH
LCALL XIANSHI
LCALL DELAY
MOV A,B
MOV P2,#0BFH
LCALL XIANSHI
LCALL DELAY
MOV P2,#0DFH
MOV P0,#0BFH
LCALL DELAY
;*************************;判斷5分鐘鬧鈴
CJNE R1,#5,L51
CLR P3.5
MOV P1,R6
MOV A,R6
RL A
MOV R6,A
LJMP L52 L51:CJNE R1,#6,L52
SETB P3.5 L52: LJMP L1
;***************;執(zhí)行1秒鐘
INTT:DJNZ R7,L33
MOV R7,#16
INC R2
MOV P1,R6
MOV A,R6
RL A
MOV R6,A L33:RETI;*********************
;外部中斷
INTT0:CPL P3.5
MOV P1,#0
RETI;***********************
;啟停功能
INTT1:MOV P1,#0
LCALL DELAY
JB P3.3,L97
CPL TR0
L97: RETI;**********************
;顯示子程序
XIANSHI:MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
RET
;**********************
;延時子程序
DELAY:MOV R3,#20
DEL1:MOV R4,#50
DEL2:DJNZ R4,DEL2
DJNZ R3,DEL1
RET
;*******************
;判斷進(jìn)位子程序
PANDUAN:
CJNE R2,#60,L31
MOV R2,#0
INC R1
L31:CJNE R1,#60,L32
MOV R1,#0
INC R0
L32:CJNE R0,#24,L35
MOV R0,#0
L35:RET
;********************
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
第二篇:單片機(jī)課程設(shè)計(jì)報告,單片機(jī)電子時鐘
題 目:單片機(jī)課程設(shè)計(jì)報告
目 錄
一、設(shè)計(jì)目的二、程設(shè)計(jì)具體要求
三、單片機(jī)發(fā)展簡史
四、8051單片機(jī)系統(tǒng)簡介
五、8051單片機(jī)內(nèi)部定時器/計(jì)數(shù)器簡介
六、程序電路
七、程序流程
八、程序代碼
九 實(shí)驗(yàn)總結(jié)-要求寫出完整的論文以及心得體會
十 參考資料及小結(jié)
原 文 :一.目的1. 進(jìn)一步熟悉和掌握8051單片機(jī)的結(jié)構(gòu)及工作原理。
2. 掌握單片機(jī)的接口技術(shù)及相關(guān)外圍芯片的外特性,控制方法。
3. 通過課程設(shè)計(jì),掌握以單片機(jī)核心的電路設(shè)計(jì)的基本方法和技術(shù),了解表關(guān)電路參數(shù)的計(jì)算方法。
4. 通過實(shí)際程序設(shè)計(jì)和調(diào)試,逐步掌握模塊化程序設(shè)計(jì)方法和調(diào)試技術(shù)。
5. 通過完成一個包括電路設(shè)計(jì)和程序開發(fā)的完整過程,使學(xué)生了解開發(fā)一單片機(jī)應(yīng)用系統(tǒng)的全過程,為今后從事相應(yīng)打下基礎(chǔ)。
二.課程設(shè)計(jì)的體要求
a)原理圖設(shè)計(jì)。
1. 原理圖設(shè)計(jì)要符合項(xiàng)目的工作原理,連線要正確,端了要不得有標(biāo)號。
2. 圖中所使用的元器件要合理選用,電阻,電容等器件的參數(shù)要正確標(biāo)明。
3. 原理圖要完整,CPU,外圍器件,擴(kuò)器接口,輸入/輸出裝置要一應(yīng)俱全。
b)程序調(diào)計(jì)
1. 根據(jù)要求,將總體項(xiàng)能分解成若干個子功能模塊,每個功能模塊完成一個特定的功能。
2. 根據(jù)總體要求及分解的功能模塊,確定各功能模塊之間的關(guān)系,設(shè)直出完整的程序流程圖。c)程序調(diào)試將設(shè)計(jì)完的程序輸入,匯編,排除語法錯誤,生成*OBJ文件。
1. 按所設(shè)計(jì)的原理圖,在實(shí)驗(yàn)平臺上連線,檢查無誤。
2. 將匯編后生成的*OBJ文件傳送到實(shí)驗(yàn)裝置的,執(zhí)行該程序,檢查該程序、是否達(dá)到設(shè)計(jì)要求,若未達(dá)
到,修改程序,直到達(dá)到要求為止,d)說明書
1. 原理圖設(shè)計(jì)說明
簡要說明設(shè)計(jì)目的,原理圖中所使用的元器件功能及在圖中的作用,各器件的工作過程及順序。
2. 程序設(shè)計(jì)說明
對程序設(shè)計(jì)總體功能及結(jié)構(gòu)進(jìn)行說明,對各子模塊的功能以及各子模塊之間的關(guān)系作較詳細(xì)的描述。
3. 畫出工作原理圖,程序流程圖并給出程序清單。
目前,單片機(jī)已廣泛應(yīng)用到圖民經(jīng)濟(jì)建設(shè)和日常生活的許多領(lǐng)域,成為測控技術(shù)現(xiàn)代化必不可少的重要工具。
單片機(jī)電子時鐘
作者:佚名來源:本站原創(chuàng)點(diǎn)擊數(shù):
491更新時間:2007年06月27日
DS1302是Dallas公司生產(chǎn)的一種實(shí)時時鐘芯片。它通過串行方式與單片機(jī)進(jìn) 行數(shù)據(jù)傳送,能夠向單片機(jī)提供包括秒、分、時、日、月、年等在內(nèi)的實(shí)時時間
信息,并可對月末日期、閏年天數(shù)自動進(jìn)行調(diào)整;它還擁有用于主電源和備份電源的雙電源引腳,在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運(yùn)行。另外,它還能提供31字節(jié)的用于高速數(shù)據(jù)暫存的RAM。鑒于上述特點(diǎn),DS1302已在許多單片機(jī)系統(tǒng)中得到應(yīng)用,為系統(tǒng)提供所需的實(shí)時時鐘信息。
一、DS1302的主要特性
1.引腳排列
500)this.width=500 border=0>
圖1DS1302引腳排列圖
DS1302的引腳排列如圖1所示,各引腳的功能如下:
X1,X2——32768Hz晶振引腳端;
RST——復(fù)位端;
I/O——數(shù)據(jù)輸入/輸出端;
SCLK——串行時鐘端;
GND——地;
VCC2,VCC1——主電源與后備電源引腳端。
2.主要功能
DS1302時鐘芯片內(nèi)主要包括移位寄存器、控制邏輯電路、振蕩器、實(shí)時時鐘電路以及用于高速暫存的31字節(jié)RAM。DS1302與單片機(jī)系統(tǒng)的數(shù)據(jù)傳送依靠RST,I/O,SCLK三根端線即可完成。其工作過程可概括為:首先系統(tǒng)RST引腳驅(qū)動至高電平,然后在作用于SCLK時鐘脈沖的作用下,通過I/O引腳向DS1302輸入地址/命令字節(jié),隨后再在SCLK
時鐘脈沖的配合下,從I/O引腳寫入或讀出相應(yīng)的數(shù)據(jù)字節(jié)。因此,其與單片機(jī)之間的數(shù)據(jù)傳送是十分容易實(shí)現(xiàn)的。
二、時鐘的產(chǎn)生及存在的問題
(1)在實(shí)際使用中,我們發(fā)現(xiàn)DS1302的工作情況不夠穩(wěn)定,主要表現(xiàn)在實(shí)時時間的傳送有時會出現(xiàn)誤差,有時甚至整個芯片停止工作。我們對DS1302的工作電路進(jìn)行了分析,其與單片機(jī)系統(tǒng)的連接如圖2所示。從圖中可以看出,DS1302的外部電路十分簡單,惟一外接的元件是32768Hz的晶振。通過實(shí)驗(yàn)我們發(fā)現(xiàn):當(dāng)外接晶振電路振蕩時,DS1302計(jì)時正確;當(dāng)外接晶振電路停振時,DS1302計(jì)時停止。因此,我們認(rèn)為32768Hz晶振是造成 DS1302工作不穩(wěn)定的主要原因。
500)this.width=500 border=0>
圖2DS1302與單片機(jī)系統(tǒng)的連接圖
(2)DS1302時鐘的產(chǎn)生基于外接的晶體振蕩器,振蕩器的頻率為32768Hz。該晶振通過引腳X1、X2直接連接至DS1302,即DS1302是依靠外部晶振與其內(nèi)部的電容配合來產(chǎn)生時鐘脈沖的。由于DS1302在芯片本身已經(jīng)集成了6pF的電容,所以,為了獲得穩(wěn)定可靠的時鐘,必須選用具有6pF負(fù)載電容的晶振。
然而,許多人在選用晶振時僅僅注意了晶振的額定頻率值,而忽視了晶振的負(fù)載電容大小,甚至連許多經(jīng)銷商也不能提供所售晶振的負(fù)載電容。所以即使在使用中選用了符合32768Hz的晶振,但如果該晶振的負(fù)載電容與DS1302提供的6pF不一致時,就會影響晶振的起振或?qū)е抡袷庮l率的偏移,出現(xiàn)上述在應(yīng)用中的問題。
三、利用輔助電容實(shí)現(xiàn)負(fù)載匹配
(1)當(dāng)所選的晶振負(fù)載電容不是6pF時,可以采用增加輔助電容的方法提高或降低DS1302振蕩器的電容性負(fù)載,使之與晶體所需的電容值匹配。如果已知晶體的負(fù)載電容為CI,若CI<6pF,則可以增加一個并聯(lián)電容CS以產(chǎn)生所需的總負(fù)載電容CI,即CI=6pF+CS;若CI>6pF,則可以在晶體的一端增加一個串聯(lián)電容CS,以產(chǎn)生所需的負(fù)載電容CI,即1/CI=1/6pF+1/CS,通過計(jì)算即可得出應(yīng)增加的輔助電容大小。輔助電容的接法如圖3所示。
圖3CS連接電路圖
(2)在使用前對晶體的負(fù)載電容并不知道的情況下,通過測定晶體振蕩頻率的方法可以確定該晶體的負(fù)載電容。
對于晶體振蕩器來說,其振蕩頻率與負(fù)載電容之間的關(guān)系是確定的。以本文討論的DS1302使用的32768Hz晶振為例:當(dāng)它工作于所要求的負(fù)載電容時,能較準(zhǔn)確地產(chǎn)生 32768Hz的頻率;當(dāng)它的負(fù)載電容小于6pF時,其振蕩頻率會正向偏移;當(dāng)它的負(fù)載電容大于6pF時,其振蕩頻率就會負(fù)向偏移。因此,對于未知負(fù)載電容的晶體應(yīng)首先采用實(shí)驗(yàn)的方法,在其兩端加入輔助電容使晶體起振,然后用頻率計(jì)測出振蕩頻率。若測得頻率大于32768Hz,說明負(fù)載電容偏?。蝗魷y得頻率小于32768Hz,說明負(fù)載電容偏大。對輔助電容逐步調(diào)整,最終使振蕩頻率盡可能接近32768Hz,則此時晶體端所接負(fù)載電容的總和就是適合該晶體的負(fù)載電容。
結(jié)論
以上方法經(jīng)我們在實(shí)際工作中多次使用,證明確實(shí)有效。它放寬了DS1302在使用中對晶振的條件要求,增強(qiáng)了DS1302在工作中的穩(wěn)定性,對DS1302更廣泛地應(yīng)用具有積極的意義。
華東交大理工學(xué)院_2007-2008 _學(xué)年第_ 一 學(xué)期
課程設(shè)計(jì)安排計(jì)劃
班級:_05應(yīng)電__課程:_單片機(jī)原理及接口技術(shù)_
一、課程設(shè)計(jì)題目:數(shù)碼管時鐘電路的設(shè)計(jì)
二、設(shè)計(jì)內(nèi)容及要求:
LED數(shù)碼管時鐘電路24小時計(jì)時方式,時、分、秒用6位數(shù)碼管顯示。選用AT89C2051單片機(jī),12MHZ晶振,6位共陽數(shù)碼管,要求有調(diào)時功能,其他功能學(xué)生可自由發(fā)揮。
三、設(shè)計(jì)方法與步驟:
1.設(shè)計(jì)硬件原理電路,選擇元器件、確定其參數(shù)。
2.設(shè)計(jì)印刷電路板電路(用面包板做)、焊接硬件電路。
3.設(shè)計(jì)匯編語言程序,調(diào)試硬件電路和程序。
4.編寫課程設(shè)計(jì)報告。
四、設(shè)計(jì)時間安排:
1.第十九周:周一、二,設(shè)計(jì)硬件原理電路,選擇元器件、確定其參數(shù)。
周三、四、五,設(shè)計(jì)印刷電路板電路(用面包板做)、焊接硬件電路。
2.第二十周:周一、二,設(shè)計(jì)匯編語言程序。
周三、四,燒錄程序,調(diào)試硬件電路和程序。
周五,編寫課程設(shè)計(jì)報告。
指導(dǎo)老師: 楊威
時間: 2007、1
第三篇:單片機(jī)電子時鐘課程設(shè)計(jì)報告
青島理工大學(xué)琴島學(xué)院 課題名稱:單片機(jī)原理及應(yīng)用課程設(shè)計(jì)學(xué)院:
專業(yè)班級:
學(xué)號:
學(xué)生:
指導(dǎo)教師:
設(shè) 計(jì) 報 告
第四篇:單片機(jī)課程設(shè)計(jì) (51單片機(jī)實(shí)現(xiàn)電子時鐘)
湖北文理學(xué)院
單片機(jī)課程設(shè)計(jì)
題目:用51單片機(jī)實(shí)現(xiàn)電子時鐘
院 部 物理與電子信息工程學(xué)院 專 業(yè) 名 稱 電子信息科學(xué)與技術(shù) 班 級 1111 姓 名 楊慶月 學(xué) 號 2011111136 指 導(dǎo) 教 師 李剛
2013年12月09日
目錄
摘要------------------------------1 1 單片機(jī)的相關(guān)知識------------1 1.1 單片機(jī)的簡介--------------------1 1.2 單片機(jī)的特點(diǎn)--------------------1 1.3 89C52單片機(jī)的基本特點(diǎn)------------2 2 電子時鐘--------------------3 2.1電子時鐘的基本特點(diǎn)----------------3 2.2電子時鐘的原理-------------------4 控制系統(tǒng)的硬件設(shè)計(jì)---------4 3.1單片機(jī)型號的選擇-----------------4 3.2 lcd1602工作的原理---------------4 3.3 鍵盤電路的設(shè)計(jì)------------------6 3.4 復(fù)位電路設(shè)計(jì)-------------------------6
3.5 時鐘電路設(shè)計(jì)-------------------7 3.6 整體電路原理圖-----------------7 控制系統(tǒng)的軟件的設(shè)計(jì)------8 4.1程序的設(shè)計(jì)----------------------8 4.2程序源代碼----------------------8 5 仿真結(jié)果和實(shí)物圖---------------19 5.1仿真結(jié)果------------------------------19 5.2實(shí)物圖-19 6 總結(jié)--20
參考文獻(xiàn)------------------------21
摘要:單片計(jì)算機(jī)即單片微型計(jì)算機(jī)。由 RAM ,ROM,CPU構(gòu)成,定時,計(jì)數(shù)和多種接口于一體的微控制器。它體積小,成本低,功能強(qiáng),廣泛應(yīng)用于智能產(chǎn)業(yè)和工業(yè)自動化上。而 51系列單片機(jī)是各單片機(jī)中最為典型和最有代表性的一種。這次課程設(shè)計(jì)通過對它的學(xué)習(xí),應(yīng)用,從而達(dá)到學(xué)習(xí)、設(shè)計(jì)、開發(fā)軟、硬的能力。
本設(shè)計(jì)主要設(shè)計(jì)了一個基于 AT89C52單片機(jī)的電子時鐘。并在 1602上顯示相應(yīng)的時間。并通過一個控制鍵用來實(shí)現(xiàn)時間的調(diào)節(jié)和是否進(jìn)入省電模式的轉(zhuǎn)換。
具有時鐘和日歷的功能,年限顯示范圍是2013-2099(可修改),且具有閏年自動修正功能
關(guān)鍵字:單片機(jī);子時鐘;鍵盤控制;LCD1602。單片機(jī)識的相關(guān)知識 1.1 單片機(jī)簡介
MCS-51是 INTEL公司在成功推廣的 MCS-48單片機(jī)基礎(chǔ)上加以改進(jìn)而成的 8位單片機(jī)。
這種單片機(jī)大約是上世紀(jì) 70年代末推出的,內(nèi)部程序可重寫的為 8751,外擴(kuò)程序的是 8031,一次性生產(chǎn),不可改變程序的是 8051。外形一般為 DIP40封裝。不久又推出了增強(qiáng)型的 8052,其資源更加豐富。以后又采用 CHMOS技術(shù)推出了 80c51,耗電大大降低。到了 90年代,INTEL公司把精力放到更賺錢的計(jì)算機(jī)上,將 51單片機(jī)技術(shù)轉(zhuǎn)讓給了一此其它公司,如 ATMEL Philips等半導(dǎo)體制造公司,使 51系列單片機(jī)的市場份額不斷擴(kuò)大。
盡管十多年前就有人認(rèn)為 51單片機(jī)會很快淘汰,但事實(shí)證明 51單片機(jī)經(jīng)過不斷的改進(jìn)后,由于技術(shù)成熟,使用方便,至今在 8位單片機(jī)市場仍然擁有龐大的用戶。特別是 MCS-51技術(shù)的 20年專利期限到期后,大量的兼容型號不斷推出。從上世紀(jì) 90年代后期開始,美國 ATMEL公司在掌握快速擦寫的存儲器后,推出了 AT89C系列,此系列在中國獲得了廣泛的應(yīng)用。
在此之前,由于可擦寫的 8751價格昂貴,國內(nèi)長時間采用 8031+27C64這樣的外擴(kuò)存程序儲器方式。
51單片機(jī)最初只有 DIP40這種很古老的封裝,后來推出了 CHMOS工藝的80C51后開始有了 PLCC44這種相對較小的方形封裝。AT89C系列中開始有 20腳的 DIP20的精簡型封裝,這極大方便了在一些相對簡單的單片機(jī)應(yīng)用,縮小了 PCB的體積。20腳的有 AT89C1051、AT89C1051、AT89C1051,對應(yīng)程序存儲器分別為 1K、2K、4K。
標(biāo)準(zhǔn)的 51為 4K程序空間,128字節(jié)的 RAM,32條端口,5個中斷,2個定時/計(jì)數(shù)器,12個時鐘周期執(zhí)行一條基本指令,最長的除法為 48個周期。52為 8K程序空間,256字節(jié)的 RAM,32條端口,6個中斷,3個定時/計(jì)數(shù)器。AT89S51是可在板上直接下載程序的改進(jìn)型號,并增加了看門狗功能,AT89C51只能在編程器下寫入程序,所以經(jīng)常會有人在 PCB上安裝 IC插座,以便取下來編程更新程序。
AT的 51系列后來也推出了單周期的 51,但價格沒什么優(yōu)勢,國內(nèi)很少使用。最近幾年宏晶在國內(nèi)大量推廣 STC51系列單片機(jī),最近又推出不少所謂 1T的單
片機(jī),價格較低
STC采用串口直接下載程序,寫入程序很方便。
1.2 單片機(jī)的特點(diǎn).單片機(jī)的存儲器ROM 和RAM 時嚴(yán)格區(qū)分的。ROM 稱為程序存儲器,只存放 程序,固定常數(shù),及數(shù)據(jù)表格。RAM 則為數(shù)據(jù)存儲器,用作工作區(qū)及存放用戶數(shù) 據(jù)。2.采用面向控制的指令系統(tǒng)。為滿足控制需要,單片機(jī)有更強(qiáng)的邏輯控制能力,特別是單片機(jī)具有很強(qiáng)的位處理能力。.單片機(jī)的I/O 口通常時多功能的。由于單片機(jī)芯片上引腳數(shù)目有限,為了 解決實(shí)際引腳數(shù)和需要的信號線的矛盾,采用了引腳功能復(fù)用的方法,引腳處于 何種功能,可由指令來設(shè)置或由機(jī)器狀態(tài)來區(qū)分。.單片機(jī)的外部擴(kuò)展能力很強(qiáng)。在內(nèi)部的各種功能部件不能滿足應(yīng)用的需求 時,均可在外部進(jìn)行擴(kuò)展,與許多通用的微機(jī)接口芯片兼容,給應(yīng)用系統(tǒng)設(shè)計(jì)帶 來了很大的方便。
1.3 89C52單片機(jī)介紹
P0 口:P0 口為一個8 位漏級開路雙向I/O 口,每腳可吸收8TTL 門電流。當(dāng) P1 口的管腳第一次寫1 時,被定義為高阻輸入。P0 能夠用于外部程序數(shù)據(jù)存儲 器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH 編程時,P0 口作為原碼輸入 口,當(dāng)FIASH 進(jìn)行校驗(yàn)時,P0 輸出原碼,此時P0 外部必須被拉高。
P1 口:P1 口是一個內(nèi)部提供上拉電阻的8 位雙向I/O 口,P1 口緩沖器能接 收輸出4TTL 門電流。P1 口管腳寫入1 后,被內(nèi)部上拉為高,可用作輸入,P1 口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH 編程和校驗(yàn)時,P1 口作為第八位地址接收。
P2 口:P2 口為一個內(nèi)部上拉電阻的8 位雙向I/O 口,P2 口緩沖器可接收,輸出4 個TTL 門電流,當(dāng)P2 口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且 作為輸入。并因此作為輸入時,P2 口的管腳被外部拉低,將輸出電流。這是由 于內(nèi)部上拉的緣故。P2 口當(dāng)用于外部程序存儲器或16 位地址外部數(shù)據(jù)存儲器 進(jìn)行存取時,P2 口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu) 勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時,P2 口輸出其特殊功能寄存器的 內(nèi)容。P2 口在FLASH 編程和校驗(yàn)時接收高八位地址信號和控制信號。
P3 口:P3 口管腳是8 個帶內(nèi)部上拉電阻的雙向I/O 口,可接收輸出4 個TTL 門電流。當(dāng)P3 口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸 入,由于外部下拉為低電平,P3 口將輸出電流(ILL)這是由于上拉的緣故。P3 口也可作為AT89C52 的一些特殊功能口,如下表所示: 口管腳備選功能
P3.0 RXD(串行輸入口)P3.1 TXD(串行輸出口)P3.2 /INT0(外部中斷0)P3.3 /INT1(外部中斷1)P3.4 T0(記時器0 外部輸入)P3.5 T1(記時器1 外 部輸入)P3.6 /WR(外部數(shù)據(jù)存儲器寫選通)P3.7 /RD(外部數(shù)據(jù)存儲器讀選通)P3 口同時為閃爍編程和編程校驗(yàn)接收一些控制信號。
RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST 腳兩個機(jī)器周期的高電平時 間。
ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的 地位字節(jié)。在FLASH 編程期間,此引腳用于輸入編程脈沖。在平時,ALE 端以不
變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外
部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE 脈沖。如想禁止ALE 的輸出可在SFR8EH 地址上置0。此時,ALE 只有在執(zhí)行MOVX,MOVC 指令是ALE 才起作用。另外,該引腳被略微拉高。
如果微處理器在外部執(zhí)行狀態(tài)ALE 禁止,置位無效。PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機(jī) 器周期兩次/PSEN 有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN 信號
將不出現(xiàn)。
EA/VPP:當(dāng)/EA 保持低電平時,則在此期間外部程序存儲(0000H-FFFFH),不
管是否有內(nèi)部程序存儲器。注意加密方式1 時,/EA 將內(nèi)部鎖定為RESET;當(dāng)/EA 端保持高電平時,此間內(nèi)部程序存儲器。在FLASH 編程期間,此引腳也用于施加 12V 編程電源(VPP)。電子時鐘
2.1 電子時鐘的基本特點(diǎn)
現(xiàn)在高精度的計(jì)時工具大多數(shù)都使用了石英晶體振蕩器,由于電子鐘、石英 鐘、石英表都采用了石英技術(shù),因此走時精度高,穩(wěn)定性好,使用方便,不需要 經(jīng)常調(diào)試,數(shù)字式電子鐘用集成電路計(jì)時時,譯碼代替機(jī)械式傳動,用用液晶顯 示器代替指針顯示進(jìn)而顯示時間,減小了計(jì)時誤差,這種表具有時、分、秒顯示 時間的功能,還可以進(jìn)行時和分的校對,片選的靈活性好。
2.2 電子時鐘的原理
該電子時鐘由89C52,1602 液晶等構(gòu)成,采用晶振電路作為驅(qū)動電路,由延時程序和循環(huán)程序達(dá)到時分秒的計(jì)時,六十秒為一分鐘,六十分鐘為一小時,滿二十四小時為一天。而電路中有四個控制按鍵,一個是選擇,一個進(jìn)行加數(shù),一個進(jìn)行減數(shù),還有一個保存。例如按下選擇鍵,然后1602顯示光標(biāo),此時可以用加或減來進(jìn)行調(diào)節(jié),在按下選擇鍵,光標(biāo)移到不同的單位上,同理進(jìn)行調(diào)節(jié),最后待日期時間調(diào)節(jié)好后,按下保存鍵,時鐘開始計(jì)時。控制系統(tǒng)的硬件設(shè)計(jì) 3.1 單片機(jī)型號的選擇
通過對51單片機(jī)的學(xué)習(xí),認(rèn)為STC89C52 是最理想的電子時鐘開發(fā)芯片。STC89C52,最終認(rèn)為89C52是一種帶8K 字節(jié)閃爍可編程可擦除只讀存儲器的低電壓,高性能CMOS8位微處理器,器件采用高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-52指令集和輸出引腳相兼容。還有一點(diǎn)重要原因,就是采用AT89C52時不能用開發(fā)板進(jìn)行程序的下載,所以最終選用STC89C52進(jìn)行設(shè)計(jì)。
3.2 1602 工作原理及顯示電路
字符型LCD 通常有14 條引腳線或16 條引腳線的LCD,多出來的2 條線是背 光電源線VCC(15 腳)和地線GND(16 腳),其控制原理與14 腳的LCD 完全一樣 1602液晶的基本的操作分為以下四種:
狀態(tài)字讀操作:輸入RS=低、RW=高、EP=高; 輸出:DB0~7 讀出為狀態(tài)字; 數(shù)據(jù)讀出操作:輸入RS=高、RW=高、EP=高; 輸出:DB0~7 讀出為數(shù)據(jù); 指令寫入操作:輸入RS=低、RW=低、EP=上升沿; 輸出:無; 數(shù)據(jù)寫入操作:輸入RS=高、RW=低、EP=上升沿; 輸出:無。
如圖 1602模塊的引腳
LCD1602正面
LCD1602背面
1602與單片機(jī)連接圖 3.3 鍵盤電路設(shè)計(jì)
本時鐘采用四個按鍵控制,一個(實(shí)物圖藍(lán)色線24號引腳)是選擇,一個進(jìn)行加數(shù)(實(shí)物圖紫色線25號引腳),一個進(jìn)行減數(shù)(實(shí)物圖灰色線26號引腳),還有一個保存(實(shí)物圖白色線27號引腳)。例如按下選擇鍵,然后1602顯示光標(biāo),此時可以用加或減來進(jìn)行調(diào)節(jié),在按下選擇鍵,光標(biāo)移到不同的單位上,同理進(jìn)行調(diào)節(jié),最后待日期時間調(diào)節(jié)好后,按下保存鍵,時鐘開始計(jì)時。
3.4 復(fù)位電路設(shè)計(jì)
單片機(jī)復(fù)位有上電復(fù)位和手動復(fù)位兩種方式,上電復(fù)位是接通電源后利用RC充電來實(shí)現(xiàn)復(fù)位。手動復(fù)位是通過人為干預(yù),強(qiáng)制系統(tǒng)復(fù)位。
連接至9號復(fù)位引腳
復(fù)位電路如圖所示,可以實(shí)現(xiàn)上電復(fù)位和手動復(fù)位功能。
3.5 時鐘電路設(shè)計(jì)
系統(tǒng)時鐘源由內(nèi)部時鐘方式產(chǎn)生,時鐘電路由12MH晶振和兩個30PF瓷片電容組成,構(gòu)成自激振蕩,形成振蕩源提供給單片機(jī)。電容可在5PF到30PF之間選擇,電容的大小對振蕩頻率有微小影響,可起頻率微調(diào)作用。
3.6整體電路原理圖 控制系統(tǒng)的軟件設(shè)計(jì) 4.1 程序設(shè)計(jì)
由于C 語言程序設(shè)計(jì)較匯編可讀性強(qiáng),可移植性,且可以大大降低編程的難 度和縮短開發(fā)周期,本系統(tǒng)程序采用c 語言設(shè)計(jì)。
4.2 程序源代碼
#include
//包含單片機(jī)寄存器的頭文件 #include
#define uchar unsigned char #define uint unsigned int
sbit RS=P2^0;
//寄存器選擇位,將RS位定義為P2.0引腳 sbit RW=P2^1;
//讀寫選擇位,將RW位定義為P2.1引腳 sbit E=P2^2;
//使能信號位,將E位定義為P2.2引腳 sbit BF=P0^7;
//忙碌標(biāo)志位,將BF位定義為P0.7引腳
uchar code table[]=“2013-12-07 WEEK6”;
//初始化液晶顯示 16 uchar code table1[]=“TIME: 19-27-50”;
//14
uchar count,s1num;char second,minute,hour,day,month,year,week;
sbit s1=P2^3;
//功能鍵
sbit s2=P2^4;
//加鍵 sbit s3=P2^5;
//減鍵
sbit s4=P2^6;
//保存并退出
/*
延時若干毫秒
*/ void delay(uchar n){ uchar i,a,b;for(i=0;i for(b=199;b>0;b--) for(a=1;a>0;a--);} /*********************************************** 函數(shù)功能:判斷液晶模塊的忙碌狀態(tài) 返回值:result。result=1,忙碌;result=0,不忙 ************************************************/ uchar BusyTest(void){ bit result;RS=0;//根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài) RW=1;E=1; //E=1,才允許讀寫 _nop_(); //空操作 _nop_();_nop_();_nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間 result=BF;//將忙碌標(biāo)志電平賦給result E=0; //將E恢復(fù)低電平 return result;} /******************************************** 函數(shù)功能:寫指令 入口參數(shù):dictate *********************************************/ void WriteInstruction(uchar dictate){ while(BusyTest()==1); //如果忙就等待 RS=0;//根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令 RW=0;E=0; //E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,//就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置“0” _nop_(); _nop_(); //空操作兩個機(jī)器周期,給硬件反應(yīng)時間 P0=dictate; //將數(shù)據(jù)送入P0口,即寫入指令或地址 _nop_();_nop_();_nop_();_nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間 E=1; //E置高電平 _nop_();_nop_();_nop_();_nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間 E=0; //當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 } /********************************************* 函數(shù)功能:寫數(shù)據(jù) 入口參數(shù):y(為字符常量)**********************************************/ void WriteData(uchar y){ while(BusyTest()==1);RS=1; //RS為高電平,RW為低電平時,可以寫入數(shù)據(jù) RW=0;E=0; //E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,//就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置“0” P0=y;//將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊 _nop_();_nop_();_nop_();_nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間 E=1; //E置高電平 _nop_();_nop_();_nop_();_nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間 E=0; //當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 } /****************************************** 函數(shù)功能:對LCD的顯示模式進(jìn)行初始化設(shè)置 *******************************************/ void LcdInitiate(void){ uchar num; second=50;minute=27;hour=19;week=6;day=7;month=12;year=13;count=0;s1num=0;E=0;delay(15);//延時15ms,首次寫指令時應(yīng)給LCD一段較長的反應(yīng)時間 WriteInstruction(0x38);//顯示模式設(shè)置:16×2顯示,//5×7點(diǎn)陣,8位數(shù)據(jù)接口 delay(5);//延時5ms?,給硬件一點(diǎn)反應(yīng)時間 WriteInstruction(0x38);delay(5);WriteInstruction(0x38);//連續(xù)三次,確保初始化成功 delay(5);WriteInstruction(0x0c);//顯示模式設(shè)置:顯示開,無光標(biāo),//光標(biāo)不閃爍 delay(5);WriteInstruction(0x06);//顯示模式設(shè)置:光標(biāo)右移,字符不移 delay(5);WriteInstruction(0x01);//清屏幕指令,將以前的顯示內(nèi)容清除 delay(5);WriteInstruction(0x80);for(num=0;num<16;num++)//讓液晶顯示日期 { WriteData(table[num]);delay(5);} WriteInstruction(0x80+0x40);for(num=0;num<14;num++)//讓液晶顯示時間 { WriteData(table1[num]);delay(5);} TMOD=0x01; //定時器中斷初始化 TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1; ET0=1;TR0=1;} //-------寫年月日---------------void write_nyr(uchar add,uchar date){ uchar i,j;i=date/10;j=date%10;WriteInstruction(0x80+add);WriteData(0x30+i);WriteData(0x30+j);} //--------寫時分秒---------------void write_sfm(uchar add,uchar date){ uchar i,j;i=date/10;j=date%10;WriteInstruction(0x80+0x40+add);WriteData(0x30+i);WriteData(0x30+j);} //-------------寫星期-------------void write_week(uchar add,uchar date){ WriteInstruction(0x80+add);WriteData(0x30+date);} //---------該年是否是閏年-------------bit leap_year(){ int leap;if((year%4==0&&year%100!=0)||year%400==0) leap=1; //是閏年 else leap=0; //非閏年 return leap;} //----------鍵盤掃描--------------------void keyscan(){ if(s1==0) //第一個鍵是否按下 { delay(5); if(s1==0) { while(!s1); s1num++; if(s1num>7) s1num=1; if(s1num==1) //第一個鍵被按一次 { TR0=0; WriteInstruction(0x80+0x40+13); WriteInstruction(0x0f); } if(s1num==2) { WriteInstruction(0x80+0x40+10); } if(s1num==3) { WriteInstruction(0x80+0x40+7); } if(s1num==4) { WriteInstruction(0x80+9); } if(s1num==5) { WriteInstruction(0x80+6); } if(s1num==6) { WriteInstruction(0x80+3); } if(s1num==7) { WriteInstruction(0x80+15); } } } if(s1num!=0) //如果功能鍵被按下 { if(s2==0)//第二個按下 { delay(5); if(s2==0) { while(!s2); if(s1num==1) //第一個鍵被按一次,秒鐘加一 { second++; if(second==60) second=0; write_sfm(12,second); WriteInstruction(0x80+0x40+13); } if(s1num==2) //第一個鍵被按二次,分鐘加一 { minute++; if(minute==60) minute=0; write_sfm(9,minute); WriteInstruction(0x80+0x40+10); } if(s1num==3) //第一個鍵被按三次,時鐘加一 { hour++; if(hour==24) hour=0; write_sfm(6,hour); WriteInstruction(0x80+0x40+7); } if(s1num==4) //日期加一 { day++; if(day==32) day=1; write_nyr(8,day); WriteInstruction(0x80+9); } if(s1num==5) //月加一 { month++; if(month==13) month=1; write_nyr(5,month); WriteInstruction(0x80+6); } if(s1num==6) //年加一 { year++; if(year==99) year=0; write_nyr(2,year); WriteInstruction(0x80+3); } if(s1num==7) //星期加一 { week++; if(week==8) week=1; write_week(15,week); WriteInstruction(0x80+15); } } } if(s3==0) //第三個鍵被按下 { delay(5);if(s3==0){ while(!s3); if(s1num==1) //秒減一 { second--; if(second==-1) second=59; write_sfm(12,second); WriteInstruction(0x80+0x40+13); } if(s1num==2) //分減一 { minute--; if(minute==-1) minute=59; write_sfm(9,minute); WriteInstruction(0x80+0x40+10); } if(s1num==3) //時減一 { hour--; if(hour==-1) hour=23; write_sfm(6,hour); WriteInstruction(0x80+0x40+7);} if(s1num==4) //日減一 { day--; if(day==0) day=31; write_nyr(8,day); WriteInstruction(0x80+9);} if(s1num==5) //月減一 { month--; if(month==0) month=12; write_nyr(5,month); WriteInstruction(0x80+6);} if(s1num==6) //年減一 { year--; if(year==-1) year=99; write_nyr(2,year); WriteInstruction(0x80+3);} if(s1num==7) //日期減一 { week--; if(week==0) week=7; write_week(15,week); WriteInstruction(0x80+15); } } } if(s4==0) //保存并退出 { s1num=0; WriteInstruction(0x0c); TR0=1; } } } /****************************************** main function *******************************************/ void main(void){ uchar k=0;LcdInitiate(); //調(diào)用LCD初始化函數(shù) while(1){ keyscan(); k=1;} } /***************************************** 函數(shù)功能:定時器T0的中斷服務(wù)函數(shù) ******************************************/ void timer0()interrupt 1 { count++;if(count==13){ count=0; second++; if(second==60) //秒計(jì)滿60,秒歸0,分+1 { second=0; minute++; if(minute==60)//分計(jì)滿60,分歸0,時+1 { minute=0; hour++; if(hour==24)//時計(jì)滿24,時歸0,星期+1,日+1 { hour=0; week++; day++; if(week==8) week=1;//星期計(jì)滿7,星期歸1 if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//大月三十一天 { if(day==32) //大月天數(shù)計(jì)滿31,日歸1,月+1 { day=1; month++; } } if(month==4||month==6||month==9||month==11)//小月三十天 { if(day==31) { //小月天數(shù)計(jì)滿30,日歸1,月+1 day=1; month++; } } if(month==2) { if(leap_year()) { if(day==30)//閏年二月29天??計(jì)滿,日歸1,月+1 { day=1; month++; } } else { if(day==29)//非閏年二月28天 計(jì)滿,日歸1,月+1 { day=1; month++; } } } if(month==13)//月計(jì)滿12,月歸1,年+1 { month=1; year++; } if(year==99)//年計(jì)滿99,年歸0 { year=0; } write_nyr(2,year); } write_nyr(5,month); } write_nyr(8,day); write_week(15,week); } write_sfm(6,hour); } write_sfm(9,minute);} write_sfm(12,second);5 仿真結(jié)果和實(shí)物圖 5.1 仿真結(jié)果 5.2 實(shí)物圖 總結(jié): 說句實(shí)話,這個時鐘在硬件上沒有什么太多的技術(shù)含量,只有一個單片機(jī)的最小系統(tǒng)和一個顯示電路,其實(shí)它們可以結(jié)合在一起,但是為了以后的方便,我還是將它們設(shè)計(jì)了兩個部分,方便以后最小系統(tǒng)的其他方面的應(yīng)用。還有就是程序,這個時鐘程序如果讓我自己寫的話那我肯定不能再規(guī)定時間內(nèi)完成,所以還是靠外界力量的幫忙。也正是如此,我找到我學(xué)習(xí)單片機(jī)的弱點(diǎn),那就是程序的編寫,記得室友百度開玩笑說:“程序是單片機(jī)的靈魂”,想想當(dāng)時很搞笑,但仔 細(xì)一想,那還真是個恰當(dāng)?shù)谋扔鳎绻f單片機(jī)沒有程序的輸入,那么它不能完成任何事情。雖然本學(xué)期的單片機(jī)課程即將結(jié)束,但是我學(xué)習(xí)單片機(jī)的過程還沒有結(jié)束,以后還是要在程序的編寫上多多下工夫。 此次的電子時鐘設(shè)計(jì)給我奠定了一個實(shí)踐基礎(chǔ),我會在以后的學(xué)習(xí)、生活中磨練自己,使自己適應(yīng)于以后的競爭。當(dāng)遇到不會或是設(shè)計(jì)不出來的地方,我們就會在QQ 群里討論或者是同學(xué)之間相互幫助。團(tuán)結(jié)就是力量,無論在現(xiàn)在的學(xué)習(xí)中還是在以后的工作中,團(tuán)結(jié)都是至關(guān)重要的,有了團(tuán)結(jié)會有更多的理念、更多的思維、更多的情感。 參考文獻(xiàn) [1]郭天祥.新概念51單片機(jī)C語言教程—— 入門,提高,開發(fā),拓展 全攻略[M].北京:電子工業(yè)出版社,2009. 五.實(shí)驗(yàn)總結(jié)及感想 在實(shí)驗(yàn)的開始幾天,基本上沒有收獲,不知何從下手,不知所措。為了看得更遠(yuǎn),不妨站在前人的肩膀上,我在整體思路模糊的情況下,在網(wǎng)上大量招資糧,各種與電子時鐘相關(guān)的文章,我閱讀了不少。隨著涉獵的點(diǎn)滴積累,我對電子時鐘的設(shè)計(jì)方案已經(jīng)慢慢醞釀而成。有了方向和不少知識儲備后,在接下來的幾天,幾乎每天都有突破,雖然有時只是一句程序的修改或誕生,但那種收獲的感覺很暖人心。 實(shí)驗(yàn)中遇到了不少問題,接下來總結(jié)一下,共同探討。 1,按鍵問題。我的設(shè)計(jì)中,很多功能選擇是通過按鍵開關(guān)實(shí)現(xiàn)的。在仿真中發(fā)現(xiàn),調(diào)整數(shù)值時,有時按鍵反應(yīng)太快,按一次,跳了幾下,使設(shè)置時間,日期很不方便。但是仿真多了之后,找到了按鍵(實(shí)際上是按鼠標(biāo))的節(jié)奏,對按鍵的掌控力提高了不少,不怎么會出現(xiàn)跳變的情況了。有些開關(guān)我采用了長按鍵的方式來防抖,效果不錯,但是每次都要長按鍵,調(diào)整效率太低,我沒有普及。本來想把所有的按鍵都加延時防抖電路,但仿真中感覺對鍵盤的控制力沒提高多少,有時還是會出問題,這個方案放棄了。索性將板子焊接出來了在調(diào)試軟件吧,仿真畢竟不是那么“真”啊!實(shí)際電路調(diào)試中,按鍵反應(yīng)沒有出現(xiàn)過于靈敏的問題,基本可控制。 出現(xiàn)以上問題,我認(rèn)為是電路板上焊接點(diǎn)太多,接觸不是很好,影響了信號的傳輸時間,從而解決了按鍵問題!也有可能是按鍵質(zhì)量問題,接觸不良。 2,P0口開關(guān)問題。P0口比較特殊,它存在高阻態(tài),要使其輸入不是高電平就是低電平,就要接上拉電阻,給其高電平輸入。 3,音樂鬧鈴問題。在鬧鈴時間到,鬧鈴提醒時,我的數(shù)碼管為熄滅狀態(tài),因?yàn)殚_始我的響鈴程序內(nèi),沒有數(shù)碼管掃描顯示程序。但加入數(shù)碼管顯示子程序后,我的鬧鈴音樂被影響了,一開始不知所措,有點(diǎn)懷疑是顯示程序時間過長,影響音樂的定時(節(jié)拍),我就在響鈴程序中加延時模塊,延時長度逐漸提高,最后出現(xiàn)了類似的問題,看來時顯示程序占用時間太長,使音樂每個音符的節(jié)拍出現(xiàn)了紊亂,音樂功能被遏制了!魚和熊掌不能兼得,我只能犧牲顯示來獲得音樂鬧鈴,但為了彌補(bǔ)顯示,我設(shè)計(jì)了閃爍提醒方案,就是在手動或音樂自然停止后,進(jìn)入當(dāng)前時間閃爍提示,8秒后若不按返回鍵,則自動跳入主程序。 在仿真中,老師提供的響鈴電路不能實(shí)現(xiàn)功能,但是在我的電路板中效果很好,令人費(fèi)解!4,中斷沖突問題,為了實(shí)現(xiàn)秒表,我在T0中斷嵌套了秒表相關(guān)進(jìn)位程序,由于秒表要求精度0.01秒,故我的T0中斷定時為就剛好0.01秒,中斷100次,剛好1秒。秒表確實(shí)實(shí)現(xiàn)了,但是我的鬧鈴音質(zhì)變差了。一開始以為是鬧鈴程序存太多冗余環(huán)節(jié),影響了T1的音樂輸出中斷,但是檢查程序后,發(fā)現(xiàn)沒什么多余的,裁剪無從下手。 在仿真中,我讓音樂模塊運(yùn)行,發(fā)現(xiàn)音質(zhì)很好。添加T0中斷服務(wù)程序,但是將中斷進(jìn)入的間隔變大,即0.05秒進(jìn)入一次中斷,發(fā)現(xiàn)音質(zhì)有所下降,有滋滋聲,但比原來的好。最后認(rèn)定應(yīng)該是T0中斷過于頻繁,T1音樂頻率發(fā)生中斷被打破,當(dāng)單位時間內(nèi)被打破的次數(shù)達(dá)到一定程度時,音符和節(jié)拍的對應(yīng)發(fā)生紊亂,最終音質(zhì)變差。 雖然如此,我的焊接的電路板的表現(xiàn)卻很爭氣,鬧鈴音質(zhì)可以接受!雖然這次實(shí)際表現(xiàn)不錯,但問題還是有的,還是要解決的,我的方案是把秒表程序放在T1中斷服務(wù)程序,雖然音樂的發(fā)生要用到T1中斷,但是秒表的顯示和鬧鈴音樂的演奏上不會重合在一起,鬧鈴判斷是在主程序,而秒表實(shí)現(xiàn)是在秒表子程序,故原本相互矛盾的兩個功能,在T1中斷服務(wù)程序中找到了共同的歸宿,和諧相處。 5,顯示數(shù)字分隔問題。本實(shí)驗(yàn)中用8個共陰極數(shù)碼管顯示日歷及其時間,但是8個數(shù)碼管連在一起,顯示過程中不能有效地區(qū)分時,分,秒和年,月,日,數(shù)碼管是兩兩組合起來,形成某位的十位和個位,故用小數(shù)點(diǎn)在適當(dāng)位置一直保持高亮狀態(tài),形成分隔符,實(shí)現(xiàn)方便的讀取數(shù)據(jù)。具體方法是,將需要小數(shù)點(diǎn)位高亮的數(shù)碼管找出來,在動態(tài)顯示掃描到該數(shù)碼管時,先將提取的字段碼的最高位變?yōu)?,利用語句 ORL A,#10000000B 實(shí)現(xiàn),修正字碼后,再將字碼送入P1口顯示數(shù)字,如此問題得以解決。 6,添加倒計(jì)時器嘀嘀聲提示功能。這個功能我用到了T1中斷,作為音調(diào)頻率發(fā)生器,但是T1已經(jīng)承擔(dān)了音樂鬧鈴的音調(diào)發(fā)生功能,在此通過設(shè)立標(biāo)志位實(shí)現(xiàn)中斷服務(wù)程序的轉(zhuǎn)變。即使我將秒表的實(shí)現(xiàn)服務(wù)程序放入T1中斷實(shí)現(xiàn),也沒問題,只要選擇標(biāo)志位判斷就可以了。在此,我們用調(diào)整狀態(tài)指示燈的狀態(tài)來做標(biāo)志位,具體的說是P0.1口做標(biāo)志位。 還有一個問題就是如何使鈴聲有間隔的響,這就牽涉到定時,在此我們用硬件定時,即T1中斷的次數(shù)作為定時參數(shù)。我的設(shè)計(jì)是音調(diào)響0.25秒,然后用T1延時0.5秒,由于計(jì)數(shù)器工作于方式1時,12MHZ時鐘頻率下時,一次中斷最多定時65536*1us=0.065536秒,為了實(shí)現(xiàn)0.5秒的響聲間隔,將T1中斷1次定時為0.05秒,中斷10次后,重新裝音調(diào)發(fā)生計(jì)數(shù)初值。對于響鈴時間的設(shè)定原理類似,可以有發(fā)聲頻率求出一次發(fā)聲定時中斷的時間,N次發(fā)聲定時中斷后,使時間變化0.25秒,而后轉(zhuǎn)入發(fā)聲間隔定時程序。 設(shè)計(jì)體會 以前看別人的一個電子表賣十幾塊錢,心里面有點(diǎn)憤憤不平,現(xiàn)在,自己做過一個電子鐘,才發(fā)現(xiàn),其中的不容易,還有艱辛。其實(shí)做其他的事情也是一樣,都會經(jīng)過很多的困難,才能成功。突然想起一句話“不經(jīng)歷風(fēng)雨,怎么見彩虹”。其實(shí)想想,這一個月,也留下了很多美好的回憶。一分耕耘,一分收獲。只有親自用實(shí)踐來驗(yàn)證這句話,在能得其要領(lǐng)。經(jīng)過這次單片機(jī)課程設(shè)計(jì),我從一個單片機(jī)實(shí)踐的門外漢,已經(jīng)越升為略知一二的新手。雖然還有很多有關(guān)單片機(jī)的應(yīng)用有待學(xué)習(xí),但萬變不離其宗,只要深入了解單片的原理,全部知識點(diǎn),各個細(xì)節(jié),一切設(shè)計(jì)皆有可能。還記得那個晚上通宵達(dá)旦仿真,不成功,誓不睡覺,很困了,都還在弄著。卻當(dāng)仿真成功時,沒有一絲睡意,有的只是心中的喜悅通過這次的設(shè)計(jì)使我認(rèn)識到本人對單片機(jī)方面的知識知道的太少了,對于書本上的很多知識還不能靈活運(yùn)用,尤其是對程序設(shè)計(jì)語句的理解和運(yùn)用,不能夠充分理解每個語句的具體含義,導(dǎo)致編程的程序過于復(fù)雜,使得需要的存儲空間增大。損耗了過多的內(nèi)存資源。本次的設(shè)計(jì)使我從中學(xué)到了一些很重要的東西,那就是如何從理論到實(shí)踐的轉(zhuǎn)化,怎樣將我所學(xué)到的知識運(yùn)用到我以后的工作中去。只要我們有耐心,夠細(xì)心,都可以把它們解決。在大學(xué)的課堂的學(xué)習(xí)只是在給我們灌輸專業(yè)知識,而我們應(yīng)把所學(xué)的用到我們現(xiàn)實(shí)的生活中去,此次的電子時鐘設(shè)計(jì)給我奠定了一個實(shí)踐基礎(chǔ),我會在以后的學(xué)習(xí)、生活中磨練自己,使自己適應(yīng)于以后的競爭,同時在查找資料的過程中我也學(xué)到了許多新的知識,在和同學(xué)協(xié)作過程中增進(jìn)同學(xué)間的友誼,使我對團(tuán)隊(duì)精神的積極性和重要性有了更加充分的理解。我知道,今后我的路還是很長,我要學(xué)的東西也有很多。通過這次實(shí)習(xí),我深刻的認(rèn)識到計(jì)算機(jī)專業(yè)的路的不平坦,但我會以一種良好的態(tài)度去迎接每一個挫折和挑戰(zhàn)。第五篇:單片機(jī)數(shù)字時鐘課程設(shè)計(jì)感想