技术交流 · 2009年 7月 27日 0

乒乓球台震动模式测试系统

/********************************
工程名:乒乓球台震动模式测试系统
程序编辑:付江云
说 明:不断扫描P1口的值,
如与各等级电压比较器相连端出现了
高电平则记录其值并启动计时器,
再通过分析其值分析出振动模式,
再在数码管等级处显示,然后等待
定时器计算完脉宽,再显示脉宽。
********************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

//无线发送控制管脚定义
sbit senden=P3^6; //当其置一后数据传送过去
sbit yellow=P3^5; //控制黄灯亮
sbit sound=P3^7; //控制蜂鸣器鸣叫

//外部中断0管脚
sbit INT_0=P3^2;

//数码管显示位及数据预设
uchar code wei[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef}; //wei[1]~wei[5]分别表示选择第1~5个数码管
uchar code num[]={0x3f,0x06,0x5b,0x4f,0x26,0x2d,0x3c,0x07,0x7f,0x27,0x00}; //0~9

//震动等级P1端值预设
//uchar code dengji[]={0xe0,0xe1,0xe3,0xe7,0xef,0xff}; //分别表示0~5级模式

//全局变量定义
uint width; //脉宽值,以毫秒为单位
uint tempwidth; //在定时器中断时临时记录脉宽值
bit flag; //脉宽显示标志位
uchar tempP1; //临时记录P1数据

void delay(uint z) //简单延时函数
{
while(z–);
}

void dosend() //发送一个亮灯鸣叫后发送熄灯不鸣叫的函数
{
yellow=1;
sound=1;
senden=1;
delay(100);
senden=0;
delay(9000);
yellow=0;
sound=0;
senden=1;
delay(100);
senden=0;
}

void starttimer() //启动定时器函数
{
tempwidth=0;
TH0=0xfc;
TL0=0x18;
TR0=1;
flag=0;
}

void inttimer() interrupt 1 //定时0中断函数,每一毫秒tempwidth加一
{
TH0=0xfc;
TL0=0x18;
tempwidth++;
if(INT_0==1)
{
TR0=0;
width=tempwidth;
flag=1;
}
}

void main() //主函数入口
{
yellow=0;
sound=0;
senden=0;
P2=num[11];
P0=wei[0];
EA=1;
ET0=1;
TMOD=0x01;
while(1)
{
while((tempP1=P1)!=0xe0) //判断是否有震动
{
starttimer(); //有则立即启动计时器
switch(tempP1) //分析P1的值来分析出振动模式
{
case 0xe1:
P2=num[1];P0=wei[2];break;
case 0xe3:
P2=num[2];P0=wei[2];dosend();break;
case 0xe7:
P2=num[3];P0=wei[2];dosend();break;
case 0xef:
P2=num[4];P0=wei[2];dosend();break;
case 0xff:
P2=num[5];P0=wei[2];dosend();break;
default:
break;
}
delay(10000);
while(!flag); //等待计算脉宽完成后再显示脉宽
P2=num[width/100];P0=wei[3];
delay(50000);
P2=num[(width/10)%10];P0=wei[4];
delay(50000);
P2=num[width%10];P0=wei[5];
delay(50000);
}
P2=num[0];P0=wei[2];
delay(100);
P2=num[0];P0=wei[5];
delay(100);
}
}