基于51单片机篮球计时计分器(Proteus仿真+Keil源码+设计文档)附下载链接!
提供对应的Proteus仿真电路图,Keil程序源码(C语言),设计文档等电子资料参考学习,文末附全部资料的下载链接。
01设计要求
设计一个基于51单片机的心形流水灯设计设计:
功能:
1.在整个比赛过程中记录比赛时间和改变比赛时间。
2.可以在比赛期间随时更新A和B队的比分。
3中场休息期间交换场地,交换A队和B队的位置。
4.当添加比赛分数时,如果有错误,可以手动更改赛场分数。
5.赛事结束时可以触发警报。
02系统概述
该设计显示A队B队赛场比分的程序、主程序、报警程序、赛场比赛时倒计时程序、赛场比赛时间显示程序、时间重置初设状态程序、交换A队B队场地程序、初始化以及按键和子程序协同调节都由主程序按流程来控制的。
03Proteus仿真

04示例代码
#include <reg51.h>
typedef unsigned char uchar;
// 引脚、全局变量省略定义
sbit beep=P1^7; uchar start,time,fen,miao,fena,fenb,flag,beep_time;
sbit k1=P3^0;sbit k2=P3^1;sbit k3=P3^2;sbit k4=P3^3;sbit k5=P3^4;sbit k6=P3^5;sbit k7=P3^6;
sbit led1=P1^0;sbit led2=P1^1;
sbit smg1=P2^0,smg2=P2^1,smg3=P2^2,smg4=P2^3,smg5=P2^4,smg6=P2^5,smg7=P2^6,smg8=P2^7;
uchar code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uchar t){while(t--);}
/************************
主函数:数码管刷新+按键扫描
************************/
void main(void)
{
uchar k=0;
TMOD |= 0x11; // T0/T1为模式1 16位定时器
TH0=0x3C; TL0=0xB0; // T0初值50ms中断
TH1=(65536-1000)/256; TL1=(65536-1000)%256;
ET0=ET1=EA=TR0=1; // 开中断、启动T0
while(1)
{
// 状态指示灯
led1=(start==1)?0:1; led2=(start==2)?0:1;
// 动态扫描时间数码管(分、秒)
P0=smgduan[fen/10];smg1=0;delay(100);smg1=1;
P0=smgduan[fen%10]|0x80;smg2=0;delay(100);smg2=1;
P0=smgduan[miao/10];smg3=0;delay(100);smg3=1;
P0=smgduan[miao%10];smg4=0;delay(100);smg4=1;
// 动态扫描双方分数数码管
P0=flag?smgduan[fenb/10]:smgduan[fena/10];smg5=0;delay(100);smg5=1;
P0=flag?smgduan[fenb%10]:smgduan[fena%10];smg6=0;delay(100);smg6=1;
P0=!flag?smgduan[fenb/10]:smgduan[fena/10];smg7=0;delay(100);smg7=1;
P0=!flag?smgduan[fenb%10]:smgduan[fena%10];smg8=0;delay(100);smg8=1;
// 按键逻辑:加减分、启动暂停、交换场地、清零
if(start>0){
if(!k1&&k!=1){k=1;if(fena<99)fena++;}
if(!k2&&k!=2){k=2;if(fena>0)fena--;}
if(!k3&&k!=3){k=3;if(fenb<99)fenb++;}
if(!k4&&k!=4){k=4;if(fenb>0)fenb--;}
}
if(!k7&&k!=7){
k=7;
if(start==0){start=1;fen=12;miao=0;}
else start=(start==1)?2:1;
}
if(start==0){
if(!k6&&k!=6){k=6;flag=!flag;}
if(!k5&&k!=5){k=5;fen=fena=fenb=miao=0;}
}
if(k1&&k2&&k3&&k4&&k5&&k6&&k7) k=0;
}
}
/************************
定时器0 50ms中断:倒计时计时、蜂鸣控制
************************/
void Timer0() interrupt 1
{
TH0=0x3C; TL0=0xB0; // 重装50ms初值
if(start == 1) // 计时运行状态
{
if(time < 19) time++; // 累计20次=1s
else{
time=0;
if(miao>0) miao--;
else if(fen>0){fen--;miao=59;}
else{start=0;beep_time=60;} // 时间到,蜂鸣触发
}
}
else time=0,TR1=0;
TR1 = (beep_time>0) ? 1 : 0; // 控制蜂鸣器定时器开关
if(beep_time>0) beep_time--;
}
注:
源码使用Keil4或Keil5打开
仿真使用的是Proteus7.8及以上版本,版本过低可能会打不开。
05资料获取
1)项目完整资料获取链接:下载链接
2)Keil、Proteus各个版本安装包: 下载链接

浙公网安备 33010602011771号