基于C51单片机的篮球计分器设计
基于C51单片机的篮球计分器设计
题目要求:
1. 设计一款能够显示篮球比分的记分牌;
2. 通过加分按钮可以给A 队,或B 队加分;
3. 设计对调功能,更换场地后,AB 队分数互换;
仿真截图:
完整源代码:
#include
code unsigned seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 分别对应数码管显示字形0-9
int m=15,n=00,x=0,y=0,jie=2,bujin=1,zanting=0,chuzanting=0;
//初始化,m 、n 为分、秒计时 x、y 为A 、B 两队分数 ,其余为中间变量
sbit A_add = P3^0; // A 队加分按钮
sbit B_add = P3^1; // B 队加分按钮
sbit Time_add = P3^2; // 时间加按钮
sbit Time_sub = P3^3; // 时间减按钮
sbit A_sub = P3^4; // A 队减分按钮
sbit B_sub = P3^5; // B 队减分按钮
sbit pause = P3^6; // 暂停、启动按钮
sbit change = P3^7; // 换场地按钮
void keyScan(); //按键扫描函数
void delay(int t) //延时子程序,通过参数t ,可以调整暂停时间
{
while(t--)
{
unsigned int i;
for(i=0;i
}
}
void display(int m,int n,int x,int y)//数码管动态刷新显示程序
{
if(jie==1&&bujin!=2) //中间变量jie=1时,为上半场,对p1赋值 P1=0xbf; //p1=0xbf,即p1=1011111B,点亮上半场对应指示灯 P2=0xfe; //数码管动态刷新显示程序p2=11111110,i 为分钟 P0=seg[m/10]; //刷新显示时间显示分钟十位,调用延时程序 delay(1); //延时数码管的点亮 P2=0xff; P0=0; P2=0xfd; P0=seg[m%10]; delay(1); P2=0xff; P0=0; //同理, 分钟个位并延时点亮 P2=0xfb; //秒钟十位 P0=seg[n/10]; delay(1); P0=0; P2=0xff; P2=0xf7; //秒钟个位 P0=seg[n%10]; delay(1); P0=0; P2=0xff;
}
P2=0xef; P0=seg[x/10]; delay(1); P2=0xff; P0=0; // A 队分数十位 P2=0xdf; //A队分数个位 P0=seg[x%10]; delay(10); P2=0xff; P0=0; P2=0xbf; P0=seg[y/10]; delay(1); P0=0; P2=0xff; P2=0x7f; P0=seg[y%10]; delay(1); P0=0; P2=0xff; //B队分数十位 //B队分数个位
void t0(void) interrupt 1 //调用定时器T0 基本计时单位秒 中断
{
int i;
TH0=0xb1; //利用定时器T0, 送入计数初值TH0,TL0
TL0=0x10; //定时器定时单位为20ms
i++;
} if(i==50) //利用中间变量i ,令i 的值为50 50*20ms=1秒 { if(n==0) //分钟与秒时间的调整 当秒减到0后分钟减1 { n=60; if(m > 0) m--; } n--; //实现1秒计时 i=0; }
void main() //主程序
{
TMOD=0x01; //设置定时器工作方式
EA=1;
ET0=1;
}
TH0=0xb1; TL0=0x10; TR0=1; P3=0xff; P1=0x7f; while(1) { } //定时计送计数初值,EA=1,开中断p3口电平拉高 //p1-0x7f,上半场指示灯点亮 //通过while (1),反复调用循环体内子程序 display(m,n,x,y); //调用动态刷新显示程序 keyScan(); //按键处理函数 if(m
void keyScan() //按键扫描函数
{
int temp; //中间变量temp ,检测到有按键按下时交换A,B 两队分数
if(A_add==0) //当检测到A 队加分按键按下,对应加分
{
delay(1); //调用延时子程序,实现按键抖动功能,即当检测到按键按下时,延时,按键仍按下,说明非抖动,A 队对应加分
if(A_add==0)
{
x++;
}
}
if(B_add==0) //B队加分键被按下
{
delay(1);
{ y++; } } if(A_sub==0) { delay(1); if(A_sub==0) { if(x>=1) x--; } } if(B_sub==0) { delay(1); if(B_sub==0) { if(y>=1)y--; } } //A队减分 //B队减分 if(Time_add==0) //时间增加按钮 { delay(10); if(Time_add==0) { n++; if(n==60) { m++; n=1; } } } if(Time_sub==0) //时间减少 { delay(10); if(Time_sub==0) { if(!(m == 0 && n == 0)) //防止被减成了负数
} } } } if(n
Proteus 仿真图: