摘 要
籃球計時計分器是一種應用非常廣泛比賽計時工具,對現代社會越來越重要。此籃球計時計分器在硬件方面主要采用STC89C51RC單片機作為主控核心,由獨立按鍵、共陽數碼管顯示屏顯示。STC89C51RC單片機是由STC公司推出的,功耗小,電壓可選用4~6V電壓供電;所有程序編寫完成后,在Keil軟件中進行調試,確定沒有問題后,燒寫到單片機上進行測試。
此設計主要由獨立按鍵采集數據到單片機進行處理再通過數碼管顯示出來,本論文主要研究了數碼管及獨立按鍵,對硬件連接方案進行了詳盡的介紹,在軟件方面算法也進行了論述。
目錄
前 言
第一章 工作原理
1.1設計目標
1.1.1基本功能
第二章 硬件設計與原理
2.1 總設計框圖
2.2 硬件設計分析
2.2.1 電源的設計
2.2.2 單片機最小系統
2.2.3 顯示系統
2.2.4 按鍵調整電路
2.2.5 蜂鳴器電路
第三章 軟件設計與分析
3.1 軟件設計的組成
3.2 源程序
第四章 軟件仿真
4.1 PROTEUS簡介
4.2仿真圖
4.3原理圖
4.4 元件清單
4.5 硬件結果圖
總結
致 謝
參考文獻
前 言最近幾年來,隨著科技的飛速發展,單片機領域正在不斷的走向社會各個角落,還帶動傳統控制檢測日新月異更新。在實時運作和自動控制的單片機應用到系統中,單片機如今是作為一個核心部件來使用,僅掌握單片機方面知識是不夠的,還應根據其具體硬件結構,以及針對具體應用對象特點的軟件結合,加以完善。“單片機原理及應用課程設計”是電子類專業的學科基礎科,它是繼“匯編語言程序設計”,“接口技術”等課程之后開出的實踐環節課程。
第一章 工作原理1.1設計目標1.1.1基本功能- 51單片機+按鍵+蜂鳴器+數碼管
- 數碼管:2個4位一體共陽數碼管
- 具有12分鐘倒計時功能,精確到秒,能夠暫停
- 最后10秒,聲音和指示燈報警功能
- 能記錄兩隊分數,并且能夠加減功能
- 半場比賽結束能夠交換兩隊比分
- 具有時間暫停功能,可以快進或者快退時間
- 51單片機型號:STC89C51RC、AT89C51單片機任選一個
- C語言編程
第二章 硬件設計與原理以STC89C51RC單片機為核心,起著控制作用。系統包括數碼管顯示電路、復位電路、時鐘電路、按鍵調整電路和蜂鳴器電路。設計思路分為六個模塊:復位電路、晶振電路模、STC89C51RC、數碼管顯示電路、按鍵調整電路和蜂鳴器電路這六個模塊。 2.1 總設計框圖 2.2 硬件設計分析2.2.1 電源的設計系統電源使用外接直流5伏。 USB是通用串行總線(Universal Serial Bus)接口的簡稱。它是目前使用比較廣泛的電腦接口之一,主要版本有1.0、1.1和最新的2.0三種版本。根據USB總線的工業標準,它可以提供額定功率為5V/500mA的電源供USB設備使用。 2.2.2 單片機最小系統51單片機是對目前所有兼容intel 8031指令系統的單片機的統稱。該系列單片機的始祖是intel的8031單片機,后來隨著技術的發展,成為目前廣泛應用的8為單片機之一。單片機是在一塊芯片內集成了CPU、RAM、ROM、定時器/計數器和多功能I/O口等計算機所需要的基本功能部件的大規模集成電路,又稱為MCU。51系列單片機內包含以下幾個部件: 一個8位CPU;一個片內振蕩器及時鐘電路; 4KB的ROM程序存儲器; 一個128B的RAM數據存儲器; 尋址64KB外部數據存儲器和64KB外部程序存儲空間的控制電路; 32條可編程的I/O口線; 兩個16位定時/計數器; 一個可編程全雙工串行口; 5個中斷源、兩個優先級嵌套中斷結構。 如圖2-2-1所示為STC89C51RC單片機基本構造,其基本性能介紹如下: 圖2-2-1 STC89C51RC單片機 STC89C51RC本身內含40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中端口,3個16位可編程定時計數器,2個全雙工串行通信口,STC89C51RC可以按照常規方法進行編程,但不可以在線編程。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫的Flash存儲器可有效地降低開發成本。 STC89C51RC的主要特性如下表所示: 表2-2-1 STC89C51RC主要功能描述 STC89C51RC為40腳雙列直插封裝的8位通用微處理器,采用工業標準的C51內核,在內部功能及管腳排布上與通用的89c51相同,其主要用于會聚調整時的功能控制。功能包括對會聚主IC內部寄存器、數據RAM及外部接口等功能部件的初始化,會聚調整控制,會聚測試圖控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19腳)和XTAL2(18腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9腳)為復位輸入端口,外接電阻電容組成的復位電路。VCC(40腳)和VSS(20腳)為供電端口,分別接+5V電源的正負端。P0~P3 為可編程通用I/O腳,其功能用途由軟件定義,在本設計中,P0端口(32~39腳)被定義為N1功能控制端口,分別與N1的相應功能管腳相連接,13腳定義為IR輸入端,10腳和11腳定義為I2C總線控制端口,分別連接N1的SDAS(18腳)和SCLS(19腳)端口,12腳、27腳及28腳定義為握手信號功能端口,連接主板CPU的相應功能端,用于當前制式的檢測及會聚調整狀態進入的控制功能。 P0口:P0口是一組8位漏極開路型雙向I/O 口,也即地址/數據總線復用口。作為輸出口用時,每位能吸收電流的方式驅動8個TTL邏輯門電路,對端口P0寫“1”時,可作為高阻抗輸入端用。在訪問外部數據存儲器或程序存儲器時,這組口線分時轉換地址(低8位)和數據總線復用,在訪問期間激活內部上拉電阻。在Flash 編程時,P0口接收指令字節,而在程序校驗時,輸出指令字節,校驗時,要求外接上拉電阻。 P1口:P1是一個帶內部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。與AT89C51不同之處是,P1.0和P1.1還可分別作為定時/計數器2 的外部計數輸入(P1.0/T2)和輸入(P1.1/T2EX)。Flash編程和程序校驗期間,P1接收低8位地址。 P2口:P2是一個帶有內部上拉電阻的8 位雙向I/O口,P2的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口P2寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數據存儲器(例如執行MOVX @DPTR指令)時,P2口送出高8位地址數據。在訪問8位地址的外部數據存儲器(如執行MOVX @RI指令)時,P2口輸出P2鎖存器的內容。Flash編程或校驗時,P2亦接收高位地址和一些控制信號。 P3口:P3口是一組帶有內部上拉電阻的8位雙向I/O口。P3口輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫入“1”時,它們被內部上拉電阻拉高并可作為輸入端口。此時,被外部拉低的P3口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能P3口還接收一些用于Flash 閃速存儲器編程和程序校驗的控制信號。 RST:復位輸入。當振蕩器工作時,RST引腳出現兩個機器周期以上高電平將使單片機復位。 ALE/PROG:當訪問外部程序存儲器或數據存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節。一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時鐘或用于定時目的。要注意的是:每當訪問外部數據存儲器時將跳過一個AL脈沖。對Flash存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條 MOVX 和MOVC指令才能將ALE激活。此外,該引腳會被微弱拉高,單片機執行外部程序時,應設置ALE禁止位無效。 PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當STC89C51RC由外部程序存儲器取指令(或數據)時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當訪問外部數據存儲器,將跳過兩次PSEN信號。 EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000H—FFFFH),EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復位時內部會鎖存EA端狀態。如EA端為高電平(接Vcc端),CPU則執行內部程序存儲器中的指令。Flash存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當然這必須是該器件是使用12V編程電壓Vpp。 XTAL1:振蕩器反相放大器的及內部時鐘發生器的輸入端。 XTAL2:振蕩器反相放大器的輸出端。 單片機最小原理圖如圖2-2-2所示。 圖2-2-2 單片機最小系統 單片機最小系統說明: 時鐘信號的產生:在MCS-51芯片內部有一個高增益反相放大器,其輸入端為芯片引腳XTAL1,其輸出端為引腳XTAL2。而在芯片的外部,XTAL1和XTAL2之間跨接晶體振蕩器和微調電容,從而構成一個穩定的自激振蕩器,這就是單片機的時鐘振蕩電路。 時鐘電路產生的振蕩脈沖經過觸發器進行二分頻之后,才成為單片機的時鐘脈沖信號。 一般地,電容C2和C3取30pF左右,晶體的振蕩頻率范圍是1.2-12MHz。如果晶體振蕩頻率高,則系統的時鐘頻率也高,單片機的運行速度也就快。 單片機復位使CPU和系統中的其他功能部件都處在一個確定的初始狀態下,并從這個狀態開始工作。單片機復位條件:必須使9腳加上持續兩個機器周期(即24個振蕩周期)的高電平。 2.2.3 顯示系統


圖2-2-3 數碼管顯示電路 2.2.4 按鍵調整電路圖2-2-4 按鍵調整電路 2.2.5 蜂鳴器電路圖2-2-5 蜂鳴器電路
第三章 軟件設計與分析3.1 軟件設計的組成該系統由延時子函數、蜂鳴器子函數、初始化子函數、調節比賽時間數碼管顯示子函數、比賽開始數碼管顯示子函數、甲隊得分數碼管顯示子函數、乙隊得分數碼管顯示子函數、按鍵掃描子函數、定時器0中斷子函數、主函數和數據定義這幾部分組成。 
圖3-1-1 主程序流程圖 
圖3-1-2 倒計時程序流程圖
第四章 軟件仿真4.1 PROTEUS簡介Proteus ISIS是英國Labcenter公司開發的電路分析與實物仿真軟件。它運行于Windows操作系統上,可以仿真、分析(SPICE)各種模擬器件和集成電路,該軟件的特點是: (1)現了單片機仿真和SPICE電路仿真相結合。具有模擬電路仿真、數字電路仿真、單片機及其外圍電路組成的系統的仿真、RS232動態仿真、I2C調試器、SPI調試器、鍵盤和LCD系統仿真的功能;有各種虛擬儀器,如示波器、邏輯分析儀、信號發生器等。 (2)支持主流單片機系統的仿真。目前支持的單片機類型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各種外圍芯片。 (3)提供軟件調試功能。在硬件仿真系統中具有全速、單步、設置斷點等調試功能,同時可以觀察各個變量、寄存器等的當前狀態,因此在該軟件仿真系統中,也必須具有這些功能;同時支持第三方的軟件編譯和調試環境,如Keil C51 uVision2等軟件。 (4)具有強大的原理圖繪制功能。 可以仿真51系列、AVR、PIC、ARM、等常用主流單片機。還可以直接在基于原理圖的虛擬原型上編程,再配合顯示及輸出,能看到運行后輸入輸出的效果。配合系統配置的虛擬邏輯分析儀、示波器等,Proteus建立了完備的電子設計開發環境。 在PROTEUS繪制好原理圖后,調入已編譯好的目標代碼文件:*.HEX,可以在PROTEUS的原理圖中看到模擬的實物運行狀態和過程。 PROTEUS 是單片機課堂教學的先進助手。 PROTEUS不僅可將許多單片機實例功能形象化,也可將許多單片機實例運行過程形象化。前者可在相當程度上得到實物演示實驗的效果,后者則是實物演示實驗難以達到的效果。 它的元器件、連接線路等卻和傳統的單片機實驗硬件高度對應。這在相當程度上替代了傳統的單片機實驗教學的功能,例:元器件選擇、電路連接、電路檢測、電路修改、軟件調試、運行結果等。 課程設計是學生走向就業的重要實踐環節。由于PROTEUS提供了實驗室無法相比的大量的元器件庫,提供了修改電路設計的靈活性、提供了實驗室在數量、質量上難以相比的虛擬儀器、儀表,因而也提供了培養學生實踐精神、創造精神的平臺。 4.2仿真圖4.3原理圖4.4 元件清單
4.5 硬件結果圖
總結經過近三個月的努力,終于順利完成了設計。剛開始,我們頭緒不是很清楚,不知道從哪里入手,但通過老師的耐心指導并和同學認真研究設計課題,跑圖書館查資料、確定基本設計方案、對所用芯片功能進行查找、調試、上機仿真等,經歷了一次次的困難,卻積累了很多寶貴的經驗。在整個設計的過程中遇到的問題主要有以下三點,第一:基礎知識掌握的不牢固,主要表現在一些常用的電路的形式和功能不清楚,對書本上的內容理解不夠透徹。第二:對一些常用的應用軟件缺少應用,體現在畫電路圖和系統的仿真的時候,對這些軟件的操作不熟練,浪費了很多時間。第三:相關知識掌握的不夠全面,缺少系統設計的經驗。 這次設計進一步端了我的學習態度,學會了實事求是,嚴謹的作風,對自己要嚴格要求,不能夠一知半解,要力求明明白白。急于求成是不好的,我有所感受。如果省略了那些必要的步驟,急于求成,不僅會浪費時間,還會適得其反。我覺得動手之前,頭腦里必須清楚該怎么做,這一點是很重要的。就目前來說,我的動手能力雖然差一點,但我想,通過我的不懈努力,在這方面,我總會得到提高。這一點,我堅信。因為別人能做到的,我也一定能做到。 在此次的設計中我最大的體會就是進一步認識到了理論聯系實踐的重要性。一份耕耘,一份收獲。通過這段時間的設計,讓我明白科學的思維方法和學習方法是多么重要,只有這樣才能夠有很高的效率,才能夠讓自己的工作更完美。總而言之,此次設計讓我學到了好多平時在課堂上學不到的東西,增加了我的知識運用能力,增強我的實際操作能力。謝謝老師給我們提供這么好的機會,為我們之后走向社會奠定了一個好的基礎。 本次設計讓我學到了很多,也學會到了要怎么樣去面對困難,不要對知識一知半截,要有的求實的能力,通過老師的幫助我學到了很多在平時的沒有注意到的動東西及知識,更美沒有深入的的去理解,通過這次我要更加的明確自己。更要注重自己在各方面的鍛煉能力,把握機會。這次的設計非常的感謝老師們。
單片機源程序如下:
- #include<reg51.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //對應數碼管顯示數字0-9
- int m=1,n=0,x=0,y=0,i=0,h=0,k;
- //定義全局變量并初始化,m,n表示分鐘與秒,x,y表示甲乙兩隊分數
- sbit P1_0=P1^0;
- sbit P1_1=P1^1;
- sbit P1_2=P1^2;
- sbit P1_3=P1^3;
- sbit P1_4=P1^4;
- sbit P1_5=P1^5;
- sbit P1_6=P1^6;
- sbit P1_7=P1^7;
- sbit P3_0=P3^0;
- sbit P3_1=P3^1;
- sbit P3_2=P3^2;
- sbit P3_3=P3^3;
- sbit P3_6=P3^6;
- sbit P3_7=P3^7;
- void delay(uint x)//定義延時程序,通過設置參數x,改變延時時間長度
- {
- while(x--)
- {
- uint y;
- for(y=0;y<200;y++);
- }
- }
- void display(int i,int j,int x,int y)//顯示子程序 變量i,j分別是分秒,變量x,y是甲乙兩隊的分數
- {
- P2=~0xfe;
- //數碼管刷新顯示時間的分鐘十位,調用延時程序
- P0=~seg[i%100/10];
- delay(1); //延時數碼管點亮
- P2=0x00;
- P0=0xff;
-
- P2=~0xfd; //同上,刷新數碼管的分鐘位的個位
- P0=~seg[i%10];
- delay(1);
- P2=0x00;
- P0=0xff;
-
- P2=~0xfb; //同上。刷新數碼管秒位的十位
- P0=~seg[j%100/10];
- delay(1);
- P2=0x00;
- P0=0xff;
-
- P2=~0xf7; //同上,刷新數碼管秒位的個位
- P0=~seg[j%10];
- delay(1);
- P2=0x00;
- P0=0xff;
-
- P2=~0xef; //同上。刷新數碼管甲隊分數的十位
- P0=~seg[x%100/10];
- delay(1);
- P2=0x00;
- P0=0xff;
-
- P2=~0xdf; //同上。刷新數碼管甲隊分數的個位
- P0=~seg[x%10];
- delay(1);
- P2=0x00;
- P0=0xff;
-
- P2=~0xbf; //同上。刷新數碼管乙隊分數的十位
- P0=~seg[y%100/10];
- delay(1);
- P2=0x00;
- P0=0xff;
-
- P2=~0x7f; //同上。刷新數碼管乙隊分數的個位
- P0=~seg[y%10];
- delay(1);
- P2=0x00;
- P0=0xff;
- }
- void t0() interrupt 1 //定義中斷程序,調用定時器TO
- {
- TH0=0xb1; //對定時器T0送入初值,THO=0xb1
- TL0=0x10; //TL0=0X10 故定時器定時為20毫秒,
- if(n==0) //即每20毫秒調用一次
- {
- n=60;
- m--;
- }
- i++;
- if(i==50) //定義i的值為50,即50*20毫秒=1秒
- {
- n--;
- i=0;
- }
- display(m,n,x,y);//調用數碼管顯示程序,即每20毫秒刷
- }
- void jiafen() //定義加分程序
- {
- if(P1_1==0)//當按下P1_1的時候
- {
- delay(1);//延時去抖
- while(P1_1==0);
- x++;//甲隊加一分
- }
- if(P1_2==0)//當按下P1_2的時候
- {
- delay(1);
- while(P1_2==0);
- x+=2;//甲隊加兩分
- }
- if(P1_3==0) //當按下P1_3的時候
- {
- delay(1);
- while(P1_3==0);
- x+=3;//甲隊加三分
- }
- if(P1_4==0) //當按下P1_4的時候
- {
- delay(1); //延時去抖
- while(P1_4==0);
- y++; //乙隊加一分
- }
- if(P1_5==0) //當按下P1_5的時候
- {
- delay(1);
- while(P1_5==0);
- y+=2; //乙隊加兩分
- }
- if(P1_6==0) //當按下P1_6的時候
- {
- delay(1);
- while(P1_6==0);
- y+=3; //乙隊加三分
- }
- }
- void jianfen() //定義減分程序
- {
- if(P3_0==0&&x>0) //當按下P3_0并且甲隊分數大于0的時候
- {
- delay(1); //延時去抖
- while(P3_0==0);
- x--; //甲隊減1分
- }
- if(P3_1==0&&x>0) //當按下P3_1并且乙隊分數大于0的時候
- {
- delay(1);
- while(P3_1==0);
- y--; //乙隊減1分
- }
- }
- void tiaoshi() //定義調時程序
- {
- if(P3_2==0) //當按下P3_2的時候
- {
- delay(1); //延時去抖
- if(P3_2==0)
- {
- n++; //秒位加1
- if(n==60)//當秒位到60的時候
- {
- m++;//分位加1,并且秒位變1
- n=1;
- }
- }
- }
- if(P3_3==0) //當按下P3_3的時候
- {
- delay(1);
- if(P3_3==0)
- {
- n--;//秒位減一
- if(n==0)
- //當秒位減到0的時候,分位減一,并且秒位變59
- {
- m--;
- n=59;
- }
- }
- }
- }
- void jiaohuan() //定義比分交換程序
- {
- int t; //定義中間變量t
- if(P1_7==0) //當P1_7按下的時候
- {
- delay(1); //延時去抖
- while(P1_7==0);
- t=x; //利用中間變量t,將甲乙兩隊比分交換
- x=y;
- y=t;
- display(m,n,x,y); //刷新數碼管
- }
- }
- void zanting() //定義暫停程序
- {
- if(P1_0==0) //當P1_0按下的時候
- {
- delay(1); //延時去抖
- while(P1_0==0);
- EA=0; //關中斷,進入死循環
- while(1)
- {
- display(m,n,x,y);
- if(P1_0==0) //當P1_0再次按下的時候,跳出死循環
- {
- delay(1);
- while(P1_0==0)
- EA=1;
- break;
- }
- }
- }
- }
- void baojing() //定義報警程序
- {
- if((m==0)&&(n<=10)&&(n>1)) //判斷當倒計時只剩下10秒的時候
- {
- P3_7=1;
- //使P3_7和P3_6同時間隔輸出高低電平,點亮發光二極管和使蜂鳴器蜂鳴
- P3_6=1;
- delay(20);
- P3_7=0;
- P3_6=0;
- delay(20);
- }
- }
- void jieshu() //定義結束子程序
- {
- M: if(h==1)
- //當時間條件滿足時,關閉中斷,使數碼管保持狀態顯示
- {
- EA=0;
- delay(20);
- m=0;
- n=0;
- P3_6=1;
- P3_7=1;
- delay(200);
- P3_7=0;
- P3_6=0;
- while(1)
- {
- display(m,n,x,y);
- jiafen();
- jianfen();
- jiaohuan();
- if(P1_0==0) //當P1_0再次按下的時候,跳出循環
- {
- delay(1);
- while(P1_0==0)
- {
- EA=1;
- m=10; //重新賦予時間初始值開始下半場比賽
- n=0;
- h=0;
- goto M ;
- }
- }
- }
- }
- }
- void main() //定義主程序
- {
- TMOD=0x01; //初始化程序
- EA=1;
- ET0=1;
- P3_7=0;
- P0=0xff;
- P2=0x00;
- if(P1_0==0) //第一次按下P1_0,單片機啟動,并顯示初始值
- { //由于調用了一次暫停功能,會顯示初始值
- TH0=0xb1;
- TL0=0x10;
- TR0=1; //啟動定時器
- P3=0xff;
- P1=0x7f;
- P3_7=0;
- P1_7=1;
- while(1)
- {
- jiafen(); //加分子程序
- jianfen(); //減分子程序
- tiaoshi(); //調時子程序
- jiaohuan(); //比分交換子程序
- zanting(); //暫停子程序
- baojing(); //報警子程序
- if((m==0)&&(n==1)) //判斷結束子程序的調用條件
- {
- h=1;
- }
- jieshu(); //結束子程序
- }
- }
- }
復制代碼
以上圖文的Word格式文檔下載(內容和本網頁上的一模一樣,方便保存):
基于51單片機籃球計時計分器的設計.doc
(808.29 KB, 下載次數: 475)
2018-12-11 23:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|