51单片机电子制作------篮球比赛计分器
作者:李剀
出处:https://blog.csdn.net/Kevin_8_Lee
或者 https://www.cnblogs.com/kevin-nancy/
欢迎转载,但也请保留上面这段声明。谢谢!(上面两个都是我的博客,只是在不同平台)
这个也是可以用于单片机课设的一个小东西。 同样和之前的交通灯项目一样,我用同样的方法介绍一下
1) 题目及设计要求
题目: 篮球比赛计分器
要求:
1、两队各三位显示,共计六位数码显示;
2、设A、B队加、减分按键,复位键;
3、加减分实现1分、2分、3分加减。
2) C51编程以及电路仿真软件
编程:: 同样使用keil3或者keil4,以keil4为例
软件就不截图了,可以看我关于交通灯的那篇blog
https://www.cnblogs.com/kevin-nancy/p/10993057.html
或者 https://blog.csdn.net/Kevin_8_Lee/article/details/91351632
3) 解决思路
使用矩阵键盘作为按键输入,分别设置A、B两队加减1、2、3分按键以及清零按键
在proteus中,我的接线如下
使用两个四位八段的数码管(共阴极)显示
**PS:**其他的都跟我之前的那篇交通灯的制作类似
但是有一个问题在那篇博客忘记说了,这里写一下
上图圈起来那块那个复位用的电阻,必须设置为Digital类型的,否则无法使用复位按钮
双击元件,即可修改
4)软件部分
这个整个流程比较简单,程序流程图如下
同样由于时间问题,没心情用更简单的方法改了,直接是无限扫描按键,
// 矩阵键盘扫描函数,返回16进制数
uchar KeyScan()
{
uchar cord_c,cord_r;
P3 = 0x0f;
if( (P3 & 0x0f) != 0x0f)
{
delay_ms(5);
if( (P3 & 0x0f) != 0x0f)
{
cord_r = P3 & 0x0f;
P3 = cord_c | 0xf0;
cord_c = P3 & 0xf0;
while( (P3 & 0xf0) != 0xf0 );
return (cord_c + cord_r);
}
}
}
// 不同的按键按下 执行不同的操作
void Key_score_Dispaly()
{
switch( KeyScan() )
{
case 0xee:
flag = 0;
teamA_scores++; // A队加分
break;
case 0xde:
flag = 1;
teamA_scores--;
break;
case 0xbe:
flag = 2;
teamB_scores++;
break;
case 0x7e:
flag = 3;
teamB_scores--;
break;
case 0xed:
flag = 4;
teamA_scores+=2; // 两分球
break;
case 0xdd:
flag = 5;
teamA_scores-=2;
break;
case 0xbd:
flag = 6;
teamB_scores+=2;
break;
case 0x7d:
flag = 7;
teamB_scores-=2;
break;
case 0xeb:
flag = 8;
teamA_scores+=3; // 三分
break;
case 0xdb:
flag = 9;
teamA_scores-=3;
break;
case 0xbb:
flag = 10;
teamB_scores+=3;
break;
case 0x7b:
flag = 11;
teamB_scores-=3;
break;
case 0xe7:
flag = 12;
teamA_scores=0; // 清零
break;
case 0xd7:
flag = 13;
teamA_scores=0;
break;
case 0xb7:
flag = 14;
teamB_scores=0;
break;
case 0x77:
flag = 15;
teamB_scores=0;
break;
}
Display(teamA_scores, teamB_scores); // 显示
}
// 主函数无限循环
void main()
{
system_Init(); // 初始化只是关闭数码管
while(1)
{
Key_score_Dispaly();
}
}
放一下最终的效果吧
路就在你脚下,只要走,就能到达远方! 加油吧!
ps:这个做的并不是很好,代码大多都是在循环中做,所以没有太细致的讲,但是用来做单片机的课设还是足够了