STM8單片機課程設計報告(鬧鐘+定時器)_第1頁
STM8單片機課程設計報告(鬧鐘+定時器)_第2頁
STM8單片機課程設計報告(鬧鐘+定時器)_第3頁
STM8單片機課程設計報告(鬧鐘+定時器)_第4頁
STM8單片機課程設計報告(鬧鐘+定時器)_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、課程設計內容與要求課程設計目的:1、鞏固和加深對單片機原理知識的理解和運用。2、進一步提高學生綜合運用所學知識的能力。3、培養學生綜合分析問題、發現問題和解決問題的能力基本要求:1) 顯示時間和日期2) 可設置多個鬧鐘3) 可以調整時間擴展功能:1) 按鍵復用 共有六個按鍵,每個按鍵在不同模式下有不同的功能。2) 秒表功能 進入秒表界面后,再按一下就秒表開始計時,再按一下秒表停止。3) 省電模式 在每天00:00會自動進入省電模式,8個數碼管會自動關閉,到5:00時會自動退出省電模式;也可以手動進入和退出省電模式。4) 查看/刪除鬧鐘 查看鬧鐘時間為五秒,五秒內按鍵無動作則自動退出。器件介紹本

2、次設計主要用到的硬件有:1、51實驗板1塊2、stm8s105c6開發板1快51實驗板:主要用到實驗板上的硬件有:1) 兩個四位一體的共陰LED數碼管,電路圖如下:2)兩個74HC573的鎖存芯片:3)8個獨立按鍵,用了其中6個5) 一個蜂鳴器:Stm8s105c6開發板:總共有48個引腳,本設計共用引腳20個引腳。PB0PB7和PE6PE7用于數碼管顯示控制,PD0PD5用于鍵盤輸入,PD6、 PE0、PE3用于LED指示燈控制。PD7用于蜂鳴器控制。設計方案本次設計采用51實驗板和stm8s105c6開發板來完成,沒有做實物。顯示電路采用8個共陽數碼管顯示;控制按鍵采用六個獨立按鍵,每一個

3、按鍵都有復用功能;鬧鐘提醒采用蜂鳴器;外加四個不同顏色的LED發光二極管,當進入相應功能模式時對應的指示燈就會亮。1、鍵盤設計:在鍵盤電路中,使用的是6個獨立鍵盤。鍵盤在源程序中的功能安排如下:1)當掃描到有鍵盤按下時,設置相應標志位,然后延時一定時間消抖。2)鍵盤的設置鍵盤表面如圖:OkEsc其中各鍵設置為:(待機狀態:正常的時間顯示模式)待機狀態下是“設置鬧鐘”,在其他模式下是“遞增功能”待機狀態下是“調整時間”,在其他模式下是“遞減功能”。 待機狀態下是“秒表功能”,在其他模式下是“左移功能”。 待機狀態下是“查看/刪除鬧鐘”,在其他模式下是“右移功能”OK 待機狀態下是“切換顯示”,在

4、省電模式下是“退出功能”,在其他模式下是“確認功能”Esc 待機狀態下是“省電模式”,在查看/刪除鬧鐘模式下是“刪除功能”,在其他模式下是“退出功能”2、數碼管顯示:采用按位掃描的動態顯示方式。3、其他設計:定時器使用stm8s105c6中的Tim2定時器,每1ms產生一次溢出中斷。鬧鈴響的時間為15秒。查看/刪除鬧鐘模式下,5s內鍵盤無動作則自動退出。每次按鍵按下后,會延時240ms,此時間內不會再對鍵盤進行掃描。在每天00:00會自動進入省電模式,8個數碼管會自動關閉,到5:00時會自動退出省電模式;也可以手動進入和退出省電模式。4、設計思路:開始初始化引腳和Tim2定時器調用時間處理函數

5、鬧鈴響鬧鐘時間? 是 否掃描鍵盤鬧鐘設置位=1?是時間調整位=1? 否 是調用相應功能函數 否秒表功能位=1? 是 否查看鬧鐘位=1? 是 否顯示切換位=1?顯示日期 是 是 否顯示時間5、以下是部分程序:/*標志位*/_Bool off;/省電模式_Bool tab;/切換顯示模式_Bool run;/控制秒表_Bool left;/左移_Bool right;/右移_Bool set;/設置鬧鐘_Bool adjust;/調整時間_Bool ok;/確定_Bool esc;/取消或刪除_Bool duan PE_ODR:7; /PE6作為段鎖存_Bool wei PE_ODR:6; /PE

6、7作為位鎖存_Bool set_c PE_ODR:3;_Bool adjust_t PE_ODR:0;_Bool check_clock PD_ODR:6;_Bool c_alarm PD_ODR:7;/*相關變量*/unsigned char month_day=31,28,31,30,31,30,31,31,30,31,30,31;unsigned char wei_ma=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/顯示位碼unsigned char duan_ma=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7

7、f,0x6f; /共陰極顯示段碼unsigned char sec_duan_ma=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;unsigned char hour_5,minute_5,second_5=1,2,3,4,5;/用于秒表unsigned char sec_time8;/用于秒表unsigned char clocks58;/可存5個鬧鐘信息unsigned char times8;/存放當前時間unsigned char days8;/存放當前日期unsigned int T1=1000;/200x10ms=1s秒計算un

8、signed int T2=0;/20x10ms=200msunsigned char c=0;/用于記錄鬧鐘個數unsigned char hour=8,minute=55,second;unsigned char month=12,day=12;int year=2011;unsigned char *ud;/ud加減指針unsigned char lr;/記錄指針所指位char A,B,C,D,E,F,G,H,I,J,K,L;int T3=0,T4=0;/其他定時,鬧鐘顯示和蜂鳴器int sec1,sec2;/用于秒表的變量/*函數聲明*/unsigned char leapyear(i

9、nt b);/閏年判斷void TIM2_initial(void);/初始化定時器void GPIO_initial(void);/初始化I/O引腳void display(unsigned char x8);/時間顯示函數void time_process(void);/時間處理函數void times_bi_duan_ma(unsigned char,unsigned char,unsigned char);void days_bi_duan_ma(int,unsigned char,unsigned char);void keyscan(void);/鍵盤掃描函數void set_cl

10、ock(void);/設置鬧鐘void adjust_times(void);/void clock_display(void);/鬧鐘顯示函數void alarm(void);void second_clock(void);/*主函數*/main()GPIO_initial();TIM2_initial();leapyear(year);while(1)time_process();alarm();if(T2=0)/消抖,延時100mskeyscan();if(hour=0&minute=0&second=0)off=1;if(hour=5&minute=0&

11、second=0)off=0;if(set=0&adjust=0&left=0&right=0&ok=0&off=1) PB_ODR=0xff;/不顯示時間,省電模式wei=1;wei=0;else if(set=1&adjust=0)/設置鬧鐘模式 set_c=0;set_clock(); else if(set=0&adjust=1)/調整時間模式 adjust_t=0;adjust_times();else if(left=1)/秒表模式second_clock();else if(right=1)/查看/刪除鬧鐘模式check_c

12、lock=0; clock_display();else if(tab=0) times_bi_duan_ma(hour,minute,second); display(times);/時間顯示 else if(tab=1)days_bi_duan_ma(year,month,day); display(days); /*秒表函數*/void second_clock(void)if(sec1=999)sec1=999;sec_time0=0x00; sec_time1=0x00; sec_time2=0x00; sec_time3=duan_masec1/100; sec_time4=dua

13、n_masec1%100/10; sec_time5=sec_duan_masec1%10; sec_time6=duan_masec2/10;/小數位 sec_time7=duan_masec2%10;/小數位display(sec_time);if(esc=1) left=0;run=0;sec1=0; sec2=0;esc=0;/*鬧鐘設置*/void set_clock(void)unsigned char i,j; display(times);if(lr=0)ud=&G;/指針指向Gif(lr=1)ud=&H;if(lr=3)ud=&I;if(lr=4)ud

14、=&J;if(lr=6)ud=&K;if(lr=7)ud=&L;timeslr=duan_ma*ud;/*ud即是ud所指變量的當前值if(ok=1)hour_c=G*10+H;minute_c=I*10+J;second_c=K*10+L;if(c=4)c=0;else c+;set=0;ud=0;lr=0;right=0;left=0;ok=0;set_c=1;/*校時函數*/void adjust_times(void)if(ok=0)display(days);if(lr=0)ud=&A;if(lr=1)ud=&B;if(lr=3)ud=&

15、;C;if(lr=4)ud=&D;if(lr=6)ud=&E;if(lr=7)ud=&F;dayslr=duan_ma*ud;if(ok=1)display(times);if(lr=0)ud=&G;if(lr=1)ud=&H;if(lr=3)ud=&I;if(lr=4)ud=&J;if(lr=6)ud=&K;if(lr=7)ud=&L;timeslr=duan_ma*ud;if(esc=1&ok=1)year=2000+A*10+B;month=C*10+D;day=E*10+F;hour=G*10+H;minu

16、te=I*10+J;second=K*10+L;ok=0;esc=0;lr=0;ud=0;adjust=0;T1=100;adjust_t=1;/*時間處理函數*/void time_process(void) if(second>=60) /秒到60,分鐘加1 second=0; minute+; if(minute>=60)/分鐘到60,小時加1 minute=0; hour+; if(hour>=24)/小時到24,回零 hour=0; leapyear(year);/閏、平年計算if(day>=month_daymonth-1)/是否到了每月的最后一天 day=

17、1;if(month>=12) month=1; year+; else month+;else day+; /*時間數據的轉換*/void times_bi_duan_ma(unsigned char hour,unsigned char minute,unsigned char second)G=hour/10;H=hour%10;I=minute/10;J=minute%10;K=second/10;L=second%10; times0=duan_maG; /時/數據的轉換,因我們采用數碼管09的顯示,將數據分開 times1=duan_maH; times2=0x40; /加入

18、"-" times3=duan_maI;/分 times4=duan_maJ; times5=0x40; times6=duan_maK;/秒 times7=duan_maL; /*日期數據的轉換*/ void days_bi_duan_ma(int year,unsigned char month,unsigned char day) A=(year%100)/10);B=(year%100)%10); C=month/10;D=month%10; E=day/10;F=day%10; days0=duan_maA;/年 days1=duan_maB; days2=0x4

19、0; days3=duan_maC;/月 days4=duan_maD; days5=0x40; days6=duan_maE;/日 days7=duan_maF; /*時間顯示函數*/void display(unsigned char time8)unsigned char a=0,i;while(a<8)PB_ODR=0x00;/確保清除之前的數據,防止重影duan=1;duan=0;if(set=1|adjust=1)&a=lr&T1<=50)PB_ODR=0xff;/指針所指的位閃爍elsePB_ODR=wei_maa;wei=1;wei=0; PB_OD

20、R=timea+; duan=1; duan=0; for(i=100;i>0;i-);/延時a=0;/*查看/刪除鬧鐘函數*/void clock_display(void)unsigned char a=0,i;times_bi_duan_ma(hour_lr,minute_lr,second_lr);display(times);if(esc=1)esc=0;for(i=0;i<8;i+)hour_lr=0; minute_lr=0; second_lr=lr+1; if(T3=0)right=0;/5s內鍵盤無輸入,切換到原來的顯示模式/*鍵盤掃描函數*/void keys

21、can(void)T2=241;/延時241ms,消抖if(PD_IDR&0x01)=0x00)/加或設置鬧鐘按鍵if(set=1|adjust=1)/鬧鐘或校時模式下if(*ud=9)*ud=0;else(*ud)+;/ud所指的變量加1else /正常顯示模式下 set=1; esc=0;ok=0; else if(PD_IDR&0x02)=0x00)/減或調整時間if(set=1|adjust=1)/鬧鐘或校時模式下if(*ud=0)*ud=9;else(*ud)-;/ud所指的變量減1else /正常顯示模式下 adjust=1;esc=0;ok=0;else if(P

22、D_IDR&0x04)=0x00)/左移/查看鬧鐘if(set=1|adjust=1)/鬧鐘或校時模式下lr-;if(lr=255)lr=7; else if(lr=5)lr=4;/跳過第3和6個數碼管 else if(lr=2)lr=1;else if(right=1)/查看鬧鐘模式下T3=5000; if(lr=0)lr=4;else lr-;else if(left=1)run=run1;/為1時秒表開始計時else left=1;esc=0;ok=0;else if(PD_IDR&0x08)=0x00)/右移/查看鬧鐘if(set=1|adjust=1)/鬧鐘或校時模式

23、下lr+;if(lr=8)lr=0;/跳過第3和6個數碼管 else if(lr=2)lr=3;else if(lr=5)lr=6;else if(right=1)/查看鬧鐘模式下T3=5000; if(lr=4)lr=0;else lr+;else right=1;T3=5000;esc=0;ok=0;else if(PD_IDR&0x10)=0x00)/確定off=0;/退出省電模式 tab=tab1;if(ok=0)ok=1;else if(ok=1&adjust=1)esc=1;else if(PD_IDR&0x20)=0x00)/取消刪除或進入省電模式if(a

24、djust=1|set=1)set=0; ok=0; lr=0; ud=0; adjust=0;set_c=1; adjust_t=1; check_clock=1; else if(set=0&adjust=0&left=0&right=0) off=1;ok=0;else esc=1;else 1;調試過程因為此次程序比較大,實現的功能比較多,所以從一開始我便一個功能一個功能的做,邊做邊調試,做完一個功能之后才做下一個。第一次做數碼管顯示的時候就出現問題,8個數碼管一直顯示亂碼。當時我就把程序用原來的動態顯示改為靜態顯示,可是還是不行。于是我就再把8個數碼管同時顯示改為一個數碼管顯示,這下就可以了。然后我又再把顯示的位數慢慢增加,當增加到第5位的時候發現,亂碼又來了,之后我又改用其他引腳,發現原來之前寫的程序時沒有錯的,是因為芯片的一個引腳出問題了,不知道為什么,那個引腳總是高電平。所以才導致了之前的亂碼一直出來。數碼管調試好之后,其他的程序調試起來就順利多了,在用到蜂鳴器的時候還遇到了一個問題。因為之前課程設計做蜂鳴器電路的時候都是做

溫馨提示

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

評論

0/150

提交評論