【51单片机】【protues仿真】基于51单片机篮球计时计分器数码管系统
目录
一、主要功能
二、使用步骤
三、硬件资源
四、软件设计
五、实验现象
一、主要功能
1、数码管显示
1、比赛时间为15:00,甲乙队比分默认000,通过按键修改
3、比赛运行的状态下,按开始暂停键,比赛暂停,计时暂停。
4、在比赛进行的状态下按通过按键来对甲乙两队进行加减分
5、在一节比赛时间结束后,按下交换键,比赛时间重新预置为15:00,
同时左右两边数码管的比分交换显示。此时按下启动键可以开始新一节的比赛。
6、报警提示:在一节比赛时间倒计时到00:00时,蜂鸣器发出报警提示。
7、比赛时,24秒会以1秒的速度减,可随时按下24秒复位键重置24秒。
二、使用步骤
51单片机篮球计时计分器是51单片机项目中常用的显示设备,通过控制数码管来显示不同数据,通过按键来改变数码管显示的值。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、蜂鸣器模块
4、数码管显示模块
四、软件设计
#include<reg51.h>
#define LEDData P0
unsigned char code LEDCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int minit,second,count,count1; //分,秒,计数器
char min=15,sec=0;
sbit add1=P1^0; //甲对加分,每按一次加1分 /在未开始比赛时为加时间分
sbit dec1=P1^1; //甲对减分,每按一次减1分 /在未开始比赛时为减时间分
sbit exchange=P1^2; //交换场地
sbit add2=P1^3; //乙对加分,每按一次加1分 /在未开始比赛时为加时间秒
sbit dec2=P1^4; //乙对减分,每按一次减1分 /在未开始比赛时为减时间秒
sbit p24_sec=P1^5;
sbit secondpoint=P0^7; //秒闪动点
//----依次点亮数码管的位------
sbit led1=P2^7;
sbit led2=P2^6;
sbit led3=P2^5;
sbit led4=P2^4;
sbit led5=P2^3;
sbit led6=P2^2;
sbit led7=P2^1;
sbit led8=P2^0;
sbit led9=P3^7;
sbit led10=P3^6;
sbit led11=P3^5;
sbit led12=P3^4;
sbit alam=P1^7; //报警
bit playon=0; //比赛进行标志位,为1时表示比赛开始,计时开启
bit timeover=0; //比赛结束标志位,为1时表示时间已经完
bit AorB=0; //甲乙对交换位置标志位
bit halfsecond=0; //半秒标志位
unsigned int scoreA; //甲队得分
unsigned int scoreB; //乙队得分
char sec24=24;
void Delay5ms(void)
{
unsigned int i;
for(i=100;i>0;i--);
}
void display(void)
{
//-----------显示时间分--------------
LEDData=LEDCode[minit/10];
led1=1;
Delay5ms();
led1=0;
LEDData=LEDCode[minit%10];
led2=1;
Delay5ms();
led2=0;
//-------------秒点闪动------------
if(halfsecond==1)
LEDData=0x7f;
else
LEDData=0xff;
led2=1;
Delay5ms();
led2=0;
secondpoint=0;
//-----------显示时间秒------------
LEDData=LEDCode[second/10];
led3=1;
Delay5ms();
led3=0;
LEDData=LEDCode[second%10];
led4=1;
Delay5ms();
led4=0;
//-----------显示1组的分数百位-------
if(AorB==0)
LEDData=LEDCode[scoreA/100];
else
LEDData=LEDCode[scoreB/100];
led5=1;
Delay5ms();
led5=0;
//---------------显示1组分数的十位-----------
if(AorB==0)
LEDData=LEDCode[(scoreA%100)/10];
else
LEDData=LEDCode[(scoreB%100)/10];
led6=1;
Delay5ms();
led6=0;
//---------------显示1组分数的个位-----------
if(AorB==0)
LEDData=LEDCode[scoreA%10];
else
LEDData=LEDCode[scoreB%10];
led7=1;
Delay5ms();
led7=0;
//-----------显示2组分数的百位-------
if(AorB==1)
LEDData=LEDCode[scoreA/100];
else
LEDData=LEDCode[scoreB/100];
led8=1;
Delay5ms();
led8=0;
//-----------显示2组分数的十位-----------
if(AorB==1)
LEDData=LEDCode[(scoreA%100)/10];
else
LEDData=LEDCode[(scoreB%100)/10];
led9=1;
Delay5ms();
led9=0;
//-----------显示2组分数的个位-----------
if(AorB==1)
LEDData=LEDCode[scoreA%10];
else
LEDData=LEDCode[scoreB%10];
led10=1;
Delay5ms();
led10=0;
//-----------显示时间分--------------
LEDData=LEDCode[sec24/10];
led11=1;
Delay5ms();
led11=0;
LEDData=LEDCode[sec24%10];
led12=1;
Delay5ms();
led12=0;
}
//******************************主函数*************************************************
void main(void)
{
TMOD=0x11;
TL0=0xb0;
TH0=0x3c;
TL1=0xb0;
TH1=0x3c;
minit=min;
second=sec;
EA=1;
ET0=1;
ET1=1;
TR0=0;
TR1=0;
EX0=1;
IT0=1;
IT1=1;
// EX1=1;
PX0=1;
// PX1=1;
PT0=0;
P1=0xFF;
P3=0xFF;
alam=1;
while(1)
{
keyscan();
display();
}
}
void PxInt0(void) interrupt 0
{
Delay5ms();
EX0=0;
alam=1;
TR1=0;
if(timeover==1)
{
timeover=0;
}
if(playon==0)
{
playon=1; //开始标志位
TR0=1; //开启计时
if((minit+second)==0)
{
sec24=24;
minit=min;
second=sec;
}
}
else
{
playon=0; //开始标志位清零,表示暂停
TR0=0; //暂时计时
}
EX0=1; //开中断
}
五、实验现象
演示视频: