cat_ol 2022-04-16 18:53 采纳率: 100%
浏览 117
已结题

篮球红外计分器红外遥控部分按键实现不了,如何解决?(语言-c语言)

在开始键未按下的时候,分钟的加减键可以顺畅的加减,但是秒钟按下加一后红外接收器就没有反应了;按下开始键后,分数加减也是只能加一之后红外接收器就没反应了。想知道程序有什么问题。


#include<reg51.h>
#include <intrins.h>
#define LEDData P0
#define uchar unsigned char
#define uint  unsigned int
    
uchar time;
uchar code LEDCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管的段码编码
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 

int minit,second,count,count1,playon=0,ad1=1,dec1=1,exchange=1,ad2=1,dec2=1,p24_sec=1,jy,jz;
char min=15,sec=0;

uchar IRCOM[7];

sbit IRIN=P3^2;         //红外接收器数据线
sbit secondpoint=P0^7;                //秒闪动点
//依次点亮数码管的位
sbit AA1=P2^0;//一队得分
sbit AA2=P2^1;
sbit AA3=P2^2;

sbit BB1=P2^4;//二队得分
sbit BB2=P2^5;
sbit BB3=P2^6;

sbit DD1=P3^0;//24秒
sbit DD2=P3^1;

sbit CC1=P3^4;//比赛时间
sbit CC2=P3^5;
sbit CC3=P3^6;
sbit CC4=P3^7;

sbit alam=P1^7;                        //报警

bit  timeover=0;                    //比赛结束标志位,为1时表示时间已经完
bit  AorB=0;                        //甲乙对交换位置标志位
bit  halfsecond=0;                    //半秒标志位

uint scoreA;                //甲队得分
uint scoreB;                //乙队得分
char sec24=24;        

void delay(unsigned char x)    //x*0.14MS
{
 unsigned char i;
  while(x--)
 {
  for (i = 0; i<13; i++) {}
 }
}
void Delay5ms(void)
{
    unsigned int i;
    for(i=100;i>0;i--);
}
void IR_init(void)         //红外初始化
{
    IT0=0;
    EX0=1;
    EA=1;
    IRIN=1;             //相当于打开外部中断0  此处意义为红外接收器打开

}
void time0_init(void)
{ //定时器初始化
    TMOD=0x11;//TR1和TR0都选用直接启动且定时时间为0.05s的定时器
     TL0=0xb0;//定时时间为0.05s,T0和T1的初值都为15536
     TH0=0x3c;
     TL1=0xb0;
     TH1=0x3c;
    minit=min;                //初始值为1500
    second=sec;      //初始值为0
    EA=1;//打开总中断
    ET0=1;//启动定时器0
    ET1=1;//启动定时器1
     TR0=0;//计时器0,1先停止计数
    TR1=0;
    IT0=1;//定时器0设为下降沿触发
    IT1=1;//定时器1也设为下降沿触发
    PX0=1;//外部中断1设为高优先级
    PT0=0;//定时器0设为低优先级
    P1=0xFF;//端口初始化
    P3=0xFF;
}

void display(void)
{
//显示时间分
    CC1=0;
    LEDData=LEDCode[minit/10];
    Delay5ms();
    CC1=1;
    CC2=0;
    LEDData=LEDCode[minit%10];
    Delay5ms();
    CC2=1;
    //秒点闪动
    if(halfsecond==1)
        LEDData=0x7f;
    else
        LEDData=0xff;
    CC2=0;
    Delay5ms();
    CC2=1;
    secondpoint=0;
//显示时间秒
    CC3=0;
    LEDData=LEDCode[second/10];
    Delay5ms();
    CC3=1;
    CC4=0;
    LEDData=LEDCode[second%10];
    Delay5ms();
    CC4=1;
//显示1组的分数百位
    AA3=0;
    if(AorB==0)//交换位置
        LEDData=LEDCode[scoreA/100];
    else
        LEDData=LEDCode[scoreB/100];
    Delay5ms();
    AA3=1;
//显示1组分数的十位
    AA2=0;
    if(AorB==0)
        LEDData=LEDCode[(scoreA%100)/10];
    else
        LEDData=LEDCode[(scoreB%100)/10];
    Delay5ms();
    AA2=1;

//显示1组分数的个位
    AA1=0;
    if(AorB==0)
        LEDData=LEDCode[scoreA%10];
    else
        LEDData=LEDCode[scoreB%10];
    Delay5ms();
    AA1=1;

//显示2组分数的百位
    BB3=0;
    if(AorB==1)
        LEDData=LEDCode[scoreA/100];
    else
        LEDData=LEDCode[scoreB/100];
    Delay5ms();
    BB3=1;
//显示2组分数的十位
    BB2=0;
    if(AorB==1)
        LEDData=LEDCode[(scoreA%100)/10];
    else
        LEDData=LEDCode[(scoreB%100)/10];
    Delay5ms();
    BB2=1;

//显示2组分数的个位
    BB1=0;
    if(AorB==1)
        LEDData=LEDCode[scoreA%10];
    else
        LEDData=LEDCode[scoreB%10];
    Delay5ms();
    BB1=1;

//显示时间分
    DD2=0;
    LEDData=LEDCode[sec24/10];
    Delay5ms();
    DD2=1;
    DD1=0;
    LEDData=LEDCode[sec24%10];
    Delay5ms();
    DD1=1;
}

//按键检测程序
void keyscan(void)
{
    if(playon==0)
    {
        if(ad1==0)
        {
            ad1=1;
            display();
                if(minit<99)
                    minit++;
                else{
                    minit=99; 
                    min=minit;}
        }

        if(dec1==0)
        {
            dec1=1;
            display();
                if(minit>0)
                    minit--;
                else{
                    minit=0;
                    min=minit;}
            
        }

        if(ad2==0)
        {
            ad2=1;
            display();
                if(second<59)
                    second++;
                else{
                    second=59; 
                    sec=second;}
            
        }

        if(dec2==0)
        {
            dec2=1;
            display();
                if(second>0)
                    second--;
                else{
                    second=0;  
                    sec=second;}
            
        }

        if(exchange==0)
        {
            exchange=1;
            display();
                TR1=0;                    //关闭T1计数器
                alam=1;                    //关报警
                   AorB=~AorB;                //开启交换    
                minit=min;                //并将时间预设为1500
                second=sec;
                sec24=24;
    }
  }
    else
    {
        if(ad1==0)
        {
            ad1=1;
            display();
                if(AorB==0)
                {
                    if(scoreA<999)
                        scoreA++;
                    else
                        scoreA=999;
                }
                else
                {
                    if(scoreB<999)
                        scoreB++;
                    else
                        scoreB=999;
                }
        }

        if(dec1==0)
        {
            dec1=1;
            display();
                if(AorB==0)
                {
                    if(scoreA>0)
                        scoreA--;
                    else
                        scoreA=0;
                }
                else
                {
                    if(scoreB>0)
                        scoreB--;
                    else
                        scoreB=0;
                }
        }

        if(ad2==0)
        {
            ad2=1;
            display();
                if(AorB==1)
                {
                    if(scoreA<999)
                        scoreA++;
                    else
                        scoreA=999;
                }
                else
                {
                    if(scoreB<999)
                        scoreB++;
                    else
                        scoreB=999;
                }
        }

        if(dec2==0)
        {
            dec2=1;
            display();
                if(AorB==1)
                {
                    if(scoreA>0)
                        scoreA--;
                    else
                        scoreA=0;
                }
                else
                {
                    if(scoreB>0)
                        scoreB--;
                    else
                        scoreB=0;
                }
        }
        if(p24_sec==0)
        {
            p24_sec=1;
            display();
                sec24=24;
                TR0=1;
                alam=1;
            }
    }
}
//主函数
void main(void)
{
    IR_init();
    time0_init();
    alam=1;
     while(1)
     {
        while(1)
    {
        while(jy==jz)
        {
                    if(timeover==1)
    {
        timeover=0;
    }
        switch(jz)
        {
            case 1:ad1=0;break;
            case 2:dec1=0;break;
            case 3:if(playon==0)
    {
        playon=1;                //开始标志位
        TR0=1;                    //开启计时
        
        if((minit+second)==0)
        {
            sec24=24;
            minit=min;            
            second=sec;
        }
    }
    else
    {
        playon=0;                //开始标志位清零,表示暂停
        TR0=0;                    //暂时计时
    }break;
            case 4:ad2=0;break;
            case 5:dec2=0;break;
            case 6:exchange=0;break;
            case 7:p24_sec=0;break;
        }
        jy--;
        }
        keyscan();
        display();
        Delay5ms();
        Delay5ms();
    }
    }
}
void IR() interrupt 0   //执行中断:进行读取信号  最后产生键值
{
      unsigned char j,k,N=0;
     delay(15);
     if (IRIN==1) 
     { EX1 =1;
       return;
      } 
                           
  while (!IRIN)          
    {delay(1);}

 for (j=0;j<4;j++)         
 { 
  for (k=0;k<8;k++)       
  {
   while (IRIN)           
     {delay(1);}
    while (!IRIN)         
     {delay(1);}
     while (IRIN)       
      {
    delay(1);
    N++;           
    if (N>=30)
     { EX1=1;
     return;}                 
      }                                 
     IRCOM[j]=IRCOM[j] >> 1;                 
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
     N=0;
  }//end for k
 }//end for j
   
   if (IRCOM[2]!=~IRCOM[3])
   { EX1=1;
     return; }
    
    switch(IRCOM[2])
    {
        case 0x0c:jz=1;break;
        case 0x18:jz=2;break;
        case 0x5e:jz=3;break;
        case 0x08:jz=4;break;
        case 0x1c:jz=5;break;
        case 0x5a:jz=6;break;
        case 0x42:jz=7;break;
        default:break;
    }
    jy=jz;
}
void  time0_int(void) interrupt 1 //启动定时器0
{
     TL0=0xb0;
     TH0=0x3c;
     TR0=1;
      count++;
    if(count==10)
    {
        halfsecond=0;
    }

       if(count==20)
       {
        count=0;
        halfsecond=1;
//        if(second>0)
        {
            second--;
            if(second<0)
            {
                if(minit>0)
                {
                    second=59;
                    minit--;
                }
                else
                {
                    second=0;
                    timeover=1;
                    playon=0;
                    TR0=0;
                    TR1=1;
                }
            }
            sec24--;
            if(sec24<=0)
            {
                if((minit+second)!=0)
                {
                    alam=0;
                    TR0=0;
                }
                sec24=0;
            }
        }
       }
}

void  time1_int(void) interrupt 3//开定时器中断1
{
    TL1=0xb0;
     TH1=0x3c;
     TR1=1;
      count1++;
    if(count1==10)
    {
        alam=0;
    }

       if(count1==20)
       {
        count1=0;
        alam=1;
    }
} 

  • 写回答

2条回答 默认 最新

  • 墨&语 2022-04-17 23:56
    关注

    如果编译器支持调试的话,最好使用单步调试去找下问题,和硬件有关的问题,只是看代码的是很难发现的。导致出现你这个问题的原因可能是以下两种,一是你那段计算健值的代码有问题,你可以按下不同的按键,看一下得到的健值是否正常,可能你不同按键的健值判断之间会相互影响;二是存在按键抖动,按同一个按键,但单片机每次收到的数据都不相同,可以检查一下这几个按键,看看每次按下去单片机收到的数据是否相同。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 赞助了问题酬金20元 4月16日
  • 赞助了问题酬金10元 4月16日
  • 展开全部

悬赏问题

  • ¥15 用python如何确定子元素在父元素中的位置
  • ¥15 obj文件滤除异常高程
  • ¥15 用mathematicas或者matlab计算三重积分
  • ¥15 Loop unrolling的runtime计算
  • ¥100 NVMe-oF的Target端,开启attr_offload后,测试失败。
  • ¥100 有偿照片马赛克去掉,保留原始数据
  • ¥15 c# winform http报错,如何解决?
  • ¥15 统计软件及应用-r软件
  • ¥15 爬虫返回的js数据结构如何处理
  • ¥15 python初学者中间insert部分不知道怎么写,请教各位中间如何填写。还想问问大家0基础如何入手python和c语言,期待各位的回复和帮助。