文章目录
- 一、篮球计时器
- 1.题目要求
- 2.思路
- 3.仿真图
- 3.1 未仿真时
- 3.2 仿真开始
- 3.3 A队进分
- 3.4 B队进分
- 3.5 比赛结束
- 4.仿真程序
- 4.1 主函数
- 4.2 时间显示
- 4.3 比分显示
- 4.4 按键扫描
- 二、总结
一、篮球计时器
1.题目要求
以51单片机为核心,设计并制作篮球计时器
基本功能如下:
设有比赛总时长(如10min)和24秒进攻时限的倒计时,允许在倒计时内进行投篮加分,分别有一分球、两分球、三分球三种进球方式。每次得分之后要有一个积分栏,要记录两队的比分。篮球比赛开始和结束要有标识,可以用led效果来表示。
2.思路
首先,画个51单片机,粗略计算了一下好像引脚不是很够用,所以这里想用74HC138来扩展IO口。
74HC138B 译码器可接受三位二进制加权地址输入(A0,A1,A2)并在使能时,提供8 位低电平有效、互斥的输出(Y0 到 Y7)。至于具体输出高还是低,要根据下面的真值表来看(请注意实物中的E3其实是仿真图中的E1,要看引脚编号。)不懂的小伙伴可以看下这个74HC138译码器
报警方式依旧选用蜂鸣器
显示方式,这里选用6位数码管和4位数码管分开显示。一个是显示比赛时间和进攻时间。一个是显示A队和B对的比分。
最后是一个LED来表示比赛开始和比赛结束,打算开始就长亮,一直到比赛结束使其闪烁或者熄灭。用开关或者按键来切换是A队还是B队,4个按键来刷新进攻时间和增加比分(一分、两分、三分)
3.仿真图
3.1 未仿真时
3.2 仿真开始
比赛总时间为10分钟,每次进攻时间为24s。24s倒计时为0,蜂鸣器会响进行提示,需要手动按下进攻时间来重置24s。
3.3 A队进分
A队投进3分球,记3分,当前比分3比0。
3.4 B队进分
B队投进2分球,记2分,当前比分3比2。
3.5 比赛结束
比赛时间归零,蜂鸣器长鸣,灯光熄灭。这时候比分为39比34,A队获得此次比赛的胜利。
4.仿真程序
4.1 主函数
//主函数
void main()
{
Time0_init();//定时器初始化
LED=1;//比赛开始
while(1)
{
time_display();//总时间显示和倒计时显示
score_display();//比分显示
keyscan();//按键扫描
speak();//警报
}
}
4.2 时间显示
//总时间显示和倒计时显示(六位数码管)
void time_display()
{
uchar secshi,secge,minshi,minge,attge,attshi;
secge=sec%10;//秒钟个位
secshi=sec/10;//秒钟个位
minge=min%10;//分钟个位
minshi=min/10;//分钟十位
attge=att%10;//倒计时个位
attshi=att/10;//倒计时十位
HLA=0;HLB=0;HLC=0; //第1位
P0=table0[minshi];
delayms(1);
HLA=1;HLB=0;HLC=0; //第2位
P0=table0[minge];
delayms(1);
HLA=0;HLB=1;HLC=0; //第3位
P0=table0[secshi];
delayms(1);
HLA=1;HLB=1;HLC=0; //第4位
P0=table0[secge];
delayms(1);
HLA=0;HLB=0;HLC=1; //第5位
P0=table0[attshi];
delayms(1);
HLA=1;HLB=0;HLC=1; //第6位
P0=table0[attge];
delayms(1);
P0=0x00; //消影
}
4.3 比分显示
//比分显示(4位数码管)
void score_display()
{
uchar A_scorege,A_scoreshi,B_scorege,B_scoreshi;
A_scorege=A_score%10;
A_scoreshi=A_score/10;
B_scorege=B_score%10;
B_scoreshi=B_score/10;
HHA=0;HHB=0;HHC=0; //第1位
P3=table0[A_scoreshi];
delayms(1);
HHA=1;HHB=0;HHC=0; //第2位
P3=table0[A_scorege];
delayms(1);
HHA=0;HHB=1;HHC=0; //第3位
P3=table0[B_scoreshi];
delayms(1);
HHA=1;HHB=1;HHC=0; //第4位
P3=table0[B_scorege];
delayms(1);
P0=0x00;
}
4.4 按键扫描
//按键扫描
void keyscan()
{
if (key_att==0)
{
delayms(1);
if(key_att==0)
att=24;//重置倒计时24s
while(!key_att);
}
if (Change==1)//A队
{
if (score_1==0)//比分加1
{
delayms(1);
if (score_1==0)
A_score+=1;
while(!score_1);
}
if (score_2==0)//比分加2
{
delayms(1);
if (score_2==0)
A_score+=2;
while(!score_2);
}
if (score_3==0)//比分加3
{
delayms(1);
if (score_3==0)
A_score+=3;
while(!score_3);
}
}
else//B队
{
if (score_1==0)//比分加1
{
delayms(5);
if (score_1==0)
B_score+=1;
while(!score_1);
}
if (score_2==0)//比分加2
{
delayms(5);
if (score_2==0)
B_score+=2;
while(!score_2);
}
if (score_3==0)//比分加3
{
delayms(5);
if (score_3==0)
B_score+=3;
while(!score_3);
}
}
}
二、总结
今天主要讲了基于51单片机的篮球计时器Proteus仿真。
感谢你的观看!