單片機課程設(shè)計實驗報告+基于單片機的數(shù)字時鐘+含完整實驗代碼_第1頁
單片機課程設(shè)計實驗報告+基于單片機的數(shù)字時鐘+含完整實驗代碼_第2頁
單片機課程設(shè)計實驗報告+基于單片機的數(shù)字時鐘+含完整實驗代碼_第3頁
單片機課程設(shè)計實驗報告+基于單片機的數(shù)字時鐘+含完整實驗代碼_第4頁
單片機課程設(shè)計實驗報告+基于單片機的數(shù)字時鐘+含完整實驗代碼_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、單片機課程設(shè)計報告基于單片機的數(shù)字時鐘姓名: 班級:學(xué)號:一、 前言利用實驗板上的4個LED數(shù)碼管,設(shè)計帶有鬧鈴、秒表功能的數(shù)字時鐘。功能要求:a) 計時并顯示(LED)。由于實驗板上只有4位數(shù)碼管,可設(shè)計成顯示“時分”和顯示“分秒”并可切換。b) 時間調(diào)整功能。利用4個獨立按鈕,實現(xiàn)時鐘調(diào)整功能。這4個按鈕的功能為工作模式切換按鈕(MODE),數(shù)字加(INC),數(shù)字減(DEC)和數(shù)字移位(SHITF)。c) 定鬧功能。利用4個獨立按鈕設(shè)定鬧鐘時間,時間到以蜂鳴器響、繼電器動作作為鬧鈴。d) 秒表功能。最小時間單位0.01秒。二、 硬件原理分析1. 電源部分 電源部份采用兩種輸入接口(如上圖)

2、。a) 外電源供電,采用2.1電源座,可接入電源DC5V,經(jīng)單向保護D1接入開關(guān)S1。b) USB供電,USB供電口輸入電源也經(jīng)D1單向保護,送到開關(guān)S1。 注:兩路電源輸入是并連的,因此只選擇一路就可以了,以免出問題。 S1為板子工作電源開關(guān),按下后接通電源,提供VCC給板子各功能電路。電路采用兩個濾波電容,給板子一個更加穩(wěn)定的工作電源。LED為電源的指示燈,通電后LED燈亮。2. 蜂鳴器 蜂鳴器分為有源和無源兩種,有源即兩引腳有一個直流電源就可以長鳴,無源則需要一個1K左右的脈沖才可以蜂鳴,因此對于按鍵的提示音及報警蜂鳴使用有源來得方便。有源也可以當(dāng)無源使用,而無源則不能當(dāng)有源使用,當(dāng)然用

3、有源蜂鳴器作音樂發(fā)聲會失真厲害。如上圖:單片機P15輸出高低電平經(jīng)R21連接三極管B極,控制三極管的導(dǎo)通與截止,從而控制蜂鳴器的工作。低電平時三極管導(dǎo)通,蜂鳴器得電蜂鳴,高電平時三極管截止,蜂鳴器失電關(guān)閉蜂鳴。3. 數(shù)碼管 電路使用一個四位共陽型數(shù)碼管,四個公共陽級由三極管放大電流來驅(qū)動,三極管由P10-P13控制開與關(guān)。數(shù)碼管的陰級由P0口經(jīng)過電阻限流連接。 例如,要十位的數(shù)碼管工作,P12輸出0,使三極管Q12導(dǎo)通,8腳得電,當(dāng)P0口相應(yīng)位有輸出0時,點亮相應(yīng)的LED燈組合各種字符數(shù)字。4. 獨立鍵盤如上圖,由六個按鍵組成,每個按鍵的一端連接IO口,另一端直接連接GND(0電位)。六個按鍵

4、分別接入P37-P32,只要按下按鍵,相應(yīng)位的IO口位將被拉為低電平(0),程序可以判斷相應(yīng)位是否為0來確認(rèn)按鍵己按下。5. 動態(tài)顯示 動態(tài)顯示驅(qū)動電路是單片機應(yīng)用中最常用的顯示方式。 動態(tài)顯示接口電路是把所有顯示器的8個筆劃段的同名段連在一起,而每一個顯示器的公共極COM是各自獨立地受I/O線控制。CPU向字段輸出口送出字形碼時,所有顯示器接收到相同的字形碼,但究竟是哪個顯示器亮,則取決于COM端。在輪流點亮掃描過程中,每位顯示器的點亮?xí)r間是極為短暫的(約1ms),但由于人眼的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實際上各位顯示器并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定

5、的顯示數(shù)據(jù),不會有閃爍感。 動態(tài)掃描顯示必須由CPU不斷地調(diào)用顯示程序,才能保證持續(xù)不斷的顯示。在實際工作中,當(dāng)然不可能只顯示,這樣在兩次調(diào)用顯示程序之間的時間間隔就不一定了,如果時間間隔比較長,就會使顯示不連續(xù)。三、 軟件設(shè)計l 主程序?qū)存I1設(shè)定為功能選擇鍵,每按一次按鍵1,進入相應(yīng)的功能模式。l 分秒顯示分秒顯示模式下,數(shù)碼管顯示時鐘時間的分和秒。當(dāng)按鍵1按下后,進入下一模式。l 時分顯示時分顯示模式下,數(shù)碼管顯示時鐘時間的時和分。當(dāng)按鍵1按下后,進入下一模式。l 時間調(diào)整時間調(diào)整模式下,僅調(diào)整時鐘的時、分。數(shù)碼管閃爍的為當(dāng)前調(diào)整的位子,按鍵2為加,按鍵3為減,按鍵4為移位鍵。l 鬧鐘鬧

6、鐘模式下,可設(shè)置鬧鐘的時、分。數(shù)碼管閃爍的為當(dāng)前調(diào)整的位子,按鍵2為加,按鍵3為減,按鍵4為移位鍵。當(dāng)鬧鐘時間調(diào)整完畢之后,按下按鍵5,確認(rèn)鬧鐘時間。隨后等待時鐘時間到達鬧鐘時間。時鐘時間到達鬧鐘時間后,蜂鳴器工作。l 秒表秒表模式下,按下按鍵4,秒表開始計時;再次按下按鍵4,秒表暫停。按下按鍵2或按鍵3,秒表清零。四、 軟件調(diào)試在軟件調(diào)試過程中碰到了很多問題。其中比較重要的幾個問題如下:1、時鐘調(diào)整子程序中,時、分的十位數(shù)、個位數(shù)加減不符合常識。比如在加減時,小時可以達到27、28等數(shù)值,而這是不符合常識的。在查看代碼后發(fā)現(xiàn),可以在加、減過程中設(shè)置if函數(shù)判斷當(dāng)前所處位置,調(diào)整當(dāng)前數(shù)值所能達

7、到的最大值或最小值。修改后代碼如下:else if(keyval=0xbf) /按鍵2 加if(pos=0)dispbufpos+;if(dispbufpos=3)dispbufpos=0;else if(pos=1)if(dispbuf0=0|dispbuf0=1)dispbufpos+;dispbufpos=dispbufpos%10;if(dispbuf0=2)dispbufpos+;if(dispbufpos>=4)dispbufpos=0;else if(pos=2)dispbufpos+;if(dispbufpos=6)dispbufpos=0;else if(pos=3)d

8、ispbufpos+;dispbufpos=dispbufpos%10;else if(keyval=0xdf) /按鍵3 減 if(pos=0)if(dispbufpos=0)dispbufpos=2;else dispbufpos-;else if(pos=1)if(dispbuf0=0|dispbuf0=1)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;if(dispbuf0=2)if(dispbufpos>=4&&dispbufpos<=9)dispbufpos=3;else if(dispbufpos=0)di

9、spbufpos=3;else dispbufpos-;else if(pos=2)if(dispbufpos=0)dispbufpos=5;else dispbufpos-;else if(pos=3)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;2、秒表模式下,無法很好地區(qū)分當(dāng)前計時所達到的具體數(shù)值。在秒的個位數(shù)位子設(shè)置一個小數(shù)點,使秒表的顯示更加直觀。修改后代碼如下:在程序開始處,添加如下代碼:unsigned char code segtab_dot=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,

10、0x10;/帶小數(shù)點的數(shù)碼管代碼 在void t0int(void) interrupt 1 using 1之中添加如下代碼:if(mode=4&&P1=0xfd)/秒表處顯示小數(shù)點的if語句P0=segtab_dotdispbufdispindex;elseP0=segtabdispbufdispindex;3、在秒表運行一遍后,進入其他模式操作完畢,再次進入秒表模式下發(fā)現(xiàn)秒表無法清零。檢查代碼后發(fā)現(xiàn),在鬧鐘模式下,進入秒表模式時,未對秒表清零。修改后代碼如下:if(keyval=0x7f)/1號按鍵 模式 進入秒表模式mode=4;old_ss=0;old_ms=0;mia

11、obiao_ss=old_ss;miaobiao_ms=old_ms;dispbuf0=miaobiao_ss/10;dispbuf1=miaobiao_ss%10;dispbuf2=miaobiao_ms/10;dispbuf3=miaobiao_ms%10;clocksing=0;附完整實驗代碼:/*基于單片機的數(shù)字時鐘 功能:時鐘、鬧鐘、秒表模式0:時鐘顯示模式-分、秒模式0下,數(shù)碼管顯示時鐘時間-分、秒。按鍵說明:按鍵1:選擇下一模式。模式1:時鐘顯示模式-時、分模式1下,數(shù)碼管顯示時鐘時間-時、分。按鍵說明:按鍵1:選擇下一模式。模式2:時鐘調(diào)整模式模式2下,調(diào)整時鐘時間,僅調(diào)整時、

12、分時間。按鍵說明:按鍵1:選擇下一模式。按鍵2:增加選中數(shù)碼管的數(shù)值。按鍵3:減少選中數(shù)碼管的數(shù)值。按鍵4:移位鍵,按鍵選擇下一數(shù)碼管。模式3:鬧鐘模式模式3下,設(shè)置鬧鈴時間之后,等時鐘到達相應(yīng)時間,發(fā)出鈴聲。按鍵說明:按鍵1:選擇下一模式。按鍵2:增加選中數(shù)碼管的數(shù)值。按鍵3:減少選中數(shù)碼管的數(shù)值。按鍵4:移位鍵,按鍵選擇下一數(shù)碼管。按鍵5:設(shè)置鬧鈴時間后,按鍵確認(rèn),數(shù)碼管顯示當(dāng)前時鐘時間。模式4:秒表模式模式4為秒表模式,可記錄0-59秒。最小時間單位為0.01秒。按鍵說明:按鍵1:選擇下一模式。按鍵2:清除秒表當(dāng)前數(shù)值。按鍵3:清除秒表當(dāng)前數(shù)值。按鍵4:開始、暫停秒表。*/#includ

13、e <reg52.h>unsigned char dispbuf4=0,0,0,0;unsigned char code segtab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/不帶小數(shù)點的數(shù)碼管代碼unsigned char code segtab_dot=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/帶小數(shù)點的數(shù)碼管代碼unsigned char code bittab=0xfe,0xfd,0xfb,0xf7;unsigned char dispindex;uns

14、igned char mode;unsigned char pos;unsigned char keyval;unsigned char hh,mm,ss;unsigned char miaobiao_ms=0,miaobiao_ss=0;/秒表unsigned char old_ms,old_ss;/保存秒表時間unsigned char clock_hh,clock_mm;/用于存放所設(shè)鬧鐘時間unsigned int clock_shanshuo;/用于控制鬧鐘調(diào)整時間時是否閃爍 0:閃爍 1:不閃爍sbit clocksing=P15;/鬧鐘所用蜂鳴器unsigned int cnt;

15、/用于10ms轉(zhuǎn)1s計數(shù)unsigned char cnt1;/用于10ms轉(zhuǎn)0.5s處計數(shù)(用于閃爍)unsigned char cnt2;/用于秒表處計時unsigned char keyscan(void);void delay(unsigned int t);void keypro(void);bit flash;/*主函數(shù)*/void main(void)TMOD=0x11;TH0=(0-2000)/256;TL0=(0-2000)%256;ET0=1;TR0=1;TH1=(0-2000)/256;TL1=(0-2000)%256;ET1=1;TR1=0;/秒表 先不開EA=1;mo

16、de=0;hh=02;mm=03;ss=15;while(1)if(mode=3)if(hh=clock_hh)if(mm=clock_mm)clocksing=0;elseclocksing=1;elseclocksing=1;if(keyscan()=0xff) continue;keypro();/*鍵掃描程序*/unsigned char keyscan(void)P3=0xff;keyval=P3;if(keyval=0xff) return 0xff;delay(10000);if(keyval!=P3) return 0xff;else while(P3!=0xff);retur

17、n keyval;/*時鐘中斷及顯示程序*/void t0int(void) interrupt 1 using 1TH0=(0-2000)/256;/2msTL0=(0-2000)%256;P0=0xff;P1=0xff;P1=bittabdispindex;if(mode=4&&P1=0xfd)/秒表處顯示小數(shù)點的if語句P0=segtab_dotdispbufdispindex;elseP0=segtabdispbufdispindex;if(dispindex=pos)&&(flash=1)&&(mode=2|(mode=3&&a

18、mp;clock_shanshuo=0)/閃爍控制程序P0=0xff;P1=0xf0;dispindex+;dispindex=dispindex&0x03;cnt+;cnt1+;if(cnt1>=250)/0.5ms閃爍cnt1=0;flash=flash;if(cnt>=500)/2ms*500=1scnt=0;ss+;if(ss>=60)ss=0;mm+;if(mm>=60)mm=0;hh+;if(hh>=24)hh=0;if(mode=0)dispbuf0=mm/10;dispbuf1=mm%10;dispbuf2=ss/10;dispbuf3=s

19、s%10;else if(mode=1|(mode=3&&clock_shanshuo=1)dispbuf0=hh/10;dispbuf1=hh%10;dispbuf2=mm/10;dispbuf3=mm%10; /*按鍵選擇,進入不同模式*/void keypro(void)switch(mode)case 0:/顯示分秒if(keyval=0x7f)mode=1;dispbuf0=hh/10;dispbuf1=hh%10;dispbuf2=mm/10;dispbuf3=mm%10;break;case 1:/顯示時分if(keyval=0x7f) mode=2;dispbu

20、f0=hh/10;dispbuf1=hh%10;dispbuf2=mm/10;dispbuf3=mm%10;break;case 2:/時間調(diào)整(只調(diào)整時分) if(keyval=0x7f) /按鍵1調(diào)整模式進入鬧鐘模式mode=3;clock_hh=0;clock_mm=0;clock_shanshuo=0;hh=dispbuf0*10+dispbuf1; /保存調(diào)整后的時間mm=dispbuf2*10+dispbuf3;dispbuf0=clock_hh/10;/顯示鬧鐘的初始時間dispbuf1=clock_hh%10;dispbuf2=clock_mm/10;dispbuf3=cloc

21、k_mm%10;TR0=1;else if(keyval=0xbf) /按鍵2 加if(pos=0)dispbufpos+;if(dispbufpos=3)dispbufpos=0;else if(pos=1)if(dispbuf0=0|dispbuf0=1)dispbufpos+;dispbufpos=dispbufpos%10;if(dispbuf0=2)dispbufpos+;if(dispbufpos>=4)dispbufpos=0;else if(pos=2)dispbufpos+;if(dispbufpos=6)dispbufpos=0;else if(pos=3)dispb

22、ufpos+;dispbufpos=dispbufpos%10;else if(keyval=0xdf) /按鍵3 減 if(pos=0)if(dispbufpos=0)dispbufpos=2;else dispbufpos-;else if(pos=1)if(dispbuf0=0|dispbuf0=1)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;if(dispbuf0=2)if(dispbufpos>=4&&dispbufpos<=9)dispbufpos=3;else if(dispbufpos=0)dispbu

23、fpos=3;else dispbufpos-;else if(pos=2)if(dispbufpos=0)dispbufpos=5;else dispbufpos-;else if(pos=3)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;else if(keyval=0xef) /按鍵4 移位pos+;pos=pos&03;break;case 3:/鬧鐘模式if(keyval=0x7f) /按鍵1調(diào)整模式進入秒表模式mode=4;old_ss=0;old_ms=0;miaobiao_ss=old_ss;miaobiao_ms=old_

24、ms;dispbuf0=miaobiao_ss/10;dispbuf1=miaobiao_ss%10;dispbuf2=miaobiao_ms/10;dispbuf3=miaobiao_ms%10;else if(keyval=0xbf)/按鍵2加clock_shanshuo=0;if(pos=0)dispbufpos+;if(dispbufpos=3)dispbufpos=0;else if(pos=1)if(dispbuf0=0|dispbuf0=1)dispbufpos+;dispbufpos=dispbufpos%10;if(dispbuf0=2)dispbufpos+;if(disp

25、bufpos>=4)dispbufpos=0;else if(pos=2)dispbufpos+;if(dispbufpos=6)dispbufpos=0;else if(pos=3)dispbufpos+;dispbufpos=dispbufpos%10;else if(keyval=0xdf)/按鍵3 減clock_shanshuo=0;if(pos=0)if(dispbufpos=0)dispbufpos=2;else dispbufpos-;else if(pos=1)if(dispbuf0=0|dispbuf0=1)if(dispbufpos=0)dispbufpos=9;el

26、se dispbufpos-;if(dispbuf0=2)if(dispbufpos>=4&&dispbufpos<=9)dispbufpos=3;else if(dispbufpos=0)dispbufpos=3;else dispbufpos-;else if(pos=2)if(dispbufpos=0)dispbufpos=5;else dispbufpos-;else if(pos=3)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;else if(keyval=0xef)/按鍵4移位clock_shanshuo=0;pos+;pos=pos&03;else if(keyval=0xf7) /按鍵5設(shè)置鬧鐘時間clock_shanshuo=1;clock_hh=dispbuf0*10+dispbuf1; /保存所設(shè)鬧鐘時間clock_mm=dispbuf2*10+dispbuf3;dispbuf0=hh/10;dispbuf1=hh%10;dispbuf2=mm/10;dispbuf3=mm%10;break;case 4:/秒表模式if(keyval=0x7f) /按鍵1調(diào)整模式進入時鐘顯示模式mode=0;TR1=0; /關(guān)閉秒表dispbuf0=mm/10;dispbuf1=mm%1

溫馨提示

  • 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

提交評論