标题:
单片机篮球计分器设计仿真及程序
[打印本页]
作者:
乱世灭神
时间:
2018-6-12 11:29
标题:
单片机篮球计分器设计仿真及程序
可以实现A、B两队的分数记录,12分钟倒计时、和场地互换功能。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0202.png
(160.72 KB, 下载次数: 80)
下载附件
设计图
2018-6-12 11:27 上传
单片机源程序如下:
#include <reg51.h>
#define uchar unsigned char
uchar code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}/*1~9、空格和-的字型码*/
,display[8]={1,2,4,8,16,32,64,128};//动态显示数码管
uchar score[2]={0,0},time[2]={12,0},byte[8]={0},j=0,h=0;//score数组记录A、B两队份数time
//数组记录倒计时分、秒时间,byte
//数组记录八个数码管的显示字,j记
//录按键s0按下的次数,h记录时间
//中断1的次数;
bit start=0; //start为12分倒计时是否开始时的标志位;
sbit alrm=P3^0; //alrm为响铃脉冲输出端
unsigned int t=0; //响铃脉冲个数
void delay1(uchar t) //延时程序,最短5ms
{
unsigned char m,n,k;
for(m=t;m>0;m--)
for(n=10;n>0;n--)
for(k=250;k>0;k--);
}
void jishi() //倒计时程序
{
if(start==1) //如果倒计时标志有效,则开始倒计时
{
if(time[1]==0)
{
if(time[0]==0) //如果分秒位都为0时,开启时间中断0,输出响铃脉冲
{
start=0;
ET0=1;
TR0=1;
}
else //如果秒位为0,分位不为0,则秒位跳为59,分位减1
{
time[0]--;
time[1]=59;
}
}
else time[1]--; //如果分秒位都不为0,则秒位减1
}
}
void TIMER0() interrupt 1 using 0 //时间中断0;用于产生响铃脉冲
{
TH0=0xfc; //1ms的计数初始状态
TL0=0x18;
t++;
alrm=!alrm;
if(t==5000) //如果输出5000个脉冲,则停止响铃
{
t=0;
ET0=0;
TR0=0;
}
}
void TIMER1() interrupt 3 using 1
{
TH1=0x63;
TL1=0xc0; //50ms初始值;
if((h++)==20)
{ // 一秒是否到,如果到,则进行倒计时程序
h=0;
jishi();
}
}
void INT_0() interrupt 0 using 2 //外部中断0,记录按键按下次数
{
ET0=0;
delay1(1); //延时消抖
j++;
if(j==5) //如果按键s0按下五次,则归零
j=0;
ET0=1;
}
void jiaohuan() //分数交换,AB两队换场程序
{
uchar temp;
temp=score[0];
score[0]=score[1];
score[1]=temp;
}
void INT_1() interrupt 2 using 3 //外部中断1
{
ET1=0; //延时消抖
delay1(1);
if(j==1) //如果s0按下的次数为1次,则score[1]加1
{
score[1]++;
if(score[1]==100) //分数到100后归零
score[1]=0;
}
else if(j==2)
{
score[0]++; //如果s0按下的次数为2次,则score[0]加1
if(score[0]==100) //分数到100后归零
score[0]=0;
}
else if(j==3) //如果s0按下的次数为3次,则两队分数交换
jiaohuan();
else if(j==4) //如果s0按下的次数为4次 ,则打开倒计时或关闭倒计时
start=!start;
else;
ET1=1;
}
void by(void)
{
byte[5]=11; //第五个数码管一直显示为"-"
if(j==4) //如果s0按下的次数为4,则显示倒计时
{
byte[3]=time[0]/10;
byte[4]=time[0]%10;
byte[6]=time[1]/10;
byte[7]=time[1]%10;
}
else //否则显示比分
{
byte[3]=score[0]/10;
byte[4]=score[0]%10;
byte[6]=score[1]/10;
byte[7]=score[1]%10;
}
}
void blank()
{
if(j==1) //如果s0按下1次;第7、8个数码管闪烁跳动
{
byte[7]=10,byte[6]=10;
}
else if(j==2) //如果s0按下2次;第4、5个数码管闪烁跳动
{
byte[3]=10,byte[4]=10;
}
else if(j==3) //如果s0按下3次;第4、5、7、8个数码管闪烁跳动
{
byte[7]=10,byte[6]=10;
byte[4]=10,byte[3]=10;
}
else;
}
void bitshow()
{ if(h<=10) //前半秒正常显示,后半秒根据s0按下的次数相应的数码管闪烁
by();
else
blank();
}
void dis()
{ uchar i;
while(1) // 死循环显示
{
bitshow(); //求每一位的显示
for(i=3;i<=7;i++)
{
P0=~display[i]; //P0口控制扫描显示的数码管
P1=tab[byte[i]]; //P1口输出字型码
delay1(1); //延时5ms,增加显示亮度
}
}
}
void main(void)
{
TMOD=0x11;
EA=1;
EX0=1;
EX1=1;
ET1=1;
IT1=1;
IT0=1;
TR1=1; //开启时间中断1,两个外部中断
IP=5; //中断优先级控制
dis(); //显示子程序
}
复制代码
所有资料51hei提供下载:
篮球计分器设计仿真及程序.zip
(99.46 KB, 下载次数: 94)
2018-6-12 11:28 上传
点击文件名下载附件
仿真及程序
下载积分: 黑币 -5
作者:
lnz
时间:
2018-12-20 14:54
咱们这个数码管型号是cc还是ca啊,共阳极还是公阴极啊
作者:
2582582582580
时间:
2019-5-30 10:21
应该是ca呢
作者:
学习单片机12
时间:
2019-12-4 13:35
你实物怎么连接啊?那个NOT那个地方
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1