![實時時鐘設計實驗報告_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/30/0d60e8fb-2edb-4f5a-8325-ca80c8e2a502/0d60e8fb-2edb-4f5a-8325-ca80c8e2a5021.gif)
![實時時鐘設計實驗報告_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/30/0d60e8fb-2edb-4f5a-8325-ca80c8e2a502/0d60e8fb-2edb-4f5a-8325-ca80c8e2a5022.gif)
![實時時鐘設計實驗報告_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/30/0d60e8fb-2edb-4f5a-8325-ca80c8e2a502/0d60e8fb-2edb-4f5a-8325-ca80c8e2a5023.gif)
![實時時鐘設計實驗報告_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/30/0d60e8fb-2edb-4f5a-8325-ca80c8e2a502/0d60e8fb-2edb-4f5a-8325-ca80c8e2a5024.gif)
![實時時鐘設計實驗報告_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/30/0d60e8fb-2edb-4f5a-8325-ca80c8e2a502/0d60e8fb-2edb-4f5a-8325-ca80c8e2a5025.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗報告姓 名學 號專業(yè)班級課程名稱實驗日期成 績實驗名稱實時時鐘設計一、 實驗環(huán)境1) µPD78F0485單片機:接受來自PC的程序,并通過實驗盒中的LCD顯示屏、蜂鳴器、LED燈等部件顯示出來。2 Notepad+:編寫修改源程序;3) 軟件NEC Electronics Microcomputer:運行所編寫的源程序;二、實驗內容1、電路原理PD78F0485單片機外圍硬件端口P13到端口P15都是具有輸出鎖存功能的4位I/O端口。實驗中選擇這三個端口分別控制12個LED燈的亮滅。端口4是具有輸出鎖存功能的8位I/O端口,有P40到P47共8個I/O引腳。選擇P40到P45共
2、6個端口與6個按鈕連接,當對按鍵模式寄存器KRM進行有效設置,并且在P40/KR0到P47/KR7引腳上輸入一個下降沿信號時,就會產生一個按鍵返回中斷信號INTER。P34引腳連接一個led燈,P33引腳連接一個蜂鳴器。LCD驅動方式為4分時1/3偏壓,驅動電壓為3V,通過COM0COM3,SEG0-SEG19引腳連接1個LCD顯示屏2、實驗步驟(1)、設計時鐘功能對應到每個按鍵并設計各個時鐘函數如顯示年月日函數Display_Date()。(2)、 打開PM+ V6.31軟件,新建一個工作空間( SS )。 (3)、在PM plus環(huán)境下在“File”選項下選擇“New”,在彈出的窗口中編寫
3、源程序。(4)、編譯源程序并調試成功。 (5)、設置PM plus環(huán)境并且安裝µPD78F0485單片機。 (6)、運行結果并改進。3、實驗結果單片機通電后運行啟動Show_Time()函數和分秒計數函數。Led小燈從P13.1開始每五秒順時針一個一個亮。Key1按鍵后顯示年月日,key2按下后顯示時分秒,按下key3鍵則可以在年,月,日,時,分,鬧鐘時,鬧鐘分之間進行切換。按下key4鍵則可以進行加1調整。按下key5鍵則可以進行減1調整。按下key6鍵則確定,小燈滅。按下INT鍵則鬧鐘結束。4、操作說明1.無按鍵Lcd顯示屏中間顯示程序默認分秒00.00,并且時間運行。P13.1
4、燈亮,其它燈按照5秒順時針一次亮。2.按下Key1Lcd顯示屏顯示程序默認日期2014.05.12。Led燈按照5秒順時針一個一個亮。3.按下Key2Lcd顯示屏顯示程序時間,并且時間運行。Led燈按照5秒順時針一個一個亮。4.按下Key3每按一下按鍵,Lcd顯示屏中間循環(huán)顯示年,月,日,時,分,鬧鐘時,鬧鐘分。Led燈按照5秒順時針一個一個亮。5.按下Key4Key3執(zhí)行時,該按鍵執(zhí)行加一操作,Led燈按照5秒順時針一個一個亮。6.按下Key5Key3執(zhí)行時,該按鍵執(zhí)行減一操作,Led燈按照5秒順時針一個一個亮。7.按下Key6Key3執(zhí)行時,該按鍵執(zhí)行確定操作,Led燈按照5秒順時針一個一
5、個亮。 8.按下INT鬧鐘關閉。5、實驗總結本次實驗是對課本上“電子日歷鐘設計”的加深。通過本次試驗我對led和lcd顯示有了更加熟悉的認識,能熟練應用它們的功能。同時我對時鐘計數器也有了一定的認識,可以使用定時中斷實現實時時鐘,更重要的是我的實踐能力有很大的提高。程序設計中遇到的問題 (1)、問題:初始完成程序后秒針走的時間很快,不是精確的一秒走一次。 原因:單片機只能用主系統(tǒng)時間,修改fprs后可以真確顯示。(2)、問題:時間切換函數與顯示函數和設計的不一樣,如只需要顯示時,卻多顯示分。 原因:在仔細看代碼后發(fā)現每次按鍵中斷都在調用time1()函數,而second+在里面,所以每次都會加
6、快秒的運行。把second+移到外面放入time()函數后這個問題就解決了。 (3)、問題:運行時發(fā)現按鍵中斷總會加快秒的運行,不是很精確。 原因:最后設置了一個虛擬的key7,當執(zhí)行完時間指向case7,然后調用Freshddisplaybuffer();函數,這樣就很好的解決了這個問題。在程序調試過程中,設置斷點并且在斷點處增加一個LED燈,通過判斷燈是否亮可以判斷程序是否執(zhí)行到該位置,對程序調試有很大的幫助。附件:程序流程圖:主程序流程圖開始關中斷DI()初始化蜂鳴器并關閉蜂鳴器BZOE = 0;開中斷EI();Time1()Freshddisplaybuffer();Display_D
7、ate();noise();d_c_inter()Freshddisplaybuffer();Set_D_T();noise();key=7;結束N1YWhile(1)?Key?UpNum();Freshddisplaybuffer();Set_D_T();noise();key=7;Time1();Freshddisplaybuffer();Set_D_T();noise();key = 0;noise();DownNum();Freshddisplaybuffer();Set_D_T();noise();key=7;FreshddisplaybufferTime1();Show_Time(
8、);Show_Time();023456初始化Lcd和Led; Init_Lcd(),Init_Led();初始化按鍵中斷 InitKey_INTKR();關中斷EI()初始化INT 按鍵 Init_Inter();Time1(); noise();按鍵中斷程序入口關中斷DI()key=2key=30x3D(P4 & 0x3F)?key=4breakkey=6key=5key=10x3E0x3B0x370x2F0x1F開中斷EI()退出中斷INT中斷入口關中斷DI()Que = 0;BZOE = 0;開中斷EI()退出中斷按鍵中斷流程圖INT中斷流程圖源代碼:#pragma sfr /
9、使用特殊功能寄存器#pragma EI /開中斷#pragma DI /關中斷#pragma access /使用絕對地址指令#pragma interrupt INTTM000 Time /定義時間中斷函數為Time#pragma interrupt INTKR OnKeyPress /定義按鍵中斷為OnKeyPress #pragma interrupt INTP5 OnKeyOver /定義INT中斷為OnKeyOvervoid Init_Led();void InitKey_INTKR();void Init_Lcd();void Init_Inter();void LightOneL
10、ed(unsigned char ucNum);void LightOff();int Count_Day(int month);char i=0; /定義變量i,是切換時間的標志int key=0; /定義key=0int temp=1;/用于存放當前月的天數int temp1=1;int second=0;/默認的秒second=0int minute=0;/默認的分minute=0int hour=12;/默認的時hour=12int day=1;/默認的天day=1int month=5;/默認的月month=5int year=2014;/默認的年year=2014int c_hou
11、r=1;/默認的鬧鐘時=1int c_minute=1;/默認的鬧鐘分=1int buffs2;/秒的數碼顯示緩存區(qū)int buffm2;/分的數碼顯示緩存區(qū)int buffh2;/時的數碼顯示緩存區(qū)int buffday2;/天的數碼顯示緩存區(qū)int buffmonth2;/月的數碼顯示緩存區(qū)int buffyear4;/年的數碼顯示緩存區(qū)int buffmd4;/月,天的數碼顯示緩存區(qū)int buffhm4;/時,分的數碼顯示緩存區(qū)int buffms4;/分,秒的數碼顯示緩存區(qū)int buffch2;/鬧鐘時的數碼顯示緩存區(qū)int buffcm2;/鬧鐘分的數碼顯示緩存區(qū)unsigned
12、 char Que = 0; /INT中斷中間變量int LCD_num10=0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b;/數字09的顯示碼unsigned char Scond;/延時函數1/void Delay(int k)int i,j;for(i=0;i<k;i+) for(j=0;j<k;j+) /初始化Led函數/void Init_Led()PM13=0XF0; /端口13的第四位為輸出模式PM14=0XF0; /端口14的第四位為輸出模式PM15=0XF0; /端口15的
13、第四位為輸出模式/按鍵中斷函數/void InitKey_INTKR() PM4 = 0x3F; /P4的六個端口設置為輸入模式 PU4 = 0x3F; /接通上拉電阻 KRM = 0x3F; /允許六個按鍵中斷 KRMK = 0; PM3.0 = 1; PU3.0 = 1; EGP.5 = 1; PMK5 = 0; PPR5 = 0; KRPR = 1;/ 初始化lcd函數/void Init_Lcd()PFALL=0x0F; /所有接lcd引腳指定為lcd引腳LCDC0=0x34; /設置原時鐘和時鐘頻率LCDMD=0x30; /設置lcd電壓為3/5電壓LCDM=0xC0; /4分時1/
14、3偏壓模式 /初始化定時器Inter函數/void Init_Inter()CRC00.0=0; /CR000為比較寄存器PRM00=0X04; /計數時鐘為fprs/28CR000=0X7FFF;/時間間隔為1sTMMK010=1; /TMMK010中斷屏蔽TMMK000=0; /TMMK000中斷允許TMC00=0X0C; /TM00和CR000相等時進入清零&啟動模式 void Time()second+;/按鍵中斷函數/void OnKeyPress()DI();switch(P4&0x3F) /判斷哪個按鍵按下case 0x3e:key=1; /按鍵key1按下bre
15、ak; case 0x3d:key=2; /按鍵key2按下break; case 0x3b:key=3; /按鍵key3按下break;case 0x37:key=4; /按鍵key4按下break;case 0x2f:key=5; /按鍵key5按下break;case 0x1f:key=7; /按鍵key6按下break;default:break;EI();/INT按鍵中斷函數/void OnKeyOver()DI();Que = 0; /判斷Que是否為0BZOE = 0; /蜂鳴器關閉EI();/Led小燈函數/void LightOneLed(unsigned char ucNu
16、m)switch(ucNum) /檢測變量ucNumcase 0:case 1:case 2:case 3:P13 |= (unsigned char) 1 << (ucNum); /如果為0到3中的一個值則讓LED1到LED4中的一個亮 break;case 4:case 5:case 6:case 7:P14 |= (unsigned char) 1 << (ucNum - 4); /如果為4到7中的一個值則讓LED5到LED8中的一個亮break;case 8:case 9:case 10:case 11:P15 |= (unsigned char) 1 <
17、< (ucNum - 8); /如果為8到11中的一個值則讓LED9到LED12中的一個亮break;default:break;/Led小燈熄滅函數/void LightOff()P13 = 0;P14 = 0;P15 = 0;/時間函數/void Time1()if(second % 5) = 0) /秒大于5變?yōu)?Scond = second / 5 + 1; LightOff(); /調用小燈亮函數LightOneLed(Scond % 12);if(second>=60)minute+; /秒大于60時分加1second=0;if(minute>=60)minute
18、=0;hour+; /分大于60時時加1if(hour>=24)hour=0;day+; /時大于24時天加1temp=Count_Day(month);if(day>=temp)day=1;month+; /天大于當前月份的天數時月加1if(month>=13)month=1; year+; /月大于12時年加1/計算當前月的天數/int Count_Day(int month)int day;if(month=4)|(month=6)|(month=9)|(month=11)/4,6,9,11月為30天day=30;else if(month=2)if(year%4=0&
19、amp;&year%100=0)|(year%400=0)day=29; /閏年2月29天elseday=28; /平年2月28天elseday=31; /1,3,5,7,8,10,12月為31天return (day);/倒計時函數./void Show_Time()pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0XFA48,buffs1); /在lcd右邊顯示1pokew(0XFA4A,buffs0); /在lcd右邊顯示0 pokew(0XFA44,buffm1); /在lcd右邊顯示1pokew(0XFA46,buffm0); /在lc
20、d右邊顯示0pokew(0xFA4C,0x00);pokew(0xFA4E,0x00);Delay(100);/日期顯示函數/void Display_Date()buffm0|=0x0800;pokew(0xFA40,buffyear3); /顯示年pokew(0xFA42,buffyear2);pokew(0xFA44,buffyear1);pokew(0xFA46,buffyear0);pokew(0xFA48,buffmonth1); /顯示月pokew(0xFA4A,buffmonth0);pokew(0xFA4C,buffday1); /顯示日pokew(0xFA4E,buffda
21、y0);temp1=0;/時間顯示函數/void Display_Time()pokew(0xFA40,0x00); pokew(0xFA42,0x00);pokew(0xFA44,buffh1); /顯示時pokew(0xFA46,buffh0);pokew(0xFA48,buffm1); /顯示分pokew(0xFA4A,buffm0);pokew(0xFA4C,buffs1); /顯示秒pokew(0xFA4E,buffs0);/設定時間函數/void Set_D_T()int lcd_addr;lcd_addr = 0xFA40;switch(i)case 1:pokew(lcd_ad
22、dr,buffyear3); /時間年pokew(lcd_addr+2,buffyear2);pokew(lcd_addr+4,buffyear1);pokew(lcd_addr+6,buffyear0);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 2:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00)
23、;pokew(lcd_addr+8,buffmonth1); /時間月pokew(lcd_addr+10,buffmonth0);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 3:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,buffday1); /時間日poke
24、w(lcd_addr+14,buffday0);break;case 4:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,buffh1); /時間時pokew(lcd_addr+6,buffh0); pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 5: pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0xFA44,0x0
25、0);pokew(0xFA46,0x00);pokew(0xFA48,buffm1); /時間分pokew(0xFA4A,buffm0);pokew(0xFA4C,0x00);pokew(0xFA4E,0x00);break;case 6:pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x56);pokew(0xFA4C,buffch1); /鬧鐘時pokew(0xFA4E,buffch0);break;case 7:poke
26、w(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x00);pokew(0xFA4C,buffcm1); /鬧鐘分pokew(0xFA4E,buffcm0);break;default:break;/切換時間函數/void d_c_inter()DI(); /關中斷i+;if(i>7) /切換標志>7,i=1,否則i+i=1;EI(); /開中斷/調整時間加函數/void UpNum()switch(i)case 1:yea
27、r+;case 2:month+;if(month > 12)month = 1;break;case 3:temp = Count_Day(month); day+; if(temp < day)day = 1; break;case 4:hour+;if(hour > 23)hour = 1; break;case 5:minute+;if(minute > 59)minute = 0;break;case 6:c_hour+;if(c_hour > 23)c_hour = 1; break;case 7:c_minute+;if(c_minute >
28、59)c_minute = 0;break;default:break;/調整時間減函數/void DownNum()switch(i)case 1:year-;case 2:month-;if(month < 1)month = 12;break;case 3:temp = Count_Day(month); day-; if(day < 1)day = temp; break;case 4:hour-;if(hour < 1)hour = 23; break;case 5:minute-;if(minute < 0)minute = 59;break;case 6:
29、c_hour-;if(c_hour < 1)c_hour = 23; break;case 7:c_minute-;if(c_minute < 0)c_minute = 59;break;default:break;/鬧鈴以及小燈函數/void noise()if(c_hour = hour && c_minute = minute && Que = 1) /鬧鈴的時,分與系統(tǒng)時,分相等,并且鬧鐘標志開啟CKS=0XE0; /開啟蜂鳴器輸出,輸出頻率為0.98khz的音頻Time1(); /調用時間函數/顯示緩存區(qū)刷新時間函數/void Freshd
30、displaybuffer()buffs1=LCD_numsecond/10;/秒的顯示碼放入秒的數碼顯示緩存區(qū)buffs0=LCD_numsecond%10;buffm1=LCD_numminute/10;/分的顯示碼放入分的數碼顯示緩存區(qū)buffm0=LCD_numminute%10;buffm0|=0x0800; /分的后面顯示一個"."buffh1=LCD_numhour/10; /時的顯示碼放入時的數碼顯示緩存區(qū)buffh0=LCD_numhour%10;buffh0|=0x0800; /時的后面顯示一個"."buffday1=LCD_numd
31、ay/10; /天的顯示碼放入天的數碼顯示緩存區(qū)buffday0=LCD_numday%10;buffmonth1=LCD_nummonth/10;/月的顯示碼放入月的數碼顯示緩存區(qū)buffmonth0=LCD_nummonth%10;buffmonth0|=0x0800; /月的后面顯示一個"."buffyear3=LCD_numyear/100/10;/年的顯示碼放入年的數碼顯示緩存區(qū)buffyear2=LCD_num(year/100)%10;buffyear1=LCD_num(year%100)/10;buffyear0=LCD_num(year%100)%10;b
32、uffyear0|=0x0800; /年的后面顯示一個"."buffmd3=LCD_nummonth/10;/月,天的顯示碼放入月,天的數碼顯示緩存區(qū)buffmd2=LCD_nummonth%10;buffmd2|=0x0800; /月,天后顯示一個"."buffmd1=LCD_numday/10;buffmd0=LCD_numday%10;buffhm3=LCD_numhour/10;/時,分的顯示碼放入時,分的數碼顯示緩存區(qū)buffhm2=LCD_numhour%10;buffhm2|=0x0800; /時,分的后顯示一個"."b
33、uffhm1=LCD_numminute/10;buffhm0=LCD_numminute%10;buffms3=LCD_numminute/10;/分,秒的顯示碼放入分,秒的數碼顯示緩存區(qū)buffms2=LCD_numminute%10;buffms2|=0x0800; /分,秒的后顯示一個"."buffms1=LCD_numsecond/10;buffms0=LCD_numsecond%10;buffch1=LCD_numc_hour/10;/鬧鐘時的顯示碼放入鬧鐘時的數碼顯示緩存區(qū)buffch0=LCD_numc_hour%10;buffcm1=LCD_numc_minute/10;/鬧鐘分的顯示碼放入鬧鐘分的數碼顯示緩存區(qū)buffcm0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車租賃合同
- 對照六檢查個人自我剖析材料與反思總結三篇
- 房地產稅收優(yōu)惠政策解析培訓課件:張強
- 2025年安徽省職教高考《語文》考前沖刺模擬試題庫(附答案)
- 2025年江西中醫(yī)藥高等??茖W校高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 2025年江蘇安全技術職業(yè)學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年武漢城市職業(yè)學院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 2025年新疆建設職業(yè)技術學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 專題08 走進法治天地 帶解析
- 工程維修勞務分包合同
- 江西省部分學校2024-2025學年高三上學期1月期末英語試題(含解析無聽力音頻有聽力原文)
- GA/T 2145-2024法庭科學涉火案件物證檢驗實驗室建設技術規(guī)范
- 2024年度窯爐施工協(xié)議詳例細則版B版
- 尿毒癥替代治療
- 【課件】2025屆高考英語一輪復習小作文講解課件
- 基底節(jié)腦出血護理查房
- 工程公司總經理年終總結
- 2024年海南省高考地理試卷(含答案)
- 【企業(yè)盈利能力探析的國內外文獻綜述2400字】
- 三年級上冊數學口算題1000道帶答案
- 蘇教版(2024新版)一年級上冊科學全冊教案教學設計
評論
0/150
提交評論