当前位置:首页 > 篮球报道 > 正文

单片机篮球赛计时器,c51单片机篮球计时计分器总结

单片机篮球赛计时器,c51单片机篮球计时计分器总结

本篇文章给大家谈谈c51单片机篮球计时计分器总结,以及单片机篮球赛计时器对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、51单片机实现篮球记...

本篇文章给大家谈谈c51单片机篮球计时计分器总结,以及单片机篮球赛计时器对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

51单片机实现篮球记分牌

我认为输入可以用按钮键盘,用于加分,比如加1分按1键,3分按3键,减分另设键盘,这个你可以自己设计,应该用到的键格不多,键盘可以采用中断扫描的方法查询键值,如果条件允许就直接用按键输入就行,这样编程简单。至于数码管那只能用简单的符号表示队名比如u表示正队,n表示反队。应该用到两个三位的数码管就行。显示可采用动态显示,如果有六个寄存器,完全可以采用静态显示,这样编程很简单。我认为自己焊板子更好,想怎么搞就怎么搞,只是注意一下ISP烧录程序的电路。不会很麻烦,多琢磨一下吧!

求一份关于篮球计分器的51单片机C语言程序

这是一个数码管显示的篮球计分程序,你可以参考一下:

#include"reg52.h"

#define u8 unsigned char

#define u16 unsigned int

sbit UP_1    = P1^1;  //第一队加分键

sbit DOWN_1  = P1^2;  //第一队减分键

sbit UP_2    = P1^3;  //第二队加分键

sbit DOWN_2  = P1^4;  //第二队减分键

sbit Change  = P1^5;  //交换键

sbit Begin   = P1^6;  //开始键

sbit Pause  = P1^7;  //暂停键

sbit Beef   = P2^4;  //蜂鸣器

sbit duan = P2^3;  //段选

sbit wei  = P2^2;  //位选

u8 Grate_1=0;  //第一队计分

u8 Grate_2=0;  //第二队计分

u8 Grate_change=0;  //换场标志

u8 Time = 99;  //总时间

u16 Flag=0;  //计时次数

u8 leddata[]={ 

                0x3F,  //"0"

                0x06,  //"1"

                0x5B,  //"2"

                0x4F,  //"3"

                0x66,  //"4"

                0x6D,  //"5"

                0x7D,  //"6"

                0x07,  //"7"

                0x7F,  //"8"

                0x6F,  //"9"

                };

              

void InitTimer1(void)

{

    TMOD = 0x10; //定时器1设为模式1

    TH1 = 0xFC;

    TL1 = 0x18;     //1ms

    EA = 1;         //开总中断

    ET1 = 1;        //开定时器1中断

//    TR1 = 1;      //

}

void delay(u8 d)    //延时

{

    u8 a,b,c;

    for(c=d;c0;c--)

        for(b=17;b0;b--)

           for(a=16;a0;a--);

}

void beef(u8 d)   //发声

{

    u8 a,b,c;

    for(c=d;c0;c--)

        for(b=17;b0;b--)

           for(a=16;a0;a--)

           {

                Beef=~Beef; 

           }

}

void display(u8 grate_1,u8 grate_2,u8 time)  //显示

{

   u8 w1,w2,w3,w4,w7,w8;

   w1=grate_1/10; //计算第一队分数十位

   w2=grate_1%10; //计算第一队分数个位

   w3=grate_2/10; //计算第二队分数十位

   w4=grate_2%10; //计算第二队分数个位

   w7=time/10; //计算时间十位

   w8=time%10; //计算时间个位

  P0=0xff; //消隐,该段显示第一队分数十位

   wei=1;

   P0=0xfe; //送位码

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w1]; //送段码

   duan=0;

   delay(5);

   P0=0xff; //显示第一队分数个位

   wei=1;

   P0=0xfd;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w2];

   duan=0;

   delay(5);

   P0=0xff; //显示第二队分数十位

   wei=1;

   P0=0xf7;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w3];

   duan=0;

   delay(5);

   

    P0=0xff;  //显示第二队分数个位

   wei=1;

   P0=0xef;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w4];

   duan=0;

   delay(5);

   

   P0=0xff;   //显示时间十位

   wei=1;

   P0=0xbf;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w7];

   duan=0;

   delay(5);

   

   P0=0xff;   //显示时间个位

   wei=1;

   P0=0x7f;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w8];

   duan=0;

   delay(5);

}

void main()

{

    InitTimer1();  //初始化定时器1

    UP_1    = 1;  //以下初始化IO口

    DOWN_1  = 1;

    UP_2    = 1;

    DOWN_2  = 1;

    Change  = 1;

    Begin   = 1;

    while(1)

    {  

        if(UP_1==0)  //如果第一队加分键按下

        {

            ET1 = 0;  //关闭定时器1中断

            delay(5);  //稍加延时

            while(UP_1==0);//等待按键抬起

            Grate_1++;    //第一队分数加1

            ET1 = 1;    //开启定时器1中断

        }

        if(DOWN_1==0)   //如果第一队减分键按下

        {   

            ET1 = 0;

            delay(5);

            while(DOWN_1==0);

            Grate_1--;   //第一队分数减1

            ET1 = 1;

        }

        if(UP_2==0)    //如果第二队加分键按下

        {

            ET1 = 0;

            delay(5);

            while(UP_2==0);

            Grate_2++;    //第二队分数加1

            ET1 = 1;

        }

        if(DOWN_2==0)    //如果第二队减分键按下

        {

            ET1 = 0;

            delay(5);

            while(DOWN_2==0);

            Grate_2--;    //第二队分数减1

            ET1 = 1;

        }

        if(Change==0)    //如果换场键按下

        {

            ET1 = 0;

            delay(5);

            while(Change==0);

            Grate_change=Grate_1; //一下三行语句完成分数交换显示

            Grate_1=Grate_2;   

            Grate_2=Grate_change; 

            ET1 = 1;

        }

        if(Begin==0)  //如果开始键按下

        {

            delay(5);

            while(Begin==0);

            TR1 = 1;        //开启定时器1

        }

if(Pause==0)

{

delay(5);

while(Pause==0);

TR1=0;

}

        if(Time=0)    //如果时间计数到0

        {

            Time=99;    //恢复初始时间

            TR1 = 0;    //关闭定时器1

            beef(100);    //发声

        }

    display(Grate_1,Grate_2,Time); //显示分数、时间     

    }

}

void Timer1Interrupt(void) interrupt 3   //定时器1中断函数

{

    TH1 = 0xFC;   //重赋初值

    TL1 = 0x18;

    Flag++;   //中断次数加1

    if(Flag=1000)//1000次也就是1秒到

    {

        Flag=0;

        Time--;    //秒变量减1

    }

}

篮球比赛计分器

 篮球比赛计时计分器是为了解决篮球比赛时计分与计时准确的问题。此装置利用单片机AT89C51完成了计时和计分的功能。本文详细地介绍了系统硬件与软件的设计过程,采用该装置可根据实际情况进行比分修改和时间的准确显示,具有低功耗,可靠性,安全性以及低成本等特点

如何用c51单片机编写一个篮球计分,计时器

#include"reg52.h"

#define u8 unsigned char

#define u16 unsigned int

sbit UP_1    = P1^1;  //第一队加分键

sbit DOWN_1  = P1^2;  //第一队减分键

sbit UP_2    = P1^3;  //第二队加分键

sbit DOWN_2  = P1^4;  //第二队减分键

sbit Change  = P1^5;  //交换键

sbit Begin   = P1^6;  //开始键

sbit Pause  = P1^7;  //暂停键

sbit Beef   = P2^4;  //蜂鸣器

sbit duan = P2^3;  //段选

sbit wei  = P2^2;  //位选

u8 Grate_1=0;  //第一队计分

u8 Grate_2=0;  //第二队计分

u8 Grate_change=0;  //换场标志

u8 Time = 99;  //总时间

u16 Flag=0;  //计时次数

u8 leddata[]={ 

                0x3F,  //"0"

                0x06,  //"1"

                0x5B,  //"2"

                0x4F,  //"3"

                0x66,  //"4"

                0x6D,  //"5"

                0x7D,  //"6"

                0x07,  //"7"

                0x7F,  //"8"

                0x6F,  //"9"

                };

              

void InitTimer1(void)

{

    TMOD = 0x10; //定时器1设为模式1

    TH1 = 0xFC;

    TL1 = 0x18;     //1ms

    EA = 1;         //开总中断

    ET1 = 1;        //开定时器1中断

//    TR1 = 1;      //

}

void delay(u8 d)    //延时

{

    u8 a,b,c;

    for(c=d;c0;c--)

        for(b=17;b0;b--)

           for(a=16;a0;a--);

}

void beef(u8 d)   //发声

{

    u8 a,b,c;

    for(c=d;c0;c--)

        for(b=17;b0;b--)

           for(a=16;a0;a--)

           {

                Beef=~Beef; 

           }

}

void display(u8 grate_1,u8 grate_2,u8 time)  //显示

{

   u8 w1,w2,w3,w4,w7,w8;

   w1=grate_1/10; //计算第一队分数十位

   w2=grate_1%10; //计算第一队分数个位

   w3=grate_2/10; //计算第二队分数十位

   w4=grate_2%10; //计算第二队分数个位

   w7=time/10; //计算时间十位

   w8=time%10; //计算时间个位

  P0=0xff; //消隐,该段显示第一队分数十位

   wei=1;

   P0=0xfe; //送位码

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w1]; //送段码

   duan=0;

   delay(5);

   P0=0xff; //显示第一队分数个位

   wei=1;

   P0=0xfd;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w2];

   duan=0;

   delay(5);

   P0=0xff; //显示第二队分数十位

   wei=1;

   P0=0xfb;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w3];

   duan=0;

   delay(5);

   

    P0=0xff;  //显示第二队分数个位

   wei=1;

   P0=0xf7;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w4];

   duan=0;

   delay(5);

   

   P0=0xff;   //显示时间十位

   wei=1;

   P0=0xbf;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w7];

   duan=0;

   delay(5);

   

   P0=0xff;   //显示时间个位

   wei=1;

   P0=0x7f;

   wei=0;

   P0=0xff;

   duan=1;

   P0=leddata[w8];

   duan=0;

   delay(5);

}

void main()

{

    InitTimer1();  //初始化定时器1

    UP_1    = 1;  //以下初始化IO口

    DOWN_1  = 1;

    UP_2    = 1;

    DOWN_2  = 1;

    Change  = 1;

    Begin   = 1;

    while(1)

    {  

        if(UP_1==0)  //如果第一队加分键按下

        {

            ET1 = 0;  //关闭定时器1中断

            delay(5);  //稍加延时

            while(UP_1==0);//等待按键抬起

            Grate_1++;    //第一队分数加1

            ET1 = 1;    //开启定时器1中断

        }

        if(DOWN_1==0)   //如果第一队减分键按下

        {   

            ET1 = 0;

            delay(5);

            while(DOWN_1==0);

            Grate_1--;   //第一队分数减1

            ET1 = 1;

        }

        if(UP_2==0)    //如果第二队加分键按下

        {

            ET1 = 0;

            delay(5);

            while(UP_2==0);

            Grate_2++;    //第二队分数加1

            ET1 = 1;

        }

        if(DOWN_2==0)    //如果第二队减分键按下

        {

            ET1 = 0;

            delay(5);

            while(DOWN_2==0);

            Grate_2--;    //第二队分数减1

            ET1 = 1;

        }

        if(Change==0)    //如果换场键按下

        {

            ET1 = 0;

            delay(5);

            while(Change==0);

            Grate_change=Grate_1; //一下三行语句完成分数交换显示

            Grate_1=Grate_2;   

            Grate_2=Grate_change; 

            ET1 = 1;

        }

        if(Begin==0)  //如果开始键按下

        {

            delay(5);

            while(Begin==0);

            TR1 = 1;        //开启定时器1

        }

if(Pause==0)

{

delay(5);

while(Pause==0);

TR1=0;

}

        if(Time=0)    //如果时间计数到0

        {

            Time=99;    //恢复初始时间

            TR1 = 0;    //关闭定时器1

            beef(100);    //发声

        }

    display(Grate_1,Grate_2,Time); //显示分数、时间     

    }

}

void Timer1Interrupt(void) interrupt 3   //定时器1中断函数

{

    TH1 = 0xFC;   //重赋初值

    TL1 = 0x18;

    Flag++;   //中断次数加1

    if(Flag=1000)//1000次也就是1秒到

    {

        Flag=0;

        Time--;    //秒变量减1

    }

}

单片机c51篮球计时器程序

暑假写的,你参考参考#include#include#include#include#defineucharunsignedchar#defineuintunsignedint#defineoutbitP3#defineoutsegP1ucharsecond;sbitp20=P2^0;//设置sbitp21=P2^1;//+sbitp22=P2^2;//-sbitchange=P2^3;//显示选择sbitspeak=P2^4;//蜂鸣器ucharclock[7]={6,6,12,58,12,59,0};//依次为月日时分闹钟时闹钟分比较量ucharcodeTAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharm,n,q,i,h;j=6;k=1;a=0xff;b=0xff;c=0xff;d=0xff;voiddelay(){uinte;for(e=0;e1)clock[j]=clock[j]-1;elseclock[j]=12;break;case1:if(clock[j]1)clock[j]=clock[j]-1;elseclock[j]=31;break;case2:if(clock[j]0)clock[j]=clock[j]-1;elseclock[j]=23;break;case3:if(clock[j]0)clock[j]=clock[j]-1;elseclock[j]=59;break;case4:if(clock[j]0)clock[j]=clock[j]-1;elseclock[j]=23;break;case5:if(clock[j]0)clock[j]=clock[j]-1;elseclock[j]=59;break;default:break;}}if(change==1){while(1){P2=0x0f;if((P20x0f)==0x0f)break;}}}main(){EA=1;ET0=1;TMOD=0x01;TH0=-20000/256;TL0=-20000%256;TR0=1;while(1){display();keyscan();if(j==6){if(change==1){m=clock[3]%10;//选择显示时间n=clock[3]/10;q=clock[2]%10;i=clock[2]/10;outbit=0x08;//显示秒的点闪动outseg=second;delay();}else{m=clock[1]%10;//选择显示日期n=clock[1]/10;q=clock[0]%10;i=clock[0]/10;}}elseif(j==0){q=clock[j]%10;i=clock[j]/10;}elseif(j==1){m=clock[j]%10;n=clock[j]/10;}elseif(j==2){q=clock[j]%10;i=clock[j]/10;}elseif(j==3){m=clock[j]%10;n=clock[j]/10;}elseif(j==4){q=clock[j]%10;i=clock[j]/10;}elseif(j==5){m=clock[j]%10;n=clock[j]/10;}if(clock[2]==clock[4]clock[3]==clock[5])//定点报时{if(p20==0||p21==0||p22==0||change==0)//有键按下则停止报警k=0;speak=1k;}elsek=1;}}voidtimer0()interrupt1using1{uchare,f,g,h;TH0=-20000/256;TL0=-20000%256;e=e+1;if(e==50)//1sec{e=0;g=g+1;second=second^0x80;if(g==60)//1min{g=0;if(clock[3]==59)//每过60s改变下时间{if(clock[2]==23){clock[2]=0;clock[3]=0;}else{clock[2]=clock[2]+1;clock[3]=0;}}elseclock[3]=clock[3]+1;if(clock[3]==0clock[2]==0)//时间都为0时改变日期{switch(clock[0]){case1:if(clock[1]31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=2;}break;case2:if(clock[1]29)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=3;}break;case3:if(clock[1]31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=4;}break;case4:if(clock[1]30)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=5;}break;case5:if(clock[1]31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=6;}break;case6:if(clock[1]30)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=7;}break;case7:if(clock[1]31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=8;}break;case8:if(clock[1]31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=9;}break;case9:if(clock[1]30)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=10;}break;case10:if(clock[1]31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=11;}break;case11:if(clock[1]30)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=12;}break;case12:if(clock[1]31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=1;}break;default:break;}}}if(j!=6){f=f+1;if(f!=10)//判断10s是否到是否有键按下{switch(j)//所设置的那位闪动{case0:a=~a;b=~b;c=0;d=0;break;case1:c=~c;d=~d;a=0;b=0;break;case2:a=~a;b=~b;c=0;d=0;break;case3:c=~c;d=~d;a=0;b=0;break;case4:a=~a;b=~b;c=0;d=0;break;case5:c=~c;d=~d;a=0;b=0;break;default:break;}if(clock[6]!=clock[j]||h!=j){f=0;h=j;clock[6]=clock[j];}}else{j=6;f=0;a=0xff;b=0xff;c=0xff;d=0xff;}}else{a=0xff;b=0xff;c=0xff;d=0xff;}}}

篮球比赛计时计分器设计

1.1背景知识介绍 单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。单片机自20世纪70年代问世以来,以极其高的性价比受到人们的重视和关注,所以应用很广,发展很快。单片机的优点是体积小、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。例如,80C51系列单片机已有十多年的生命期,如今仍保持着上升的趋势,就充分证明了这一点。单片机以其一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统,数据采集系统、智能化仪器仪表,及通讯设备、日常消费类产品、玩具等。并且已经深入到工业生产的各个环节以及人民生活的各层次中,如车间流水线控制、自动化系统等、智能型家用电器等。而美国ATMEL公司开发生产了新型的8位单片机——AT89系列单片机。他不但具有一般MCS-51单片机的所有特性,而且还拥有一些独特的优点,此次设计中所用到的AT89C51就是其中典型的代表。单片机内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,用它来做一些控制电器一类不是很复杂的工作足矣了。我们现在用的全自动滚筒洗衣机,排烟罩VCD等等的家电里面都可以看到它的身影。 单片机是靠程序实现功能的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件的话,电路一定是一块大PCB板。但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别。只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性。1.2 设计意义 单片机的应用是具有高度现实意义的。单片机极高的可靠性,微型性和智能性(我们只要编写不同的程序后就能够完成不同的控制工作),单片机已成为工业控制领域中普遍采用的智能化控制工具,已经深深地渗入到我们的日常生活当中通过此次基于单片机设计的篮球计时计分系统,我们可以更清楚详细的了解单片机程序设计的基本指令功能、编程步骤和技巧来讲述单片机编程,并对MCS-51单片机的结构和原理进行讲述,以及基于单片机开发应用的相关芯片的工作原理,并且可以在将来的工作和学习中加以应用。1.3 设计目的 随着单片机在各个领域的广泛应用,许多用单片机做控制的球赛计时计分系统也应运而产生,如用单片机控制LCD液晶显示器计时计分器,用单片机控制LED七段显示器计时计分器等。本次设计用由AT89C51编程控制LED七段数码管作显示的球赛计时计分系统。该系统具有赛程定时设置,赛程时间暂停,及时刷新甲、乙双方的成绩以及赛后成绩暂存等功能。它具有价格低廉,性能稳定,操作方便并且易于携带等特点。广泛适合各类学校或者小型团体作为赛程计时计分。通过本次基于C51系列篮球计时计分器的设计,可以了解、熟悉有关单片机开发设计的过程,并加深对单片机的理解和应用以及掌握单片机与外围接口的一些方法和技巧,这主要表现在以下一些方面:(1) 篮球赛计时计分系统包含了8051系列单片机的最小应用系统的构成,同时在此基础上扩展了一些使用性强的外围接口。(2) 可以了解到LED显示器的结构、工作原理以及这种显示器的接口实例与具体连接与编程方法。(3) 怎样利用串行口来扩展显示接口等。

关于c51单片机篮球计时计分器总结和单片机篮球赛计时器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

发表评论

最新文章

取消
扫码支持 支付码