基于AT89C51單片機的多功能電子萬年歷的設計
基于AT89C51單片機的多功能電子萬年歷的設計,基于,at89c51,單片機,多功能,電子,萬年歷,設計
單片機課程設計
單片機應用系統(tǒng)設計
課 題: 基于AT89C51單片機的多功能電子萬年歷的設計
姓 名:
班 級:
學 號:
指導老師:
日 期:
目錄
一.緒言……………………………………………………………3
二.系統(tǒng)總體方案設計……………….………………………………3
三.硬件系統(tǒng)設計:…………………….……………………….4
四.系統(tǒng)軟件設計………………….……………………………5
五.設計總結……………………………………………………8
六.參考文獻……………………………………………………8
七.附錄………………………………………………………….9
一.緒論
隨著電子技術的迅速發(fā)展,特別是隨大規(guī)模集成電路出現,給人類生活帶來了根本性的改變。由其是單片機技術的應用產品已經走進了千家萬戶。電子萬年歷的出現給人們的生活帶來的諸多方便。
本文首先描述系統(tǒng)硬件工作原理,并附以系統(tǒng)結構框圖加以說明,著重介紹了本系統(tǒng)所應用的各硬件接口技術和各個接口模塊的功能及工作過程,其次,詳細闡述了程序的各個模塊和實現過程。
萬年歷是采用數字電路實現對.時,分,秒.數字顯示的計時裝置,廣泛用于個人家庭,車站, 碼頭辦公室等公共場所,成為人們日常生活中不可少的必需品,由于數字集成電路的發(fā)展和石英晶體振蕩器的廣泛應用,使得數字鐘的精度,遠遠超過老式鐘表, 鐘表的數字化給人們生產生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關烘箱、通斷動力設備、甚至各種定時電氣的自動啟用等,但是所有這些,都是以鐘表數字化為基礎的。因此,研究萬年歷及擴大其應用,有著非?,F實的意義。
本系統(tǒng)采用了以廣泛使用的單片機技術為核心,軟硬件結合,使硬件部分大為簡化,提高了系統(tǒng)穩(wěn)定性,并采用LED顯示電路、鍵盤電路,使人機交互簡便易行。
二.系統(tǒng)總體方案設計
1. 系統(tǒng)設計硬件框圖
振蕩電路
按鍵調節(jié)
DS1302
AT89C51
LED顯示頻
2. 實現的基本原理
在本實驗中,我引用了DS1302的時,分,秒功能,當時計數字24時通過74LS164給模塊年月日進位,當日模塊對應其相應月份進行向月進位時,就給月進位,當月滿12時,給年進位。
三.硬件系統(tǒng)設計
1.元器件介紹
名稱
圖形
功能
DS1302
可以對年、月、日、周日、時、分、秒進行計時,且具有閏年補償等多種功能
74LS164
74LS164是一個串行輸入并行輸出的移位寄存器,并帶有清除端。其中; Q0—Q7 并行輸出端 。 A,B串行輸入端。 MR 清除端, 為0時,輸出清零。 CP 時鐘輸入端。
AT89C51
at89c51單片機是美國ATMEL公司生產的低電壓,高性能CMOS 8位單片機,片內含4K bytes的可反復擦寫的Flash只讀程序存儲器和128bytes的隨機數據存儲器(RAM),器件采用ATMEL公司的高密度,非易失性存儲技術生產,兼容標準MCS-51指令系統(tǒng)。功能強大的at89c51單片機可為您提供許多高性價比的應用場合,可靈活應用于各種控制領域。
2.硬件原理圖
四.系統(tǒng)軟件設計
仿真過程
1、打開PROTEUS軟件,并出畫單片機電子萬年歷具體運行電路圖。
3、檢查所畫電路運行圖,確保沒有錯誤以后,加載源程序。
4、加載完成后,單擊電路圖框下的開始按鈕,進行仿真,觀察LED數碼管現實情況,此時LED數碼管開始顯示數字。調節(jié)開關進行時間的調節(jié)。當秒的顯示間隔快與或慢與實際間隔時,調節(jié)石英晶體震蕩器的頻率參數,從而使秒的間隔達到標準。然后檢查電路其它問題,并對其的各參數進行調整,使之正確。
仿真結果
通過對源程序的編譯,改正了其中的很多錯誤,然后運行,保證源程序的正確性。然后按原理圖選擇正確合理的電器元件,畫出正確的電路圖,加載源程序運行,順利實現了單片機數字電子鐘的“小時”、“分鐘”、“秒”的顯示。
1主程序流程圖設計
開始
設置串行口工作方式
設置計數器工作方式
給計數器1,0賦初值
調用1302寫操作
啟動定時計數器0
定時時間到?
讀年月日時分秒
把要顯示的數據送到緩沖區(qū)
調用顯示子程序
結束
N
調用定時中斷
Y
2顯示模塊流程圖
基本顯示模塊設計的重點是由顯示代碼取得相應的段碼、顯示段碼數據的串行發(fā)送,程序流程如圖1-11所示。其中時個位的段碼必須加上小數點,即帶小數點顯示時個位,目的是以小數點符代替時間分割符“-”。
軟件秒脈沖發(fā)生器其實質是利用了定時器0的定時溢出中斷,將它設定為100ms溢出中斷,則10次中斷的時間正好為1s。將時間參數設計為100ms的原因有兩個:
1)根據系統(tǒng)時鐘主頻為6M的特點,16位定時器最大定時時間為65536×2M(M為機器周期,這里是2μS),即131ms,取整數100便于計次數;
2)如取的太短,如10ms,則定時器頻繁中斷,干擾系統(tǒng)正常運行效果。
有了秒脈沖發(fā)生器,10次中斷為1s,秒指示燈閃亮1次,秒變量單元加1,60后分變量單元加1,如果為60分則時變量單元加1。任何一個變量的變化,則顯示刷新一次(更新)。上述思想的實現均集成在定時器0的中斷子程序中。
該設計顯示模塊流程圖如圖
將16進制時分數據轉化為BCD顯示代碼
關顯示以免顯示抖動
通過串口將時十位段碼送入對應的LS164
將時個位段碼送入對應的LS164
將分十位和個位段碼送入各自對應LS164
打開顯示
運行結果
五.設計總結
通過這一周的課程設計,我學到了不少的知識。把以前沒有學好的模擬電路的知識進行了補充和加強。這使我受益很大。加深了我對于單片機和數字電路的認識,相信在以后的學習和工作中碰到這些基礎的元器件我會更加得心應手。通過查閱大量的資料,我獲得了以前在課堂上學不到的東西,我想這對于以后的畢業(yè)設計,或者工作也好,都是很有幫助的。我很認真地對待這個過程中的每一個細節(jié),希望自己能做得更好。希望今后還有這樣的機會,能夠讓我學到更多的知識。在此次的數字鐘設計過程中,更進一步地熟悉了芯片的結構及掌握了各芯片的工作原理和其具體的使用方法。
在連接六進制,十進制,六十進制的進位及十二進制的接法中,要求熟悉邏輯電路及其芯片各引腳的功能,那么在電路出錯時便能準確地找出錯誤所在并及時糾正了。
學無止境,我們現在所做的一切都還只是一個開始。
主要參考資料:
[1] 林志琦.基于Proteus的單片機可視化軟硬件仿真[M].北京:北京航空航天大學出版社,2006.9
[2] 周潤景,張麗娜.基于PROTEUS的電路及單片機系統(tǒng)設計與仿真[M].北京:北京航空航天大學出版社,2006.5
[3] 張靖武,周靈彬.單片機系統(tǒng)的PROTEUS設計與仿真[M].北京:電子工業(yè)出版社,2007.4
[4] 周潤景,張麗娜.PROTEUS入門實用教程[M].北京:機械工業(yè)出版社,2007.9
[5] 戴俊峰.嵌入式系統(tǒng)大屏幕LED點陣顯示器[J].現代電子技術,2004,27(19):68-89,72.
[6] 馮壽鵬.基于嵌入式系統(tǒng)的LED信息顯示技術研究[J].現代電子技術,2005(1):15-47.
[7] 樓然苗,李光飛.51系列單片機設計實例[M].北京:北京航空航天大學出版社,2003.3
[8] 樓然苗,李光飛.單片機課程設計指導[M].北京:北京航空航天大學出版社,2007.7
[9] 賈東耀,汪仁煌. 數字溫度傳感器在倉庫溫度檢測系統(tǒng)的應用[J]. 傳感器世界,2001.
[10] DALLAS DS18B20數據手冊[Z].http://www.maximic.com
[11]付旭,方康玲.利用VB6.0實現PC機與單片口通訊[J].微計算機信息,2002,18(10):30-31
[12] 李江全,張麗,岑紅蕾.Visual Basic串口通信與測控應用技術實戰(zhàn)詳解[M].北京:人民郵電出版社,2007.
[13] 法國Humirel公司.HS1101使用說明手冊.
[14] 長沙太陽人電子有限公司.SMC1602A LCM使用說明手冊.
附錄:
;*****************************
;* 萬年歷程序 *
;*****************************
;67H(高兩位年)66H(低兩位年)65H(月)64H(星期)
;63H(日)62H(小時)61H(分)60H(秒)57H(農歷月)56H(農歷日)
;顯示緩沖單元CH~7BH(4CH~4BH)年低位,AH~79H(4AH~49H)月,
;78H(48H)星期,H~76H(47H~46H)日,H~74H(45H~44H)時,
;73H72H(43H~42H)分,H~70H(41H~40H)秒,EH~5DH(55H~54H)農歷年
;5CH~5BH(53H~52H)農歷月,AH~59H(51H~50H)農歷日
;閏年標志為F0,定時器T1為調整時候閃爍用
; LCALL GETWEEK
; MOV 78H,WEEk
SCLK BIT P3.2
IO BIT P3.3
RST BIT P3.4
TIME_YEAR DATA 66H
TIME_MONTH DATA 65H
WEEK DATA 64H
TIME_DAY DATA 63H
HOUR DATA 62H
MINTUE DATA 61H
SECOND DATA 60H
DS1302_ADDR DATA 32H
DS1302_DATA DATA 31H
start_year EQU 01; 定義查詢表起始年份,01--199 表示1901-2099 年
week_byte1 DATA 3AH
WEEK_BYTE2 DATA 3BH
WEEK_BYTE3 DATA 3CH
WEEK_BYTE4 DATA 3DH
WEEK_BYTE5 DATA 3EH
CONvert_year DATA 6dh
CONvert_month DATA 6eh ;BIT7 為1 表示閏月
CONvert_date DATA 6fh
temp_Byte1 DATA 68h
temp_Byte2 DATA 69h
temp_Byte3 DATA 6Ah
temp_Byte4 DATA 6Bh
temp_Byte5 DATA 6Ch
; RS EQU P3.0
; RW EQU P3.1
; E EQU P3.5
ORG 0000H
AJMP START
ORG 0003H
RETI
ORG 000BH
LJMP INTT2
ORG 001BH
LJMP INTT1
ORG 30H
;************************************
;* 主程序 *
;************************************
start:
mov R1,#254h ;清RAM 128單元
mov r0,#2
mov a,#0
clear:
mov @r0,a
inc r0
djnz r1,clear
mov r0,A
MOV R1,A
MOV R7,#10 ;計數器初始計數值
SETB EA ;打開總中斷
; MOV T2CON,#0
;MOV T2MOD,#0
; MOV TH2,#0
;MOV TL2,#0
;SETB TR2
MOV SCON,#00H ;串行輸出,方式
MOV TMOD,#11H ;計數器,方式;計數器,方式
MOV TL1,#00H ;計數器初值65.5MS中斷一次
MOV TH1,#00H
MOV TH0,#3CH ;計數器50MS中斷一次
MOV TL0,#0B0H
CLR P0.6
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允許協
LCALL WRITE
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A6H ;1302充電,充電電流.1mA
lcall write
SETB ET0 ;打開秒閃定時器
SETB TR0
main1: MOV DS1302_ADDR,#8DH ;READ OUT YEAR
LCALL READ
MOV TIME_YEAR,DS1302_DATA
MOV DS1302_ADDR,#8BH ;READ OUT WEEK
LCALL READ
MOV WEEK,DS1302_DATA
MOV DS1302_ADDR,#89H ;READ OUT MONTH
LCALL READ
MOV TIME_MONTH,DS1302_DATA
MOV DS1302_ADDR,#87H ;READ OUT DAY
LCALL READ
MOV TIME_DAY,DS1302_DATA
MOV DS1302_ADDR,#85H ;READ OUT HOUR
LCALL READ
MOV HOUR,DS1302_DATA
MOV DS1302_ADDR,#83H ;READ OUT MINTUE
LCALL READ
MOV MINTUE,DS1302_DATA
MOV DS1302_ADDR,#81H ;READ OUT SECOND
LCALL READ
MOV SECOND,DS1302_DATA
MOV R0,TIME_YEAR ;年分離,送顯示緩存
LCALL DIVIDE
MOV 7BH,R1
MOV 4BH,R1
MOV 7CH,R2
MOV 4CH,R2
MOV 78H,WEEK
MOV 48H,WEEK
MOV R0,TIME_MONTH ;月分離,送顯示緩存
LCALL DIVIDE
MOV 79H,R1
MOV 49H,R1
MOV 7AH,R2
MOV 4AH,R2
MOV R0,TIME_DAY ;日分離,送顯示緩存
LCALL DIVIDE
MOV 76H,R1
MOV 46H,R1
MOV 77H,R2
MOV 47H,R2
MOV R0,HOUR ;小時分離,送顯示緩存
LCALL DIVIDE
MOV 74H,R1
MOV 44H,R1
MOV 75H,R2
MOV 45H,R2
MOV R0,MINTUE ;分分離,送顯示緩存
LCALL DIVIDE
MOV 72H,R1
MOV 42H,R1
MOV 73H,R2
MOV 43H,R2
MOV R0,SECOND ;秒分離,送顯示緩存
LCALL DIVIDE
MOV 70H,R1
MOV 40H,R1
MOV 71H,R2
MOV 41H,R2
LCALL GENGXIN ;更新農歷程序
MOV R0,CONVERT_MONTH ;農歷月分離,送顯示緩存
LCALL DIVIDE
MOV 5BH,R1
MOV 52H,R1
MOV 5CH,R2
MOV 53H,R2
MOV R0,CONVERT_DATE
LCALL DIVIDE
MOV 59H,R1
MOV 50H,R1
MOV 5AH,R2
MOV 51H,R2
LCALL GETWEEK
MOV 78H,WEEK
LCALL DISPLAY
GOON:JNB P1.1,SETGG ;調整日歷
;JNB P1.4,QIDONG ;啟動秒鐘指示燈
; LCALL QIDONG
AAA: JNB F0,SSS
CLR P1.0 ;閏月,則p1.0清,指示燈亮
LJMP MAIN1
SSS: SETB P1.0 ;非閏月,則p1.0置位,指示燈滅
LJMP MAIN1
SETGG: LJMP SETG
QIDONG: LCALL DISPLAY ;秒鐘指示燈開啟/關閉
;JNB P1.4,QIDONG
; LCALL QIDONG
CPL 30H ;30
JB 30H,ON
CLR TR0
CLR ET0
AJMP QDOUT
ON: SETB TR0
SETB ET0
QDOUT: AJMP AAA
;*****************************
;* 秒燈閃爍程序 *
;*****************************
INTT2: PUSH ACC ;累加器入棧保護
PUSH PSW ;狀態(tài)字入棧保護
CLR ET0 ;關T0中斷允許
CLR TR0 ;關閉定時器T0
MOV A,#0B7H ;中斷響應時間同步修正
ADD A,TL0 ;低位初值修正
MOV TL0,A ;重裝初值(低位修正值)
MOV A,#3CH ;高位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重裝初值(高位修正值)
SETB TR0 ;開啟定時器T0
CLR PSW.4
DJNZ R7,INTT2OUT
MOV R7,#10
CPL 20H
JB 20H,S1
SETB P0.7 ; 秒指示燈閃爍
AJMP INTT2OUT
S1:
CLR P0.7
INTT2OUT: POP PSW ;出棧
POP ACC
SETB ET0
RETI
;*********************************
;* 寫程序 *
;*********************************
WRITE: CLR SCLK
NOP
SETB RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8
WRITE1: RRC A ;送地址給
NOP
NOP
CLR SCLK
NOP
NOP
NOP
MOV IO,C
SETB SCLK ;送入地址在時鐘上升沿有效
NOP
NOP
NOP
NOP
DJNZ R4,WRITE1
CLR SCLK
NOP
MOV A,DS1302_DATA
MOV R4,#8
WRITE2: RRC A
NOP ;送數據給,時鐘上升沿,數據輸入
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE2
CLR RST
RET
;*******************************
;* 讀程序 *
;*******************************
READ: CLR SCLK
NOP
NOP
SETB RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8
READ1: RRC A
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK ;送入地址在時鐘上升沿有效
NOP
NOP
NOP
;CLR SCLK
CLR SCLK
NOP
NOP
DJNZ R4,READ1
MOV R4,#8
READ2: CLR SCLK
NOP
NOP
NOP
收藏