當前位置:編程學習大全網 - 編程語言 - 籃球遊戲編程

籃球遊戲編程

籃球比賽的30秒規則規定,進攻方在場上控球時必須在30秒內出手(NBA比賽24秒,NCAA比賽35秒),所以裁判在比賽過程中既要看球,又要看秒表,本文介紹的30秒倒計時器可以解決這個問題。

AT89C51單片機,30秒倒計時器,發光二極管

有很多方法可以設計和制作30秒倒計時器。本文介紹的30秒倒計時定時器以AT89C51為控制單元,用兩個數碼管顯示時間,用三個按鈕分別控制定時器的計時開始、復位和暫停。倒計時器的初始狀態顯示“30”。當裁判按下計時器鍵,30秒後開始倒計時。當計時時間減少到0時,計時器會發出聲光警報,提醒裁判計時時間到了。

第壹,電路設計

30秒倒計時器的電路主要由電源電路、單片機最小系統、按鍵輸入、顯示驅動電路和報警電路組成。30秒倒計時定時器的控制電路如圖1所示。

圖1 30秒倒計時定時器電路原理圖

1,按鍵輸入

“30秒倒計時器”使用三個按鈕完成開始計數、復位、暫停/繼續計數等功能。

(1)K1鍵:開始按鈕(P3.2)。

按下K1鍵,計數器開始倒計時,數碼管顯示的數字從30開始每秒倒計時。當達到零時,報警電路會發出聲光報警信號。當計數器處於暫停狀態時,按下K1鍵將返回計時狀態。

(2)K2鍵:復位按鈕(P3.3)。

按K2鍵,無論計數器工作在什麽狀態,計數器都會立即復位到預設值“30”,在報警狀態下按K2鍵取消報警。

(3)K3鍵:暫停/定時開關按鈕(P3.4)。

當計數器處於計時狀態時,按此鍵暫停計時器,數碼管顯示的數字不變;當計數器處於暫停狀態時,按下該鍵,計數器將回到計時狀態;密鑰在初始狀態下無效。

2.顯示驅動電路

“30秒倒計時器”采用兩個* * *數碼管顯示時間,數碼管的顯示方式為動態顯示。在顯示驅動電路中,數碼管的段管腳通過壹個470歐姆的電阻連接到單片機的P1端口,兩個片選管腳通過壹個9012連接到正5V電源,由P3.0和P3.1控制。

4.告警電路

當計時時間減少到0時,當顯示數碼管顯示“00”時,LED D1由P3.5控制發出光報警,蜂鳴器由P3.7控制發出聲報警。

二、軟件編程思路

1,全局變量

“30秒倒計時器”的動作流程主要由三個全局變量控制。壹是位變量“act”,當“act”為“1”時,倒計時開始,為“0”時停止,“act”的初始值為“0”,可以設置為“1”,也可以通過按鈕操作清零。第二個全局變量是char變量“time ”,它存儲倒計時時間。當倒計時時間為0時,將發出聲光報警。變量“時間”的初始值是30。當“act”為1時,定時器中斷服務程序會每隔1減去1,減為0時保持為0。按下“重置鍵”將“時間”重置為30。第三個全局變量是int變量“t”,它記錄響應計時被0中斷的次數。根據初始化定義,定時器0工作在1模式,每1 ms發出壹個中斷請求..控制程序只打開定時器0中斷,所以不會有比定時器0中斷更高級的中斷,所以每壹個請求都會被立即應答。響應後,在中斷服務程序中的全局變量“T”上加1,記錄響應中斷次數。1000次的每壹次響應都是1秒。變量“t”的初始值為0,中斷服務程序加上1。當“t”為2000時,它被中斷服務程序清除。在鍵驅動器中,當按下開始鍵、復位鍵和暫停/開始鍵時,“t”被清除為0,以便從0 ms開始計數

2.控制流

主程序主要用於檢測全局變量“時間”,當“時間”為0時發出“聲光報警”。按鍵驅動、顯示驅動和“時間”操作都在定時器0中斷服務程序中進行。控制流程如圖2所示。

圖2控制流程圖

三、軟件程序設計

1,數碼管驅動器

計時器的兩個數碼管動態顯示計時時間“time”(全局變量),LED1顯示十位“time”,LED2顯示壹位“time”。

(1)定義段代碼數據端口和芯片選擇信號。

根據實際電路,C51中定義的段碼的數據端口為P1,兩個片選信號分別為P3.0和P3.1。定義如下:

#定義段P1

sbit wei1=p3^0;

sbit wei2=p3^1;

(2)定義字體代碼

LED顯示數字0~9和被完全破壞的字體碼表放在數組zixing[]中。字體代碼是壹個固定的表,在定義的時候加上關鍵字“code”意味著這個表存儲在程序內存中。

無符號字符代碼zixing[]=

{

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff

};

(3)定義LED1和LED2的顯示變量。

為了增加驅動程序的可移植性,作者為LED1和LED2定義了顯示變量。顯示變量是這個驅動器的外部接口,外部程序可以通過改變顯示變量的值來改變數碼管顯示的值。定義如下:

無符號字符led_str[2]={10,10 };

Led_str[0]直接對應LED 1,LED _ STR [1]直接對應LED2。在這個項目中,全局變量time的計算被壹個特殊的子程序分為led_str[0]和led_str[1]兩部分。

void js()

{

led _ str[1]= time/10% 10;

led _ str[0]= time % 10;

}

(4)數碼管驅動器

數碼管驅動程序“void處士(char i)”在定時中斷服務程序中被調用和執行。根據初始化程序的定義,定時中斷服務程序每1 ms執行壹次,在定時中斷服務程序中,用全局變量“t”記錄進入服務程序的次數,當達到2000次時“t”被定時中斷服務程序清零。

數碼管驅動器的參數“char i”用於確定LED1或LED2當前是否點亮。當參數為“0”時,LED1亮,當參數為“1”時,LED2亮。如果我們想偶數次進入定時中斷服務程序時點亮LED1,奇數次進入定時中斷服務程序時點亮LED2,可以使用程序調用語句“處士(t % 2);”容易實現。

進入數碼管驅動後,先調用子函數js()計算當前led_str[0]和led_str[1]。接下來把兩個數碼管都滅了,防止余輝。最後點亮需要點亮的數碼管,發出字體代碼。驅動程序代碼如下:

無效處士(char i)

{

js();//計算顯示變量

段= 0xff//去余暉

Wei 1 = I;wei2=!我;//確認電影選擇

段= Zixing[led _ str[I]];//發送字體代碼

}

2、關鍵驅動因素

按鍵驅動分為兩部分:按鍵識別和按鍵功能執行。按鍵功能可以在按鍵時執行,也可以在按鍵擡起後執行,按鍵功能設計為在按鍵擡起後執行。

(1)定義關鍵I/O地址。

根據實際電路,三個按鍵(開始鍵、復位鍵、暫停/開始鍵)分別連接到P3端口的P3、P3.3和P3.4引腳。為了方便的獲取鍵值,P3端口也被定義為“iokey”,可以在程序中定義如下:

#定義約基·P3

sbit key1=p3^2;

sbit key2=p3^3;

sbit key3=p3^4;

(2)關鍵驅動過程

按鍵識別的壹般流程如下:I/O口寫“1”→判斷某個按鍵是否被按下→延時搖動→確定鍵值→等待按鍵被擡起→執行按鍵功能。按鍵驅動中定義了兩個靜態變量“ts”和“kv”,分別用於延遲去抖和存儲鍵值。

(3)延遲去抖

靜態變量“ts”用於延遲去抖。在定時器中斷服務程序中,每1毫秒執行壹次按鍵驅動程序。當按下壹個鍵“ts”並添加1時,如果沒有按下壹個鍵,它將被清除。如果鍵被連續按下20毫秒,當鍵驅動器被連續執行20次時,檢測到鍵被按下。此時靜態變量“ts”累計到20,可以確認按鍵被有效按下。

為了防止按鍵保持按下時“ts”累積溢出,可以將“ts”的值保持在20或者大於20的某個值,比如21。

(4)取鍵值

確認某個鍵被按下後,可以通過讀取該鍵的I/O端口狀態來獲取鍵值。為了讀取P3.2、P3.3、P3.4的管腳狀態,屏蔽P3口其他管腳的影響,讀取值可以逐位或高達11000111b(0x E3)後發送給靜態變量“kv”。

靜態變量“kv”存儲該鍵的鍵值,在沒有按下任何鍵或擡起鍵後,kv的值為0。按下啟動鍵時Kv = 111110111b(0x FB),按下復位鍵時Kv = 1165448。當按下暫停/開始鍵key3時,KV = 11011111b(0x ef)。

(5)執行鍵功能

當按鍵被擡起後第壹次執行按鍵驅動時,靜態變量“kv”保存按鍵被按下時最終得到的鍵值,鍵值作為參數調用按鍵執行器“act key(kV);”可以執行按鍵功能。通話結束後,kv值立即清零,以確保按鍵功能執行壹次。驅動程序代碼如下:

void鍵()

{

靜態無符號字符kv = 0;

靜態無符號字符ts = 0;

key 1 = 1;key 2 = 1;key 3 = 1;

如果(!(key 1 & amp;key2 & amp按鍵3))

{

ts++;

if(ts & gt;= 20)ts = 20;//有壹個鍵被按下。

如果(ts==20)

kv = iokey | 0xe3//獲取鍵值

}

其他

{//沒有按下或擡起任何鍵。

act key(kv);

ts = 0;

kv = 0;

}

}

函數actkey(kv)用於根據鍵值“kv”執行相應的操作。當“kv”等於0xFB時,表示啟動鍵key1被按下,函數actkey(kv)將全局變量act賦值為“1”。當“kv”等於0xF7時,表示復位鍵key2被按下,函數actkey(kv)將全局變量“time”復位為“30”。當“kv”等於0xEF時,表示暫停/開始鍵被按下,函數actkey(kv)反轉全局變量act。每按壹次按鈕,全局變量“t”就會被清零,這樣每當定時器復位或啟動時,進入計時中斷的次數就會從0開始計數,否則第1秒計時不準。程序代碼如下:

void actkey(無符號字符k)

{

開關(k)

{

case 0x FB:act = 1;t = 0;打破;

案例0xf7:時間= 30;t = 0;打破;

case 0x ef:act = ~ act;t = 0;打破;

}

}

四。結束語

本文在編程過程中用面向對象的編程思想封裝了兩個LED數碼管和三個獨立的按鈕。在定時中斷服務程序中調用它的驅動程序時,程序員只需要操作它的接口:數組“led_str[2]”和函數“actkey(unsigned char k)”,就可以改變函數,不需要直接對硬件編程,增強了軟件的通用性和可移植性。

  • 上一篇:漫畫:什麽是“可控核聚變”?
  • 下一篇:想要轉行,如何跨專業就業?
  • copyright 2024編程學習大全網