用8個LED發光管(4紅4綠)的來回滾動顯示,模擬打乒乓球時兩邊乒乓球的來回運動。遊戲雙方采用按鍵的方式(每方使用1按鍵)模擬發球和接發球,即發球方按下由其控制的按鍵,球從發球方移動到對方(led發光管從發球方到對方壹個壹個點亮,顯示滾動)。當球移動到接發球方時,接發球方立即按下由其控制的按鈕,“擊球”使球“反彈”到發球方,以此類推。
2.設計要求
比賽規則可以參考乒乓球的壹般規則。要求:
(1)球以每0.5秒滾過1個led的速度移動;
(2)球到達後0.5秒內回球(按下按鈕),否則算失球;
(3)球到達前按下按鈕,球不會返回;
(4)用四個八段碼為兩邊記分(每邊兩個八段碼,以10為基數計數,初始值0:0)。
設備:單脈沖電路、可編程並行接口8255、可編程定時計數器8253、LED行車燈、七段數碼管、開關等。
壹、實驗原理
1.8253定時器采用模式0實現定時功能。為了實現連續顯示,必須每隔5~10ms刷新兩個七段數碼管,燈的移動速度為300 ~ 500 ms,設置計時周期為5 ms,當計數停止,8253輸出高電平時,將分別顯示分數的高低位置。在壹定數量的定時周期之後,執行燈移動的操作。
2.8255並行接口A口和B口分別用於控制LED流水燈和數碼管的顯示,C口用於讀入各開關的狀態,輸出數碼管的片選信號。
3.單脈沖開關模擬擊球。當8255讀入的脈沖信號為高電平時,通過判斷燈和電池的當前移動方向,可以確定燈的下壹個移動方向。
4.四號。LED跑步燈指示乒乓球的運動。每次燈移動時,都應該給操作員留出足夠的時間來撥動速度開關或按下脈沖開關。
5.七段數碼管與比賽同步顯示比分,0~f對應的16基控數為0x3f、0x06、0x5b、0x4f、0x66、0x6d、0x7d、0x07。
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x7b,0x71 .
二、硬件接線圖
三、程序框圖
四、源程序
程序源代碼如下:
(包括註釋)
// -
//文件名:table tennis.cpp
//版本:1.0標準版
//創建人:鳳飛
//創建日期:01/12/2010
//說明:可以計分,判斷勝負,調節乒乓球速度。
//這個程序都是我自己寫的。如有雷同,不勝榮幸!
// -
# include & ltstdio.h & gt
# include & ltconio.h & gt
# include & ltstring.h & gt
# include & ltiostream.h & gt
#包含“ApiEx.h”
#pragma註釋(lib," ApiEx.lib ")
int pa = 0x280
int Pb = 0x 281;
int pc = 0x282
int pn 1 = 0x 283;
int p0 = 0x288
int p 1 = 0x 289;
int p2 = 0x28a
int pn2 = 0x28b
int s[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x7b,0x 71 };
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
void leddic(無符號字符& ampLed,int f) //燈移動功能
{
int x = led
if(f = = 0)x = x/2;//如果方向對,光向右移動壹個。
else if(f = = 1)x = x * 2;//如果方向是左,燈光向左移動壹個。
else printf("錯誤!");
led = x;
}
虛空速度(int & ampS) //球速控制,從8255C口讀取開關狀態,
{//高的話,調整速度快。
無符號字符數據;
int x;
端口讀取字節(PC & amp;數據);
x =數據;
x = x & amp4;
if(x = = 0)s = 100;//默認為5 * 100毫秒。
if(x = = 1)s = 60;//高速5*60ms
}
void score(int m)//通過數碼管顯示分數。
{
無符號字符數據;
data = s[m];
PortWriteByte(pc,0x 20);//選擇數碼管的高位
PortWriteByte(pa,data);//顯示分數
}
無效分數(整數)
{
無符號字符數據;
data = s[n];
PortWriteByte(pc,0x 10);//選擇數碼管的低位。
PortWriteByte(pa,data);//顯示B分數
}
void start(無符號字符& amp發光二極管,int & ampf,int & amps,int m,int n) //服務器仿函數
{
無符號字符數據;
int x;
PortWriteByte(pn2,0x 57);//8253計數器1初始化,低八位,模式3,控制字01010111b。
PortWriteByte(p1,0x 10);//8253計數器1計數初始值10。
for(;1 & lt;2;)
{
速度;
端口讀取字節(PC & amp;數據);
x =數據;
x = x & amp1;
If(x==1) //如果A發球,光線從左到右。
{
led = 0x80
f = 0;
打破;
}
x =數據;
x = x & amp2;
If(x==1) //如果B發球,光線從右向左。
{
led = 0x 1;
f = 1;
打破;
}
x =數據;
x = x & amp8;
If(x==1) //當8253的輸出為高時,顯示A分。
{
scorem(米);
}
Else //當8253輸出為低電平時,顯示B的分數score(n);
}
}
void out(無符號字符& amp發光二極管,int & ampf,int & ampm,int & ampN) //判斷球是否出界,即球員得分。
{
If(f==1) //當球向左移動時,
{
If(led==0x0) //球出界了。
{
Printf ("B分!\ n ");
n++;
printf(" score:");
printf("%d-%d ",m,n);
printf(" \ n \ n ");
}
}
Else //當球向右移動時,
{
If(led==0x0) //球超出右邊界。
{
Printf ("A分數!\ n ");
m++;
printf(" score:");
printf("%d-%d ",m,n);
printf(" \ n \ n ");
}
}
if((m = = 11)& amp;& amp(m-n & gt;= 2))| |((m & gt;11)& amp;& amp(m-n & gt;= 2))//判斷整場比賽的勝負。
{
Printf("這局A贏了!重新得分!\ n \ n \ n ");
m = n = 0;
}
else if((n = = 11)& amp;& amp(n-m & gt;= 2))| |((n & gt;11)& amp;& amp(n-m & gt;=2)))
{
Printf("這局B贏了!重新得分!\ n \ n \ n ");
m = n = 0;
}
}
無效攻擊(無符號字符& amp發光二極管,int & amp美國國際貿易公司。f,int & ampm,int & ampN) // hitter函數
{
無符號字符數據;
int x,y;
STA:
Printf("請上菜!\ n ");
啟動(led,f,s,m,n);
PortWriteByte(pn2,0x 51);//8253計數器1初始化,低八位,模式0,控制字0101001b。
紅色:
PortWriteByte(pb,led);
for(int I = 1;我& lt= s;i++)
{
PortWriteByte(p1,5);//8253計數器1計數初始值5。
咕:
端口讀取字節(PC & amp;數據);
x =數據;
y =數據;
y = y & amp8;
if(y = = 0)goto Goo;//8253不輸出高電平時繼續讀取。
if(I % 2 = = 1)scorem(m);
else scoren(n);
If(f==1) //球向左移動。
{
x = x & amp1;
if((x = = 1)& amp;& amp(led & gt=0x10)) //球接近A,A擊球。
{
f = 0;//向右調整球的移動方向。
}
}
Else //球向右移動。
{
x =數據;
x = x & amp2;
if((x = = 2)& amp;& amp(led & lt=0x8)) //球接近B and B擊球。
{
f = 1;//向左調整球的移動方向。
}
}
}
leddic(led,f);
out(led,f,m,n);
中頻(led==0x0)
{
PortWriteByte(pb,led);
goto STA
}
轉紅;
}
void main()
{
無符號字符led
int f=1,s = 0;//f是光線的移動方向,默認為向右;s是燈的移動速度。
int m=0,n = 0;//m是分數,n是分數。
startup();//打開設備
PortWriteByte(pn1,0x 81);//8255初始化,A口和B口輸出,
//C口高電平輸出,低電平輸入,控制字1000001b。
PortWriteByte(pn2,0x 27);//8253計數器0初始化,8個高位,模式3,控制字001001111b。
PortWriteByte(p0,0x 20);//8253計數器0計算初始值2000。
攻擊(led,s,f,m,n);//調用擊球手函數
clean up();//關閉設備
}
動詞 (verb的縮寫)結論
實現了壹個可以同步記分和顯示比分的模擬乒乓球比賽。
可以實現或完成的功能如下:
1.LED燈模擬乒乓球的運動。
2.模擬乒乓球擊球和發球。
3.像在實際比賽中壹樣判斷比分和整場比賽的勝負。
4.妳可以調整服務速度。
5.得分和顯示得分同步進行