仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【D04】
1. 简介
本文介绍一种用AT89C51作为核心部件进行逻辑控制及信号产生的单片机技术和C语言编程设计的篮球比赛计时器。此篮球计时计分器在硬件方面主要采用AT89C51单片机作为主控核心,由独立按键、蜂鸣器、LCD1602显示屏显示。具有灵活方便、适用范围广的特点,基本能够满足实践需求。
2. 主要功能
a.支持按键设置开始、暂停、24S倒计时复位、甲队加分、乙队加分。
b.支持LCD1602显示甲队、乙队分数、比赛时间、24S倒计时。
c.支持比赛结束后蜂鸣器告警。
3. 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
#include<reg51.h>//51单片机头文件
typedef unsigned char uchar;
typedef unsigned int uint;
sbit K1=P3^2;//比赛倒计时开始/暂停
sbit K2=P3^3;//24s倒计时重新开始
sbit K3=P1^3;//甲队+1按键
sbit K4=P1^4;//甲队+2按键
sbit K8=P1^5;//乙队+3按键
sbit K5=P1^0;//乙队+1按键
sbit K6=P1^1;//乙队+2按键
sbit K7=P1^2;//甲队+3按键
sbit beep=P2^0;//蜂鸣器接口
sbit RS=P2^7;
sbit E=P2^5;
char miao,fen,num,time,aa;
uchar bb,cc;
uchar code table1[]={"H.T 000:000 R.T "};
uchar code table2[]={"12:00 SEC-1 24"};
//延时子函数
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//LCD1602液晶写指令子函数
void write_com(uchar com)
{
RS=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
//LCD1602液晶写数据子函数
void write_date(uchar date)
{
RS=1;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
//LCD1602液晶初始化子函数
void LCD1602_init()
{
uchar i;
bb=0; //H.T分数初始化
cc=0; //R.T分数初始化
time=0;
TMOD=0x10; //定时器1初始化
TL1=0x00;
TH1=0x4c;
EA=1; //开总中断
ET1=1; //开定时器1
TR1=0; //定时器1不工作
EX0=1; //开中断0
EX1=1; //开中断1
IT0=1; //中断0为边沿触发
IT1=1; //中断1为边沿触发
E=0;
beep=0;
miao=0;
fen=12;
num=1;
aa=24;
write_com(0x38); //LCD设置初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80); //LCD显示初始化
for(i=0;i<16;i++)
{
write_date(table1[i]);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(table2[i]);
}
}
//分数更新子函数
void point_lcd(uchar add,uchar dat)
{
write_com(0x80+add);
write_date(0x30+dat/100);
write_date(0x30+(dat%100)/10);
write_date(0x30+dat%10);
write_com(0x80+add);
}
//按键扫描子函数
void keyscan()
{
if(K3==0) //K3按下H.T分数加一
{
while(K3==0);
bb++;
point_lcd(0x04,bb); //分数显示更新
if(K3==0) //松手检测
{
while(K3==0);
delay(20);
}
}
else if(K4==0) //S4按下H.T分数加二
{
while(K4==0);
bb=bb+2;
point_lcd(0x04,bb);
if(K4==0)
{
while(K4==0);
delay(20);
}
}
else if(K7==0) //S4按下H.T分数加二
{
while(K7==0);
bb=bb+3;
point_lcd(0x04,bb);
if(K7==0)
{
while(K7==0);
delay(20);
}
}
else if(K5==0) //S5按下R.T分数加一
{
while(K5==0);
cc++;
point_lcd(0x08,cc);
if(K5==0)
{
while(K5==0);
delay(20);
}
}
else if(K6==0) //S6按下R.T分数加2
{
while(K6==0);
cc=cc+2;
point_lcd(0x08,cc);
if(K6==0)
{
while(K6==0);
delay(20);
}
}
else if(K8==0) //S6按下R.T分数加2
{
while(K8==0);
cc=cc+3;
point_lcd(0x08,cc);
if(K8==0)
{
while(K8==0);
delay(20);
}
}
}
4. 仿真proteus8.6
本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
开始:
加分:
5. 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6. 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7. 资料获取链接
百度网盘下载链接:【D04】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集