51单片机电子制作------篮球比赛计分器

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:这个做的并不是很好,代码大多都是在循环中做,所以没有太细致的讲,但是用来做单片机的课设还是足够了

天道酬勤 作者:李剀 转载请注明出处:https://home.cnblogs.com/u/kevin-nancy/
posted @ 2019-08-04 19:18  K35inL  阅读(1340)  评论(0编辑  收藏  举报