51单片机课设--篮球计分器
篮球计分器用一个四位数码管显示两队分数(最高分为99),再用一个四位数码管时间,分钟和秒钟各占两位;可进行按键进行计分,加1、加2和加3等,两个都可以进行加分。8个独立按键。等比赛结束后有蜂鸣器提醒。原理图设计.........
·
篮球计分器
用一个四位数码管显示两队分数(最高分为99),再用一个四位数码管时间,分钟和秒钟各占两位;
可进行按键进行计分,加1、加2和加3等,两个都可以进行加分。8个独立按键。等比赛结束后有蜂鸣器提醒。
原理图设计
对应的代码
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define duan_pin P1
#define wei_pin P2
#define key_pin P0
sbit BZ=P3^7; //蜂鸣器
long t=0,jia=0,yi=0; //所需的变量
uchar code DATA[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //CC段码
uchar TABLE[]={5,9,5,9,0,1,0,2}; //定义数组,以对应各个数码管
void DelayMs(int x){ //自定义延时函数
int i;
while(x--) for(i=0;i<120;i++);
}
void BUZZ() //蜂鸣器响相关操作
{
int i;
if(t==3600-1)
{
TR0=0,duan_pin=0X00,t=0; //关掉显示
for(i=0;i<120;i++) BZ=!BZ,DelayMs(25); //无源蜂鸣器
TR0=1; //开启显示
}
}
void Keyscan() { //按键检测的相关操作及分数的控制
static char key_up=1; //防止连按的变量
uchar key_value=0;
if(key_up&&key_pin!=0xff) //按键状态发生改变
{
_nop_(),_nop_(),_nop_(),_nop_(); //消抖
key_value=P0; //保存按键的状态
key_up=0; //清除防止连按发生
if(key_pin!=0xff)
{
switch(key_value)
{
case 0xfe:jia=0;break;
case 0xfd:jia+=1;break;
case 0xfb:jia+=2;break;
case 0xf7:jia+=3;break;
case 0xef:yi=0;break;
case 0xdf:yi+=1;break;
case 0xbf:yi+=2;break;
case 0x7f:yi+=3;break;
default:break;
}
jia=jia>99?0:jia; //变量控制
yi= yi>99?0:yi;
}
}else key_up=1; //为了下一次可进入
}
void Dis() { //数码显示操作
uchar i,a=0xfe; //数码管显示所需要的变量
//给要显示的数码管赋值
TABLE[0]=t/60/10; //时间的4个
TABLE[1]=t/60%10;
TABLE[2]=t%60/10;
TABLE[3]=t%60%10;
TABLE[4]=jia/10; //分数的4个
TABLE[5]=jia%10;
TABLE[6]=yi/10;
TABLE[7]=yi%10;
//消除阴影和显示
for(i=0;i<8;i++) duan_pin=0X00,wei_pin=_crol_(a,i),duan_pin=DATA[TABLE[i]],DelayMs(1);
}
void main() {
IE=0X82; //开定时器中断
TR0=1; //开启定时器
while(1)
{
BUZZ(); //报警操作
Keyscan(); //按键检测
}
}
void Time0() interrupt 1 { //定时器0的函数相关操作
static int tm=0;
Dis(); //数码显示
if(++tm%100==0) tm=0,t++;
}
更多推荐
已为社区贡献1条内容
所有评论(0)