单片机简易乒乓球游戏机.docx
《单片机简易乒乓球游戏机.docx》由会员分享,可在线阅读,更多相关《单片机简易乒乓球游戏机.docx(23页珍藏版)》请在冰豆网上搜索。
![单片机简易乒乓球游戏机.docx](https://file1.bdocx.com/fileroot1/2022-11/17/7f9bc22c-aa37-4a44-b5af-ec7042a25347/7f9bc22c-aa37-4a44-b5af-ec7042a253471.gif)
单片机简易乒乓球游戏机
单片机课程设计
实验报告
乒
乓
球
游
戏
设计题目
简单乒乓球游戏
所选题意义
充分利用51单片机壮大的操纵功能并结合实验室所具有的设备(示波器),设计一个简单的两人乒乓球游戏,使这种生活中游戏也能在电子设备中实现,再次证明实验也并非是枯燥的,乐趣就在其中,关键取决于自己
系统所实现的要紧功能
(1)利用51单片机输出两路脉冲波到示波器,将示波器设置为X-Y模式(显示乒乓球点),操纵单片机使乒乓球在示波器上两边跳动,途径呈抛物线形式;
(2)利用两个按键作为球拍,能够将乒乓球即便击打归去(仍然呈抛物线),假设没有即便击打乒乓球,那么球触边界表示一方击球失败,另一方相应的加1分,分数实时在数码管上显示,同时有代表两边的红、绿LED灯相应闪烁;
(3)按键一次,蜂鸣响一下,球走向为一样抛物线,按键两次表示球以高抛球形式返归去;
(4)球的球向由LED灯实时显示,同时球过中线时,数码管小数点闪烁一下
(5)同实际一样,游戏为11分制,任何一方先达到11分为成功方,同时奏响成功方的音乐(两边有各自不同的音乐),在奏响音乐的时候,数码管归零,音乐终止后,游戏从头开始
本人所做工作
(1)完成系统设计的构思,依照构思开始编写程序,慢慢实现系统所需要的一些功能(程序中通过挪用子函数实现);
(2)程序在keil中编译通事后,将产生的Hex文件加入到Proteus仿真环境下的单片机中,连接电路后仿真;
(3)在编写完程序和Proteus仿真取得预期成效后,开始购买元件,焊接硬件电路;
(4)焊接完后,在实验室利用示波器和单片机电路联调,以达到最正确成效
硬件电路设计及描述
本设计用自己焊接的PCB板实现。
实际焊接的电路在keil和Proteus联调环境下实现了全数功能。
系统硬件电路包括:
显示部份、按键部份、蜂鸣奏乐部份。
(1)显示部份
电路图如下:
本设计采纳的是共阳数码管,作为打球两边计分显示。
用P0口作为数码管的段选,由于P0口内部没有上拉电阻,在输出1时是悬浮的,状态不确信,因另外接上拉电阻,当输出0时,靠内手下拉电阻输出为低电平,当输出为1时,靠外部上拉电阻输出为高电平。
P2口的0、一、二、3端口作为数码管的位选端,由于用的是大号的共阳数码管,因此为了让实际中数码管足够亮,在位选端加入PNP三极管增加驱动。
两个红、绿LED发光二极管灯别离接P1_7、P1_6口,得分的一方闪烁一下各自的LED灯;同时LED灯显示球在抛物线的哪一边,球过中线时,数码管小数点亮一下。
(2)蜂鸣奏响部份
电路图如下:
P1_3口作为蜂鸣器的输入端,为了能驱动蜂鸣器,一样增加了PNP。
(3)按键部份
两个外部触点按键别离接外中断INTO、INT1作为击球的球拍。
总的电路图如下:
(1)单片机XATL一、XATL2端口接12M晶振;RST端口接复位按键;
(2)对ROM的读操作是始终从单片机的内部程序存储器开始的,因此EA端口一直接高电平;
(3)P1_一、P1_2作为两路X轴、Y轴脉冲波的输出端,接入到示波器中显示乒乓球运动
单片机上电后,假设不按按键那么乒乓球点开始在示波器上两边来回呈抛物线跳动,乒乓球在一边触底线后,另一方得分,数码管分数加1,同时LED灯闪烁一下;乒乓球过中线后,按键一次乒乓球即便反弹归去,数码管分数不变,同时LED灯不亮;持续按键两次,乒乓球呈高抛球轨迹反弹归去;当一方分数达到11分时,音乐奏响,同时数码管归零。
软件设计流程及描述
(1)按键扫描程序
本设计顶用到了3个按键,其中一个作为复位端,另外两个作为击球球拍,球过中线后,按键一次能及时将这球击打归去,按键两次为高抛球返归去;两个球拍是用INTO、INT1外中断实现的。
INTO中断程序流程图如下:
否
外中断开启
INTO是否为0
是
进外中断,延时10ms
INT0是否为0
否
退出外中断
是
球是否中线和边界之间
是
建立返回标志位flag;shu1++,shu2=0;
判断shu1奇偶数,建立发高抛球标志位
数码管显示,发X轴、Y轴波
按键是否弹出
否
是
(2)T0中断效劳程序
采纳按时器T0计时,采纳模式1每隔进入按时器中断效劳程序中对乒乓球进行处置,包括判定标志位来加减用于查X轴、Y轴表的计数值;判定球是不是触边界了,假设触边界那么让发球方分数加1,点亮发光二极管;判定比分是不是达到11分来决定是不是设定开启音乐子程序的标志位。
T0中断效劳程序流程图如下:
保护现场
设定计数初值
到否
是
进中断,判断标志位flag
重装计数器值
0
查表计数值++,判断计数值是否为54
是
设Flag为1,比分加1,抛物线标志位置1,点亮LED灯
判断比分是否为11
否
恢复现场
1
查表计数值--,判断计数值是否为0
是
设Flag为0,比分加1,抛物线标志位置1,点亮LED灯
判断比分是否为11
是
返回
建立响不同音乐标志位flag2,比分置0,关T0中断,设置T1计数初值,设定进入响音乐程序的标志位flag1
是
否
否
否
否
(3)显示部份
采纳数码管动态扫描法,能实时显示比分值
数码管显示子程序流程图如下:
位选设定(高位)
查共阳表后送入到P0口
位选设定(低位)
查共阳表后送入到P0口
延时
延时
返回
(4)蜂鸣音乐设计
音调由不同频率的方波产生,音调与频率的关系如下表所示(这是其中一个八度)。
要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时刻。
利用计时器计时此半周期时刻,每当计时到后就将输出方波的I/0反相,然后重复计时此半周期时刻再对I/O反相,就可在I/O脚取得此频率的方波。
在在焊接板中产生方波的I/O脚选用,端口已经与蜂鸣器的驱动电路相连。
如此输出不同频率的方波,蜂鸣器便会发出不同的声音。
另外,音调的节拍是由延时实现的。
依照延时的设定和乐谱的节拍数,设定半拍、1拍的时刻。
(5)整体设计流程图:
中断初始化
灭LED灯,发X轴、Y轴波子函数调用,数码管显示子函数调用
标志位flag1是否为1
是
判断flag2
1
0
查询乐曲“欢乐颂”表(音调、节拍),调用song子函数
查询乐曲“卡农”表(音调、节拍),调用song子函数
否
判断乐曲是否结束对定时器T1、T0开启与否进行设置
数码管显示
进定时器T0中断服务程序
时间中断
外中断
进外中断服务程序
源程序代码及注释
#include<>
#defineucharunsignedchar//8位无符号数
#defineintunsignedint//16位无符号数
#defineulongunsignedlong//32位无符号数
/*************************************************************************/
sbitspeaker=P1^3;//扬声器输出口定义
unsignedchartimer0h,timer0l,time;//音调、节拍变量概念
/***********频率-半周期数据表高八位共保留了四个八度的28个频率数据***/
codeunsignedcharFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,//超低音1234567
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音1,2,3,4,5,6,7
0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音1234567
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF};//高音1234567
/*******************频率-半周期数据表低八位***************************/
codeunsignedcharFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,//超低音1234567
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,//低音1,2,3,4,5,6,7
0x8F,0xEE,0x44,0x6B,0xB4,0xF4,0x2D,//中音1234567
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16};//高音1234567
/************************************************************************
一个音符有三个数字。
前为第几个音、中为第几个八度、后为时长(以半拍为单位)
6,2,3代表:
6,中音,3个半拍;
1,3,2代表:
1,高音,2个半拍;
要想演奏不同的乐曲,只需要修改下面的数据表
************************************************************************/
/**********************************欢乐颂*******************************/
ucharcodehls[]={3,2,2,3,2,2,4,2,2,5,2,2,5,2,2,4,2,2,3,2,2,2,2,2,1,2,2,
1,2,2,2,2,2,3,2,2,3,2,3,2,2,1,2,2,4,3,2,2,3,2,2,4,2,2,5,2,2,5,2,2,4,2,2,
3,2,2,2,2,2,1,2,2,1,2,2,2,2,2,3,2,2,2,2,3,1,2,1,1,2,4,2,2,2,2,2,2,3,2,2,
1,2,2,2,2,2,3,2,1,4,2,1,3,2,2,1,2,2,2,2,2,3,2,1,4,2,1,3,2,2,2,2,2,1,2,2,
2,2,2,5,1,2,3,2,2,3,2,2,3,2,2,4,2,2,5,2,2,5,2,2,4,2,2,3,2,2,4,2,1,2,2,1,
1,2,2,1,2,2,2,2,2,3,2,2,2,2,3,1,2,1,1,2,4,
0,0,0};
/**********************************卡农*********************************/
ucharcodekan[]={5,3,2,3,3,1,4,3,1,5,3,2,3,3,1,4,3,1,5,3,1,5,2,1,6,2,1,
7,2,1,1,3,1,2,3,1,3,3,1,4,3,1,3,3,2,1,3,1,2,3,1,3,3,2,3,2,1,4,2,1,5,2,1,
6,2,1,5,2,1,4,2,1,5,2,1,3,2,1,4,2,1,5,2,1,4,2,2,6,2,1,5,2,1,4,2,2,3,2,1,
2,2,1,3,2,1,2,2,1,1,2,1,2,2,1,3,2,1,4,2,1,5,2,1,6,2,1,4,2,2,6,2,1,5,2,1,
6,2,2,7,2,1,1,3,1,5,2,1,6,2,1,7,2,1,1,3,1,2,3,1,3,3,1,4,3,1,5,3,1,3,3,2,
1,3,1,2,3,1,3,3,2,2,3,1,1,3,1,2,3,1,7,2,1