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:這個做的並不是很好,代碼大多都是在循環中做,所以沒有太細致的講,但是用來做單片機的課設還是足夠了