單片機課程設計報告基于單片機的時鐘設計樣本_第1頁
單片機課程設計報告基于單片機的時鐘設計樣本_第2頁
單片機課程設計報告基于單片機的時鐘設計樣本_第3頁
單片機課程設計報告基于單片機的時鐘設計樣本_第4頁
單片機課程設計報告基于單片機的時鐘設計樣本_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單片機課程設計報告設計課題:基于MCS-51單片機時鐘設計專業(yè)班級:小構成員:指引教師:設計時間:目錄設計任務與規(guī)定 31.基本設計規(guī)定 32.選作項目 4有關硬件構造概述 41.硬件構造原理 42.有關電路圖: 7軟件構造概述 8程序清單 10程序調(diào)試 17課程總結 17參照文獻 19設計任務與規(guī)定1.基本設計規(guī)定

(1)在ZY15MCU12BD型綜合單片機實驗箱硬件構造上編寫軟件完畢設計。也可以在其他MCS—51單片機硬件板上完畢,或自行設計硬件并制做完畢。

(2)程序首地址應使目的機可以直接運營,即從0000H開始。在主程序開始某些必要設立一種適當棧底。程序放置地址須持續(xù)且靠前,不要在中間留下大量空閑地址,以使目的機可以使用較少硬件資源。(3)6位LED數(shù)碼管從左到右分別顯示時、分、秒(各占用2位),采用24小時原則計時制。開始計時時為000000,到235959后又變成000000。

(4)在鍵盤上選定3個鍵分別作為小時、分、秒調(diào)校鍵。每按一次鍵,相應顯示值便加1。分、秒加到59后再按鍵即變?yōu)?0;小時加到23后再按鍵即變?yōu)?0。在調(diào)校時均不向上一單位進位(例如分加到59后變?yōu)?0,但小時不發(fā)生變化)。(5)軟件設計必要使用MCS-51片內(nèi)定期器,采用定期中斷構造,不得使用軟件延時法。(6)上機調(diào)試通過。2.選作項目有能力同窗,在做完以上設計后,可選作此項設計內(nèi)容。(1)另設三個鍵,分別作小時、分、秒減1調(diào)校。(2)在以上設計基本上,修改程序制作一種電子秒表。分、秒各占用2位顯示,1/10秒、1/100秒各占用1位顯示。設定二個鍵分別作啟動/停止、清零。(3)在做完(2)后,將時鐘與秒表合二為一,并且在同步使用時互不影響。即可在時鐘與秒表之間任意切換,而不影響走時、計秒。有關硬件構造概述硬件構造原理該課程設計基于STC89C52單片機為核心完畢,外加少量其她輔助器件,硬件構造比較簡樸。由于本電路構造比較簡樸,單片機I/O口完全夠用,故咱們將6位8段LED直接和單片機相連。硬件構造中6位8段LED顯示屏,采用動態(tài)方式驅動。咱們采用是共陽電路,一位LED顯示屏顯示內(nèi)容一段時間,然后下一位LED顯示屏顯示內(nèi)容一段時間……,周而復始。只要刷新頻率不不大于50Hz,就可以獲得清晰穩(wěn)定顯示效果。為了增長和位選相連接I/O口驅動能力,直接接上上拉電阻。在本設計中,只使用了6個按鍵。復位鍵,模式設定鍵、2個上下調(diào)節(jié)鍵。1、定期器/計數(shù)器定期器/計數(shù)器簡稱定期器,其作用重要用于生產(chǎn)各種時間間隔、記錄外部脈沖與事件數(shù)量等,是微機中最慣用、最基本部件之一。89C52單片機有2個16位定期器/計數(shù)器0(T0)和定期器1(T1).T0由2個定期寄存器TH0和Th0構成,T1則由Th1和TL1構成,她們分別映射在特殊功能寄存器中,從而可以通過對特殊功能寄存器讀寫來實現(xiàn)對這兩個定期器操作。作為定期器時,每個機器周期定期寄存器自動加1,因此定期器也可以看做是計量機器周期計數(shù)器。由于每個機器周期為12個時鐘震蕩周期,因此定期器辨別率是時鐘震蕩頻率1/12.作為計數(shù)器時,只要在單片機外部引腳T0(T1)有從1到0電平負跳變,計數(shù)器自動加1.計數(shù)最高頻率普通為振蕩頻率1/24,例如,選用12MHz晶振,則最高計數(shù)頻率為0.5MHz。2、中斷系統(tǒng)當中央解決器CPU正在執(zhí)行某程序時,由于某種因素,外界向CPU發(fā)出暫停當前工作去解決更重要事情祈求,程序被打斷;CPU響應當祈求并轉入相應解決程序,解決程序完畢后來,再返回本來程序被打斷位置,繼續(xù)本來工作,這一過程稱為中斷。實現(xiàn)中斷功能部件稱為中斷系統(tǒng),或稱為中斷控制邏輯系統(tǒng)。89C52單片機中斷系統(tǒng)簡樸實用。其基本特點是:有6個固定可屏蔽中斷源,4個在片內(nèi),2個在片外,她們在程序存儲器中各有固定中斷入口地址,由此進入中斷服務程序;6個中斷源由兩級有先級,可形成中斷嵌套;2個特殊功能寄存器用于中斷控制和條件設立編程。若某個中斷源通過編程設立,處在被打開狀態(tài),并滿足中斷響應條件,并且滿足如下3個條件時,單片機響應此中斷:1)當前正在執(zhí)行那條指令已被執(zhí)行完。2)當前未響應同級或高檔中斷。3不在操作IE、IP中斷控制寄存器或執(zhí)行RETI中斷指令。在正常狀況下,從中斷祈求信號有效開始,到中斷得到響應,普通需要3個機器周期到8個機器周期。中斷得到響應后,自動清除中斷祈求標志(對串行I\O端口中斷標志,要用軟件清除),將斷點即程序計數(shù)器之值(PC)壓入堆棧(以備恢復用);然后把相應中斷入口地址裝入PC,使程序轉入相應中斷服務程序中去執(zhí)行。各個中斷源在程序寄存器中中斷入口地址如表1所示。中斷源入口地址INT0(外部中斷0)0003HTF0(T0中斷)000BHINT1(外部中斷T1)0013HTF1(T1中斷)001BHRI/TI(串行口中斷)0023HTF2(T2中斷)002BH各個中斷入口地址相隔很近,不便于存儲各個比較長中斷服務程序,故普通將中斷服務程序存儲在此外以便存儲地方,而在中斷入口地址開始二三個單元中,安排一條轉移類指令,以轉入中斷服務程序。由于6個中斷源各有其中斷求標志IE0、TF0、IE1、TF1、RI/TI以及TF2,在中斷源滿足中斷祈求條件下,各標志自動置1,向CPU祈求中斷。如果某個中斷源提出中斷祈求后,CPU不能及時響應,只要該中斷祈求標志不被軟件以為清除,中斷祈求狀態(tài)就將始終保持,直到CPU響應此中斷為止。對串行口中斷而言,這一過程與其她5個中斷不同之處在于,雖然CPU響應了中斷,其中斷標志RI/TI也不會清零,必要在中斷服務程序中設立清除RI/TI指令后,才有也許再一次提出中斷祈求。CPU現(xiàn)場保護和恢復必要由被響應相應中斷服務程序去完畢。當執(zhí)行RI/TI中斷返回指令后,斷點值自動從棧頂2字節(jié)彈出并裝入PC寄存器,使CPU繼續(xù)執(zhí)行被打斷程序。本課程設計中用到定期器T0,并通過T0定期時間到產(chǎn)生中斷。由于實驗中定期器T0工作于方式1(即16位方式)且定期器中斷容許,因而當定期器計滿回零時,TF=1,并可申請中斷;當CPU響應中斷并進入中斷服務程序后,TF自動清零。因此,在中斷服務程序中只需要重新設立定期器初始值。如果通過對TF查詢來擬定定期器狀態(tài)(定期器中斷不被容許),在查得TF=1,亦即定期器回零后,要用指令將TF清零,以便下次操作。有關電路圖:八段數(shù)碼管:共陽極電路:各某些電路原理圖:顯示某些電路:電源某些電路:單片機某些電路:數(shù)碼管驅動電路:控制按鈕:復位電路:仿真原理圖:最后PCB圖:軟件構造概述1.主程序在主程序中只完畢系統(tǒng)初始化,同步進行時、分、秒按鍵掃描。如果有按鍵按下,則做相應時、分、秒計數(shù)數(shù)據(jù)加1解決。主程序執(zhí)行流程圖如下圖所示:開始開始初始化(定期器、顯示區(qū)、初始化(定期器、顯示區(qū)、中斷系統(tǒng)、計數(shù)單元等)開中斷開中斷調(diào)用顯示子程序調(diào)用顯示子程序調(diào)用鍵盤掃描子程序調(diào)用鍵盤掃描子程序N有鍵按下?N有鍵按下?YY關中斷關中斷YY秒加1解決秒鍵?秒加1解決秒鍵?NNYY分加1解決分加1解決NNYY小時加1解決分鍵?小時鍵?小時加1解決分鍵?小時鍵?NN圖1主程序流程圖圖1主程序流程圖(2)定期器中斷服務程序定期器T0用于時間計時。定期計數(shù)個數(shù)為5000,由于采用12MHz晶體振蕩器,因此定期益處中斷周期為5000us=1ms。為保證計時精確性,進入中斷服務程序時應及時重設計數(shù)初始值。在中斷程序中還要判斷與否計時1s,若是,還應通過調(diào)用其她子程序作時、分、秒值解決。定期器中斷解決定期器中斷解決重送初值重送初值保護現(xiàn)場保護現(xiàn)場計數(shù)單元加1計數(shù)單元加1NN到1秒?到1秒?秒加1秒加1N秒清0、分加1秒到60?N秒清0、分加1秒到60?NN分清0、小時加1分到60?分清0、小時加1分到60?N小時到24?小時清0N小時到24?小時清0恢復現(xiàn)場恢復現(xiàn)場中斷返回中斷返回圖2定期器中斷程序流程圖圖2定期器中斷程序流程圖(3)顯示子程序該子程序通過在中斷服務程序中被調(diào)用而執(zhí)行。每一次中斷程序調(diào)用一次,其作用是依照掃描指針循環(huán)驅動各個數(shù)碼管。(4)時鐘調(diào)節(jié)子程序當中斷程序中判斷出計時1s時,該程序即被調(diào)用執(zhí)行。其作用為將秒計數(shù)值加1,同步判斷與否應對時批、分作相應修改。(5)延時子程序用于鍵盤延時去抖。程序清單:#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#defineuintunsignedint/*八段共陰管顯示定義*/unsignedcharwei[8]={0x1f,0x2f,0x37,0x3b,0x3d,0x3e};unsignedcharcodeduan1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharcodeduan2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};ucharBUFF[6];/*定義并初始化變量*/ucharsecond=0;minute=0;hour=0;unit=0;hun=0;ten=0;sec=0;min=0;m,n,q;sbitP_s_add_on_off=P1^0;//鍵值定義sbitP_m_add=P1^1;sbitP_h_add=P1^2;sbitP_s_sub=P1^3;sbitP_m_sub=P1^4;sbitP_h_sub=P1^5;sbitP_del=P1^6;sbitP_tran=P3^7;/*函數(shù)聲明*/voiddelay(uchark);//延時子程序voidtime();//時間解決子程序voiddisplay();//時間顯示子程序voidkeyboard();//鍵盤掃描子程序voidstopwatch(); //秒表顯示子程序/*****************************//*延時子程序*//****************************/voiddelay(uchark){ucharj;while((k--)!=0){for(j=0;j<125;j++){;}}}/*****************************//*時間顯示子程序*//*****************************/voiddisplay(void){ uchari; BUFF[0]=duan1[second%10];//顯示秒個位 BUFF[1]=duan1[second/10];//顯示秒十位 BUFF[2]=duan2[minute%10];//顯示分個位 BUFF[3]=duan1[minute/10];//顯示分十位 BUFF[4]=duan2[hour%10];//顯示時個位 BUFF[5]=duan1[hour/10];//顯示時十位 for(i=0;i<6;i++) { P0=BUFF[i]; P2=wei[i]; delay(4); P2=0xff; }}/*******************************//*秒表顯示子程序*//******************************/voidstopwatch(void){ uchara;if(n==1){TR0=1;ET0=1;TR1=1;ET1=1;}if(n==0){TR0=1;ET0=1;TR1=0;ET1=0;}BUFF[0]=duan1[hun];BUFF[1]=duan2[ten];BUFF[2]=duan2[sec%10];BUFF[3]=duan1[sec/10];BUFF[4]=duan2[min%10];BUFF[5]=duan1[min/10];for(a=0;a<6;a++){P0=BUFF[a];P2=wei[a];delay(4);P2=0xff;}}/*******************************//*鍵盤掃描子程序*//*******************************/voidkeyboard(void){ if(P_tran==0){delay(100);if(P_tran==0)switch(m){case0:m++;break; //切換到秒表case1:m--;break; //切換屆時間}}if(m==1){if(P_s_add_on_off==0){delay(100);if(P_s_add_on_off==0){switch(n){ case0:n++;break;case1:n--;break;}}}}if(m==1&&n==0){if(P_del==0){delay(100);if(P_del==0){hun=0;ten=0;sec=0;min=0;}}}if(m==0){if(P_del==0)delay(100);if(P_del==0){switch(q){case0:q++,TR0=0,ET0=0;break;case1:q--,TR0=1,ET0=1;break;}}} if(q==1) {if(P_s_add_on_off==0)//秒調(diào)節(jié){TR0=0; delay(100);if(P_s_add_on_off==0) //秒加法{second++;if(second==60){second=0;}} TR0=1; }if(P_s_sub==0) //秒減法 { TR0=0; delay(100); if(P_s_sub==0) second--; if(second==0) { second=59; } TR0=1; } if(P_m_add==0)//分調(diào)節(jié){TR0=0; delay(100);if(P_m_add==0) //分加法{minute++;if(minute==60){minute=0;}}TR0=1; }if(P_m_sub==0) //分減法 { TR0=0; delay(100); if(P_m_sub==0) minute--; if(minute==0) { minute=59; } TR0=1; } if(P_h_add==0)//時調(diào)節(jié){TR0=0; delay(100);if(P_h_add==0) //時加法{hour++;if(hour==24){hour=0;}}TR0=1; } if(P_h_sub==0) //時減法 { TR0=0; delay(100); if(P_h_sub==0) hour--; if(hour==0) { hour=23; } TR0=1; }}}voidtimer0(void)interrupt1//定期器0方式1,50ms中斷一次{TH0=(65536-50000)/256; TL0=(65536-50000)%256;unit++;if(unit==20){second++;unit=0;//注意點。對計數(shù)單元清零十分重要,本次調(diào)試中就是 if(second==60)//秒鐘設為60進制{second=0;minute++;if(minute==60)//分鐘設為60進制{minute=0;hour++;if(hour==24)//時鐘設為24進制{hour=0;}}}}}voidtimer1(void)interrupt3 //定期器1方式1,10ms中斷一次{TH1=(65536-10000)/256;TL1=(65536-10000)%256;hun++;if(hun==10){hun=0;ten++;if(ten==10){ten=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;}}}}}/**************************//*主函數(shù)*//**************************/voidmain(void){m=n=q=0;TMOD=0x11;//time0為定期器,方式1TH0=(65536-50000)/256;//預置計數(shù)初值TL0=(65536-50000)%256;TH1=(65536-10000)/256;TL1=(65536-10000)%256;EA=1;ET0=1; //開定期器0中斷ET1=1;TR0=1; //啟動定期器0while(1){keyboard();//按鍵掃描if(m==0){display();}if(m==1){stopwatch();}}}程序調(diào)試初LED顯示時鐘時間與實際時間快慢不一致,通過調(diào)節(jié)定期器,變化給TLO、THO賦初值大小,通過幾次調(diào)試最后顯示時間與實際時間相接近。秒表和時鐘功能能通過幾次調(diào)試,始終不可以完畢切換,存在一定問題。課程總結這幾周咱們做了單片機課程設計,真正做到了把所學到知識應用于實踐中。通過本次課程設計,使我更加夯實掌握了關于單片機方面知識,在設計過程中雖然遇到了某些問題,但通過一次又一次思考,一遍又一遍檢查終于找出了因素所在,也暴露出了前期在這方面知識欠缺和經(jīng)驗局限性。實踐出真知,通過親自動手制作,使咱們掌握知識不再是紙上談兵。過而能改,善莫大焉。在課程設計過程中,咱們不斷發(fā)現(xiàn)錯誤,不斷改正,不斷領悟,不斷獲取。最后檢測調(diào)試環(huán)節(jié),自身就是在踐行“過而能改,善莫大焉”知行觀。這次課程設計終于順利完畢了,在設計中遇到了諸多問題,最后在教師指引下,終于游逆而解。在此后社會發(fā)展和學習實踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩發(fā)現(xiàn)問題所在,然后一一進行解決,只有這樣,才干成功做成想做事,才干在此后道路上劈荊斬棘,而不是知難而退,那樣永遠不也許收獲成功,收獲喜悅,也永遠不也許得到社會及她人對你承認!我以為,在這學期實驗及課程設計中,不但培養(yǎng)了獨立思考、動手操作能力,在各種其他能力上也均有了提高。更重要是,在實驗課上,咱們學會了諸多學習辦法。而這是日后最實用,真是受益匪淺。要面對社會挑戰(zhàn),只有不斷學習、實踐,再學習、再實踐。這對于咱們將來也有很大協(xié)助。后來,不論有多苦,我想咱們都能變苦為樂,找尋有趣事情,發(fā)現(xiàn)其中貴重事情。這樣咱們都可以在實驗結束之后變更加成熟,會晤對需要面對事情。另一方面,在這次課程設計中,咱們運用到了此前所學專業(yè)課知識,如:CAD制圖、匯編語言、模仿和數(shù)字電路知識等。雖然過去從未獨立應用過它們,但在學習過程中帶著問題去學我發(fā)現(xiàn)效率很高,這是咱們做這次課程設計又一收獲。要做好一種課程設計,就必要做到在設計程序之前,對所用單片機內(nèi)部構造有一種系統(tǒng)理解,懂得該單片機內(nèi)有哪些資源;要有一種清晰思路和一種完整軟件流程圖;在設計程序時,不能妄想一次就將整個程序設計好,重復修改、不斷改進是程序設計必經(jīng)之路;要養(yǎng)成注釋程序好習慣,一種程序完美與否不但僅是實現(xiàn)功能,而應當讓人一看就能明白你思路,這樣也為資料保存和交流提供了以便;在設計課程過程中遇到問題是很正常德,但咱們應當將每次遇到問題記錄下來,并分析清晰,以免下次再遇到同樣問題課程設計結束了,但是從中學到知識會讓我受益終身。發(fā)現(xiàn)、提出、分析、解決問題和實踐能力提高都會受益于我在后來學習、工作和生活中。設計過程,常有某些不如意,但畢竟這是第一次做,難免會遇到各種各樣問題。在設計過程中發(fā)現(xiàn)了自己局限性之處,對此前所學過知識理解得不夠深刻,掌握得不夠牢固。咱們通過查閱大量關于資料,并在小組中互相討論,交流經(jīng)驗和自學,若遇到實在搞不明白問題就會及時請教教師,使自己學到了不少知識,也經(jīng)歷

溫馨提示

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

評論

0/150

提交評論