⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basketball.c

📁 利用实验板上的89C51,8279,LED,LCD等资源设计篮球比赛记时记分器
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg51.h>
#include<absacc.h>
#define w_c_add XBYTE[0x2070]      /*写命令字地址*/
#define w_d_add XBYTE[0x2071]      /*写数据地址  */
#define r_s_add XBYTE[0x2072]      /*读状态字地址*/
#define r_d_add XBYTE[0x2073]      /*读数据地质  */
#define COM XBYTE[0x2021]          /*8279命令口  */
#define DAT XBYTE[0x2020]          /*8279数据口  */
#define uchar unsigned char
#define uint unsigned int
uchar halftime0;                   /*半场时间分的十位纪录*/
uchar halftime1;                   /*半场时间分的个位纪录*/
uchar halftime;                    /*全场时间阿拉伯数字总计时*/
uchar second0;                     /*24秒到计时十位*/
uchar second1;                     /*24秒到计时个位*/
uchar time;                        /*用于一秒定时*/
uchar Acount;                      /*A队比分变量*/        
uchar Bcount;                      /*B对比分变量*/
uchar backtime;                    /*10秒定时变量*/
uchar a; 
uchar fulltime0;                   /*全场计时分钟的十位lcd编码*/
uchar fulltime1;                   /*全场计时分的个位lcd编码*/                  
uchar fulltime;                    /*全场计时阿拉伯数字计数*/
uchar bdata status;               // 可位寻址片内数据存储器,允许位与字节混合访问 
sbit speaker=P1^4;
sbit red=P1^5;
sbit yellow=P1^6;                 /*指示灯*/
sbit green=P1^7;   
sbit busy=status^7;               /*RT12864HZ液晶显示器“忙”线的检测(第7位)*/
sbit clflag=ACC^7;                /*8279标志位*/
bit flag;                         /*显示页面选择标志*/  
bit dk;                           /*队伍选择标志*/
bit mk;                           /*功能选择标志*/   
bit stop;                         /*24秒到是标志位*/           
bit pk;                           /*10秒延时到标志位*/
                      
unsigned char code num_lcd[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
                          /*lcd数字编码*/
unsigned char code num_led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
                          /*led数字编码*/
unsigned char xdata hz1[16]={0xC8,0xAB,0xB3,0xA1,0xCA,0xB1,0xBC,0xE4,0x3A,
	                  /*     全        场        时         间   :*/
	                         0x20,0x30,0x30,0x3A,0x30,0x30,0x20};
                             /*     0     0    :   0    0     */
unsigned char xdata hz2[16]={0xB0,0xEB,0xB3,0xA1,0xCA,0xB1,0xBC,0xE4,0x3A,
	                     /*     半        场        时        间    : */
                             0x20,0x31,0x39,0x3A,0x35,0x39,0x20};                                 
                            /* 空    0    0    :   0     0  空*/  
unsigned char xdata hz3[16]={0xD6,0xD0,0xB9,0xFA,0x56,0x53,0xCB,0xB9,0xC2,
                              /*   中       国      v    s       斯        */
                                0xE5,0xCE,0xC4,0xC4,0xE1,0xD1,0xC7  };
                              /*  洛        文        尼       亚  */                 
unsigned char xdata hz4[16]={0x20,0x30,0x30,0x30,0x3A,0x30,0x30,0x30,0x20,0x20,
	                        /*(主队得分)           :               */
	                        0x20,0x20,0x20,0x32,0x34,0x20};
                            /*                    客队得分             */
unsigned char xdata start1[16]={0xbb,0xb6,0xd3,0xad,0xca,0xb9,0xd3,0xc3,0x20,   
	                         /*        欢       迎       使         用   :*/
	                         0x20,0x20,0x20,0x20,0x20,0x20,0x20};
                             /*    空           */
unsigned char xdata start2[16]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xc0,
	                        /*                                  空   */
                             0xba,0xc7,0xf2,0xb1,0xc8,0xc8,0xfc};                                 
                            /* 篮        球       比      赛*/  
unsigned char xdata start3[16]={0xd7,0xa8,0xd3,0xc3,0xbc,0xc6,0xca,0xb1,0xbc,
                              /*       专        用        计       时                */
                                 0xc7,0xb7,0xd6,0xcf,0xb5,0xcd,0xb3  };
                              /*  记         分       系       统  */                 
unsigned char xdata start4[16]={0xb1,0xc8,0xc8,0xfc,0xca,0xb1,0xbc,0xe4,0xc9,0xe8,
	                         /*        比        赛         时         间       设 */
	                        0xb6,0xa8,0x3A,0x20,0x30,0x30};
                            /*    定    :               */

/*LCD忙状态检测函数 */
void lcd_busy(void)                       
{
	do 
	{
  	  status=r_s_add;                    /* 读状态字地址的第7位 */
	}	
	while(busy);
}

/*LCD显示子程序*/
void display_lcd(void)                   
{   
	int i; 
    lcd_busy();
    w_c_add=0x30;                     /* 功能设置:8位数据 */
    lcd_busy();     
    w_c_add=0x0C;                     /* 显示状态:整体显示,游标位置无效*/
    lcd_busy();
    w_c_add=0x01;                     // 清除显示:将DDRAM填满“20H”,并且设
                                      // 定DDRAM的地址计数器到“00”
    lcd_busy();                
    w_c_add=0x02; 
    lcd_busy();
    w_c_add=0x80;                      /* 写第一行数据*/   
    for(i=0;i<8;i++)
       {
	      lcd_busy();
	      if(flag==1)w_d_add=hz1[2*i];     
          else  w_d_add=start1[2*i];     /* 写数据 ,上半字节*/
	      lcd_busy();                    
	      if(flag==1)w_d_add=hz1[2*i+1];   /* 写数据 ,下半字节*/
	      else  w_d_add=start1[2*i+1];
        }
    lcd_busy();
    w_c_add=0x90;                       /* 写第二行数据*/
    for(i=0;i<8;i++)
       {
	      lcd_busy();
	      if(flag==1)w_d_add=hz2[2*i];     
          else  w_d_add=start2[2*i];     /* 写数据 ,上半字节*/
	      lcd_busy();                    
	      if(flag==1)w_d_add=hz2[2*i+1];   /* 写数据 ,下半字节*/
	      else  w_d_add=start2[2*i+1];
       }
    lcd_busy();
    w_c_add=0x88;                       /* 写第三行数据*/      
    for(i=0;i<8;i++)
       {
          lcd_busy();
	      if(flag==1) w_d_add=hz3[2*i];     
          else  w_d_add=start3[2*i];     /* 写数据 ,上半字节*/
	      lcd_busy();                    
	      if(flag==1) w_d_add=hz3[2*i+1];   /* 写数据 ,下半字节*/
	      else  w_d_add=start3[2*i+1];
       }
    lcd_busy();
    w_c_add=0x98;                       /* 写第四行数据*/
    for(i=0;i<8;i++)
       {
	      lcd_busy();
	      if(flag==1)w_d_add=hz4[2*i];     
          else  w_d_add=start4[2*i];     /* 写数据 ,上半字节*/
	      lcd_busy();                    
	      if(flag==1)w_d_add=hz4[2*i+1];   /* 写数据 ,下半字节*/
	      else  w_d_add=start4[2*i+1];
       }
}



/*十秒延时*/
void delay(void)
{
    uchar i,j,k,a=1;
    for(i=0;i<50;i++)
    for(j=0;j<200;j++)
    for(k=0;k<100;k++)
    {
    	a=a;
	}
}

/*全场时间,半场倒计时操作子程序*/
void operate1(void)
{
    uchar statefull=1,statehalf=1;
     /*判断全场时间是否到*/    
    if((hz1[10]==fulltime0)&&(hz1[11]==fulltime1))     /*全场时间到?(写一行太多,所以分两行)*/
      {                                
         if((hz1[13]==0x35)&&(hz1[14]==0x39))          /*时间达到fulltime0 fulltime1:59*/
           {
             TR1=0;                                    /*停止计时、发出铃声*/
             speaker=1;
             statefull=0;             
           }
      }
      /*判断半场时间是否到*/
     if((hz2[10]==0x30)&&(hz2[11]==0x30))              /*半场时间到?*/
      {                                
         if((hz2[13]==0x30)&&(hz2[14]==0x30))
           {
             TR1=0;                                    /*停止计时、发出铃声*/
             speaker=1;
             statehalf=0; 
           //  delay1();                                 /*调用一分钟延时,为中场休息时间*/   
                      
           }
      }
    if(statefull==1)
         {
           hz1[14]=hz1[14]+0x01;              /*秒个位加1*/
           if(hz1[14]==0x3A)                  /*秒个位是否等于10?*/
             {
                hz1[14]=0x30;                   /*等于 ,进位;秒个位归零*/
                hz1[13]=hz1[13]+0x01;           /*秒十位加1*/
                if(hz1[13]==0x36)               /*秒十位是否等于10?*/
                  {
                     hz1[13]=0x30;                /*等于 ,进位;秒十位归零*/ 
                     hz1[11]=hz1[11]+0x01;        /*分个位加1*/
                     if(hz1[11]==0x3A)            /*分个位是否等于10?*/
                       {
                         hz1[11]=0x30;             /*等于 ,进位;分个位归零*/
                         hz1[10]=hz1[10]+0x01;     /*分十位加1*/
                       }
                  }
             }
              
               /*半场时间为倒计时*/ 
           if(statehalf==1)                           /*半场时间未到,正常计时*/
             {
                hz2[14]=hz2[14]-0x01;              /*秒个位加1*/
                if(hz2[14]<0x30)                  /*秒个位是否 小于0?*/
                  {
                     hz2[14]=0x39;                   /*大于 ,进位;秒个位归零*/
                     hz2[13]=hz2[13]-0x01;           /*秒十位加1*/
                     if(hz2[13]<0x30)               /*秒十位是否大于10?*/
                       {
                         hz2[13]=0x35;                /*大于 ,进位;秒十位归零*/ 
                         hz2[11]=hz2[11]-0x01;        /*分个位加1*/
                         if(hz2[11]<0x30)            /*分个位是否大于10?*/
                           {
                              hz2[11]=0x39;             /*大于 ,进位;分个位归零*/
                              hz2[10]=hz2[10]-0x01;     /*分十位加1*/             
                           }
                       }
                  } 
             }   
           else                                /*半场时间到,恢复到初始状态*/
               {
                 hz2[10]=halftime0;
                 hz2[11]=halftime1;
                 hz2[13]=0x35;
                 hz2[14]=0x39;
                 statehalf=1;
                }             
         }
     
}

/*24秒倒计时子程序、显示程序*/
void operate2(void)
{
	hz4[14]=hz4[14]-0x01;
	if((hz4[14]==0x30)&&(hz4[13]!=0x30))
	  {
	  	hz4[14]=0x39;
	  	hz4[13]=hz4[13]-0x01;
  	  }
	if((hz4[14]==0x30)&&(hz4[13]==0x30))
	  { 
	  	speaker=0;
	  	TR1=0;
	  	stop=1;
	  	delay();
	  	stop=0;	  	
	  	speaker=1;	    	  	
      }	
    display_lcd();
}


/*定时计数器1一秒定时(20*50ms=1s)子程序*/
void timer(void)interrupt 3  using 2    
{
  TH1=(65536-50000)/256;                
  TL1=(65536-50000)%256;
  time++;
  if(time==20) //{time=0;time1++;half time--;}
    {  flag=1;
       time=0;
       operate1();                   /*调用全场时间,半场时间变化LCD子程序*/
       operate2();                   /*调用24倒计时变化子LED程序*/
       flag=1;
       display_lcd();
    }
}

/*设定时间送入lcd显示器子程序*/
void timedevide(void)
{
   uchar half,i;     
   half=fulltime/2-1;
   i=half/10;
   hz2[10]=num_lcd[i];
   halftime0=num_lcd[i];
   i=half%10;
   hz2[11]=num_lcd[i];
   halftime1=num_lcd[i];
   display_lcd();
}   

/*比分转化子程序*/
//void countdevide(void)
//{
//	uchar i,j,k,b;
//	b=Acount;
//	i=b/100;                 /*篮球比分百位*/
//	b=b%100;
//	k=b/10;                  /*篮球比分十位*/
//	k=b%10;                  /*篮球比分个位*/
//	hz4[1]=num_lcd[i];
//	hz4[2]=num_lcd[j];
//	hz4[3]=num_lcd[k];              /*送入显示区*/
//	/*上面主队,下面客队*/
//	b=Bcount;
//	i=b/100;                 /*篮球比分百位*/
//	b=b%100;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -