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

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

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

#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=dc>0c--)

        for(b=17b>0b--)

           for(a=16a>0a--)

}

void beef(u8 d)   //发声

{

    u8 a,b,c

    for(c=dc>0c--)

        for(b=17b>0b--)

           for(a=16a>0a--)

           {

                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

    }

}

class Ball {

public void play() {

System.out.println("玩球儿...")

}

}

class Football extends Ball {

public void play() {

System.out.println("使用足球运动")

}

}

class Basketball extends Ball {

public void play() {

System.out.println("使用篮球运动")

}

}

public class TestMain {

public static void main(String[] args) {

TestMain tm = new TestMain()

tm.testPlay()

}

public void testPlay() {

Ball ball = new Football()

ball.play()

ball = new Basketball()

ball.play()

}

}

/*

D:\>javac TestMain.java

D:\>java TestMain

使用足球运动

使用篮球运动

*/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11465117.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存