数字电路课程设计乒乓球游戏机
乒乓球游戏机控制电路的设计
专业化产业
班级水平
姓
教师
日期:65438+2009年2月26日
一、基本要求:
1.设计一个甲、乙双方都参与并有裁判的3人乒乓球游戏机。
2.用8个(或更多)发光二极管组成一条直线,以中点为界,两边代表参与者的位置。一个发光二极管指示球的当前位置,并且发光二极管的移动速度应该可以从左到右或从右到左调节。调整
3.当“球”(点亮的LED)移动到一侧的最后一个位置时,参赛者应该能够果断地按下自己一侧的按钮开关,这意味着启动球拍击球。如果击中,球会向相反的方向移动;如果不中,对方将获得1分。
4.当一方得分时,电路自动响铃3 s,期间发球无效,比赛可以继续,直到铃停。
5.设置自动计分电路。甲乙双方均采用2位数码管进行计分显示,每21分为1轮。
6.甲乙双方各有一个发光二极管,表示有发球权,每五次自动交换发球。
为了模拟乒乓球运动的过程和规则,我们使用AT89C51单片机来控制模拟。8个(或更多)发光二极管排成一条直线,以中点为界,两边代表参与者的位置,其中一个发光表示球的当前位置,一个蜂鸣器用来鸣钟。
比赛双方用按钮开关模拟启动球拍击球,用数码管显示比赛比分。
关键词:AT89C51 LED蜂鸣器。
二。系统设计
2.1总体设计
2.1.1乒乓球比赛系统框图
整个过程由AT89C51单片机控制,控制器产生控制信号控制8个led的开关,使led从左到右或从右到左模拟,速度可调。对于分数的显示,我们使用LED,它的优点是亮度强,可以满足我们的要求。整体电路图如下图所示:
2.1.2单片机总体设计
AT89C51单片机价格低廉,抗干扰能力强,可以满足我们的要求。我们用单片机的P0来控制8个led的开关,通过控制P0口就可以控制led。由于P0端口内部没有上拉电阻,我们无法驱动led,因此我们在外部添加上拉电阻。用P1端口控制数码管的分段显示,用P2端口的低四位控制数码管的位置选择,用P30和P31控制开关,用PP26和P27显示服务权。P25控制蜂鸣器,总体框图如下图所示:
2.1.3 LED开关的设计
要求LED从左向右或从右向左移动。我们只需要改变P0端口的值。依次给P0口取值0x 01,0X02,0X04,0x08,0x10,0X20,0X40,0X80,方向可以移动。整体画面如下:
2.1.4数码管设计
通过控制数码管的分段,我们可以控制数码管的数学显示。我们用一种动态的方式来控制数字。这种方式是让数码管快速切换显示,人眼无法分辨,既省电,又节省单片机的端口,从而降低程序的复杂度,如下图所示:
2.2编程
该系统的程序如下:
# include & ltreg 51 . h & gt;
# include & ltabsacc.h & gt
#定义uchar无符号字符
#定义uint无符号整数
#定义DB P1
sbit sb1=p3^0;//按钮1
sbit sb2=p3^1;//按钮2
sbit deng1=p2^7;//指示灯1
sbit deng2=p2^6;//指示灯2
sbit mic=p2^5;//蜂鸣器
uchar计数= 0;
uchar i,j,fengshu1,fengshu2
位停止,选择,返回,标志= 0;
uchar ledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x 90 };//从0到9的分段代码
uchar dengcode[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x 80 };//代码从左向右移动
* * * * * * * * * * * *延时x毫秒程序* * * * * * * * * * * * * *
无效延迟(单位x)
{ uchar y;
while(x -)
for(y = 0;y & lt125;y++);}
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
虚空一洞(乌恰方)
{ for(I = 0;我& lt8;i++)
{延迟(1000);
if(fang==0)
{ P0 = Deng code[I];}
else P0 = Deng code[8-I];
}
}
* * * * * *数码管显示程序* * * * * * * * * * * * * *
空显示(uchar a,uchar b)
P2 = P2 & amp;& amp0xe 1;
延迟(50);
p 1 = led code[a/10];
P2 = P2 & amp;& amp0Xe0
P2 = P2 & amp;& amp0Xe2
延迟(50);
p 1 = led code[a % 10];
P2 = P2 & amp;& amp0Xe0
P2 = P2 & amp;& amp0Xe4
延迟(50);
p 1 = led code[b/10];
P2 = P2 & amp;& amp0Xe0
P2 = P2 & amp;& amp0Xe8
延迟(50);
p 1 = led code[b % 10];
P2 = P2 & amp;& amp0Xe0
}
/* * * *蜂鸣器响应程序* * *
空麦克风()
{ Mic = 1;
延时(3000);//延迟3秒
mic = 0;
}
void main()
{ uchar Shu = 0;
TMOD = 0x 01;
TH0 = 0X00
TL0 = 0X00
TR0 = 1;
ET0 = 1;
P0 = 0;
feng Shu 1 = 0;feng U2 = 0;
P2 = 0;
p 1 = 0;
sb 1 = 1;
SB2 = 1;
while(1)
{ for(I = 0;我& lt2;i++)
for(j = 0;j & lt5;j++)
{一东(一);
如果(i==0)
{ Deng 1 = 1;Deng 2 = 0;}
ifi==1)
{ Deng 2 = 1;Deng 1 = 0;}
if(SB2 = = 0 & amp;& ampP0=0X80)
{ yidong(0);}
if(SB2 = = 1 & amp;& ampP0=0X80)
{ feng Shu 1++;
if(fengshu1==21)
{ feng Shu 1 = 0;feng U2 = 0;}
mic();}
if(sb 1 = = 0 & amp;& ampP0=0X01)
{一东(1);}
if(sb 1 = = 1 & amp;& ampP0=0X01)
{ feng u2++;
if(fenshu2==21)
{ feng Shu 1 = 0;feng U2 = 0;}
mic();}
}
}
void display0()中断1
{ TH0 = 0;
TL0 = 0;
显示(fengshu1,feng Shu 2);
}