單片機(jī)課程設(shè)計(jì)—萬年歷[1]_第1頁
單片機(jī)課程設(shè)計(jì)—萬年歷[1]_第2頁
單片機(jī)課程設(shè)計(jì)—萬年歷[1]_第3頁
單片機(jī)課程設(shè)計(jì)—萬年歷[1]_第4頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、單片機(jī)課程設(shè)計(jì)一萬年歷1鄭州輕工業(yè)學(xué)院軟件學(xué)院單片機(jī)與接口技術(shù)課程設(shè)計(jì)總結(jié)報(bào)告設(shè)計(jì)題目:電子萬年歷學(xué)生姓名:系 別:專 業(yè):班 級:學(xué) 號:指導(dǎo)教師:2011年12月16日設(shè)計(jì)題目:電子萬年歷設(shè)計(jì)任務(wù)與要求:1、顯示年月日時(shí)分秒及星期信息2、具有可調(diào)整日期和時(shí)間功能3、增加閏年計(jì)算功能方案比較:方案一:系統(tǒng)分為主控制器模塊、顯示模塊、按鍵開關(guān)模塊,主控制模塊采用AT89C52 單片機(jī)為控制中心,顯示模塊采用普通的共陰LED數(shù)碼管,鍵輸入采用中斷實(shí)現(xiàn)功能調(diào)整, 計(jì)時(shí)使用AT89C52單片機(jī)自帶的定時(shí)器功能,實(shí)現(xiàn)對時(shí)間、日期的操作,通過按鍵盤開關(guān) 實(shí)現(xiàn)對時(shí)間、日期的調(diào)整。方案二:系統(tǒng)分為主控模塊、

2、時(shí)鐘電路模塊、按鍵掃描模塊,LCD顯示模塊,電源電路、復(fù)位電路、晶振電路等模塊。主控模塊采用AT89C52單片機(jī),按鍵模塊用四個(gè)按鍵,用于調(diào)整時(shí)間,顯示模塊采用 LCD1602時(shí)鐘電路模塊采用DS1302時(shí)鐘芯片實(shí)現(xiàn)對時(shí)間、 日期的操作。兩個(gè)方案工作原理大致相同,只有顯示模塊和時(shí)鐘電路不同。LED數(shù)碼管價(jià)格適中,對于數(shù)字顯示效果較好,而且使用單片機(jī)的端口也較少;LCD1602液晶顯示屏,顯示功能 強(qiáng)大,可以顯示大量文字、圖形,顯示多樣性,清晰可見,價(jià)格相對LED數(shù)碼管來說要昂貴些,但是基于本設(shè)計(jì)顯示的東西較多,若采用LED數(shù)碼管的話,所需數(shù)碼管較多,而且不利于控制,因此選擇LCD1602作為顯

3、示模塊。DS1302是一款高性能的實(shí)時(shí)時(shí)鐘芯片, 以 計(jì)時(shí)準(zhǔn)確、接口簡單、使用方便、工作電壓范圍寬和低功耗等優(yōu)點(diǎn),得到廣泛的應(yīng)用,實(shí) 時(shí)時(shí)鐘有秒、分、時(shí)、星期、日、月和年,月小于31天時(shí)可以自動調(diào)整,并具有閏年補(bǔ)償功能,而且在掉電時(shí)能夠在外部紐扣電池的供電下繼續(xù)工作。單片機(jī)有定時(shí)器的功能, 但時(shí)間誤差較大,且需要編寫時(shí)鐘程序,因此采用DS1302作為時(shí)鐘電路。對比以上方案,結(jié)合設(shè)計(jì)技術(shù)指標(biāo)與要求我們選擇了方案二進(jìn)行設(shè)計(jì)。2 / 25邏輯總框圖:該電子萬年歷的總體設(shè)計(jì)框圖如圖(1)所示團(tuán)電子萬年歷總體設(shè)計(jì)框圖4設(shè)計(jì)所需的元件:元件名稱型號數(shù)量/個(gè)單片機(jī)AT89C521時(shí)鐘芯片DS13021晶振1

4、2MHz1晶振32.768kHz1電容30pF2電容22uF1按鍵開關(guān)4電阻10K9滑動變阻器1K1電池1.5V4LCDLCD16021電源Vcc+5V1導(dǎo)線若干單元電路設(shè)計(jì):1、主控制系統(tǒng)單片機(jī)中央處理系統(tǒng)的萬案設(shè)計(jì),選用AT89C52單片機(jī)作為中央處理器,如圖(2)所示。該單片機(jī)除了擁有 MCS-51系列單片機(jī)的所有優(yōu)點(diǎn)外,內(nèi)部還具有 8K的在系統(tǒng)可編程FLASHY儲器,低功耗的空閑和掉電模式,極大的降低了電路的功耗,還包含了定時(shí)器、程序存儲器、數(shù)據(jù)存儲器等硬件,其硬件能符合整個(gè)控制系統(tǒng)的要求,不需要外接其他存 儲器芯片和定時(shí)器件,方便地構(gòu)成一個(gè)最小系統(tǒng)。整個(gè)系統(tǒng)結(jié)構(gòu)緊湊,抗干擾能力強(qiáng),性

5、價(jià)比高。11 1ppp fpffflefpbfpfppttR/ XXcccccr-Er-r-ccccccccttcohz345GTe90O98r&5432ios7&54351 433吝金33$3Z2 Vcrc POT O/ADO PO. 1/AD13 FO, 5/AD23 PO” 3/AD33 FO, 4/AD43 FO, 5/AD5 3 PO. &/ADG-3 FO. r/ADT Ea/Vpp仇 LE/PKJOG3 FSEW3T/AD1 5 EN. &/AD14 FZ. 5/ADl 3 PS. 4/A DI 2 3 Fi. 3/AD1 1 3 FZ_ 2/AD1 O PN一 l/AB-5 P

6、2. O/AD2/L圖AT8&C528052引腳圖卡2、時(shí)鐘振蕩電路時(shí)鐘振蕩電路圖(3)所示,時(shí)鐘振蕩電路用于產(chǎn)生單片機(jī)正常工作時(shí)所需要的時(shí)鐘 信號,電路由兩個(gè)30pF的瓷片電容和一個(gè)12MHZ勺晶振組成,并接入到單片機(jī)的 XTAL1 和XTAL2引腳處,使單片機(jī)工作于內(nèi)部振蕩模式。此電路在加電后延遲大約10ms振蕩器起振,在XTAL2引腳產(chǎn)生幅度為3V左右的正弦波時(shí)鐘信號,其振蕩頻率主要由石英晶振 的頻率決定。電路中兩個(gè)電容 C1、C2的作用使電路快速起振,提高電路的運(yùn)行速度。畑C3-22uF復(fù)位電路3、復(fù)位電路復(fù)位電路由電阻和極性電容組成,如圖 所示,通過高電平使單片機(jī)復(fù)位,在時(shí)鐘 電路開

7、始工作后,當(dāng)高電平的時(shí)間超過大約 2us時(shí),即可實(shí)現(xiàn)復(fù)位。此復(fù)位電路為上電復(fù) 位,較為簡單。若改進(jìn)可以添加手動復(fù)位的功能,上電復(fù)位發(fā)生在開機(jī)加電時(shí),由系統(tǒng)自 動完成,手動復(fù)位通過一個(gè)按鍵來實(shí)現(xiàn),在程序運(yùn)行時(shí),若遇到死機(jī),死循環(huán)或程序“跑 飛”等情況,通過手動復(fù)位就可以實(shí)現(xiàn)重新啟動的操作。手動按鈕復(fù)位需要人為在復(fù)位輸 入端RST上加入高電平。一般采用的辦法是在 RST端和正電源Vcc之間接一個(gè)按鈕和一個(gè) 電阻。4、DS1302時(shí)鐘電路時(shí)鐘電路主要由時(shí)鐘芯片 DS1302備用電池、晶振等幾部分組成,如圖 所示。DS1302采用3線串行接口,占用引腳少,內(nèi)部集成了可編程日歷時(shí)鐘,用戶可以根據(jù)需要 通

8、過單片機(jī)的控制來自行設(shè)置,支持雙電源供電,可以使用外部主電源和備用電源,備份電源能夠使時(shí)鐘芯片繼續(xù)工作VcC2 C28hvcc1XI 2 g 7SCLK3 2 6I/OGND4 Q 5pCE圖(5) DS1302管腳圖X2口017253U2 D13O232766 HzR-1VGC2VCC1I/O SCLK RSTP1.0P1.1P1.2P1.3P1.4P1.5P1.6F1.7圖(6)DS1302時(shí)鐘電路DS1302各引腳的功能為:8: Vcc1 :備用電池端;1: Vcc2 : 5V 電源。當(dāng) Vcc2Vcc1+0.2V 時(shí),由 Vcc2 向 DS1302供電,當(dāng) Vcc2XTAL1PQ.Oj

9、WCRD. AMm磁ro.azAKira.4jTAD4KJ.aMLCro.a/AMRCTro.7Zft&7n.ciMP2.-1W.泅0宀曰FJ.aAHALEF2.123piq/rxeFJ.lZLStP3i-TJK:F3.MJ P-OKWP3.WRDasC- .-39339c: :WE丿33if22Q - C-圖(13) 電子萬年歷硬件電路圖結(jié)論與心得:在這學(xué)期的課程序設(shè)計(jì)中,收獲知識的同時(shí),還收獲了閱歷,收獲了成熟,通過查找大量資料,請教老師,以及不懈的努力,不僅培養(yǎng)了獨(dú)立思考、動手制作的能力,在各種其它能力上也都有了提高。更重要的是,在課程序設(shè)計(jì)里,我們學(xué)會了很多學(xué)習(xí)的方 法,知道了理論和實(shí)

10、踐的巨大差別。而這是以后最實(shí)用的,真的是受益匪淺。要面對社會的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)踐,再學(xué)習(xí)、再實(shí)踐。同時(shí)在與老師和同學(xué)的交流過程中, 互動學(xué)習(xí),將知識融會貫通。通過自己的努力,做出了一個(gè)萬年歷,對以后的學(xué)習(xí)是一個(gè) 莫大的鼓舞,激起了我的學(xué)習(xí)興趣和開發(fā)創(chuàng)新思維。參考文獻(xiàn)圖書類:1張毅坤 陳善久,單片微型計(jì)算機(jī)原理及應(yīng) 用 西安電子科技大學(xué)出版社2張毅剛,彭喜元,單片機(jī)原理與應(yīng)用 設(shè)計(jì)電子工業(yè)出版社3趙建領(lǐng)薛園園,零基礎(chǔ)學(xué)單片機(jī)C 語言程序設(shè)計(jì)機(jī)械工業(yè)出版社4周向紅51單片機(jī)課程設(shè)計(jì)華中科技 大學(xué)出版社,5郭天祥51單片機(jī)C語言教程-入門,提 高,開發(fā),拓展全攻略,電子工業(yè)出版社6趙亮侯國銳

11、.單片機(jī)C語言編程與實(shí) 例人民郵電出版社附實(shí)驗(yàn)源程序:#in elude #i nclude vintrin s.h #include #defi ne uint un sig ned int#defi ne uchar un sig ned charsbit 10= P1A0;/DS1302 數(shù)據(jù)線sbit SCLK = P1A1;sbit RST = PM2;/DS130時(shí)鐘線/DS1302復(fù)位線sbit RS = P2A0; sbit RW = P2A1; sbit EN = P2A2;sbit K1=P3A4;sbit K2=P3A5;sbit K3=P3A6;sbit K4=P3A7

12、;/LCD數(shù)據(jù)/命令選擇端/LCD讀/寫控制/LCD使能端/選擇/加/減/ 確定uchar tCo un t=0;uchar Mo nthsDays=0,31,0,31,30,31,30,31,31,30,31,30,31;uchar *WEEK戶SUN,MON,TUS,WEN,THU,FRI,SAT;uchar LCD_DSY_BUFFER1=DATE 00-00-00 ; / 顯示格式uchar LCD_DSY_BUFFER2=TIME 00:00:00 ;uchar DateTime7; /所讀取的日期時(shí)間char Adjust_I ndex=-1; /當(dāng)前調(diào)節(jié)的時(shí)間對象:,分,是,日,

13、月,年(123,4,6 )uchar Cha nge_Flag= -MHDM-Y; / (分,時(shí),日,月,年)(不調(diào)節(jié)秒與周)/* 延時(shí)程序*/void DelayMS(ui nt ms) uchar i;while(ms-)for(i=0;i120;i+);/ 向 DS1302寫入一字節(jié)/void Write_A_Byte_TO_DS1302(uchar x) uchar i;for(i=0;i=1;/右移/ 從DS1302讀取一字節(jié)/uchar Get_A_Byte_FROM_DS1302() uchar i,b=0x00;for(i=0;i8;i+)b |= _crol_(uchar)I

14、O,i);SCLK=1;SCLK=0;/每一個(gè)高脈沖讀取一位數(shù)據(jù)return b/16*10+b%16; / 返回 BCD碼/ 從DS1302指定位置讀數(shù)據(jù) /uchar Read_Data(uchar addr)uchar dat;RST = 0;SCLK=0;RST=1;RST 高電平時(shí)讀 / 寫Write_A_Byte_TO_DS1302(addr); / 先寫入地址 dat = Get_A_Byte_FROM_DS1302();SCLK=1;RST=0;return dat;/ 向DS1302某地址寫入數(shù)據(jù) /void Write_DS1302(uchar addr,uchar dat

15、) SCLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);Write_A_Byte_TO_DS1302(dat);SCLK=0;RST=0; /高脈沖寫入數(shù)據(jù)/ 設(shè)置時(shí)間/void SET_DS1302() uchar i;/寫控制字,取消寫保護(hù)Write_DS1302(0x8E,0x00);/分時(shí)日月年依次寫入for(i=1;i7;i+) /分的起始地址10000010 (0x82),后面依次是時(shí),日,月,周,年,寫入地址每次遞增2Write_DS1302(0x80+2*i,(DateTimei/104)|(DateTimei%10);Write_DS1302(

16、0x8E,0x80); / 加保護(hù)15 / 25/ 讀取當(dāng)前日期時(shí)間/void GetTime()uchar i;for(i=0;i7;i+) DateTimei=Read_Data(0X81+2*i);/ 讀LCD犬態(tài)/uchar Read_LCD_State() uchar state;RS=0;RW=1;EN=1;/ 輸出:D0D7犬態(tài)字DelayMS(1);state=P0;/ 從 P0 口讀 LCD犬態(tài)EN = 0;DelayMS(1);return state;/ 忙等待/void LCD_Busy_Wait()while(Read_LCD_State ()&0x80)=0x80)

17、;DelayMS(5);/ 向 LCD寫數(shù)據(jù)/void Write_LCD_Data(uchar dat)LCD_Busy_Wait();RS=1;EN=0;RW=0;/寫數(shù)據(jù),EN為高脈沖,16 / 25P0=dat;EN=1;DelayMS(1);EN=0;/ 寫LCD旨令/void Write_LCD_Comma nd(uchar cmd)LCD_Busy_Wait();RS=0;EN=0; RW=0; /寫指令,EN高脈沖,輸出:D0D7數(shù)據(jù)P0=cmd;EN=1;DelayMS(1);EN=0;/LCD 初始化-void In it_LCD()Wite_LCD_Comma nd(0x

18、38); /DelayMS(1);Write_LCD_Comma nd(0x01); /DelayMS(1);Write_LCD_Comma nd(0x06); /DelayMS(1);Write_LCD_Comma nd(0x0c); /DelayMS(1);/設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口顯示清零,數(shù)據(jù)指針清零寫一個(gè)字符后地址指針自動加1設(shè)置開顯示,不顯示光標(biāo)/設(shè)置液晶顯示位置/ void Set_LCD_POS(uchar p)Write_LCD_Command(p|0x80);相當(dāng)于在0x80基礎(chǔ)上加入位置量/-在LCD上顯示字符串/void Display_LCD_Str

19、i ng(uchar p,uchar *s) uchar i;Set_LCD_POS(p);for(i=0;i16;i+)Write_LCD_Data(si); /在固定位置顯示時(shí)間日期DelayMS(1);/ 日期與時(shí)間值轉(zhuǎn)換為數(shù)字字符/void Format_DateTime(uchar d,uchar *a)a0=d/10+0;a1=d%10+0;/判斷是否為閏年uchar isLeapYear( uint y) r eturn (y%4=0&y%100!=0)|(y%400=0);/求自2000.1.1開始的任何一天是星期幾/函數(shù)沒有通過,求出總天數(shù)后再求星期幾/因?yàn)榍罂偺鞌?shù)可能會超出

20、uint的范圍void RefreshWeekDay() uint i,d,w=5; / 已知 1999.12.31 是周五for(i=2000;i2000+DateTime6;i+) d=isLe apYear(i)?366:365; w=(w+d)%7;d=0;for(i=1;iDateTime4;i+) d+=Mo nthsDaysi; d+=DateTime3;,六,為了與DS1302的星期/保存星期,06表示星期日,星期一,二, 格式匹配,返回值需要加1DateTime5=(w+d)%7+1;年月 日時(shí)分+/*/void DateTime_Adjust(char x) switch(

21、Adjust_l ndex)case 6:/ 年 00-99if(x=1 &DateTime60) DateTime6-;/獲取2月天數(shù)Mon thsDays2=isLeapYear(2000+DateTime6)?29:28;/如果年份變化后當(dāng)前月份的天數(shù)大于上限則設(shè)為上限if(DateTime3 Mon thsDaysDateTime4)DateTime3=M on thsDaysDateTime4;RefreshWeekDay(); /刷新星期19 / 25break;case 4:/ 月 01-12if(x=1 &DateTime41) DateTime4-;Mon thsDays2=

22、isLeapYear(2000+DateTime6)?29:28;if(DateTime3 Mon thsDaysDateTime4)DateTime3=M on thsDaysDateTime4;RefreshWeekDay();break;case 3:/日00-28、29、30、31,調(diào)節(jié)之前首先根據(jù)年份得出該年中斷二月天數(shù)Mon thsDays2=isLeapYear(2000+DateTime6)?29:28;/根據(jù)當(dāng)前月份決定調(diào)節(jié)日期的上限if(x=1 &DateTime30) DateTime3-;RefreshWeekDay();break;case 2:/ 時(shí)if(x=1 &

23、DateTime20) DateTime2-;break;case 1:/ 分if(x=1 &DateTime10) DateTime1-;break;/- 定時(shí)器0每秒刷新LCD顯示-/void T0_INT() in terrupt 1TH0=-50000/256;TL0=-50000%256;if(+tCo unt !=2)return;tCou nt=0;/按指定格式生成待顯示的日期時(shí)間串Format_DateTime(DateTime 6, LCD_DSY_BUFFER1+5);Format_DateTime(DateTime4, LCD_DSY_BUFFER1+8);Format_

24、DateTime(DateTime3 ,L CD_DSY_BUFFER1+11); /星期 strcpy(LCD_DSY_BUFFER1+13,WEEKDateTime5-1);/時(shí)分秒Format_DateTime(DateTime2 , LCD_DSY_BUFFER2+5);Format_DateTime(DateTime1, LCD_DSY_BUFFER2+8);Format_DateTime(DateTime0 ,L CD_DSY_BUFFER2+11);/顯示年月日,星期,時(shí)分秒Display_LCD_Stri ng(0x0 0, LCD_DSY_BUFFER1);Display_LCD_Stri ng(0x40,LCD_DSY_BUFFER2);/ 鍵盤中斷(INT0)/void EX_INT0() in terru

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論