單片機課程設(shè)計--電子時鐘實驗可定時調(diào)鬧鐘用LCD顯示_第1頁
單片機課程設(shè)計--電子時鐘實驗可定時調(diào)鬧鐘用LCD顯示_第2頁
單片機課程設(shè)計--電子時鐘實驗可定時調(diào)鬧鐘用LCD顯示_第3頁
單片機課程設(shè)計--電子時鐘實驗可定時調(diào)鬧鐘用LCD顯示_第4頁
單片機課程設(shè)計--電子時鐘實驗可定時調(diào)鬧鐘用LCD顯示_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、評閱單片機實驗報告 姓名 學號 時間 2013.1.9 實驗題目 電子數(shù)字鐘 一、實驗目的與要求1. 電子數(shù)字鐘必須具有顯示年、月、日和顯示時、分、秒的功能。(用LCD顯示)。2.具有按鍵時間校正功能。3.具備設(shè)定鬧鐘和定時鬧鐘功能。二、實驗環(huán)境(硬件環(huán)境、軟件環(huán)境)1.硬件環(huán)境:單片機開發(fā)板一個,計算機一臺,單片機主機電源線及與計算機的連接線各一條。2.軟件環(huán)境:軟件Keil C51和軟件Flash Magic。三、實驗電路(P2口輸入、P1口輸出實驗原理圖) 本次實驗主要使用了開發(fā)板的4個板塊,分別是單片機STC89C52(如圖2所示)、矩陣鍵盤(如圖2所示)、1206LCD顯示器和蜂鳴器

2、(如圖3所示)。其中單片機芯片通過P0口把總線和矩陣鍵盤連接;通過P2.2和蜂鳴器間接相連,因為蜂鳴器所在的電路已經(jīng)連芯片ULN2003,因此用一根杜邦線把P2.2和芯片ULN2003的第一個輸入口IN1連起來。而鍵盤顯示這一塊,由于內(nèi)部已經(jīng)把鍵盤顯示的電路和單片機芯片連接起來了,所以不需要借助杜邦線了。圖1為實物連線圖。圖1 實物連線圖圖2 單片機機座和矩陣鍵盤圖3 蜂鳴器和1602液晶顯示器四、程序流程圖主要算法: 主函數(shù)中先定時中斷初始化,利用定時器中斷實現(xiàn)走時,調(diào)用LCD顯示程序和按鍵處理子函數(shù),再調(diào)用顯示時間函數(shù)顯示初始時間值。同時,在主函數(shù)中判斷當前的小時和分鐘值是否等于鬧鐘設(shè)定的

3、時間,若等于則讓蜂鳴器響。主函數(shù)算法的框圖如圖4所示。按鍵處理函數(shù)算法:通過鍵盤掃描函數(shù)得到確定哪個鍵盤按下,得到鍵盤值,如果鍵0按下則暫停時鐘走時;鍵1按下則在當前的光標所在的時間單元加1;鍵2按下則開鬧鐘;鍵3按下則實現(xiàn)當前的時間單元左移一位的功能;鍵4按下則在當前的光標所在的時間單元減1。時間的年月日算法:通過定時器實現(xiàn)時鐘的走時,秒滿60,分鐘加1;分滿60,小時加1;小時滿24,日加1;至于每個月的天數(shù)根據(jù)閏年和非閏年的表格確定當月天數(shù)。 圖4 主函數(shù)算法框圖五、程序測試報告:(調(diào)試輸入數(shù)據(jù)、結(jié)果數(shù)據(jù)或狀態(tài)。)1.輸入:源代碼1 輸出結(jié)果:(1) 電子數(shù)字鐘必須具有顯示年、月、日和顯

4、示時、分、秒的功能。(用LCD顯示)(2)具有按鍵時間校正功能。(3)具備設(shè)定鬧鐘和定時鬧鐘功能。六、體會:(碰到的問題、如何解決、有何體會。)1.深入了解如何運用高級語言,此次實驗運用C語言進行編程,使單片機開發(fā)板實現(xiàn)電子時鐘的功能,對匯編語言和高級語言在實現(xiàn)單片機功能的特點也加深了認識。體會到C語言在編程時的靈活性和不用過多考慮硬件的方便。2.該實驗中主要用到幾個板塊,單片機控制,鍵盤運用,LCD顯示,蜂鳴器。掌握了鍵盤的工作方式和掃描的特點,懂得運用C語言進行編程鍵盤掃描的程序;掌握LCD顯示的幾種功能指令,盡管LCD顯示的程序較多,但是工作原理弄清楚后就清晰很多;掌握如何把硬件和軟件聯(lián)

5、系起來,特別是控制定時鬧鐘蜂鳴器的程序,由于該片單片機開發(fā)板的蜂鳴器是和步進電機等電路連在一起的,所以需要把控制蜂鳴器的連接端口找到,并用指令“sbit BEEP=P22”進行定義;對單片機的應用有了更深入的認識和了解。3.蔣老師在實驗過程中一直強調(diào)程序的排版格式,讓我從細節(jié)上更注意排版,收獲了一個美觀處理文檔的習慣。在實驗過程中遇到了調(diào)試失敗的各種問題,除了得到老師的指導,自己也主動上網(wǎng)搜索發(fā)生錯誤的各種原因,培養(yǎng)了解決問題的能力。七、源程序代碼#include<reg52.h> #include<intrins.h>sbit BEEP=P22; /喇叭端口sbit

6、RS = P24; /定義端口 sbit RW = P25;sbit EN = P26;bit Al; /鬧鐘標志位#define DataPort P0#define KeyPort P1#define uint unsigned int#define uchar unsigned charuchar code table="0123456789"/轉(zhuǎn)換成液晶顯示的字符uchar table1=31,31,29,31,30,31,30,31,31,30,31,30,31; /閏年uchar table2=31,31,28,31,30,31,30,31,31,30,31,3

7、0,31; /非閏年uint i,j,k;uint n_hour,n_minu; /鬧鐘時,分uint sec,minu,hour,day,mon;/秒,分,時,日,星期uint count,key;unsigned long int year; /年uchar hs,hg,mis,mig,ss,sg;uchar nhs,nhg,nms,nmg;uchar ms,mg,ds,dg;uchar yq,yb,ys,yg;uchar i_,j_,k_;/*- mS延時函數(shù),這里使用單片機的晶振為12MHz-*/void DelayMs(uchar i_) for(j_=i_;j_>0;j_-)

8、 for(k_=500;k_>0;k_-)/*- 判忙函數(shù)-*/ bit LCD_Check_Busy(void) DataPort= 0xFF; RS=0; RW=1; EN=0; _nop_(); EN=1; return (bit)(DataPort & 0x80); /*- 寫入命令函數(shù)-*/ void LCD_Write_Com(uchar com) RS=0; RW=0; DataPort=com; DelayMs(5); EN=1; DelayMs(5); EN=0; /*- 寫入數(shù)據(jù)函數(shù)-*/ void LCD_Write_Data(uchar Data) /wh

9、ile(LCD_Check_Busy(); /忙則等待 DelayMs(5); RS=1; RW=0; EN=1;DataPort= Data; DelayMs(5); EN=0; /*- 清屏函數(shù)-*/ void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5); /*- 寫入字符串函數(shù)-*/ void LCD_Write_String(uchar x,uchar y,uchar *s) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); while (*s) LCD

10、_Write_Data( *s); s +; /*- 寫入字符函數(shù)-*/ void LCD_Write_Char(uchar x,uchar y,uchar Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*- 初始化函數(shù)-*/ void LCD_Init(void) LCD_Write_Com(0x38); /*顯示模式設(shè)置*/ LCD_Write_Com(0x08); /*顯示關(guān)閉*/ LCD_Write_Com(0x01); /*顯示清屏*/ L

11、CD_Write_Com(0x06); /*顯示光標移動設(shè)置*/ DelayMs(5); LCD_Write_Com(0x0C); /*顯示開及光標設(shè)置*/ /*-按鍵掃描函數(shù),返回掃描鍵值-*/unsigned char KeyScan(void) /鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法 unsigned char cord_h,cord_l;/行列值中間變量 KeyPort=0x0f; /行線輸出全為0 cord_h=KeyPort&0x0f; /讀入列線值 if(cord_h!=0x0f) /先檢測有無按鍵按下 DelayMs(10); /去抖 if(KeyPort&0x0f

12、)!=0x0f) cord_h=KeyPort&0x0f; /讀入列線值 KeyPort=cord_h|0xf0; /輸出當前列線值 cord_l=KeyPort&0xf0; /讀入行線值 while(KeyPort&0xf0)!=0xf0);/等待松開并輸出 return(cord_h+cord_l);/鍵盤最后組合碼值 return(0xff); /返回該值/*-按鍵值處理函數(shù),返回掃鍵值-*/unsigned char KeyPro(void) switch(KeyScan() case 0x7e:return 0;break;/0 暫停鍵 case 0x7d:r

13、eturn 1;break;/1 加 case 0x7b:return 2;break;/2 鬧鐘 case 0x77:return 3;break;/3 左移 case 0xbe:return 4;break;/4 減 case 0xbd:return 5;break;/5 case 0xbb:return 6;break;/6 case 0xb7:return 7;break;/7 case 0xde:return 8;break;/8 case 0xdd:return 9;break;/9 case 0xdb:return 10;break;/a case 0xd7:return 11;

14、break;/b case 0xee:return 12;break;/c case 0xed:return 13;break;/d case 0xeb:return 14;break;/e case 0xe7:return 15;break;/f default:return 0xff;break; /*- 鍵盤控制時間函數(shù)(0鍵-暫停鍵,1鍵-加1鍵, 2鍵-開鬧鐘,3鍵-左移鍵,4鍵-減1鍵)-*/void jianpan() key=KeyPro(); if(key!=0xff) if(key=0)/關(guān)中斷,暫停時鐘 EA=EA; if(EA=0)&&(Al=0) /若

15、鬧鐘關(guān)且時間暫停,則可以改動時間 if(key=3) / 左移,i為改動標志位,按順序改動秒分時日月年 if(i<6)i+;elsei=0; else if(key=1) /加1,根據(jù)i增加對應的數(shù)值 switch(i) case 0:if(sec<59)sec+;elsesec=0;break; case 1:if(minu<59)minu+;elseminu=0;break; case 2:if(hour<23)hour+;elsehour=0;break; case 3:if(day<31)day+;elseday=0;break; case 4:if(mo

16、n<12)mon+;elsemon=0;break; case 5:year+;break; else if(key=4)/減1,根據(jù)i減少對應的數(shù)值 switch(i) case 0:if(sec>0)sec-;elsesec=60;break; case 1:if(minu>0)minu-;elseminu=60;break; case 2:if(hour>0)hour-;elsehour=23;break; case 3:if(day>1)day-;elseday=31;break; case 4:if(mon>1)mon-;elsemon=12;br

17、eak; case 5:if(year>0)year-;break; if(key=2) /鬧鐘開關(guān) Al=Al; if(Al=1) /鬧鐘開,顯示鬧鐘,允許設(shè)定鬧鐘 if(key=3) /左移,設(shè)定標志位 if(j<1) j+;else j=0;else if(key=1) /加1,根據(jù)l增減設(shè)定 switch(j) case 0:if(n_hour<24)n_hour+;break; case 1:if(n_minu<60)n_minu+;break;else if(key=4)/減1 switch(j) case 0:if(n_hour>0)n_hour-;

18、break; case 1:if(n_minu>0)n_minu-;break; else if(Al=0) LCD_Write_Char(15,0,' '); LCD_Write_String(10,1," "); /*- 時間的年月日算法(考慮閏年和非閏年)-*/ void time() /計時函數(shù) if(sec=60) sec=0; minu+; if(minu=60) minu=0; hour+; if(hour=24) hour=0; day+; if(year%4=0&&year%100!=0|year%400=0) /閏年

19、 if(day=table1mon+1) day=0;mon+;if(mon=13)mon=0;year+;else /非閏年if(day=table2mon+1)day=0;mon+;if(mon=13) mon=0;year+;/*- 定時器中斷控制時鐘走動-*/void time0_to()interrupt 1TH0=(65536-49872)/256;TL0=(65536-49872)%256;count+;if(count=20)/中斷20次為一秒 count=0; sec+; time(); /*- 時間顯示函數(shù)-*/void DISPLAY() uchar KeyPro();y

20、q=year/1000;yb=(year/100)%10;ys=(year/10)%10;yg=year%10;hs=hour/10; /時分秒HH.MM.SShg=hour%10;mis=minu/10;mig=minu%10;ss=sec/10;sg=sec%10;ms=mon/10; /月日-星期MM.DD.-Wmg=mon%10;ds=day/10;dg=day%10;nhs=n_hour/10; /鬧鐘定時HH.MM.SSnhg=n_hour%10;nms=n_minu/10;nmg=n_minu%10; /年顯示 LCD_Write_Char(0,0,tableyq); LCD_W

21、rite_Char(1,0,tableyb); LCD_Write_Char(2,0,tableys); LCD_Write_Char(3,0,tableyg); LCD_Write_Char(4,0,'-'); /月顯示 LCD_Write_Char(5,0,tablems); LCD_Write_Char(6,0,tablemg); LCD_Write_Char(7,0,'-'); /日顯示 LCD_Write_Char(8,0,tableds); LCD_Write_Char(9,0,tabledg); /時顯示 LCD_Write_Char(1,1,tablehs); LCD_Write_Char(2,1,tablehg); LCD_Write_Char(3,1,':'); /分顯示 LCD_Write_Char(4,1,tablemis); LCD_Write_Char(5,1,tablemig); LCD_Write

溫馨提示

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

評論

0/150

提交評論