基于μPD78F0485單片機實驗板的實時時鐘程序設計與實現(xiàn)_第1頁
基于μPD78F0485單片機實驗板的實時時鐘程序設計與實現(xiàn)_第2頁
基于μPD78F0485單片機實驗板的實時時鐘程序設計與實現(xiàn)_第3頁
基于μPD78F0485單片機實驗板的實時時鐘程序設計與實現(xiàn)_第4頁
基于μPD78F0485單片機實驗板的實時時鐘程序設計與實現(xiàn)_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、基于PD78F0485單片機實驗板的實時時鐘程序設計與實現(xiàn) 專業(yè): 計算機科學與技術 班級: 11級 學號: 姓名: 基于PD78F0485單片機實驗板的實時時鐘程序設計與實現(xiàn)1實驗環(huán)境 硬件:PC、µPD78F0485單片機。 軟件:Windows7 操作系統(tǒng)、開發(fā)環(huán)境支持軟件NEC Electronics Microcomputer、 Microsoft Visio 繪圖2功能描述 a)液晶屏可切換顯示日期和時間。 b)具有日期和時間校對功能。 c)用LED1LED12模擬秒針走動。 d)有鬧鐘功能。3總體設計 3.1顯示設計 a)在LCD上顯示年月日,分別用兩位數(shù)表示年月日。年

2、的值從0099;月的值從 0112;日的值如果是2月,閏年為0129,平年為0128,其他月份大月為0131, 小月為0130。圖 3.1.1 年月日的顯示 b)在LCD上顯示星期時分,分別用兩位數(shù)表示星期時分。星期的值從0006,其中 00表示星期天,其它的則一一對應;時采用24小時制,其值從0023;分的值從 0059。圖 3.1.2 星期時分的顯示 c)在LCD上顯示時分秒。時采用24小時制,其值從0023;分的值從0059;秒的 值從0059。圖 3.1.3 時分秒的顯示 3.2時間顯示切換設計 設置一個全局變量i,初值為0。每按一下KEY1,i的值加一。當i = 0,1,2,3時,L

3、CD顯示年月日。當i = 4,5,6時,LCD顯示星期時分。當i = 7時,LCD顯示時分秒。當i >7時,i自動變?yōu)?。 3.3日期和時間校對設計 通過前面設置的全局變量i和KEY3來實現(xiàn)。當i = 1時,每按一下KEY3,年的值就加一,直到大于99時自動變?yōu)?0。當i = 2時,每按一下KEY3,月的值就加一,直到大于12時自動變?yōu)?1。當i = 3時,每按一下KEY3,日的值就加一,直到大于當月天數(shù)時自動變?yōu)?1。當i = 4時,每按一下KEY3,星期的值就加一,直到大于06時自動變?yōu)?0。當i = 5時,每按一下KEY3,時的值就加一,直到大于23時自動變?yōu)?0。當i = 6時,

4、每按一下KEY3,分的值就加一,直到大于59時自動變?yōu)?0。 3.4鬧鐘顯示設計當按下KEY2時,LCD顯示鬧鐘設定的時間。圖 3.4 鬧鐘的顯示 3.5鬧鐘調(diào)整設計 當按下KEY5時,鬧鐘的時就加一,到23時就歸零。當按下KEY6時,鬧鐘的分就加一,到59時就歸零。 3.6鬧鐘開關設計 通過KEY4控制鬧鐘的開關,并用LED燈的亮滅來顯示。將LED燈端口的輸出信號 作為鬧鐘是否響鈴的一個判斷條件。按下KEY4,LED燈的輸出信號取反,輸出信號為 1時燈亮并且鬧鐘打開,為0時燈滅并且鬧鐘關閉。 3.7鬧鐘響鈴設計 當鬧鐘設定的時分與時鐘的時分相等并且鬧鐘處于打開狀態(tài)時,蜂鳴器就會發(fā)出響聲。 3

5、.8用LED1LED12模擬秒針走動設計 將端口13、14、15設置為輸出模式,設置1個全局變量s,初值為-1。當1秒中斷來到時s的值加一模12。根據(jù)s的值亮相應的燈,并且滅上一個燈。實現(xiàn)一秒亮一個燈。4功能模塊設計 4.1主模塊圖 4.1 主模塊流程圖 當按鍵按下時,會改變KEY的值。當KEY1按下時,KEY的值就等于1,以此類推。主模塊是一個無限循環(huán),當KEY改變時,它就會轉(zhuǎn)到相應的分支,執(zhí)行相應的的功能。從而響應用戶的操作。如KEY2被按下,則主模塊就會轉(zhuǎn)到分支2,然后調(diào)用鬧鐘顯示函數(shù),顯示鬧鐘的當前設置值。 4.2 初始化模塊 選定cpu的時鐘為5.0Hz。將所有接LCD的引腳指定為L

6、CD引腳,確定LCD的顯示頻率,打開LCD顯示。將P4的六個端口設置為輸出模式,接通上拉電阻,并且允許六個按鍵中斷。將P13、14、15的所有端口設置為輸出模式。將P3.3和P3.4端口設置為輸出。選擇8MHz內(nèi)部高速時鐘作為主系統(tǒng)時鐘,實時計數(shù)器時鐘=fprs/28=32.768KHz。將周期性定時中斷打開,設置為24小時制,1秒定時中斷。將年的初值設置為13,月初值為01,日初值為01,星期初值為00,時初值為12,分初值為00。 4.3 實時時鐘模塊 利用實時計數(shù)器來實現(xiàn)實時時鐘模塊。實時計數(shù)器的秒計數(shù)寄存器、分計數(shù)寄存器、時計數(shù)寄存器、日計數(shù)寄存器、周計數(shù)寄存器、月計數(shù)寄存器、年計數(shù)寄

7、存器在開啟計數(shù)模式后會自動計數(shù)。然后只要在一秒中斷到來時,將寄存器中的值讀入對應變量中,送到顯示刷新模塊刷新后顯示就能實現(xiàn)實時時鐘了。 4.4 鬧鐘設置模塊 圖 4.4 鬧鐘設置模塊流程圖 利用變量hour1和minute1來實現(xiàn)鬧鐘功能。當KEY5或KEY6被按下就會分別調(diào)用鬧鐘的調(diào)時、調(diào)分模塊來設置鬧鐘的時間。Hour1的值大于23時歸零,minute1的值大于59時歸零。 4.5 INTRTC中斷處理模塊 在一秒中斷到來時,將實時計數(shù)器的秒計數(shù)寄存器、分計數(shù)寄存器、時計數(shù)寄存器、日計數(shù)寄存器、周計數(shù)寄存器、月計數(shù)寄存器、年計數(shù)寄存器中的值從BCD碼轉(zhuǎn)換為十進制送入到相對應的變量中,等待顯

8、示刷新模塊調(diào)用。 4.6 顯示刷新模塊 主模塊在循環(huán)中會不停的調(diào)用此模塊,將實時時鐘的最新值轉(zhuǎn)換為LCD的顯示碼,并送入到顯示的緩存中,等待顯示模塊調(diào)用。 4.7 時鐘調(diào)時模塊圖 4.7 時鐘調(diào)時模塊流程圖 此模塊根據(jù)全局變量i的值,當KEY3被按下時,分別對實時時鐘的年、月、日、星期、時、分、秒進行調(diào)整,達到調(diào)時目的。當各個寄存器的值達到所對應的最大值時,根據(jù)各自的性質(zhì)歸零或歸一。 4.8 按鍵中斷模塊 根據(jù)被按下的鍵,將KEY設置成對應的值。KEY1對應的值為1,以此類推。 4.9 鬧鐘響鈴模塊 圖 4.9 鬧鐘響鈴模塊流程圖 當鬧鐘設置的時、分與實時時鐘的時分相等并且P3.4端口的輸出值

9、為1即LED燈亮時,打開蜂鳴器的輸出。蜂鳴器就會發(fā)出聲音提醒鬧鐘時間到了。 4.10 顯示模塊圖 4.10 顯示模塊流程圖 此模塊根據(jù)全局變量i的值,將對應的顯示緩存區(qū)中的內(nèi)容依次顯示。 4.11 流水燈模塊 當一秒中斷來到時,根據(jù)變量s的值,LED亮起對應的燈,并關閉上一個燈,s 的值加一模十二。5 操作說明 按下KEY1鍵,改變LCD的顯示內(nèi)容。按四下KEY1鍵顯示從年月日變?yōu)樾瞧跁r分再按三下KEY1鍵顯示又變?yōu)闀r分秒。 按下KEY3鍵,進行調(diào)時。當按了一下KEY1鍵再按KEY3鍵時,對年進行調(diào)整;當按了兩下KEY1鍵再按KEY3鍵時,對月進行調(diào)整;當按了三下KEY1鍵再按KEY3鍵時,對

10、日進行調(diào)整;當按了四下KEY1鍵再按KEY3鍵時,對星期進行調(diào)整;當按了五下KEY1鍵再按KEY3鍵時,對時進行調(diào)整;當按了六下KEY1鍵再按KEY3鍵時,對分進行調(diào)整。 按下KEY2鍵,顯示鬧鐘的設定時間。再按下KEY5鍵,對鬧鐘的設定時間進行時調(diào)整;再按下KEY6鍵,對鬧鐘的設定時間進行分調(diào)整。 按下KEY4鍵,將P3.4 LED燈打開,并開啟鬧鐘功能。再按一下關閉P3.4 LED燈,并關閉鬧鐘功能。 LED1LED12每一秒依次亮一個燈。6 總結(jié) 經(jīng)過幾周的單片機課程設計,已基本完成課題要求。功能上基本達標:時鐘的顯示,調(diào)時功能。時鐘顯示功能,精確度完全可以滿足日常生活顯示時間的需要;調(diào)

11、時功能,方便快捷。 本次設計是結(jié)合書本樣例和老師給的樣例,獨立設計完成。   另外,在本次設計的過程中,我發(fā)現(xiàn)很多的問題,雖然以前沒有做過這樣的設計但通過這次設計我學會了很多東西,單片機課程設計重點就在于軟件算法的設計,需要有很巧妙的程序算法,雖然以前寫過幾次程序,但我覺的寫好一個程序并不是一件簡單的事,比如寫一個程序看其功能很少認為編寫程序簡單,但到編的時候才發(fā)現(xiàn)一些細微的知識或低級錯誤經(jīng)常犯做不到最后常常失敗,所以有些東西只有學精弄懂并且要細心才行,只學習理論有些東西是很難理解的,更談不上掌握。   從這次的課程設計中,我真真正正的意識到,在以后的學

12、習中,要理論聯(lián)系實際,把我們所學的理論知識用到實際當中,學習單機片機更是如此,程序只有在經(jīng)常的練習的過程中才能提高,我想這就是我在這次課程設計中的最大收獲。附錄 程序清單:#pragma sfr /使用特殊功能寄存器#pragma access /使用絕對地址指令#pragma EI /使用開中斷關中斷功能#pragma DI#pragma interrupt INTKR inter RB1 /定義按鍵中斷#pragma interrupt INTRTC RTC_INTRTC /定義周期性定時中斷char SEC_Num; /定義一個秒單元char MIN_Num; /定義一個分單元char

13、HOUR_Num; /定義一個時單元char DAY_Num; /定義一個日單元char WEEK_Num; /定義一個周單元char MONTH_Num;/定義一個月單元char YEAR_Num; /定義一個年單元unsigned char hour1 = 0; /初始化鬧鐘時單元=0unsigned char minute1 = 0;/初始化鬧鐘分單元=0unsigned int numbercode10 = 0x070d , 0x0600 , 0x030e , 0x070a , 0x0603 , 0x050b , 0x050f , 0x0700 , 0x070f , 0x070b ;/

14、數(shù)字“0”-“9”的顯示碼unsigned char i=0;/顯示轉(zhuǎn)換標志,i=0,1,2,3時顯示年月日;i=4,5,6時顯示星期時分;i=7時顯示時分秒unsigned char KEY=0; /定義全局變量keyunsigned int s=-1; /定義全局變量sunsigned int buffy_m_d6; /年月日的數(shù)碼顯示緩存區(qū)unsigned int buffw_h_m6; /星期時分的數(shù)碼顯示緩存區(qū)unsigned int buffh_m_s6; /時分秒的數(shù)碼顯示緩存區(qū)unsigned int buffhm16; /鬧鐘的數(shù)碼顯示緩存區(qū)void delay(); /延時

15、函數(shù)unsigned int BCDtoDec( char bcd) /BCD碼轉(zhuǎn)換十進制函數(shù)char DectoBCD(int Dec) /十進制轉(zhuǎn)換BCD碼函數(shù)unsigned int m_days(unsigned int mmonth) /計算當月天數(shù)函數(shù)void inter() /按鍵中斷處理函數(shù)void RTC_INTRTC() /INTRTC中斷處理函數(shù)void noise() /鬧鐘響鈴函數(shù)void freshdisplaybuffer() /顯示緩存區(qū)刷新函數(shù)void d_c_inter() /切換時間函數(shù)void play6bit() /顯示函數(shù)void set_hour(

16、) /鬧鐘使顯示函數(shù)void set_minute() /鬧鐘分顯示函數(shù)void set_inter() /調(diào)整時間函數(shù)void hour_inter() /鬧鐘調(diào)時函數(shù)void minute_inter() /鬧鐘調(diào)分函數(shù)/-延時函數(shù)void delay()int i;for(i=0;i<=100;i+);/-將BCD碼轉(zhuǎn)換成十進制的函數(shù)unsigned int BCDtoDec( char bcd) unsigned int i, tmp; tmp = (bcd>>4)&0x0F)*10 + (bcd&0x0F); return tmp;/-將十進制轉(zhuǎn)換成

17、BCD碼的函數(shù)char DectoBCD(int Dec) char Bcd; Bcd = (Dec/10)<<4) + (Dec%10) & 0x0F); return Bcd;/-計算當前月中天數(shù)的函數(shù)unsigned int m_days(unsigned int mmonth)unsigned int days;if(mmonth=4)|(mmonth=6)|(mmonth=9)|(mmonth=11)days=30;else if (mmonth=2)if(BCDtoDec(YEAR)%4=0) /判斷是否是閏年days=29;elsedays=28;else d

18、ays=31;return(days);/-按鍵中斷處理函數(shù)void inter()DI(); switch(P4 & 0x3F) case 0x3e:KEY=1;break; case 0x3d:KEY=2;break; case 0x3b:KEY=3;break; case 0x37:KEY=4;break; case 0x2f:KEY=5;break; case 0x1f:KEY=6;break; default: break; EI();/-INTRTC中斷處理函數(shù)void RTC_INTRTC()RWAIT = 1; /RWAIT標志置1,讀取實時時鐘數(shù)據(jù)while(RWST

19、=0); /檢測是否處于讀、寫模式,RWST=1表示處于讀寫模式SEC_Num =BCDtoDec(SEC); /將秒鐘數(shù)轉(zhuǎn)換為十進制讀取到SEC_Num中MIN_Num =BCDtoDec(MIN); /將分鐘數(shù)轉(zhuǎn)換為十進制讀取到MIN_Num中HOUR_Num =BCDtoDec(HOUR); /將小時數(shù)轉(zhuǎn)換為十進制讀取到HOUR_Num中DAY_Num =BCDtoDec(DAY); /將日計數(shù)轉(zhuǎn)換為十進制讀取到HOUR_Num中 WEEK_Num =BCDtoDec(WEEK); /將周計數(shù)轉(zhuǎn)換為十進制讀取到WEEK_Num中MONTH_Num =BCDtoDec(MONTH); /將

20、月計數(shù)轉(zhuǎn)換為十進制讀取到MONTH_Num中YEAR_Num =BCDtoDec(YEAR); /將年計數(shù)轉(zhuǎn)換為十進制讀取到Y(jié)EAR_Num中RWAIT = 0;while(RWST=1); /檢測是否處于計數(shù)模式,RWST=0表示處于計數(shù)模式 s=(s+1)%12; /流水燈處理,每一秒換一個燈顯示switch(s) case 0: P15.3=0;P13.0=1; break; case 1: P13.0=0;P13.1=1; break; case 2: P13.1=0;P13.2=1; break; case 3: P13.2=0;P13.3=1; break; case 4: P13

21、.3=0;P14.0=1; break; case 5: P14.0=0;P14.1=1; break; case 6: P14.1=0;P14.2=1; break; case 7: P14.2=0;P14.3=1; break; case 8: P14.3=0;P15.0=1; break; case 9: P15.0=0;P15.1=1; break; case 10: P15.1=0;P15.2=1; break; case 11: P15.2=0;P15.3=1; break; default:break; /-鬧鐘響鈴函數(shù)void noise()if(hour1=HOUR_Num&

22、amp;&minute1=MIN_Num&&P3.4=1)CKS=0X80;delay();BZOE=0;/-顯示緩存區(qū)刷新函數(shù)void freshdisplaybuffer() buffy_m_d5=numbercodeYEAR_Num/10; /年月日顯示刷新 buffy_m_d4=numbercodeYEAR_Num%10; buffy_m_d4|=0x0800; buffy_m_d3=numbercodeMONTH_Num/10; buffy_m_d2=numbercodeMONTH_Num%10; buffy_m_d2|=0x0800; buffy_m_d1=

23、numbercodeDAY_Num/10; buffy_m_d0=numbercodeDAY_Num%10; buffw_h_m5=numbercodeWEEK_Num/10; /星期時分顯示刷新 buffw_h_m4=numbercodeWEEK_Num%10; buffw_h_m4|=0x0800; buffw_h_m3=numbercodeHOUR_Num/10; buffw_h_m2=numbercodeHOUR_Num%10; buffw_h_m2|=0x0800; buffw_h_m1=numbercodeMIN_Num/10; buffw_h_m0=numbercodeMIN_N

24、um%10; buffh_m_s5=numbercodeHOUR_Num/10; /時分秒顯示刷新 buffh_m_s4=numbercodeHOUR_Num%10; buffh_m_s4|=0x0800; buffh_m_s3=numbercodeMIN_Num/10; buffh_m_s2=numbercodeMIN_Num%10; buffh_m_s2|=0x0800; buffh_m_s1=numbercodeSEC_Num/10; buffh_m_s0=numbercodeSEC_Num%10;/-切換時間函數(shù)void d_c_inter()DI();if(i<7)i+;els

25、ei=0; EI();/-顯示函數(shù)void play6bit()unsigned int dp=0;unsigned int b6;unsigned int LCD_addr;LCD_addr=0xFA4A;while (dp<6)switch(i) case 0: case 1: case 2: case 3:bdp = buffy_m_d dp;break;/i=0,1,2,3時顯示年月日 case 4: case 5: case 6:bdp = buffw_h_m dp;break;/i=4,5,6時顯示星期時分 case 7:bdp = buffh_m_s dp;break;/i

26、=7使顯示時分秒pokew(LCD_addr,bdp);delay();pokew(LCD_addr,0x0000);LCD_addr = LCD_addr-2;dp+;/-鬧鐘時顯示函數(shù)void set_hour()unsigned int dp=4;unsigned int a6;unsigned int LCD_addr;LCD_addr=0xFA42;buffhm15=numbercodehour1/10; buffhm14=numbercodehour1%10;buffhm14|=0x0800;while (dp<6)adp=buffhm1dp;pokew(LCD_addr,a

27、dp);delay();pokew(LCD_addr,0x0000);LCD_addr=LCD_addr-2;dp+;/-鬧鐘分顯示函數(shù)void set_minute()unsigned int dp=0;unsigned int b6;unsigned int LCD_addr;LCD_addr=0xFA4A;buffhm13=numbercodeminute1/10;buffhm12=numbercodeminute1%10;buffhm11=0;buffhm10=0;while (dp<4)bdp=buffhm1dp;pokew(LCD_addr,bdp);delay();poke

28、w(LCD_addr,0x0000);LCD_addr=LCD_addr-2;dp+;/-調(diào)整時間函數(shù)void set_inter()DI();RTCE=0;switch(i)case 1: if(YEAR_Num<99) YEAR = DectoBCD(YEAR_Num+1); else YEAR = 0; break;case 2: if(MONTH_Num<12) MONTH = DectoBCD(MONTH_Num+1); else MONTH = 1; break;case 3: int temp =m_days(BCDtoDec(MONTH); /計算當月天數(shù) if(D

29、AY_Num >= temp) DAY =1; else DAY = DectoBCD(DAY_Num+1); break;case 4: if(WEEK_Num<6) WEEK =DectoBCD(WEEK_Num+1); else WEEK = 0; break;case 5: if(HOUR_Num<23) HOUR = DectoBCD(HOUR_Num+1); else HOUR =0; break;case 6: if(MIN_Num<59) MIN = DectoBCD(MIN_Num+1); else MIN = 0; break; default :

30、break; RTCE=1;EI();/-鬧鐘調(diào)時函數(shù)void hour_inter()if(hour1<23) hour1+;else hour1=0;/-鬧鐘調(diào)分函數(shù)void minute_inter()if(minute1<59) minute1+;else minute1=0;/-主函數(shù)void main() PCC=0x00; /CPU的時鐘選擇(5.0Hz) PFALL=0x0F; /所有接LCD引腳指定為LCD引腳LCDC0=0x45; /確定LCD顯示頻率LCDMD=0x10; /LCD電源設置為1/5VDDLCDM=0xC0; /LCD顯示開PM4=0x3F; /P4的六個端口設置為輸入模式PU4=0x3F; /接通上拉電阻KRM=0x3F; /允許六個按鍵中斷KRMK=0;P3.4=0; /LED燈初始化為熄滅狀態(tài)PM3.4=0; /P3.3和P3.4端口設置為輸出模式P3.3=0;PM3.3=0; PM13=0xf0; /端口13,14,15

溫馨提示

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

評論

0/150

提交評論