前言 学无止境,日常上来分享一些自己的一些小心得,虽然不是什么高尖端的技术,但是重在学习。 本设计主要讲解一个关于篮球计分器的简易系统设计及编程思路。 主要分两大部分进行阐述:电路部分和程序部分。 电路设计 简易电路设计总体来说还是比较简单的,需要的耗材也不是很多,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);
sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;
sbit G2A=P1^3;
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()
{
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)
{
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)
{
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;
}
void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5)
{
uchar jj;
G2A=0;
for(jj=0;jj<8;jj++)
{
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;
}
}
以上就是所有关于简易篮球计分器设计所有过程与程序了,写的不是很好,还望读者能给些建议或者自己能将其完善的更加完美。
|