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

📄 text1.c

📁 基于89S52的篮球计时计分器,实现外部中断和定时器的使用.用2803驱动共阳数码管.
💻 C
字号:
//#include <reg52.h>
#include <reg52.h>
//#include "AT89X52.H"
//#include <intrins.h>
#define TIME0H 0xFC
#define TIME0L 0x17	
#define TIME1H 0x3C
#define TIME1L 0xB0		

	
unsigned char code table[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
unsigned char code dis_digit[13]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFE,0xFD,0xFB,0xF7,0xEF};
unsigned char temp[13];
unsigned char uc_TimeCount=0;
int  dis_index;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^4;
sbit key4=P3^5;
sbit BEEP=P0^5;
sbit Light=P0^6;
int key;
int flag;
int score=0;
int score2=0;
int second24,second,minute,jie;

void delay(char i)				
{
	unsigned char k;
	for( k=0; k<i; k++)
	{
		
		;
	}
}                         //延时

int  keyscan()
{
  int i;
  P3=0xFF;
  if(key1==0)
  {
      delay(6);
      if(key1==0)
      {
         delay(6);
         if(key1==0)
         {
			 do{;}while(key1!=1);
			 i=1;
         }
      }
   }
   if(key2==0)
  {
      delay(6);
      if(key2==0)
      {
         delay(6);
         if(key2==0)
         {
			 do{;}while(key2!=1);
			 i=2;
         }
      }
   }
   if(key3==0)
  {
      delay(6);
      if(key3==0)
      {
         delay(6);
         if(key3==0)
         {
			 do{;}while(key3!=1);
			 i=3;
         }
      }
   }
   if(key4==0)
  {
      delay(6);
      if(key4==0)
      {
         delay(6);
         if(key4==0)
         {
			 do{;}while(key4!=1);
			 i=4;
         }
      }
   }
   return(i);
}

/*void inc_min()
{
 
 minute--;
 if(minute <0)
 {
  minute = 12;
  jie++;
  flag=1;
  ET1=0;
 }
 temp[10]=table[jie]; 
 temp[1] = table[minute / 10];  // 分十位
 temp[0] = table[minute % 10];  // 分个位
}

void inc_sec()
{
 
 second24--;
 second--;
 if(second<0)
 {
  second=59;
  inc_min();
 }
 if(second24==0)
 {
  second24=24;
  flag=1;
  ET1=0;
 }
 temp[8]=table[second/10];
 temp[9]=table[second%10]; 
 temp[11]=table[second24/10];
 temp[12]=table[second24%10];
}

*/

void vTimer1(void) interrupt 3        //中断1程序
{
    TH1=TIME1H;               //TIME1H=0x3C
    TL1=TIME1L;               //TIME1L=0xB0
    flag=0;
    uc_TimeCount++;           //倒计时开始
    if(uc_TimeCount==20)
    {
        uc_TimeCount=0;
        second24--;
	    second--;
	if(second24==0)
	{
	    second24=24;             //24秒倒计时
        flag=1;
        ET1=0;
	}
	if(second==-1)
	{
        second=59;
	    minute--;
	    if(minute==-1)
	    {
	        minute=12;
		    second=0;
			second24=24;
	        jie++;
			flag=1;
		    ET1=0;
	    }		 
    }
    }
	temp[10]=table[jie]; 
    temp[1] = table[minute / 10];  // 分十位
    temp[0] = table[minute % 10];  // 分个位
	temp[8]=table[second/10];
    temp[9]=table[second%10]; 
    temp[11]=table[second24/10];
    temp[12]=table[second24%10];
}


 void vTimer0(void) interrupt 1          //1毫秒刷新一次
{   
    TH0=TIME0H;		   					
	TL0=TIME0L;

	if(dis_index>=0 && dis_index<8)
	{ 
	    P1=dis_digit[dis_index];
		P0=0xFF;
		P2=temp[dis_index];
	}
	else
	if(dis_index>=8 && dis_index<13)
	{
	    P1=0xFF;
		P0=dis_digit[dis_index];
		P2=temp[dis_index];
	}
	dis_index++;
	if(dis_index==13)
	{
	    dis_index=0;
	}
}



 void intersvr0(void) interrupt 0 using 1
{   
    ET1=~ET1;
}

 void intersvr1(void) interrupt 2 using 2
{   
    second24=24;
}

void main(void)
{
	//初始化全局变量		
    P3=0xFF;
	P2 = 0;
    P1 = 0;
	P0 = 0x01;

    PX0=0;
	PX1=0;
	PT0=1;
	PT1=0;
	TMOD=0x11;

	TH0=TIME0H;
	TL0=TIME0L;
		 
	TR0=1;			 //开启定时器0
	ET0=1;			 //开定时器0中断
    EX0=1;
    EX1=1;

	TH1=TIME1H;
	TL1=TIME1L;
	TR1=1;			 //开启定时器1
	ET1=1;			 //开定时器1中断
//	ET2=0;
    IT0=1;
	EA=1;			 //开启总中断
    uc_TimeCount=   0;
	flag=0;
	second24=24;
    second=0;
    minute=12;
    score=0;
	score2=0;
	jie=1;	
	temp[0]=table[minute%10];
	temp[1]=table[minute/10];
    temp[8]=table[second/10];
    temp[9]=table[second%10];
    temp[11]=table[second24/10];
    temp[12]=table[second24%10];
   	temp[2]=table[score/100];
    temp[3]=table[(score%100)/10];
    temp[4]=table[(score%100)%10];
    temp[5]=table[score2/100];
    temp[6]=table[(score2%100)/10];
    temp[7]=table[(score2%100)%10];
    temp[10]=table[jie]; 
    dis_index = 0;


    while(1)
	{ 
	   if(flag==1)
	   {
	      BEEP=0;
		  Light=0;
	   }
   	   key=keyscan();
       if(key)
        {
            switch(key)
            {
                case 1 :
                	score++;
					temp[2]=table[score/100];
                    temp[3]=table[(score%100)/10];
                    temp[4]=table[(score%100)%10];
                break ;
				 case 2 :
                	score--;
					if(score==-1)
					{score=0;}
					temp[2]=table[score/100];
                    temp[3]=table[(score%100)/10];
                    temp[4]=table[(score%100)%10];
                  break;
                case 3 :
                	score2++;
					temp[5]=table[score2/100];
                    temp[6]=table[(score2%100)/10];
                    temp[7]=table[(score2%100)%10];
                break ;
				 case 4 :
                	score2--;
					if(score2==-1)
					{score2=0;}
					temp[5]=table[score2/100];
                    temp[6]=table[(score2%100)/10];
                    temp[7]=table[(score2%100)%10];
                  break;
                 default :
                break ;
             }
	     }
	}
}

⌨️ 快捷键说明

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