资源描述
基于单片机的篮球电子计分器的源代码。
其中的功能有:1.能够显示年月日
2 .能够分别显示两队得分
3 .能够记录两队一二三分的得分球的个数
4 .初始状态下:数码管显示当前剩余的时间 最左边
是 节数(因为篮球比赛有4节) 中间是分右边是秒
/ xlx xlx slz >1^ six slz six slz slz slz slz slz six slz six six xlx six six >lx slz slz slz xlz xlz slz xlz six
/ xr^ xrx xrx xt* xTx xTx *rx ^7% xT^ xT^ xTx ^rv zTx xjx xtx xTx x?x Xj^ xT> xT> <T^ xT^ xix xTx xT^ xrs xix xix <7^ xix xr^ xrx xTx xlx ✓lx xr^ xp*
six six six xlx s£* s£* s£* six
^fx x7x <T^ <j^ xTx XjX x5x xTx ✓Tx
篮球计分器
实验
初始状态下:数码管显示当前剩余的时间 最左边是 节数(因为篮球比赛
有4节) 中间是分右边是秒
S1按键按下:显示年月日
S5按键按下:显示两队得分 左边为甲队 右边为乙队
S9按键按下:显示甲队进球情况 左边为三分 中间为两分 右边为一分
S13按键按下:显示乙队进球情况 左边为三分 中间为两分 右边为一分
S6按键按下: 甲队进一分球
S7按键按下: 甲队进二分球
S8按键按下: 甲队进三分球
S10按键按下: 乙队进一分球
S11按键按下: 乙队进二分球
S12按键按下: 乙队进三分球
S16按键按下:计时器开启关闭状态翻转初始是关闭也就是数码管不倒计时 但是显示当前倒计时剩余时间(注意只有计时器关闭的时候 才能查看进球情况 和进球状态)
也就是说只有通过按按键S16关闭倒计时的时 候 按下SI S5 S9 S13查看其它显示状态时候才有用
slz *1* *£z %fz vfz viz vfz *lz *lz *1* viz *£* *1* *1* *1* *1* *£* *1* *1* *1* *1* *1* *1* *£* *1* *£* *lz v£* ^1* xl* viz *1* ^£z vlz*lx viz vl* %fz
yjx yjs xjx *J1* yj% ✓J% zjs zjx zjx yp% yp* zjs yjx yp%
slz slz slz slz *lz >lz siz siz xlz xlz *lz >lz ^Izxlz slz >1* /
*J、<7< >Tx >Tx >Tx >Tx *1% /
ttinclude 〃reg51.h〃
〃此文件中定义了单片机的一些特殊功能寄存
DisplayDatal[3]=smgduan[number1[l]%100/10];
DisplayDatal[4]=smgduan[number1[l]%10];
DisplayDatal[6]=smgduan[number1[0]%100/10];
DisplayDatal[7]=smgduan[number1[0]%10];
void xianshi5() 〃显示乙队进球情况
(
〃三分球
DisplayDatal[0]=smgduan Enumber2[2]%100/10];
DisplayDatal[l]=smgduan[number2[21%10];
〃二分球
DisplayDatal[3]=smgduan[number2[1]%100/10];
DisplayDatal[4]=smgduan[number2[1]%10];
〃一分球
DisplayDatal[6]=smgduan[number2[0]%100/l0];
DisplayDatal[7]=smgduan[number2[0]%10];
typedef unsigned int ul6; 〃对数据类型进行声明定义 typedef unsigned char u8;
ttdefine GPIO_KEY P3
u8 KeyValue; 〃用来存放读取到的键值
〃定义显示得分数码管的 译码器输入口
sbit LSA=P2";
sbit LSB=P2」;
sbit LSC=P2A2;
〃两队得分变量
u8 scorel=O,score2=0;
u8 numberl [3]; 〃甲队进球情况1分2分3分
int Second=0;
int Time=0; char jie=l;
12分钟)
u8 number2[3]; 〃甲队进球情况1分2分3分
〃全局变量秒
〃全局变量分
〃全局变量第几节(篮球比赛共有4节 一节
〃数码管数据储存数组 u8 DisplayDatal[8];
〃共阴码表
u8 code smgduan[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};〃显示 0~F
的值
void TimerOInit();
〃定时器初始化函数
void delay(ul6 i);
〃延时函数
void DigDisplayl();
〃数码管扫描函数
void KeyDown();
void valuedown(u8 i);
void xianshiO ();
void xianshil();
void xianshi2 ();
void xianshi3 ();
void xianshi4();
分别为三分二分一分
〃按键处理
〃键值处理
〃熄灭数码管函数
〃数码管显示年月日 数据处理函数
〃数码管显示两队得分数据处理函数
〃数码管倒计时显示函数
〃数码管显示甲队进球情况 从左往右
void xianshi5 ();
分别为三分二分一分
//数码管显示乙队进球情况 从左往右
/ viz >1* si* slz *1* *1* *1* *1* *1* *1* six slz
/ xj% XJ% ZJX ✓JX xj% xTx XT% ^1% ZJN ZJ% ZJ% xj、XJX *J、4、xjx XJX ZJX xy% xy% xjx xyx xy% ✓JX *J、*JX✓JX /、"、zjx xj% xjx
*函数名
:main
*函数功能
:主函数
*输 入
:无
*输 出
:无
xlx
X|X X|X xTx
>X^ six *lx SIX >lx vjx xt* six six >£* slz vx >Jx >lx >X^ >Xx >lx six six ^L* >iz slz >£z six six >lx >lx >£z six six six six *lx >lx
xjx xjx ✓ix xTx ✓ix xT^ ✓Tx xjx x?x xrx xTx xTx x»> xix <v^ xT> ^Tx ^Tx ✓jx xix ✓Tx xTx xTx xix xjx xix
>1^ >1^ >!< >!< >!< / xts *ts xT> Xrs XjX XjX xrx xTx xrx !
void main()
(
TimerOInit (); xianshi3 (); while (1)
〃数码管倒计时显示函数
KeyDown ();
valuedown(KeyValue);
〃按键处理
〃键值处理
〃数码管扫描
DigDisplayl ();
void TimerO() interrupt 1 〃中断服务函数 定时50毫
秒进入一次中断,当进入了 20次 也就是 定时了一秒 让Second加一
//当到
达60秒 让Time加一也就是过了一分钟
//当到
达12分钟让jie加一也就是比赛过了一节 (
static ul6 i;
TH0=0x3C; 〃定时器赋初值定时50毫秒进入一次中断执行中
断服务函数
TL0=0xB0;
i++;
xianshiO(); 〃熄灭数码管函数
xianshi3(); 〃数码管倒计时显示函数
if (i==20) //定时到了一秒
( i=0; Second ++;
)
if (Second=60)
(
Second=0;
Time++;
)
if(Time==12)
Time=0;
jie++;
void TimerOInit()
丁》10口|二0*01;〃选择为定时器0模式,工作方式1,仅用TRO翻开启动。
TH0=0x3C; 〃定时器赋初值 定时50毫秒
TL0=0xB0;
ETO=1;〃翻开定时器0中断允许
EA=1; 〃翻开总中断
TRO=O;〃初始关闭定时器 等待按键按下翻开定时器
void KeyDown(void)
(
char a=0;
GPIO_KEY=OxOf;
if(GPIO_KEY! =0x0f) 〃读取按键是否按下
(
delay (1000);〃延时10ms进行消抖 if(GPIO_KEY! =0x0f) 〃再次检测键盘是否按下 (
〃测试列
GPIO_KEY=OXOF;
switch(GPIO_KEY) {
case(0X07): KeyValue=0;break; case(OXOb): KeyValue=l;break;
case(OXOd): KeyValue=2;break; case(OXOe): KeyValue=3;break;
)
〃测试行
GPIO_KEY=OXFO;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(OXbO): KeyValue=KeyValue+4;break;
case(OXdO): KeyValue=KeyValue+8;break;
case(OXeO): KeyValue=KeyValue+12;break;
)
while ((a<50) && (GPIO_KEY!= Oxf 0)) 〃检测按键松手检测 (
delay(1000);
a++;
}
)
)
void valuedown(u8 i)
(
switch (i)
(
case(0):
case (1):
case (2):
case (3):
日
case (4):
xianshi2(); break;
case(5):
xianshi2 (); break;
case (6):
xianshi2(); break;
case (7):
case (8):
; break;
; break;
; break;
xianshiO(); xianshil (); break;
〃显示年月
scorel+=3; numberl[2]+=l; xianshiO ();
〃甲队进一个三分球
scorel+=2; numberl[1]+=1; xianshiO ();
〃甲队进一个两分球
scorel+=l; numberl[0]+=l; xianshiO ();
〃甲队进一个一分球
xianshiO () ; xianshi2 ();
break; 〃显示得分
score2+=3; number2[2]+=l; xianshiO ();
xianshi2 (); break;
case (9):
xianshi2 (); break;
case(10):
xianshi2 (); break;
case(11):
case(12):
score2+=2; number2[1]+=1;
score2+=l; number2[0]+=1;
xianshiO() ; xianshi4();
break;
TRO二〜TRO;
case(13): ; break;
case (14): ; break;
case(15) : xianshiO() ; xianshi5();
break;
xianshiO ();
xianshiO ();
〃甲队进球 break;
〃乙队进球
}
KeyValue=20;
void delay(u16 i) (
while (i一一);
void DigDisplayl() (
u8 i;
for(i=0;i<8;i++) {
switch(i) 〃位选,选择点亮的数码管,
{
case (0):
LSA=O; LSB=O; LSC=O; break; //显示第 0 位
case (1):
LSA=1;LSB=O;LSC=O; break;〃显示第 1 位 case (2):
LSA=O; LSB=1; LSC=O; break; //显示第 2 位 case (3):
LSA=1; LSB=1; LSC=O; break; //显示第 3 位 case (4):
LSA=O; LSB=O; LSC=1; break; //显示第 4 位 case (5):
LSA=1;LSB=O;LSC=1; break;〃显示第 5 位 case (6):
LSA=O; LSB=1; LSC=1; break; //显示第 6 位 case (7):
LSA=1;LSB=1;LSC=1; break;〃显示第 7 位
}
PO=DisplayDatal [i];〃发送段码 delay(lOO); 〃间隔一段时间扫描
PO=OxOO;〃消隐
} void xianshiO () 〃熄灭数码管 (
DisplayDatal[0]=0x00;
DisplayDatalEl]=0x00;
DisplayDatal[2]=0x00;
DisplayDatal[3]=0x00;
DisplayDatal[4]=0x00;
DisplayDatal[5]=0x00;
DisplayDatal[6]=0x00;
DisplayDatal[7]=0x00;
void xianshil () // 年日月 显示函数
(
DisplayDatal[0]=smgduan[2];
DisplayDatal[l]=smgduan[0];
DisplayDatal[2]=smgduan[2];
DisplayDatal[3]=smgduan[0]|0x80;
DisplayDatal[4]=smgduan[l];
DisplayDatal[5]=smgduan[2]|0x80;
DisplayDatal[6]=smgduan[2];
DisplayDatal[7]=smgduan[0];
void xianshi2() 〃得分显示函数
(
DisplayDatal[0]=smgduan[scorel%1000/100];
DisplayDatal[1]=smgduan[scorel%100/10];
DisplayDatal[2]=smgduan[scorel%10];
DisplayDatal[5]=smgduan[score2%1000/100];
DisplayDatal[6]=smgduan[score2%100/10];
DisplayDatal[7]=smgduan[score2%10];
void xianshi3() //倒计时显示函数
(
DisplayDatal [0]=smgduan[ jie]; 〃显示第几节
DisplayDatal [3]=smgduan[ (ll-Time)/10]; 〃显示分钟
DisplayDatal[4]=smgduan[(11-Time)%10];
DisplayDatal [6]=smgduan[ (60-Second) /10]; 〃显示秒
DisplayDatal[7]=smgduan[(60-Second)%10];
}
void xianshi4() 〃显示甲队进球情况
(
DisplayDatal[0]=smgduan[number1[2]%100/10]|0x80;
DisplayDatal[1]=smgduan[number1[2]%10];
展开阅读全文