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

向大佬们求一个这个电路的篮球计分器的C语言参考程序,多谢~
2024-12-01 07:34:33
推荐回答(2个)
回答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=d;c>0;c--)
        for(b=17;b>0;b--)
           for(a=16;a>0;a--);
}

void beef(u8 d)   //发声
{
    u8 a,b,c;
    for(c=d;c>0;c--)
        for(b=17;b>0;b--)
           for(a=16;a>0;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
    }

}

回答2:

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。