用 8 个 LED 发光管 (4 个红, 4 个绿 ) 的来回滚动显示来模拟打乒乓球时乒乓球在两边球台上的来回运动。比赛双方用按按钮 ( 双方各用 1 个按钮 ) 的方法来模拟发球与接球 , 即发球方按动其控制的按钮 , 球从发球方一侧向对方运动 (LED 发光管从发球方到对方逐个点亮 , 滚动显示 ), 当球运动至接球方时 , 接球方立即按动其控制的按钮 , “击球”使球“d回”发球方一侧 , 如此周而复始 , 直至在规定的击球时间内有一方未能完慧雀成击球动作 , 从而对方得一分 , 然后继续比赛。
2.设计要求
比赛规则可参照一般的乒乓球比赛规则。要求:
(1)球以每0.5秒滚过1个LED的速度移动;
(2)回球需在球到达后的0.5秒内进行(按下按钮), 否则按失球计;
(3)球未到达提前按下按钮不起回球作用
(4)用 4 个八段码为双方记分 ( 每方 2 个八段码 ,10 进制计数 , 初始值 0:0) 。
设备:单脉冲电路,可编程并行接口8255,可编程定时计数器8253,LED流水灯,七段数码管,开关等。
一、 实验原理
1.8253定时器选用方式0,实现定时功能。两个七段数码管要实现连续显示,必须每隔5~10ms刷新一次,而灯移动速度为300~500ms。设定定时周期为5ms,当计数停止,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。
二、 硬件接线图
三、 程序框图
四、 源程序
程序源代码如下:
(含注解)
//--------------------------------------------------------------------------------------------------
// File Name: table tennis.cpp
// Version: 1.0标准版
// Created By: 枫飞
// Created date: 01/12/2010
// Description: 实现可记分、判断胜负,可速度调整的乒乓球对打
//本程序全部由本人编写,如有雷同,不胜荣幸!
//--------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
#include "ApiEx.h"
#pragma comment(lib,"ApiEx.lib")
int pa=0x280
int pb=0x281
int pc=0x282
int pn1=0x283
int p0=0x288
int p1=0x289
int p2=0x28a
int pn2=0x28b
int s[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x7b,0x71}
// 012 3 4 5 6789 ab c d e f
void leddic(unsigned char &led, int f) //灯移动函数
{
int x=led
if(f==0) x=x/2 //若方向向右,灯向右移动一个
else if(f==1) x=x*2 //若方向向左,灯向左移动一个
else printf("Error!")
led=x
}
void speed(int &s)//球速控制,从8255C口读入开关状态,
{ //若为高电平,调整速度为高速
unsigned char data
int x
PortReadByte(pc,&data)
x=data
x=x&4
if(x==0) s=100 //默认5*100ms
if(x==1) s=60 //高速5*60ms
}
void scorem(int m) //通过数码管显示比分
{
unsigned char data
data=s[m]
PortWriteByte(pc,0x20) //选择数码管高位
PortWriteByte(pa,data) //显示甲得分
}
void scoren(int n)
{
unsigned char data
data=s[n]
PortWriteByte(pc,0x10) //选择数码管低位
PortWriteByte(pa,data) //显示乙得分
}
void start(unsigned char &led, int &f,int &s,int m,int n) //发球子函数
{
unsigned char data
int x
PortWriteByte(pn2,0x57)//8253计数器1初始化,低八位,方式3,控制字01010111B
PortWriteByte(p1,0x10) //8253计数器1计数初值10
for(1<2)
{
speed(s)
PortReadByte(pc,&data)
x=data
x=x&1
if(x==1) //若甲发球,灯从左往右
{
led=0x80
f=0
break
}
x=data
x=x&2
if(x==1) //若乙发球,灯从右往左
{
led=0x1
f=1
break
}
x=data
x=x&8
if(x==1)//当8253输出为高电平时,显示甲得分
{
scorem(m)
}
else//当8253输出为低电平时,显示乙得分 scoren(n)
}
}
void out(unsigned char &led, int &f,int &m,int &n) //判断球是否出界,即选手得分
{
if(f==1) //球向左运动时
{
if(led==0x0) //球超出左边界
{
printf("乙得分!\n")
n++
printf("比分:")
printf("%d-%d",m,n)
printf("\n\n")
}
}
else //球向右运动时
{
if(led==0x0) //球超出右边界
{
printf("甲得分!\n")
m++
printf("比分:")
printf("%d-%d",m,n)
printf("\n\n")
}
}
if(((m==11)&&(m-n>=2))||((m>11)&&(m-n>=2))) //判断整局比赛的胜负
{
printf("此局甲获胜!重新计分!\n\n\n")
m=n=0
}
else if(((n==11)&&(n-m>=2))||((n>11)&&(n-m>=2)))
{
printf("此局乙获胜!重新计分!\n\n\n")
m=n=0
}
}
void attack(unsigned char &led,int &s, int &f,int &m,int &n) //击球子函数
{
unsigned char data
int x,y
STA:
printf("请发球!\n")
start(led,f,s,m,n)
PortWriteByte(pn2,0x51) //8253计数器1初始化,低八位,方式0,控制字01010001B
Red:
PortWriteByte(pb,led)
for(int i=1i<=si++)
{
PortWriteByte(p1,5) //8253计数器1计数初值5
Goo:
PortReadByte(pc,&data)
x=data
y=data
y=y&8
if(y==0) goto Goo //当8253未输出高电平时,继续读入
if(i%2==1)scorem(m)
else scoren(n)
if(f==1) //球向左运动
{
x=x&1
if((x==1)&&(led>=0x10)) //球靠近甲且甲击球
{
f=0 //调整球的运动方向为向右
}
}
else//球向右运动
{
x=data
x=x&2
if((x==2)&&(led<=0x8))//球靠近乙且乙击球
{
f=1//调整球的运动方向为向左
}
}
}
leddic(led,f)
out(led,f,m,n)
if(led==0x0)
{
PortWriteByte(pb,led)
goto STA
}
goto Red
}
void main()
{
unsigned char led
int f=1,s=0//f为灯移动方向,默认向右;s为灯移动速度
int m=0,n=0 //m为甲得分,n为乙得分
Startup() //打开设备
PortWriteByte(pn1,0x81)//8255初始化,A口B口输出,
//C口高位输出,低位输入,控制字10000001B
PortWriteByte(pn2,0x27)//8253计数器0初始化,高八位,方式3,控制字00100111B
PortWriteByte(p0,0x20) //8253计数器0计数初值2000
attack(led,s,f,m,n) //调用击球子函数
Cleanup() //关闭设备
}
五、 结论
实现了能够计分、同步显示比分的模拟乒乓球比赛。
能够实现或完成的功能如下:
1. LED灯模拟乒乓球的移动
2. 模拟乒乓球的击球、发球
3. 与实际比赛一样判断得分和整局的胜负情况
4. 可以调整发球速度
5. 计分、同步显示比分
你说的这种txt文件其实就是csv文件高缓。
如果只是1,1,1,50,13,50 EOR(end of record)这样的只有一个一维数组,直接用“读取电子表格”VI,使用半角逗号为分隔符,然后用“首行”输出接到波形图控件即可。
算了,不上图你是不知道有多简单。这样常用的功能,LabVIEW已经自带了VI。羡则
如果是像你写的1,1,1,50,13,50 EOR(end of record) , 2,1,1,4,40,60.....这样的,有多个一维数组存在同一兄念棚个文件里?这就需要在循环中使用“匹配正则表达式”函数,分离出一条条记录,然后用“电子表格字符串至数组转换”函数转换出一维数组,再用LabVIEW2012循环输出隧道的连接数组功能,连成一个大数组给波形图控件显示。
打visual studio 二05 二 点击文件颂仿渗">"新建>"项目" 三 选择visual c++>"win三二控制大拆台应用程序"点击确定 四 点击步 5 空项目选项打勾点击完 /步骤二 完面步骤右边解决案管理器选择源文件右键选择添加野脊>新建项 选择C++文件(.cpp),点击添加 编写代码点击面绿色调试按钮 d框点击按钮 5 完hello worl欢迎分享,转载请注明来源:内存溢出
评论列表(0条)