抢答器51单片机stc89c52

  #include <reg52.h>                //  定义 MCS-51 单片机寄存器。 
  sbit start=P3^1; //定义k1为开始的按键	
  sbit spk=P2^5;                 

  unsigned char ST;                

  unsigned char keyval;              //  读取的键值。 

  #define DispDat P0                 
  #define KeyDat P3                 
  #define LS P2
  #define keyboard P1	
  unsigned char mSec,Sec;           
 unsigned char qw,bw,sw,gw;         

unsigned char tab[]= 

  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};

	void delay_10us(unsigned int n)
{
	while(n--);
}


  void Init()              

   { 

      TMOD=0x01;                      

      TH0=0x4C;TL0=0x00;                    //  该值在 12MHz 时为 50ms 中断1次 

      //TR0=1;                              //使用时启动定时 

       ET0=1; 

      EA=1; 

   } 

  void Sound(unsigned char F,unsigned char L)   
  {   

       unsigned char f;
		   unsigned int l; 

      for(l=0;l<L;l++) 

{

         spk=l; 

          for(f=0;f<F;f++); 

         spk=0; 

          for(f=0;f<F;f++); 

       } 

   } 

  void Timer0Int(void) interrupt 1          
    {

      TH0=0x4c; 

      TL0=0x00;                             // 50ms 中断一次。 

      mSec++; 

     if(mSec>=20)                        
                                              
    {

         mSec=0; 

           Sec--; 

       if(Sec==0) 

{

             ST=0;                         //  抢答自动到时。 

              TR0=0;                   

             Sound(60,250);                //  长声。 

              gw=0;                      

		 }
	 }
 }



   void Delay(unsigned char t)               

   { 

     while(t--); 

   } 



   void Display()                           

  { 

       unsigned char j; 

      qw=Sec/10; 

      bw=Sec%10; 

      for(j=0;j<10;j++) 

{

          LS=0XEF; 

         DispDat=tab[gw];               

         Delay(10); 

         DispDat=tab[0xb];               

        LS=0XEB; 
         DispDat=tab[0xa];                     
                                             
         Delay(10); 

          DispDat=tab[0xb];                

         LS=0XE7; 

         DispDat=tab[bw];          

         Delay(10); 

          DispDat=tab[0xb];            

          LS=0XE3; 

           DispDat=tab[qw];               

        Delay(10); 

          DispDat=tab[0xb];                

       } 

      DispDat=0x00;                        
                                             
   } 

   void Scankey()                         //键盘扫描程序。 

  {
	 unsigned char i;
   
       if(KeyDat!=0xff)                    //有按键按下。 

       { 

          i=~KeyDat;                      //读取键盘状态。 

          switch(i) 

        {
            case 0x01: gw=0x01;          //K2,键值显示在个位。 
                       TR0=0;            //关定时。 

                       Sound(100,250);   

                        ST=0; 

                        break; 

             case 0x04: gw=0x02;          //K3				

                       TR0=0;            //关定时。 

                        Sound(100,250);   //长声。 

                        ST=0; 

                        break; 

             case 0x08:  gw=0x03;           //K4 

                         TR0=0;             // 关定时。 

                        Sound(100,250);    //长声。 

                         ST=0; 

                         break; 

             default:break;             //其它按键按下不处理。 

         } 

      } 
			 keyboard=0xf7;
			if(keyboard!=0xf7)
			{
				delay_10us(1000);
				switch(keyboard)
				{
					case 0x77:gw=0x04;           //K5o 
                    TR0=0;             //关定时。 
                    Sound(100,250);    //长声。 
                    ST=0; 
                    break; 
					case 0xb7:gw=0x05;           //K5o 
                    TR0=0;             //关定时。 
                    Sound(100,250);    //长声。 
                    ST=0; 
                    break; 
					case 0xd7:gw=0x06;           //K6o 
                    TR0=0;            //关定时。 
                    Sound(100,250);    //长声。 
                    ST=0; 
                    break;
					}				
			}
			 
		}


main()                                      //主程序。 
{

     unsigned   int i; 

      Init();                               //初始化。 

     DispDat=0x00; 

     ST=0; 

     for(i=0;i<300;i++)  Display();           //  开始显示。 

     gw=0;                                  //  平常对号显示”0”。 

     while(1) 

{

         if(ST==0) 

          { 

             start=1; 

             if(start==0)

              { 

               keyval=0; 

                Sound(100,50);             //短一声。 

                 TH0=0x4c; TL0=0x00; 

            mSec=gw=0;          //清计时时间、上次获胜对号。 

             Sec=10;             //  预置抢答时限。可以自行设置 1-99 秒限时时间。 

             TR0=1;               //  开始计时。 

             ST=1;              //抢答开始。 

        } 

       } 

       if(ST==1) Scankey();       //  抢答开始后才允许扫描键盘。 

       if(TR0==0) Sec=0;         //不在抢答期,时间显示0。 

       Display(); 

 

 } 
	}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值