|
一、設計的目的 課程設計是自動化專業集中實踐環節的主要內容之一。訓練正確地應用單片機,培養解決工業控制、工業檢測等領域具體問題的能力。學生通過所做課題,熟悉單片機應用系統開發研制的過程,軟硬件設計的工作方法、內容及步驟,對學生進行基本技能訓練。例如組成系統、編程、調試、繪圖等。使學生理論聯系實際,提高動手能力和分析問題、解決問題的能力。 通過本課程設計,主要達到以下目的: 1.使學生增進對單片機的感性認識,加深對單片機理論方面的理解。 2.使學生掌握單片機的內部功能模塊的應用,如定時器/計數器、中斷、片內外存貯器、I/O口、串行口通訊等。 3.使學生了解和掌握單片機應用系統的軟/硬件設計過程、方法及實現,為以后設計和實現單片機應用系統打下良好基礎。 二、課程設計的要求 1.學生需認真閱讀課程設計任務書,熟悉有關設計資料及參考資料,熟悉各種設計規范的有關內容,認真完成任務書規定的設計內容。 2.課程設計的成果為“課程設計報告”。課程設計報告內容要正確,概念要清楚,完成任務書所規定的內容,附有原理圖及程序流程圖,程序清單,文字要通順,書寫要工整,設計圖紙必須符合規范。 3.課程設計報告應在2000字以上(含相關圖紙和計劃書等),用A4紙打印。 三、課程設計的選題參考(可另自行擬題或參考教材和實驗指導書) 1.交通燈系統設計 2.計時器系統設計 3.出租車計價器系統設計 4.頻率計系統設計 5.溫度控制系統設計 6.音樂播放系統設計 四、時間安排及成績評定 課程設計時間:6月21日(16周周四)下午布置課程設計,6月25日(17周周一)下午4:30在信息行政樓八層自動化系會議室輔導課程設計,6月27日全天(自動化1、2班),6月28日全天(自動化3、4班),6月29日全天(交控1班、創新2班)在信息實驗樓2層計算機實驗室上機調試電路及程序,7月2日上午各班長收齊設計報告交給輔導老師。輔導老師根據學生的設計表現,設計報告書、圖紙等進行評定。課程設計成績按百分制分評定。
3.設計步驟敘述 3.1選題過程 本次單片機課程設計的選題我參考了教材第十一章實驗及課程設計中的11.3.3課程設計參考題目及要求中的選題示例,選擇了電子鐘為本次的課程設計題目,同時參考了秒表和定時鬧鐘課題,準備對電子鐘課題進行秒表或者鬧鐘的功能擴展,從而達到一定的難度系數,然后填寫了選題說明書,確定了設計內容與目的功能,最后開始圍繞設計的功能開始本次的課程設計。 3.2硬件設計說明 本電子時鐘主要由單片機,鍵盤,數碼管顯示接口電路和蜂鳴器電路構成 (1)AT89C51芯片 AT89C51芯片的引腳圖如圖所示。 AT89C51芯片引腳
其中主要應用到的引腳口介紹: a.P0口的第一功能是作為一般I/O口使用,第二功能是在CPU訪問外部存儲器時,分時提供低8位地址和8位雙向數據。 b.P1口是8位準雙向I/O口,51子系列中P1只能用作一般I/O口,52子系列中P1.0和P1.1引腳還具有第二功能。 c.P2口是8位準雙向I/O口,第二功能是在CPU訪問外部存儲器時,作為高8位地址總線,輸出高8位地址。 d.P3口是8位準雙向I/O口,其第一功能是用作一般I/O口,第二功能是作為中斷信號和外部數據存儲器的讀寫控制信號。 e.RES,復位信號高電平有效。 (2)鍵盤電路 鍵盤電路如圖所示 P3口連接按鍵,當按鍵沒有按下時,P3.0~P3.4為高電平,若按下則變低電平
(3)數碼管顯示電路 數碼管顯示電路如圖所示 當對應的P2口輸出時,所對應的數碼管顯示 P0口為低電平的端口所對應的段碼顯示。 (4)蜂鳴器電路 蜂鳴器電路如圖所示 當P1.0為低電平時,三極管導通,蜂鳴器開始工作,作為鬧鐘功能的基礎
(5)復位電路 復位電路如圖所示 通電瞬間電容充電,RST端出現脈沖,用以復位,只要接通電源就完成了系統的復位 (6)振蕩電路 振蕩電路如圖所示 此處晶振為12MHz,提供單片機的時鐘頻率。晶振頻率越高,單片機運行速度越快。
(7)總體電路 
3.3程序編制說明 設計電子時鐘使用單片機資源的情況如下: P0口輸出數碼管段選信號,P2口輸出數碼管位選信號 調整功能選擇鍵kgnxz:P3.0口,通過其選擇調整時鐘還是調整鬧鐘 調整秒 ksec:P3.1口,按一次使秒加1 調整分kmin:P3.2;按一次使分加1 調整小時khour:P3.3口,按一次使時加1 12與24小時制的轉換鍵kzh:P3.4,默認24小時制,按一次鍵之后轉換為12小時制。 具體如下: (1)實現基本的走時間和顯示時間的時、分、秒,上電自動顯示初始時間00-00-00。 (2)當第一次按下第一個按鍵時進入時間的調節狀態,按下第二個按鍵時實現秒的加一調節,按下第三個按鍵時實現分的加一調 節,按下第四個按鍵時實現小時的加一調節。 (3)當第二次按下第一個按鍵時進入鬧鐘的調節狀態(鬧鐘初始值設定為01-00-30),按下第二個按鍵時實現秒的加一調節,按下第三個按鍵時實現分的加一調節,按下第四個按鍵時實現小時的加一調節。 (4)當第三次按下第一個按鍵時進入原顯示時間的狀態。 (5)按下第五個按鍵時實現24到12小時制的轉換。 (6)當第五次按下第一個按鍵時返回正常的顯示時間走時狀態。 軟件系統的各個模塊: 時鐘系統的軟件設計主要采用以下基本模塊來實現,主程序、定時中斷服務程序、鍵盤掃描程序模塊、時鐘顯示模塊、鬧鐘顯示模塊、轉換模塊、延時模塊和蜂鳴器模塊。 主程序:對中斷程序初值進行設定,在各種情況下對子函數的調用,保證整個程序的順序執行。 定時中斷服務程序:用于電子時鐘的準確運行。 鍵盤掃描程序模塊:用于確定按鍵并在按鍵按下時調用相應的程序進行顯示。 時鐘顯示模塊:用于顯示正常走表的時間。 鬧鐘顯示模塊:用于顯示設定鬧鐘的時間。 轉換模塊:用于將默認的24小時制轉換為12小時制。 延時模塊:程序中調用延時子程序,用于按鍵消抖動,數碼管消影等。 蜂鳴器模塊:用于在設定的鬧鐘時間與走表的時間相等時,鬧鐘響起。 軟件系統程序流程圖及程序清單附于報告后
4.上機調試及修改,優化過程過程 4.1上機調試過程 本次課程設計于6月28日進行了上機調試,在上級調試之前,我認真思考了設計內容和要求,認為自己理論課學的還差不多,認為困難不是很大,各部分的程序可以分別完成。然后按照自己的思路開始了自己的程序編寫,但是在上機調試過程中,發現自己認為邏輯合理的程序根本運行不起來,只好從頭開始一步步將程序分解找錯,然后對程序進行完善,經過了大半天的努力,終于做到實現了大部分的功能,而且在調試過程中發現當初寫選題報告時有很多設想和實際調試中不太相符,比如接口的分配,部分功能的實現,在選題說明中設想的秒表功能因為個人能力原因沒有實現,為了代替這部分功能,我在程序設計中增加了鬧鐘功能來彌補程序的不足,通過這個問題我也了解了實踐檢驗的重要性,只靠天馬行空的想像是不可能將工作目標完成的。 4.2 上機調試過程中的問題、解決辦法及分析 在本次上機調試過程中,還沒有在單片機上運行程序,我就遇到了一個大問題,在軟件中運行程序時,程序出現了錯誤報告,在上網查詢后也沒能解決問題,只好在后來更換電腦,才進行了程序調試。 在程序調試中還遇到了一些問題比如按下按鍵卻沒有對應的功能運行,經過尋找我發現忘記編寫子程序調用語句導致子程序沒有運行,添加了語句果然運行了,還有在單片機上接線時,將段選與位選的端口接反,鍵盤防抖動,數碼管顯示延時時間不合適等,還有定時計數器中斷忘記開啟等問題,均通過自己調試或者詢問同學將問題解決,完成了這次上機調試。 5.設計總結 5.1設計結果 本次課程設計我設計了基于51單片機的數字電子時鐘,可以顯示時間并對時間進行手動調節以及復位,擴展了鬧鐘功能,可以設置鬧鐘時間并在時間到達后使蜂鳴器響起。 

5.2收獲與體會 通過這次課程設計,我感覺到自己從課本上學到的理論知識和實踐仍有很大的差距。學習理論課時也是有實驗課的,但當時自己只是追求明白課本例題的程序,也沒深入想過課本上那些小的程序之間的聯系應用。所以學習知識不能局限于理論,要與實踐結合。學會了單片機的一般設計過程,通常都要進行系統擴展,因此,要完成一個單片機的設計工作,必須依次做到硬件電路的設計、組裝與調試,軟件的編寫、調試,完整軟件的調試和下載運行。 而在進行硬件系統設計時應當盡量做到盡可能的選擇典型電路,并符合單片機的常規使用,硬件結構設計應與軟件設計方案一同考慮。因為基礎知識學的也并不是很牢固,程序若有不完善之處還請老師見諒。 通過這次課程設計,我對單片機有了更深入的了解,同時也培養了我的動手實踐能力,使我獲益良多。
附:軟件系統程序流程圖 主程序: 
顯示程序: 
中斷程序: 
單片機源碼:
- #include<reg52.h>
- #include<intrins.h>
- #include<absacc.h>
- sbit kgnxz=P3^0; //功能選擇鍵,按一次設定時間,按兩次設定鬧鐘時間,按三次又顯示時間表
- sbit ksec=P3^1;//調整秒
- sbit kmin=P3^2;//調整分
- sbit khour=P3^3;//調整時
- sbit kzh=P3^4;//24與12小時制轉換
- sbit bear=P1^0;//蜂鳴器控制口
- unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0,flag=0,//flag是按鍵的計數
- secshi1=0,secge1=0,minshi1=0,minge1=0,hourshi1=0,hourge1=0;//定義存儲時間和鬧鐘時分秒的個位和十位
- unsigned int num=0,sec=0,min=0,hour=0,sec1=30,min1=0,hour1=1, num1=0;//定義時間和鬧鐘的時分秒
- unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數碼管段控口
- void keyscan();//鍵盤掃描函數
- void display();//時鐘顯示函數
- void display1();//鬧鐘顯示函數
- void clock();//鬧鐘函數即蜂鳴器函數
- /***延時函數****/
- void delay(unsigned char z)
- {unsigned char x,y;
- for(x=z;x>0;x--)
- for(y=255;y>0;y--);
- }
- /***中斷函數****/
- void time0() interrupt 1
- {num++;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(num==20)
- {num=0;
- sec++;
- if(sec==60)
- {sec=0;
- min++;
- if(min==60)
- {min=0;
- hour++;
- if(hour==24)
- {hour=0;
- }
- }
- }
- display(); }
- }
- /******時鐘顯示函數******/
- void display()
- {
- secge=sec%10;
- secshi=sec/10;
- minge=min%10;
- minshi=min/10;
- hourge=hour%10;
- hourshi=hour/10;
- P2=0xfe;
- P0=table[secge];
- delay(5);
- P2=0xfd;
- P0=table[secshi];
- delay(5);
- P2=0xfb;
- P0=0x40;
- delay(5);
- P2=0xf7;
- P0=table[minge];
- delay(5);
- P2=0xef;
- P0=table[minshi];
- delay(5);
- P2=0xdf;
- P0=0x40;
- delay(5);
- P2=0xbf;
- P0=table[hourge];
- delay(5);
- P2=0x7f;
- P0=table[hourshi];
- delay(5);
- }
- /*****鬧鐘顯示函數****/
- void display1()
- {
- secge1=sec1%10;
- secshi1=sec1/10;
- minge1=min1%10;
- minshi1=min1/10;
- hourge1=hour1%10;
- hourshi1=hour1/10;
- P2=0xfe;
- P0=table[secge1];
- delay(10);
- P2=0xfd;
- P0=table[secshi1];
- delay(15);
- P2=0xfb;
- P0=0x40;
- delay(15);
- P2=0xf7;
- P0=table[minge1];
- delay(15);
- P2=0xef;
- P0=table[minshi1];
- delay(15);
- P2=0xdf;
- P0=0x40;
- delay(15);
- P2=0xbf;
- P0=table[hourge1];
- delay(15);
- P2=0x7f;
- P0=table[hourshi1];
- delay(15);
- }
- /*****鍵盤掃描*********/
- void keyscan()
- {if(kgnxz==0) //功能選擇鍵是否按下
- { delay(10);//延時消抖
- if(kgnxz==0)//再次判斷鍵是否按下
- {flag++;} //計數,功能選擇鍵按鍵次數加一
- while(!kgnxz);} //釋放鍵
- if(flag==1)//功能選擇鍵
- {if(ksec==0)//秒調整鍵
- {delay(10);//延時消抖
- if(ksec==0)//再次判斷鍵是否按下
- {sec++;//秒加加
- if(sec>=60)//如果秒大于60
- sec=0;//秒清零
- }
- while(ksec==0)//釋放鍵
- display();}
- if(kmin==0)
- {delay(10);
- if(kmin==0)
- {min++;
- if(min>=60)
- min=0;
- }
- while(kmin==0)
- display();
- }
- if(khour==0)
- {delay(10);
- if(khour==0)
- {hour++;
- if(hour==24)
- hour=0;
- }
- while(khour==0)
- display();
- }
- }
- if(flag==2)//鬧鐘調整
- {if(ksec==0)
- {delay(5);
- if(ksec==0)
- {sec1++;
- if(sec1==60)
- sec1=0;}
- while(!ksec)
- {display1();delay(50);}
- }
- if(kmin==0)
- {delay(5);
- if(kmin==0)
- {min1++;
- if(min1==60)
- min1=0;}
- while(!kmin)
- {display1();}
- }
- if(khour==0)
- {delay(5);
- if(khour==0)
- {hour1++;
- if(hour1==24)
- hour1=0;}
- while(!khour)
- {display1();} } }}
- /*****蜂鳴器*********/
- void clock()
- { unsigned int i;
- for(i=1000;i>0;i--)
- {bear=1;
- P1=0xfe;
- delay(10);
- bear=0;
- P1=0xff;
- delay(10);}}
- /*****24轉12小時制*********/
- void to12()
- {if(hour>=12)
- {hour=hour-12;}
- if(hour1>=12)
- {hour1=hour1-12;}}
- /*****主函數*********/
- main()
- {TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;ET0=1;TR0=1;
- while(1)
- {
- keyscan();display();
- if(flag==1) {keyscan(); display();}
- if(flag==2) {keyscan(); display1();}
- if(flag==3) {display();}
- if((hour==hour1)&&(min==min1)&&(sec==sec1))
- {clock();}//鬧鐘設定時間與時鐘時間相等,調用蜂鳴器函數
- if(kzh==0){to12();}
- }
- }
復制代碼
完整的Word格式文檔51黑下載地址:
圖文.doc
(8.42 MB, 下載次數: 92)
2021-1-5 17:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|