單片機課程設(shè)計多功能定時器_第1頁
單片機課程設(shè)計多功能定時器_第2頁
單片機課程設(shè)計多功能定時器_第3頁
單片機課程設(shè)計多功能定時器_第4頁
單片機課程設(shè)計多功能定時器_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、多功能定時裝置單片機課程設(shè)計多功能定時器一、設(shè)計目的:1、 在理論學(xué)習(xí)的基礎(chǔ)上,通過完成一個涉及mcs-51單片機多種資源應(yīng)用并具有綜合功能的小系統(tǒng)目標(biāo)板的設(shè)計與編程應(yīng)用;2、 能夠?qū)﹄娮与娐贰㈦娮釉骷?、印制電路板等方面的知識進一步加深認(rèn)識,在軟件編程、排錯調(diào)試、相關(guān)儀器設(shè)備的使用技能等方面得到較全面的鍛煉和提高;3、 使學(xué)生增進對單片機的感性認(rèn)識,加深對單片機理論方面的理解。使學(xué)生掌握單片機的內(nèi)部功能模塊的應(yīng)用,如定時器/計數(shù)器、中斷、片內(nèi)外存貯器、i/o口、串行口通信等;4、 使學(xué)生了解和掌握單片機應(yīng)用系統(tǒng)的軟硬件設(shè)計過程、方法及實現(xiàn),為以后設(shè)計和實現(xiàn)單片機應(yīng)用系統(tǒng)打下良好基礎(chǔ)。二、設(shè)計

2、功能說明數(shù)字鐘是采用數(shù)字電路實現(xiàn)對時,分,秒,數(shù)字顯示的計時裝置,由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度,遠(yuǎn)遠(yuǎn)超過老式鐘表,鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地擴展了鐘表的報時功能。數(shù)字鐘已成為人們?nèi)粘I钪械谋匦杵罚驹O(shè)計可實現(xiàn)如下功能:1、使用實時時鐘芯片寫入及讀取時間2、用lcd顯示,可顯示年、月、日、時、分、秒、星期、農(nóng)歷日期、節(jié)日3、選擇蜂鳴器電路,實現(xiàn)兩個鬧鐘設(shè)置和事件提示功能4、實現(xiàn)時鐘校正功能,12小時/24小時切換功能5、顯示當(dāng)前時間為上午時間或下午時間6、整點報時功能按鍵功能如下:1、對顯示時間的設(shè)置按鍵0:進入設(shè)置模式,實現(xiàn)秒

3、(s)、分(m)、時(h)、年(y)、月(m)、日(d)、星期(w)設(shè)置的切換,并在lcd右下角顯示所設(shè)置的項目,當(dāng)各項目設(shè)置完畢后,再按下按鍵0則返回主界面正常顯示時間;按鍵1:每按一次按鍵1,對所設(shè)置的時間加1,當(dāng)設(shè)置的時間超過它的最大值時,該項自動為0,例如:當(dāng)設(shè)置秒為59時,秒自動清零;按鍵2:每按一次按鍵:2,對所設(shè)置的時間減1,當(dāng)設(shè)置的時間小于0時,該項自動為它的最大值;按鍵3:設(shè)置完成后的確認(rèn)鍵并可按此鍵中途退出設(shè)置,時間按用戶設(shè)置值正常計時;按鍵7:實現(xiàn)時鐘校正功能,12小時/24小時切換功能。2、對鬧鐘的設(shè)置按鍵4:進入鬧鐘1的設(shè)置,并在lcd右上方顯示“clock1”并通過

4、按鍵0、1、2設(shè)置用戶所需鬧鐘時間,完成鬧鐘1的設(shè)置后,通過按鍵0進入鬧鐘2的設(shè)置,并在lcd右上方顯示“clock2”,若無需設(shè)置鬧鐘2,則通過按鍵3退出鬧鐘設(shè)置,返回主界面正常顯示時間;按鍵5:設(shè)置鬧鐘是否開啟,例如:當(dāng)設(shè)置鬧鐘1為開啟狀態(tài)時,在lcd右上方顯示“*clock1”當(dāng)鬧鐘,并在返回主界面后顯示“c1”表示鬧鐘1開啟;三、整體設(shè)計思路這部分主要介紹工作安排和整體設(shè)計的思想。工作過程規(guī)劃如下:對測試中的問題再調(diào)試對程序編譯,下板測試編輯各個程序模塊完成調(diào)試程序,進行修改綜合各程序完成整體程序熟悉硬件 了解各引腳功能完成整體電路圖認(rèn)真學(xué)習(xí)c語言分塊設(shè)計各部分電路將分塊的電路組合確定

5、結(jié)構(gòu)和思路上電初始化四、主程序流程圖 顯示時間初值yy響鈴是否開啟?與鬧鐘時間相同?n不響y報時整點?n不響nkeyvalue=getkey()n進入時間設(shè)置ykey=0?ny各設(shè)置項加一key=1?ny各設(shè)置項減一key=2?nkey=3?y退出設(shè)置回到主界面繼續(xù)計時nkey=4?鬧鐘設(shè)置yny關(guān)閉鬧鐘鬧鐘已開啟?ykey=5?n開啟鬧鐘,顯示*ykey=7?12/24進制的轉(zhuǎn)換n結(jié)束五、電氣原理圖(見附圖)六、實驗程序1、鍵盤程序(keyprocess)鍵盤與848相連接,采用矩陣鍵盤的方式p2用于列掃描,p1用于行掃描,經(jīng)過消抖及等待鍵釋放的程序,將最終正確的結(jié)果置于getkey();程

6、序?qū)崿F(xiàn)如下:#includeaduc848.hvoid keydelay(unsigned int keyjstime); /鍵盤掃描延時函數(shù)聲明unsigned char getkey(); /掃描后獲取鍵值unsigned char getkey()static unsigned char keyhavefree=1;static unsigned int keyjs=0;unsigned char temp,keytemp=0xff;p1&=0xf0;p2&=0xf0; / 將低四位置零做i/o口temp=p1&0x0f;if(keyhavefree) if(temp!=0x0f) ke

7、ydelay(1000); /延時消除抖動 if(temp=(p1&0x0f) /延時后確認(rèn)是否有鍵按下,并獲取具體鍵值 p2|=0x0e; switch(p1&0x0f) case 0x0e:keytemp=3;break; case 0x0d:keytemp=7;break; case 0x0b:keytemp=11;break; case 0x07:keytemp=15;break; case 0x0f:break; default:keytemp= 0x80;break; p2&=0xf0; p2|=0x0d; switch(p1&0x0f) case 0x0e:keytemp= 2;

8、break; case 0x0d:keytemp= 6;break; case 0x0b:keytemp= 10;break; case 0x07:keytemp= 14;break; case 0x0f:break; default:keytemp= 0x81;break; p2&=0xf0; p2|=0x0b; switch(p1&0x0f) case 0x0e:keytemp= 1;break; case 0x0d:keytemp= 5;break; case 0x0b:keytemp= 9;break; case 0x07:keytemp= 13;break; case 0x0f:br

9、eak; default:keytemp= 0x82;break; p2&=0xf0; p2|=0x07; switch(p1&0x0f) case 0x0e:keytemp= 0;break; case 0x0d:keytemp= 4;break; case 0x0b:keytemp= 8;break; case 0x07:keytemp= 12;break; case 0x0f:break; default:keytemp= 0x83;break; keyhavefree=0; /lcdprintnumber(6,11,5,keytemp); else keyjs+; if(keyjs70

10、) keyhavefree=1; keyjs=66; if(temp=0x0f)keyhavefree=1;keyjs=0; keytemp=0xf0; return keytemp;void keydelay(unsigned int keyjstime)unsigned char temp;unsigned int jskeydelay;for(jskeydelay=0;jskeydelay0;x-) for(y=110;y0;y-); void write_com(unsigned char com) / rs=0; rw=0; p0=com; delay(5); en=1; delay

11、(5); en=0; void write_data(unsigned char date) rs=1; rw=0; p0=date; delay(5); en=1; delay(5); en=0; 3、iic程序(rtc)/實時時鐘#includeaduc848.hvoid iic_start(void);void iic_stop(void);void iic_ack(void);bit read_ack(void);void iic_nack();unsigned char get_byte(void);void out_byte(unsigned char dd);void iic_d

12、elay_us(unsigned int times);void readtime(unsigned char time7);void settime(unsigned char time7);void switchrtc(unsigned char switch);void readtime(unsigned char time7) bit eatemp; unsigned char temp; eatemp=ea; iic_start(); out_byte(0xd0); read_ack(); out_byte(0x00); read_ack(); iic_stop(); iic_del

13、ay_us(1); iic_start(); out_byte(0xd1); read_ack(); time0=get_byte(); iic_ack(); time1=get_byte(); iic_ack(); time2=get_byte(); iic_ack(); time3=get_byte(); iic_ack(); time4=get_byte(); iic_ack(); time5=get_byte(); iic_ack(); time6=get_byte(); iic_nack(); iic_stop(); iic_delay_us(1); time0=(time0&0x7

14、f)4)*10+(time0&0x0f); /second time1=(time1&0x7f)4)*10+(time1&0x0f); /minute if(time2&0x40) if(time2&0x20)temp=0x80;else temp=0x40; time2=(time2&0x1f)4)*10+(time2&0x0f); /hour time2|=temp; else time2=(time2&0x3f)4)*10+(time2&0x0f); time3=time3&0x07; /week time4=(time4&0x3f)4)*10+(time4&0x0f); /date t

15、ime5=(time5&0x1f)4)*10+(time5&0x0f); /month time6=(time64)*10+(time6&0x0f); /year ea=eatemp;void settime(unsigned char time7) bit eatemp; unsigned char temp=0; unsigned char timetemp7; eatemp=ea; for(temp=0;temp7;temp+)timetemptemp=timetemp; temp=0; timetemp6=(timetemp6/10)4)+(timetemp6%10);/year ti

16、metemp5=(timetemp5/10)4)+(timetemp5%10);/month timetemp4=(timetemp4/10)4)+(timetemp4%10);/day timetemp3=(timetemp3/10)4)+(timetemp3%10);/week if(timetemp2&0xc0)=0x00)/hour timetemp2=(timetemp2/10)4)+(timetemp2%10); else if(timetemp2&0xc0)=0x01)temp=0x40;else temp=0x60; timetemp2&=0x3f; timetemp2=(ti

17、metemp2/10)4)+(timetemp2%10); timetemp2|=temp; timetemp1=(timetemp1/10)4)+(timetemp1%10); /minute timetemp0=(timetemp0/10)4)+(timetemp0%10);/second timetemp0&=0x7f; iic_start(); out_byte(0xd0); read_ack(); out_byte(0x00); read_ack(); out_byte(timetemp0); read_ack(); out_byte(timetemp1); read_ack();

18、out_byte(timetemp2); read_ack(); out_byte(timetemp3); read_ack(); out_byte(timetemp4); read_ack(); out_byte(timetemp5); read_ack(); out_byte(timetemp6); read_ack(); iic_stop(); iic_delay_us(1); ea=eatemp; void switchrtc(unsigned char switch) unsigned char temp; bit eatemp; eatemp=ea; iic_start(); ou

19、t_byte(0xd0); read_ack(); out_byte(0x00); read_ack(); iic_stop(); /iic_delay_us(1); iic_start(); out_byte(0xd1); read_ack(); temp=get_byte(); iic_nack(); iic_stop(); /iic_delay_us(1); if(switch)temp&=0x7f; else temp|=0x80; iic_start(); out_byte(0xd0); read_ack(); out_byte(0x00); read_ack(); out_byte

20、(temp); read_ack(); iic_stop(); /iic_delay_us(1); ea=eatemp;void iic_start(void) mde=1; mdo=1; /iic_delay_us(2); mco=1; /iic_delay_us(2); mdo=0; /iic_delay_us(2); void iic_stop(void) mde=1; mdo=0; /iic_delay_us(2); mco=1; /iic_delay_us(2); mdo=1;void iic_ack(void) mde=1; mco = 0; mdo = 0; /iic_delay

21、_us(2); mco = 1; /iic_delay_us(2); mco = 0; /iic_delay_us(1); mdo = 1;bit read_ack(void) bit flag; mco = 0; /iic_delay_us(2); mde=1; mdo = 1; mco = 1; /iic_delay_us(2); mde=0; flag = mdi; mco = 0; return flag;void iic_nack() mde=1; mdo = 1; /iic_delay_us(2); mco = 1; /iic_delay_us(2); mco = 0;/* 函數(shù)名

22、: get_byte;* 描述: 從iic總線獲取一個字節(jié);* 輸入: none;* 返回值: 一字節(jié)數(shù)據(jù);* 注釋: none;*/unsigned char get_byte(void) /輸入一個字節(jié) unsigned char dd; int i; dd=0; mde=1; mdo = 1; mde=0;for (i=0;i8;i+) mco = 0; iic_delay_us(1); mco = 1; /iic_delay_us(1); dd=1; if (mdi)dd|=0x01; mco = 0;return(dd);/* 函數(shù)名: out_byte;* 描述: 向iic總線輸出

23、一個字節(jié);* 輸入: 一字節(jié)數(shù)據(jù)* 返回值: none;* 注釋: none;*/ void out_byte(unsigned char dd) /輸出一個字節(jié) unsigned char i; mde=1; for(i=0;i7; iic_delay_us(1); mco = 1; /iic_delay_us(3); dd = 1; mco = 0; /* 函數(shù)名: iic_delay_us;* 描述: iic總線延時函數(shù);* 輸入: 延時參數(shù)* 返回值: none;* 注釋: none;*/ void iic_delay_us(unsigned int times) unsigned i

24、nt i; unsigned char delayjs;for (i=0; i7) /如果設(shè)置完了,則開始計時 setmode=0; settime(currenttime); if(setmode=0)switchrtc(1);write_com(0xcf);write_data(0x20); break; case 1: /按鍵1:加 switch(setmode) /執(zhí)行按鍵1是在進入設(shè)置的模式下 case 1:write_com(0xcf);write_data(0x53);currenttime0+;if(currenttime059)currenttime0=0;break;/mi

25、ao case 2:write_com(0xcf);write_data(0x4d);currenttime1+;if(currenttime159)currenttime1=0;break;/fen case 3:write_com(0xcf);write_data(0x48);currenttime2+;if(currenttime223)currenttime2=0;break;/shi case 4:write_com(0xcf);write_data(0x59);currenttime6+;if(currenttime699)currenttime6=0;break;/year ca

26、se 5:write_com(0xcf);write_data(0x6d);currenttime5+;if(currenttime512)currenttime5=1;break;/month case 6:/day write_com(0xcf);write_data(0x44);currenttime4+; switch(currenttime5) case 1: case 3: case 5: case 7: case 8: case 10: case 12:if(currenttime431)currenttime4=1;break; case 4: case 6: case 9:

27、case 11:if(currenttime430)currenttime4=1;break; case 2: if(currenttime6%4)if(currenttime428)currenttime4=1; else if(currenttime429)currenttime4=1; break; default:break; break; case 7:write_com(0xcf);write_data(0x57);currenttime3+;if(currenttime37)currenttime3=1;break; /week default:break; break; case 2: /按鍵2:減 switch(setmode) case 1:currenttime0-;if(currenttime0254)currenttime0=59;break;/miao case 2:currenttime1-;if(currenttime1254)currenttime1=59;break;/fen case 3:currenttime2-;if(currenttime2254)currenttime2=23;break;/shi case 4:currenttime6-;if(currenttime6254)currenttime6=99;break;/

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論