




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、課程實驗報告 課 程 名 稱: 夏季小學期實訓 實驗項目名稱: 可切換單雙人手速游戲 專 業(yè) 班 級: 姓 名: 學 號: 指 導 老 師 : 完 成 時 間: 2017 年 9 月 6 日信息科學與工程學院1、 設計內(nèi)容利用STC-B單片機設計一個具有如下功能的手速游戲:1、 能夠讀取按鍵的次數(shù)并且能夠用數(shù)碼管表示出來;2、 能夠雙人同時按鍵,并且能自動顯示最終比賽結(jié)果,顯示數(shù)多的一方獲勝;3、 能夠設定一段時間用于比賽,其余時間不能掃描按鍵;4、 可以切換雙人比賽模式與單人訓練模式,單人模式只單純在一段時間內(nèi)計數(shù);5、 有蜂鳴器提示游戲開始,并且有l(wèi)ed流水燈作為時間提示;2、 運行效果說
2、明程序下載到STC學習板上后:1、按下Reset,之后蜂鳴器發(fā)出響聲,作為預備開始信號;2、 在開始之后,不斷按下Key1與Key3,數(shù)碼管上顯示的個數(shù)不斷增加,同時led從左到右逐個亮起,作為時間信號。3、當led從左至右亮完之后,時間停止,此時按下Key按鍵數(shù)碼管不再加1;數(shù)碼管上顯示的個數(shù)即在規(guī)定時間內(nèi),按下Key鍵的次數(shù)并且能比較出按鍵次數(shù)多的一方。3、 方案設計與論證按照系統(tǒng)設計的要求與功能,將系統(tǒng)分為主控模塊、按鍵掃描模塊、數(shù)碼管顯示模塊、LED顯示模塊、蜂鳴器電路、電源電路、復位電路、晶振電路幾個模塊,系統(tǒng)框圖如下圖所示。主控模塊采用STC15F2K61S2單片機,按鍵模塊用3個
3、按鍵,用于進行雙方按鍵計數(shù)以及切換單雙人模式,顯示模塊有數(shù)碼管顯示比賽結(jié)果與過程、LED顯示電路顯示定時時間作為游戲時間的提示,蜂鳴器模塊利用蜂鳴器定時鳴叫作為游戲開始前的預備信號。 復位電路 按鍵掃描主控模塊STC15F2K61S2 晶振電路 蜂鳴器電路 電源電路 顯示電路4、 硬件單元電路設計與參數(shù)計算1、 主控模塊選用STC15F2K61S2單片機作為中央處理器,如下圖所示: 2、 復位電路復位電路由電阻和極性電容組成,通過高電平使單片機復位;此復位電路同時具備了上電復位和手動復位的功能,上電復位發(fā)生在開機加電時,由系統(tǒng)自動完成,手動復位通過一個按鍵來實現(xiàn),在程序運行時,若遇到死機,死循
4、環(huán)等情況,通過手動復位就可以實現(xiàn)重新啟動的操作。手動按鈕復位需要人為在復位輸入端RST上加上高電平。一般采用的辦法是在RST端和正電源Vcc之間接一個按鈕和一個電阻,如圖所示,當人為按下按鈕時,則Vcc的+5電平就會直接加到RST端; 3、 按鍵電路按鍵電路由3個按鍵開關以及導航按鍵組成;在本實驗設計中只用到三個輕觸按鍵開關,KEY1用于按鍵計數(shù),由右三位數(shù)碼管顯示按鍵結(jié)果;KEY3鍵用于案件計數(shù),由左三位數(shù)碼管顯示按鍵結(jié)果,KEY2用于模式切換,用于從單人模式與雙人模式中互相切換;4、 顯示電路顯示電路采用數(shù)碼管與LED共同顯示實驗現(xiàn)象與結(jié)果,圖中有數(shù)碼管與LED的電路原理以及接口說明;接口
5、P0口的8位輸出分別控制8個發(fā)光二極管L0L7的陽極;而P2.3經(jīng)反相器U4C控制8個發(fā)光管陰極E3;當陽極為高(對應P0口位為1)、陰極為低時,對應的二極管將會發(fā)光。而P2.3經(jīng)反相器U4C控制74HC138的使能信號E3,結(jié)合P2.0、P2.1、P2.2這3個位選控制信號確定8個LED數(shù)碼管中的哪個被點亮;電阻R15R22為限流電阻。當段選為高、使能信號有效時,對應的LED管將會發(fā)光;通過以一定頻率掃描位選信號,選擇段選信號進行數(shù)碼管點亮一段時間,從而給人視覺上幾個數(shù)碼管幾乎同時顯示的效果;同時掃描led,使led從左到右不斷亮起。本實驗中在雙人模式中,數(shù)碼管左三位用于記錄KEY3按鍵按下
6、的次數(shù),右三位記錄KEY1按鍵按下的次數(shù),中間兩位在比賽過程中顯示“”,如果兩邊按鍵按下次數(shù)相同,顯示等號;兩個數(shù)碼管中靠近勝方的上部點亮,靠近數(shù)碼管敗方的下部被點亮;在單人模式中,左右三位數(shù)碼管都顯示KEY1按鍵按下的次數(shù)。5、 蜂鳴器電路蜂鳴器電路通過控制三極管的導通和截止來實現(xiàn)蜂鳴器的鳴響與不響;蜂鳴器鳴叫定時,定時1s鳴響之后停止鳴叫,切換模式之后也會鳴響1s作為游戲開始的預警;5、 軟件設計與流程圖1、 程序主流程圖LED燈熄滅,數(shù)碼管顯示最終勝負結(jié)果2、 程序流程圖解析主程序首先初始化定時器參數(shù)、按鍵參數(shù)、接口、蜂鳴器以及顯示模塊;然后開始進入定時中斷函數(shù)同時可掃描KEY2模式切換
7、鍵,選擇切換單雙人模式,按下則選擇單人模式,不按選擇雙人模式;選擇成功,定時器定時1s之后,蜂鳴器連續(xù)鳴叫1s,作為提示游戲開始的信號,此時只有數(shù)碼管的初始顯示與蜂鳴器的鳴叫,1s之后蜂鳴器鳴叫暫停;接著是LED燈從左到右開始依次點亮,點亮時間間隔1s,在LED點亮開始,程序開始掃描KEY1、KEY2鍵,并把掃描的次數(shù)顯示在數(shù)碼管上,LED全部點亮后不能再掃描按鍵;結(jié)果由數(shù)碼管顯示,勝方是按鍵次數(shù)的一方,靠近按鍵次數(shù)多的一側(cè),中間數(shù)碼管點亮上半部分,靠近敗方的數(shù)碼管點亮下半部分,相等次數(shù)時顯示等號;期間一直可以進行KEY2掃描,進行模式切換。6、 函數(shù)說明1、 延時函數(shù)利用while循環(huán)延時2
8、00ms;2、 按鍵掃描消抖函數(shù)利用參數(shù)k1、k3作為按鍵KEY1、KEY3的參數(shù),當檢測到按鍵按下,即檢測到低電平時,此時參數(shù)值迅速翻轉(zhuǎn),由初始值0變?yōu)?,避免一次按下卻掃描到多次低電平,所以此時if條件句里邊就是當KEY與參數(shù)同時成立時,才能掃描一次鍵盤;然后在下一次檢測到按鍵的高電平時,參數(shù)再次反轉(zhuǎn),就返回到參數(shù)的初始值,在一次次重復檢測中能夠不會抖動,數(shù)碼管的顯示也不會有延時或者抖動暫停等現(xiàn)象;3、 數(shù)碼管顯示函數(shù)利用for循環(huán)顯示8個數(shù)碼管,每個數(shù)碼管顯示的數(shù)據(jù)不同,在雙人模式中1-3數(shù)碼管顯示KEY1鍵按鍵掃描到的次數(shù)結(jié)果,6-8位數(shù)碼管顯示KEY3鍵按鍵掃描到的次數(shù)結(jié)果,4-5位
9、數(shù)碼管顯示的內(nèi)容由程序運行的進度而定,在游戲過程中,數(shù)碼管段選是0x40,游戲結(jié)束之后,這兩個數(shù)碼管的作用是顯示勝敗結(jié)果;按鍵次數(shù)多的一方,點亮靠近其數(shù)碼管的上部,段選信號是0x63;次數(shù)少的一方,點亮靠近其數(shù)碼管的下部,段選信號是0x5c;單人模式中1-3、6-8位數(shù)碼管都是顯示KEY1按鍵次數(shù);雙人模式:void display_1()/雙人模式的數(shù)碼管顯示led_sel=0;/數(shù)碼管顯示,led_sel置為0for(i=0;i<8;i+)/循環(huán)掃描8位數(shù)碼管if(i=0)/數(shù)碼管第1-3位顯示count_1j=count_1%10;else if(i=1)j=(count_1%10
10、0)/10;else if(i=2)j=count_1/100;else if(i=3)/數(shù)碼管4-5位顯示勝負結(jié)果,以及游戲運行狀態(tài)if(light=1)if(count_1>count_2)/點亮第4位數(shù)碼管上半部分j=11;else if(count_1<count_2)/點亮第4位數(shù)碼管下半部分j=12;else if(count_1=count_2)/顯示等號j=13;else j=10;/顯示“-”else if(i=4)if(light=1)if(count_1>count_2)j=12;else if(count_1<count_2)j=11;else
11、if(count_1=count_2)j=13;else j=10;else if(i=5)/數(shù)碼管6-8顯示count_2j=count_2%10;else if(i=6)j=(count_2%100)/10;else if(i=7)j=count_2/100;P2=weixuani;/選擇數(shù)碼管的位數(shù)P0=duanxuanj;/顯示對應的數(shù)值delay_ms(1);/延時200ms單人模式:void display_2()/單人模式的數(shù)碼管顯示led_sel=0;/數(shù)碼管顯示,led_sel置為0for(i=0;i<8;i+)if(i=0)/數(shù)碼管1-3、6-8都顯示KEY1的按鍵結(jié)
12、果count_1j=count_1%10;else if(i=1)j=(count_1%100)/10;else if(i=2)j=count_1/100;else if(i=3)j=14;else if(i=4)j=14;else if(i=5)j=count_1%10;else if(i=6)j=(count_1%100)/10;else if(i=7)j=count_1/100;P2=weixuani;/選擇數(shù)碼管的位數(shù)P0=duanxuanj;/顯示對應的數(shù)值delay_ms(1);4、 LED顯示函數(shù)LED顯示函數(shù)是由一個if循環(huán)組成,count參數(shù)的作用是延時,由于LED掃描頻率較
13、快,利用延時函數(shù)能更好的觀察實驗現(xiàn)象;連續(xù)掃描50次即當count加到50時,表示兩次掃描之間相隔1s;設置LED標志位light,當所有的LED燈全部點亮,即信號led=0xff時,標志位light反轉(zhuǎn),此時led重新設置為0x00,而同時按鍵掃描停止,在數(shù)碼管顯示函數(shù)中,根據(jù)light標志位,可以開始比較并顯示最終比賽結(jié)果;當LED并沒有全部點亮時,每當count累加到50時,led向右移一位并且加1;這樣就能實現(xiàn)實驗LED的定時點亮以及游戲的定時;void display_led()/led顯示電路if(count=50)&&(light=0)/延時1s并且led標志位位
14、0if(led = 0xff) /led等于0xff時,重新賦值0x00,led燈全部熄滅,標志位反轉(zhuǎn)led = 0x00;light=1;elseled = (led << 1) + 1;/led值逐個左移并且補1,led依次點亮,直至所有全亮count=0;/重置count的值5、 蜂鳴器定時函數(shù)設置定時器工作模式為方式1,初始化TMOD為0x01,工作模式為16位定時器,并且設置定時器的初值TH0=0xfc,TL0=0x18,打開中斷總開關EA=1,設置定時參數(shù)pp=0;在中斷函數(shù)中pp累加,當pp累加到1000(相當于定時1s)時,蜂鳴器標志位反轉(zhuǎn),并且此時關閉中斷總開關,
15、不接受其他的中斷信號;當蜂鳴器標志位反轉(zhuǎn)的時候,蜂鳴器停止鳴叫;void timer0() interrupt 1 /定時中斷TH0=0xfc;TL0=0x18;pp+;if(flag)beep=beep;elsebeep=0;if(pp=1000)/定時器flag=!flag;/蜂鳴器標志位反轉(zhuǎn)EA=0;/關閉中斷總開關6、 切換模式函數(shù)在程序開始運行時,直接進入雙人模式,首先蜂鳴器鳴叫,然后led開始點亮;當掃描到KEY2時,退出雙人模式的while循環(huán),此時再次初始化,進入單人模式,但當掃描KEY2按下時,又切換回雙人模式;切換模式之后都會重新調(diào)用初始化函數(shù),然后經(jīng)過相同的時間控制函數(shù),
16、顯示模式稍微不同,實現(xiàn)了在單雙人模式之間的轉(zhuǎn)換,切換模式在程序的主函數(shù)中;void main()while(1)Init();/初始化,進入雙人模式while(1)if(pp=1000)/定時器flag=!flag;/蜂鳴器標志位反轉(zhuǎn)EA=0;/關閉中斷總開關display_1();/數(shù)碼管顯示speed();if(KEY2=0)/掃描到KEY2鍵,則切換你while(!KEY2);break;Init();/初始化,進入單人模式while(1)if(pp=1000)flag=0;EA=0;display_2();speed();if(KEY2=0)/掃描到KEY2鍵則切換回雙人模式while
17、(!KEY2);break;7、 實驗現(xiàn)象1、 雙人模式開始掃描按鍵,LED正在逐步點亮2、 掃描按鍵,右側(cè)數(shù)碼管顯示KEY1按鍵按下的次數(shù)3、 結(jié)果顯示左右按鍵次數(shù)相等,中間兩位顯示等號4、 結(jié)果顯示右側(cè)按鍵次數(shù)比左側(cè)多,4號數(shù)碼管上部點亮;5、 結(jié)果顯示左側(cè)按鍵次數(shù)比右側(cè)多,5號數(shù)碼管上部點亮;6、 單人模式開始,右側(cè)三位數(shù)碼管與左側(cè)三位數(shù)碼管都點亮,LED正在依次點亮;7、 單人模式中按鍵掃描開始,左右兩側(cè)數(shù)碼管都顯示KEY1按鍵的次數(shù);8、 實驗結(jié)論與心得通過這次程序設計,我對單片機的理論知識有了進一步的掌握,對單片機的原理和實際應用有了更多的理解和掌握。我對單片機C語言編程有了更深刻
18、的認識和更扎實的掌握,通過不斷的修改、不斷嘗試,對源代碼各個模塊的函數(shù)都有了一個非常深入的掌握。在收獲知識的同時,還收獲了閱歷,收獲了成熟。在此過程中,不僅培養(yǎng)了獨立思考、動手制作的能力,在各種其他能力上也都有了提高。更重要的是,在課程設計中,我們學會了很多學習的方法,真的是受益匪淺。要面對挑戰(zhàn),只有不斷的學習、實踐。9、 源程序程序頭文件STC15F2K60S2.H#include"STC15F2K60S2.H"#define uint unsigned int#define uchar unsigned charuchar duanxuan=0x3f,0x06,0x5b
19、,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x63,0x5c,0x48,0x00; /顯示0-9、輸贏情況uchar weixuan=0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00; /數(shù)碼管7-0/引腳別名設置sbit KEY1 = P32;/K1按鍵sbit KEY2 = P33;/K2按鍵sbit KEY3 = P17;/K3按鍵sbit led_sel = P23;/數(shù)碼管、LED引腳sbit beep = P34;/蜂鳴器引腳uint led=0x01;/LED初始化點亮第一個燈uint count_1;/KEY
20、1計數(shù)參數(shù)uint count_2;/KEY3計數(shù)參數(shù)uint i,j;uint k1,k2,k3;/三按鍵的控制參數(shù)uint flag;/flag控制蜂鳴器開啟關閉情況uint light;/light控制LED參數(shù)uint pp;/參數(shù)pp控制蜂鳴器定時uint count=0;/控制延時的參數(shù)void Init() /推挽輸出P0M0 = 0XFF;P0M1 = 0X00;P2M0 = 0X08;/設置P23為推挽模式P2M1 = 0X00;P3M1 = 0x00;P3M0 = 0x10; /設置P34為推挽模式TMOD=0x01; /設置定時器0,工作方式0,16位自動重裝定時器TH0
21、=0xfc; /設定定時器0的初值TL0=0x18;EA=1; /打開總中斷ET0=1; /打開定時器0中斷允許位TR0=1;flag=1; /標志位置初始化light=0;pp=0;count_1=0;count_2=0;led=0x01;count=0;i=0,j=0;k1=0,k2=0,k3=0;beep=0; /蜂鳴器引腳置0,以保護蜂鳴器led_sel = 0;/選擇讓數(shù)碼管發(fā)光P0 = 0;/初始化P0,讓LED燈全部熄滅void delay_ms(uint n)/延時函數(shù),一次延時200mswhile(n)uchar i, j;i = 11;j = 190;dowhile (-j
22、); while (-i);n-;void key_scan()/按鍵掃描函數(shù),設置按鍵消抖if(KEY1=0)&&(k1=0)/在KEY1掃描到的時候,k1改變count_1+;k1=1;/掃描到KEY1時,count_1計數(shù)累加else if(KEY1=1)/掃描到高電平時,使參數(shù)變回初始值k1=0;if(k3=0)&&(KEY3=0)count_2+;k3=1;/掃描到KEY3時,count_2計數(shù)累加else if(KEY3=1)k3=0;void display_1()/雙人模式的數(shù)碼管顯示led_sel=0;/數(shù)碼管顯示,led_sel置為0for(
23、i=0;i<8;i+)/循環(huán)掃描8位數(shù)碼管if(i=0)/數(shù)碼管第1-3位顯示count_1j=count_1%10;else if(i=1)j=(count_1%100)/10;else if(i=2)j=count_1/100;else if(i=3)/數(shù)碼管4-5位顯示勝負結(jié)果,以及游戲運行狀態(tài)if(light=1)if(count_1>count_2)/點亮第4位數(shù)碼管上半部分j=11;else if(count_1<count_2)/點亮第4位數(shù)碼管下半部分j=12;else if(count_1=count_2)/顯示等號j=13;else j=10;/顯示“-”
24、else if(i=4)if(light=1)if(count_1>count_2)j=12;else if(count_1<count_2)j=11;else if(count_1=count_2)j=13;else j=10;else if(i=5)/數(shù)碼管6-8顯示count_2j=count_2%10;else if(i=6)j=(count_2%100)/10;else if(i=7)j=count_2/100;P2=weixuani;/選擇數(shù)碼管的位數(shù)P0=duanxuanj;/顯示對應的數(shù)值delay_ms(1);/延時200msvoid display_2()/單人模式的數(shù)碼管顯示led_sel=0;/數(shù)碼管顯示,led_sel置為0for(i=0;i<8;i+)if(i=0)/數(shù)碼管1-3、6-8都顯示KEY1的按鍵結(jié)果count_1j=count_1%10;else if(i=1)j=(count_1%100)/10;else if(i=2)j=count_1/100;else if(i=3)j=14;else if(i=4)j=14;else if(i=5)j=count_1%10;else
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省周口市項城市2024-2025學年高三下學期高考模擬一(開學診斷考試)數(shù)學試題(原卷版+解析版)
- 江蘇省蘇州市蘇州工業(yè)園區(qū)星灣學校2024-2025學年下學期3月月考八年級數(shù)學試題(原卷版+解析版)
- 四川省資陽市安岳中學2025屆高三下學期二模數(shù)學試題(原卷版+解析版)
- 《鄉(xiāng)土中國》導讀
- 2025年風力提水機組項目合作計劃書
- 三方駕駛培訓合作協(xié)議
- 售后變更通知函
- 長沙報關委托協(xié)議
- 汽車租賃合同范本大全
- 鋼筋運輸應急預案協(xié)議
- 中國國際航空內(nèi)蒙古有限公司2025屆空中乘務員航空安全員高校畢業(yè)生校園招聘筆試參考題庫附帶答案詳解
- 2025江蘇省安全員考試題庫附答案
- 4.2 明確概念的方法 課件高中政治統(tǒng)編版選擇性必修三邏輯與思維
- 2024年國網(wǎng)陜西省電力有限公司招聘筆試真題
- 2025年共同成立子公司的戰(zhàn)略合作協(xié)議書
- 安保部績效考核方案
- 2025年中國硫酸慶大霉素片行業(yè)市場深度分析及行業(yè)發(fā)展趨勢報告
- 2025年江蘇農(nóng)林職業(yè)技術學院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 2025年背光源導光板市場分析現(xiàn)狀
- 2025山東能源集團中級人才庫選拔高頻重點提升(共500題)附帶答案詳解
- 2025年度新股東增資擴股股權激勵與員工持股計劃協(xié)議3篇
評論
0/150
提交評論