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

📄 dingshi.c

📁 基于89S51芯片开发的篮球倒计时系统,开发环境KEIL,仿真环境PROTUES
💻 C
字号:
/*********************************************************************/
//            
//                       定时
//                    ancleyan 2007.04.23      
/*********************************************************************/
//使用AT89C51单片机,3MHZ晶振,P1口输入,P2口作列扫描,P1数据输出,用共阳LED数码管

#include"reg51.h"
#define char unsigned char
char data time[6]={0x0b,0x0b,0x0b,0x0b,0x0b,0x0b};  //当开启之后显示最下面一行
char code dis_7[14]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xf7,0xbf,0xfe};
char code  scan_con[7]={0x01,0x02,0x04,0x08,0x10, 0x20, 0x00};   // 列扫描控制字
//*********************第1个  2个  3个  4个  5个  6个 全不亮
char data t=0;     //供键盘输入的数存储进数组时使用
char data count=13;
sbit clean=P3^2;
sbit aa=P3^0;
sbit bb=P3^1;
char data lock=0;
char data lockfun14=0;

//*********外部中断0  完成清零功能  *********
void reset(void) interrupt 0 using 1   // 利用中断清零
{ 
  char i;
  //if(){bb=0;}
  aa=1;
  //else{
  for(i=0;i<6;i++) {time[i]=0x0c;}
  ////gg=0;//delay1ms(200);//P2=0;
  clean=1;//记得将P3还原   对产生中断的信号还原      
  t=0;   //还原供键盘输入的数存储进数组时使用  如果不还原 下次存储是从上次中断的地方接着存储
  lock=0;
  TR0=0;//关闭定时器0
  EA=0;
}

//*******定时器0  50MS定时中断
void delay50ms() interrupt 1 using 0
{ void fun15(void);
//while(1)
//{   //0000
  count--;
  EA=1;ET0=1;TMOD=0x01;
  TH0=(65536-15526)/256;
  TL0=(65536-15536)%256;
  //*****原来使用的确定键功能函数 void okset(void)*********//
if(time[5]==0xff) //&&count==0
  {   //1111
    if(time[4]==00)
      {   //2222
        if(time[3]==0x00)
          {   //3333
            if(time[2]==0x00)
              {   //4444
                if(time[1]==0x00)
                  {    //5555
                    if(time[0]==0x00)
                      {aa=0;TR0=0;}// 一定要关计时器0 如果不关 7段显示码上无显示 实际上还在继续倒计时
                    else
                      {time[0]--;time[1]=9;time[2]=5;time[3]=9;time[4]=5;time[5]=9;}
				  }    //5555
                else
                  {time[1]--;time[2]=5;time[3]=9;time[4]=5;time[5]=9;}
			  }   //4444
            else
              {time[2]--;time[3]=9;time[4]=5;time[5]=9;}
		  }   //3333
	    else
          {time[3]--;time[4]=5;time[5]=9;}
	 }    //2222
	 else
        {time[4]--;time[5]=9;}
  }       //1111
else 
   {
     if(count==0)
      { count=13;TR0=1;time[5]--;}//
   }
//}       //0000
}
//*********设置键的功能**********
void settime(void)
{ 
  if(t==0)  //防止输入数据、计时过程中按下设置键
  {
  char i;
  for(i=0;i<6;i++)
  {time[i]=0x0d;}
  lock=1;lockfun14=1;
  }
}
//*******1毫秒延时程序********
delay1ms(int t1)
{
   char i,j;
   for(i=0;i<t1;i++)
   for(j=0;j<120;j++)
   {;}
}
//*******10毫秒延时程序********
//delay10ms(int t2)
//{
  // int i,j;
   //for(i=0;i<t2;i++)
   //for(j=0;j<1200;j++)
   //{;}
//}

//**********功能函数15   发出INT0中断请求脉冲清零***********************************
void fun15(void)
{
  clean=0;//delay1ms(1);clean=1;
}
//**********功能函数14   发出T0中断请求脉冲计时***********************************
void fun14(void)
{
 if(t==6)
  {TR0=1;}
  //ff=0;
}
//**********功能函数13***********************************
void fun13(void)
{
  //delay1ms(200);
 // okset();
  //ee=0;
}
//**********功能函数12***********************************
void fun12(void)
{
  //delay1ms(200);
  //dd=0;
}
//**********功能函数11***********************************
void fun11(void)
{
  //delay1ms(200);
  //cc=0;
}
//**********功能函数10***********************************
void fun10(void)
{
  settime();
  //password();
 // okset();
}
//**********功能函数9***********************************
char fun9(void)
{ if(lock==1&&t<6)//平时数字键无效 只有按下设置键才有效
 {if(t!=2&&t!=4){  
  void scan_7(void);//对被调用函数的说明
  while(P1!=0xfe){scan_7();}                          //while(P3!=0xfe);
  //delay1ms(200);       //防止由于按键未放开 输入一串数字  可以加入一个while(P3!=0xfe)语句 直到放开键才动作
  time[t]=9;         //用delay1ms(100)语句可以按住键之后重复输入
  //aa=0;              
  return t++;}
  }
}
//**********功能函数8***********************************
char fun8(void)
{if(lock==1&&t<6)         //加入t<6  防止输入的定时时间多于6位数字
  {if(t!=2&&t!=4){
  void scan_7(void);      //对被掉函数的说明  
  while(P1!=0xfe){scan_7();}  //加入这两条语句的目的是防止闪烁
//while(P3!=0xfe);
  //delay1ms(200);
  time[t]=8;
 // bb=0;                 //函数功能测试灯
  return t++;}}
}
//**********功能函数7***********************************
char fun7(void)
{ if(lock==1&&t<6)
  {
  if(t!=2&&t!=4)   //防止出现类似66分钟的数据
  {
  void scan_7(void);//对被掉函数的说明
  while(P1!=0xfe){scan_7();}            //注意 不是所有的语句都使用while(P1!=0xfe),不同的行使用不同的语句
  //while(P3!=0xfe);                    //与密码程序的区别密码程序中使用的不是while(P1!=0xfe),用的是delay();
  //delay1ms(200);
  time[t]=7;
  //cc=0;
  return t++;}}
}
//**********功能函数6***********************************
char fun6(void)
{if(lock==1&&t<6)
  //void scan_7(void);//对被掉函数的说明
  {if(t!=2&&t!=4){
  while(P1!=0xfd){scan_7();}
  time[t]=6;
  //dd=0;
  return t++;}}
}
//**********功能函数5***********************************
char fun5(void)
{ if(lock==1&&t<6)
 // void scan_7(void);//对被掉函数的说明
  {while(P1!=0xfd){scan_7();}
  time[t]=5;
  //ee=0;
  return t++;}
}
//**********功能函数4***********************************
char fun4(void)
{if(lock==1&&t<6)
 // void scan_7(void);//对被掉函数的说明
  {while(P1!=0xfd){scan_7();}
  time[t]=4;
  //ff=0;
  return t++;}
}
//**********功能函数3***********************************
char fun3(void)
{if(lock==1&&t<6)
  //void scan_7(void);//对被掉函数的说明
  {while(P1!=0xfb){scan_7();}
  time[t]=3;
  //gg=0;
  return t++;}
}
//**********功能函数2***********************************
char fun2(void)
{  //delay1ms(200);
if(lock==1&&t<6)
  //void scan_7(void);//对被掉函数的说明
  {while(P1!=0xfb){scan_7();}
  time[t]=2;
  return t++;}
}
//**********功能函数1***********************************
char fun1(void)
{if(lock==1&&t<6)
  //void scan_7(void);//对被掉函数的说明
 { while(P1!=0xfb){scan_7();}
  time[t]=0x01;
  //hh=0;
  return t++;}
}
//**********功能函数0***********************************
char fun0(void)
{
if(lock==1&&t<6)
  {while(P1!=0xf7){scan_7();}
  time[t]=0;
  return t++;}
}
//**************************
//对型如7 8 9 a 的键盘的驱动
//      4 5 6 b
//      1 2 3 c
//      d 0 e f 
/**********按键驱动函数***********/
void keyscan(void)
{ 
   P1=0xfe;                             //将第一行置零
   if(P1!=0xfe)  
     {  if(P1==0x7e)        fun10();      //一行四列
	    else if(P1==0xbe)   fun9();       //一行三列
	    else if(P1==0xde)   fun8();       //一行二列
		else if(P1==0xee)   fun7();       //一行一列
	 }  
   else                              
       {
	     P1=0xfd;                 //将第二行置零
           if(P1!=0xfd)
 		      { if(P1==0x7d)        fun11();   //二行四列
			    else if(P1==0xbd)   fun6();    //二行三列
	            else if(P1==0xdd)   fun5();    //二行二列
		        else if(P1==0xed)   fun4();    //二行一列
			  }
		   else                           
               {
	              P1=0xfb;               //将第三行置零
                  if(P1!=0xfb)
 		            { if(P1==0x7b)        fun12();//三行四列
			          else if(P1==0xbb)   fun3();//三行三列
	                  else if(P1==0xdb)   fun2();//三行二列
		              else if(P1==0xeb)   fun1();//三行一列 
			        }
				  else
				  {
				    P1=0xf7;             
				    { if(P1!=0xf7) 
 		                { 
						if(P1==0x77)        fun13();//四行四列
			            else if(P1==0xb7)   fun14();//四行三列
	                    else if(P1==0xd7)   fun0();//四行二列
		                else if(P1==0xe7)   fun15();//四行一列 
			            }
	 			    }
			      }
               }
        }
}
//*****数码管显示函数   将数据及显示控制码输出*********//
void scan_7(void)
{
  char j;
  for(j=0;j<6;j++)
    {
	P2=scan_con[j];//scan_con[7]={0x01,0x02,0x04,0x08,0x10,0x200x00,};   // 列扫描控制字
	P0=dis_7[time[j]];//dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
	delay1ms(1);
	}
}

//*******主程序*******//
void main()
{ 
  EA=1;ET0=1;TMOD=0x01;
  TH0=(65536-15526)/256;
  TL0=(65536-15536)%256;

  while(1)
  {
   EA=1;    //CPU开中断
   EX0=1;   //int0允许中断  //TR0=1;
   scan_7();
   keyscan();
   //delay1ms(1);
   //okset();
  }
}















  



⌨️ 快捷键说明

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