数字电路课程设计乒乓球游戏机

课程设计报告

乒乓球游戏机控制电路的设计

专业化产业

班级水平

教师

日期: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);

}