前言
学无止境,日常上来分享一些自己的一些小心得,虽然不是什么高尖端的技术,但是重在学习。
本设计主要讲解一个关于篮球计分器的简易系统设计及编程思路。
主要分两大部分进行阐述:电路部分和程序部分。
电路设计
简易电路设计总体来说还是比较简单的,需要的耗材也不是很多,At89C52单片机一个,两个LED,一个74LS138译码器,一个八位的数码管显示器和六个不带自锁的按键。下图所示是作者在proteus软件设计的一个仿真电路。
工作原理
将编写好的单片机程序下载到到单片机后,系统上电数码管会显示六个0,左边三位于右边两位,中间两位不显示,用来区分两队的分值,当左边队伍进球得分后按选择计分队伍的按键,左边LED指示灯 D1 会亮,然后根据进球分数按相应的加分按键,加一、加二或者加三分,如果不小心将分值加错的情况下可以按减一分按键减掉所加的分,当需要对的分队伍的分值进行清理的时候可以按下单队清零按键进行分值清除。右边计分方法跟左边一样,只需要将加分队伍切换到右边即可。
程序编写
程序编写主要可分两个部分,按键处理部分和数码管显示部分。
主程序如下所示
#include <stc15.h>
typedef unsigned int uint;
typedef unsigned char uchar;
#define smgduan P0 //数码管段定义
//声明按键与数码管的子程序
void key_dis();
void key_display();
void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5);
/*数码管位定义74hs138*/
sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;
sbit G2A=P1^3;
/*led定义,用于区别加分边,led0左边,led1右边*/
sbit led0=P1^4;
sbit led1=P1^5;
/*按键定义*/
sbit key0=P3^0; //加分区别按键,未按下为左边,按下为右边
sbit key1=P3^1; //加一分按键
sbit key2=P3^2; //加两分按键
sbit key3=P3^3; //加三分按键
sbit key4=P3^4; //减一分按键
sbit key5=P3^5; //复位清零按键
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
uchar fen0,fen1; //两队得分累计标志
uchar flag0; //模式选择标志
uchar bai0,bai1,shi0,shi1,ge0,ge1; //数据处理标志
void delay(uint i) //软件延时函数
{
while(i--);
}
void main() //主函数
{
while(1)
{
key_display();
shujuchili();
display(ge1,shi1,bai1,ge0,shi0,bai0);
}
}
按键处理程序如下
void key_dis() //加分队伍选择,flag0等于1时,左边队伍,flag0=2时,右边队伍
{
P1=0xff;
if(key0==0)
{
delay(100);
if(key0==0)
{
while(!key0);
flag0++;
if(flag0==3)
{
flag0=1;
}
}
}
}
void key_display() //加减分按键处理函数
{
key_dis(); //调用选择加分队伍子程序
if(flag0==1) //左边队伍
{
led1=1;
led0=0;
if(key1==0) //加1分
{
delay(100);
if(key1==0)
{
while(!key1);
fen0=fen0+1;
}
}
if(key2==0) //加两分
{
delay(100);
if(key2==0)
{
while(!key2);
fen0=fen0+2;
}
}
if(key3==0) //加三分
{
delay(100);
if(key3==0)
{
while(!key3);
fen0=fen0+3;
}
}
if(key4==0) //减一分
{
delay(100);
if(key4==0)
{
while(!key4);
fen0=fen0-1;
}
}
if(key5==0) //清零
{
delay(100);
if(key5==0)
{
while(!key5);
fen0=0;
}
}
}
else if(flag0==2) //右边队伍
{
led1=0;
led0=1; //右边队伍指示灯
if(key1==0) //加1分
{
delay(100);
if(key1==0)
{
while(!key1);
fen1=fen1+1;
}
}
if(key2==0) //加两分
{
delay(100);
if(key2==0)
{
while(!key2);
fen1=fen1+2;
}
}
if(key3==0) //加三分
{
delay(100);
if(key3==0)
{
while(!key3);
fen1=fen1+3;
}
}
if(key4==0) //减一分
{
delay(100);
if(key4==0)
{
while(!key4);
fen1=fen1-1;
}
}
if(key5==0) //清零
{
delay(100);
if(key5==0)
{
while(!key5);
fen1=0;
}
}
}
}
数码管显示程序
/*将计分的存储变量进行处理,取出对应数码管所要显示的数值,个十百三位数*/
void shujuchili() //数据处理函数
{
//左边数码管数据处理
bai0=fen0/100;
shi0=fen0%100/10;
ge0=fen0%10;
//右边计分队伍数据处理
bai1=fen1/100; //取百位
shi1=fen1%100/10; //取十位
ge1=fen1%10; //取个位
}
/*数码管显示74LS138译码器驱动程序*/
void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5) //数码管显示函数
{
uchar jj;
G2A=0;
for(jj=0;jj<8;jj++) /*case0到case2为右边三位数码管,case5到case7为左边三位数码管,中间两位不进行显示,用以区分*/
{
switch(jj)
{
case 0:
LSA=0;LSB=0;LSC=0;smgduan=duan[a5];break;
case 1:
LSA=1;LSB=0;LSC=0;smgduan=duan[a4];break;
case 2:
LSA=0;LSB=1;LSC=0;smgduan=duan[a3];break;
case 3:
LSA=1;LSB=1;LSC=0;smgduan=0x00;break;
case 4:
LSA=0;LSB=0;LSC=1;smgduan=0x00;break;
case 5:
LSA=1;LSB=0;LSC=1;smgduan=duan[a2];break;
case 6:
LSA=0;LSB=1;LSC=1;smgduan=duan[a1];break;
case 7:
LSA=1;LSB=1;LSC=1;smgduan=duan[a0];break;
}
delay(50);
smgduan=0x00; //消隐
}
}
以上就是所有关于简易篮球计分器设计所有过程与程序了,写的不是很好,还望读者能给些建议或者自己能将其完善的更加完美。