单片机课程设计(篮球记分器)
/*******************设置场次比赛时间********************/
void Key_Y(void)
{
if(YK1==0) //初始状态,分钟的十位为0
{
delay(1); //延时去抖动
fs=fs+1; //分十位加1分
fy=fs*10+fg; //求出预置时间的分钟值
f=fy;
while(YK1==0); //中间变量
}
if(YK2==0) //初始状态,分钟的个位为0
{
delay(1); //延时去抖动
fg=fg+1; //分个位加1分
fy=fs*10+fg; //求出预置时间的分钟值
f=fy; //中间变量
while(YK1==0);
}
Js_Jf_Scan();
}
/********T0中断服务函数,每隔50ms产生一次中断********/
void Js_50ms(void)interrupt 1 using 1 //定时器T0中断,用工作寄存器组1
{
TH0=(65535-50000)/256; //定时器T0的高8位
TL0=(65535-50000)%256; //定时器T0的低8位
num++; //每50ms累加一次
Ptime(num); //调用时间处理函数
}
/**********************时间处理函数********************/
void Ptime(uchar time)
{
if(time==20) //如果为1s(50ms*20=1s)
{
num=0;
m--; //每到1s,计时器累加1次
ms=m/10; //秒的十位
mg=m%10; //秒的个位
if(m<0) //如果为1min
{
m=59; //秒钟置0
mg=m%10; //秒钟的个位置0
ms=m/10; //秒钟的十位置0
f--; //分钟开始在预设的比赛时间基础上倒计时
fs=f/10; //分钟的十位
fg=f%10; //分钟的个位
if(f==0) //分钟数倒计时到0
{
TR0=0; //时间到,停止计时
}
}
}
}
/******************数码管动态扫描显示******************/
void Js_Jf_Scan(void)
{
uchar j;
for(j=0;j<=5;j++)
{
KL4=0;P0=LED_Num[g1];delay(1);KL4=1; /*将A队分数的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
KL3=0;P0=LED_Num[s1];delay(1);KL3=1; /*将A队分数的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
KL2=0;P0=LED_Num[b1];delay(1);KL2=1; /*将A队分数的百位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
KL1=0;P0=LED_Num[q1];delay(1);KL1=1; /*将A队分数的千位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
CL4=0;P0=LED_Num[g];delay(1);CL4=1; /*将B队分数的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
CL3=0;P0=LED_Num[s];delay(1);CL3=1; /*将B队分数的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
CL2=0;P0=LED_Num[b];delay(1);CL2=1; /*将B队分数的百位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
CL1=0;P0=LED_Num[q];delay(1);CL1=1; /*将B队分数的千位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
S4=0;P0=LED_Num[mg];delay(1);S4=1; /*将秒钟的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
S3=0;P0=LED_Num[ms];delay(1);S3=1; /*将秒钟的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
S2=0;P0=LED_Num[fg];delay(1);S2=1; /*将分钟的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
S1=0;P0=LED_Num[fs];delay(1);S1=1; /*将分钟的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
}
}
/*****************判断是哪个队加分或者减分*****************/
void Key_if(void)
{
if(Key1==0) //当按键按下时
{
delay(1); //延时去抖动
sum=sum+1; //B队加1分
}
if(Key2==0 && sum>=1) //减分按键按下并且中得分不得少于1分
{
delay(1); //延时去抖动
sum=sum-1; //B队减1分
}
if(Key3==0) //当按键按下时
{
delay(1); //延时去抖动
sum1=sum1+1; //A队加1分
}
if(Key4==0 && sum1>=1) //减分按键按下并且中得分不得少于1分
{
delay(1); //延时去抖动
sum1=sum1-1; //A队减1分
}
q=0; // A队分值的千位默认为0
b=sum/100; //求出A队分值的百位
s=sum/10-b*10; //求出A队分值的十位
g=sum%10; //求出A队分值的个位
q1=0; // B队分值的千位默认为0
b1=sum1/100; //求出B队分值的百位
s1=sum1/10-b1*10; //求出B队分值的十位
g1=sum1%10; //求出B队分值的个位
}
/***********************鸣笛处理***********************/
void sound(void) interrupt 0 using 0 //外部中断0(),用工作寄存器组0
{
uchar i,j;
if(Int_Key==0) //判断鸣笛键是否按下,有按下就鸣笛
{
for(i=0;i<8;i++) //控制一种发音的时间
{
for(j=0;j<250;j++) //控制发音的频率,延时长,频率低,音低
{
music=~music; //取反
delay1(1); //延时去抖动
}
Js_Jf_Scan();
}
for(i=0;i<16;i++) //控制另一种发音的时间
{
for(j=0;j<250;j++) //控制发音的频率,延时短,频率高,音高
{
music=~music; //取反
delay(1); //延时去抖动
}
Js_Jf_Scan();
}
}
else
music=0; //喇叭不响
}
/*******************场地交换函数*******************/
void jiaohuan(void)
{
int t;
if(JH==0)
{
sum=t;
t=sum1;
sum1=t;
}
}
/*******************延时1.8ms的子程序*******************/
void delay1(uchar x)
{
uchar k;
while(x--)
for(k=0;k<215;k++); //延时长
}
/*******************延时1.0ms的子程序*******************/
void delay(uchar x)
{
uchar k;
while(x--)
for(k=0;k<120;k++); //延时短
}本文引用地址:https://www.eepw.com.cn/article/201611/323575.htm
评论