《單片機原理及應用》 課程設計報告
專 業: 班 級: 姓 名: 指導教師:
二0一* 年 ** 月 ** 日
課程設計任務書
一、設計題目 LED數字顯示電子時鐘 二、設計要求 1、方案論證,確定總體電路原理圖。 2、元器件選擇,設計PCB圖(或用萬能電路實驗板搭線)。 3、繪制程序流程圖,編寫C語言源程序。 4、安裝調試,實現數字時鐘的基本功能,即能正確顯示時、分、秒;可調整時間;秒閃功能。 三、設計報告內容 1、寫出設計方案(包括方案對比,方案確定),給出完整的電路原理圖和設計程序流程圖。 2、對所設計方案的實現進行全面分析。 3、編程調試方法和程序清單。 4、安裝調試過程,出現的各種現象,總結經驗和體會。 *5、進一步完善的設想。
目 錄
一.課程設計目的- 1 - 二.課程設計題目描述和要求- 1 - 三.課程設計報告內容- 1 - 3.1、設計思路 - 1 - 3.2、方案設計與論證 - 2 - 3.2.1數碼管顯示選擇方案 - 2 - 3.2.2數碼管驅動選擇方案 - 3 - 3.3、 設計原理、程序及流程圖 - 3 - 3.3.1流程圖 - 3 - 3.3.2電路原理圖 - 4 - 3.3.3 C語言程序及說明 - 4 - 3.4、protues仿真圖,及作品成型圖 - 12 - 3.4.1 protues 仿真圖 - 12 - 3.4.2實踐電路板照片 - 13 - 3.5安裝與調試結果 - 14 - 3.5.1電路安裝 - 14 - 3.5.2電路調試 - 15 - 3.5.3 軟件調試 - 15 - 3.5.4 性能測試 - 15 - 四.總結- 15 - 參考書目- 16 -
LED數字顯示電子時鐘
一.課程設計目的: 1、鞏固和加深對單片機原理知識的理解和運用; 2、進一步提高學生綜合運用所學知識的能力; 3、培養學生綜合分析問題、發現問題和解決問題的能力。
二.課程設計題目描述和要求: 1、方案論證,確定總體電路原理圖。 2、元器件選擇,設計PCB圖(或用萬能電路實驗板搭線)。 3、繪制程序流程圖,編寫C語言源程序。 4、安裝調試,實現數字時鐘的基本功能,即能正確顯示時、分、秒;可調整時間;秒閃功能。
三.課程設計報告內容:
3.1、設計思路: 3.1.1根據所需實現的功能畫出程序流程圖,如3.5所示。 3.1.2將電路按照3.6原理圖焊接起來,定義開關K1,K2,K3分別接單片機的P3.2,P3.2,P3.5引腳。 3.1.3用軟件延時對K1,K2,K3進行兩級防抖。啟動系統,中斷初始化,定時器0只用來做計時,定時器1根據需要可選擇進入定時模式或者計數模式。外部中斷1,2用來等待外部按鍵的按下。 3.1.4當先按下K1時,進入外部中斷0,主函數調用時間顯示函數,定時器1處于計數工作模式,num=num+1,num為1時按K2,K3對小時進行加減來調整小時位,num=2按K2,K3對分進行調整,當num=3按K2,K3對秒進行調整,當num=4時就對num進行清零,跳出時間調節。 3.1.5當先按下K2時,進入外部中斷1,cmd=cmd+1,主函數調用秒表顯示函數,進入秒表狀態,此時將定時器1的工作模式改為計時,使其每10ms進行一次中斷,并設定當cmd位偶數時進行秒表計時,當cmd為奇數時停止秒表計時。K1用來對秒表進行清零,在秒表處于00-00-00狀態時,按K1退出秒表,進入時間顯示狀態。 3.2、方案設計與論證: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9D48.tmp.png
圖1 系統整體框圖
整個系統用單片機作為中央控制器,由單片機執行采集芯片內部時鐘信號,時鐘信號通過單片機I/O口傳給單片機,單片機模塊控制驅動模塊驅動顯示模塊,通過顯示模塊來實現信號的輸出、LED的顯示及相關的控制功能。系統設有按鍵模塊用于對時間進行調整及擴展多個小鍵盤。 3.2.1數碼管顯示選擇方案 方案一:靜態顯示。靜態顯示,即當顯示器顯示某一字符時,相應的發光二極管恒定導通或截止。該方式每一位都需要一個8 位輸出口控制。靜態顯示時較小電流能獲得較高的亮度,且字符不閃爍。但因當所需顯示的位數較多時,靜態顯示所需的I/O口數較大,造成資源的浪費。 方案二:動態顯示。動態顯示,即各位數碼管輪流點亮,對于顯示器各位數碼管,每隔一段延時時間循環點亮一次。利用人的視覺暫留功能可以看到整個顯示,但須保證掃描速度足夠快,人的視覺暫留功能才可察覺不到字符閃爍。顯示器的亮度與導通電流、點亮時間及間隔時間的比例有關。調整參數可以實現較高穩定度的顯示。動態顯示節省了I/O口,降低了能耗。 從節省單片機芯片I/O口和降低能耗角度出發,本數字電子鐘數碼管顯示選擇設計采用方案二。 3.2.2數碼管驅動選擇方案 方案一:上拉電阻驅動方式。數碼管段碼與接有上拉電阻的單片機芯片I/O口相連,通過編程,單片機芯片即控制段碼電平的高低。該方式經費低,但實物制作較復雜。 方案二:7407芯片驅動方式。數碼管段碼與7407芯片B口相連,7407芯片A口與單片機芯片I/O口,通過編程,單片機芯片即可控制段碼電平的高低。該方式實物制作簡單,增強驅動數碼管段碼能力。 從實物制作簡易程度與驅動數碼管段碼能力角度出發,本數字電子鐘數碼管驅動選擇設計采用方案二。
3.3、 設計原理、程序及流程圖:
3.3.1流程圖 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9D68.tmp.png
3.3.2電路原理圖 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9D69.tmp.png 3.3.3 C語言程序及說明 #include<reg51.h> #define uchar unsigned char #define uint unsigned int uchar count=0,num=0,temp=0,cmd=0; sbit LED=P1^0; sbit H=P3^2; sbit M=P3^3;
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar sec=11,min=11,hour=11,a=0,b=0,c=0; //定義時鐘的時 分 秒 以及秒表的 分 秒 10ms;
void delay(uint i) //延時 2i ms; { uint j; for(;i>0;i--) for(j=124;j>0;j--); }
void init() //中斷初始化 { ET0=1; TMOD=0x51; TH0=(65536-25000)/256; TL0=(65536-25000)%256;
ET1=1; TH1=0xff; TL1=0xff;
IT0=1; IT1=1;
TR0=1; TR1=1; EA=1; }
void Bss() //兩級防抖 { H=1;M=1; //調時按鈕防抖 if(H==0) { delay(20); H=1; if(H==0) { delay(20); H=1; if(H==0) { EX0=1; } } } if(M==0) //調分按鈕防抖 { delay(20); M=1; if(M==0) { delay(20); M=1; if(M==0) { EX1=1; } } } }
void display() //時鐘顯示 { P0=tab[hour/10%10]; if(num==1 && temp==1) P2=0xff; else P2=0xfe; delay(1); P0=tab[hour%10]; if(num==1 && temp==1) P2=0xff; else P2=0xfd; delay(1); P0=tab[min/10%10]; if(num==2 && temp==1) P2=0xff; else P2=0xfb; delay(1); P0=tab[min%10]; if(num==2 && temp==1) P2=0xff; else P2=0xf7; delay(1); P0=tab[sec/10%10]; if(num==3 && temp==1) P2=0xff; else P2=0xef; delay(1); P0=tab[sec%10]; if(num==3 && temp==1) P2=0xff; else P2=0xdf; delay(1); }
void displaym() //秒表顯示 { P0=tab[a/10%10]; P2=0xfe; delay(1); P0=tab[a%10]; P2=0xfd; delay(1); P0=tab[b/10%10]; P2=0xfb; delay(1); P0=tab[b%10]; P2=0xf7; delay(1); P0=tab[c/10%10]; P2=0xef; delay(1); P0=tab[c%10]; P2=0xdf; delay(1); }
void T0_int() interrupt 1 using 1 //中斷T0 用于計時 { TH0=(65536-25000)/256; TL0=(65536-25000)%256; count++; if((num != 0) && (count % 10 == 0)) //用于調時 數字閃爍 temp=~temp; if(count%10==0) LED=~LED; if(count==20) { count=0; sec=sec+1; if(sec==60) { sec=0; min=min+1; if(min==60) { min=0; hour=hour+1; if(hour==24) hour=0; } } } }
void T1_int() interrupt 3 using 2 //中斷T1 用于 可在時間校準的減 與計時 之間 進行切換 { if(cmd != 0) //滿足條件 T1進入計時功能 { TH1=(65536-5000)/256; TL1=(65536-5000)%256; if(cmd%2 == 0) { c=c+1; if(c==100) { c=0; b=b+1; if(b==60) { b=0; a=a+1; } } } } else //不滿足秒表條件,進入計數功能 { TH1=0xff; TL1=0xff; switch(num) { case 1:hour=hour-1;if(hour<=0) hour=23;break; case 2:min=min-1;if(min<=0) min=59;break; case 3:sec=sec-1;if(sec<=0) sec=59;break; default:break; } } }
void I1_int() interrupt 2 using 3 //外部中斷1 用于調時的加 跟秒表的控制 { EX1=0; switch(num) { case 0:TMOD=0x11;cmd=cmd+1;break; //當外部中斷未被啟用時 進入秒表 case 1:hour=hour+1;if(hour>=24) hour=0;break; case 2:min=min+1;if(min>=60) min=0;break; case 3:sec=sec+1;if(sec>=60) sec=0;break; default:break; } }
void I0_int() interrupt 0 using 3 //外部中斷0 用于校準時間在時、分、秒之間進行切換 { EX0=0; if(cmd != 0 &&(a!=0 || b!=0 || c!=0)) //對秒表進行清零 { a=0;b=0;c=0; } else if(cmd != 0 &&(a*b*c==0)) //清零后 退出秒表 { cmd=0; TMOD=0x51; TH1=0xff; TL1=0xff; } else if(cmd==0) //調時切換 { temp=1; //啟動數字閃爍 num=num+1; if(num==4) { temp=0; //關閉字符閃爍 num=0; //推出調時功能 } } }
void main() //主函數 { init(); LED=0; while(1) { if(cmd==0) //如不滿足秒表條件 就進入時間顯示 display(); else displaym(); Bss(); } }
3.4、protues仿真圖,及作品成型圖
3.4.1 protues 仿真圖
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9D89.tmp.jpg
3.4.2實踐電路板照片
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9DB9.tmp.png LED數字顯示電子時鐘正面(關閉)
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9DBA.tmp.png LED數字顯示電子時鐘正面(開啟)
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9DCB.tmp.png LED數字顯示秒表狀態
3.5安裝與調試結果: 3.5.1電路安裝 安照電路原理圖把元器件安裝到已打好的銅板對應的位置,把個元器件固定在銅板后,用導線把對應的元器件的引腳相連接,再用焊錫焊接好即可。注意事項: (1)元器件的布局應盡量集中,且各個元器件間引腳的連線應盡量短、不彎 曲,跳線盡量少。 (2)各個元器件引腳的焊接不要虛焊。 3.5.2電路調試 把相應編譯好的目標程序代碼加載到單片機芯片AT89S51,可接上5V電壓源即開始進行硬件電路的調試工作。如果顯示結果不符合設計要求,即檢查電路各連接點是否正確連接,再次進行硬件電路的調試工作,或是檢查代碼程序是否符合硬件電路的設計,若有錯即進行相應的修改,編譯后,再進行硬件電路的調試工作。如此反復操作,直到調試出正確結果。 3.5.3 軟件調試 (1) 在計算機上運行程序調試軟件Keil,進行程序調試。 (2)利用Proteus 軟件進行仿真模擬。 (3)加載程序代碼到單片機芯片AT89S51中,進行模擬仿真。若出現錯誤,查看錯誤后進行相應修改再進行調試與模擬仿真,直到調試出正確結果。 3.5.4 性能測試 系統上電后進行功能的測試,通過測試觀察到,系統上電后數碼管上顯示時間:11-11-11。通過測試,本作品設計實現了數字電子鐘的基本功能,且系統工作穩定。經過全組組員一起調試及驗證,計時誤差為1.0秒。
四.總結: 本次課程設計的題目是LED數字顯示電子時鐘。經過本組同學的共同努力,終于調試成功,并經過測試數據顯示, 系統的可靠性已經基本能夠達到實際電子鐘的設計要求,同時本單片機數字電子鐘系統具有擴展性。 本設計從經濟實用的角度出發,采用美國Atmel公司的單片機AT89S51與顯示驅動芯片7407作為主控芯片與數據存儲器單元,結合外圍的鍵盤輸入、顯示、電源輸入等電路并用C語言編寫主控芯片的控制程序,研制了一款可以調時并帶有秒表功能的電子時鐘。使用單片機制作的電子時鐘具有軟硬件設計簡單,易于開發,成本較低,安全可靠,操作方便等特點,可應用于體育賽事和車站、辦公室及家庭等場所,有一定的實用性。此電子時鐘嚴格按照要求設計,基本達到了預期效果,能夠正確的顯示時分秒的計時,算上是一次比較成功的設計了。 實驗中遇到了不少問題,但我們一起改進和綜合了如下。 1.按鍵問題。此設計中,很多功能選擇是通過按鍵開關實現的。在仿真中發現,調整數值時,有時按鍵反應太快,按一次,跳了幾下,使設置時間很不方便。于是用軟件延時將按鍵進行兩級防抖,從而大大提高了按鈕的可操作性。 2.添加功能問題。此設計中,除了基本的功能外,我們發現沒有突出的亮點,于是想到添加一個秒表計時的功能,我們將定時器1進行時分復用,通過按鍵按下的先后順序對定時器1的計時或計數進行功能選擇,此程序是在調時進行后由開關1控制,進行復位和控制,可以實現疊加計時和清零。 課程設計是培養學生綜合運用所學知識,發現實際問題、提出實際問題、分析和解決實際問題,鍛煉實踐能力的重要環節,是對學生實際學習能力、動手能力的具體訓練和考察過程。 在此次數字鐘設計過程中, 在學習新知識的同時,把在課程中學到的理論知識運用到實際作品設計、操作中,更進一步地熟悉了單片機芯片的結構及掌握了其工作原理和具體的使用方法與相關元器件的參數計算方法、使用方法,了解了電路的開發和制作及課程設計報告的編寫。加深了對相關理論知識及專業知識的掌握度,增強自身的動手能力,鍛煉及提高了理解問題、分析問題、解決問題的能力,更深刻的體會到了理論聯系實際的重要性。 最后,我們組通過此次單片機課程設計不僅僅將我們一學期在單片機課程上的所學很好的應用到了實際設計中,更是將理論知識應用到了實踐中,這才是真正的學習,不僅僅是讀萬卷書,更要行萬里路,講知識與實踐有機的結合。也十分感謝老師為我們提供了這次單片機課程設計的機會,我們也通過此次課程設計,更清晰更實際的接觸到了單片機。
參考書目: [1] 蔣輝平,《單片機原理與應用設計》,北京,北京航空航天大學出版社,2007年 [2] 李鴻等,《單片機原理及應用》,長沙,湖南大學出版社,2004年 [3] 樓然苗,李光飛,《單片機課程設計指導》,北京,北京航空航天出版社,2007年 [4] Kenneth A.Reek,《C和指針》,北京,人民郵電出版社,2008年
|