用单片机实现抢答器

1. 使用元器件:

硬件:数码管、按键、LED

软件:定时器

2. 程序设计要求

启动后,8LED灯依次(18循环)点亮(或不点亮),数码管(8位一体、4位一体、独立)同时显示当前被点亮LED位置;

按键控制抢答;

按键按下后,停止更新LED灯和数码管;

数码管显示按键位置,LED灯停止在按键位置;

超过10秒没有按键按下,LED全部闪烁;

按键复位




#include <reg51.h>
code unsigned char duan[8]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07};//段选
code unsigned char wei[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选
unsigned char number,ms=0,flag=0;
sbit k1=P1^0;
sbit k2=P1^1;//定义LED灯
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;




void delay(unsigned char i)//延时
{
while(i--);
}


void key()
{
  if(0==k1) //当K1按下时
  {
delay(100);
if(0==k1)
{
   if((0==ms)||(1==ms))
   {
   flag=1;
   }
}
  }
   else if(1==k1)
  {
 if((1==flag)&&(ms!=2))
 {
 ms=1;
 number=1;
 }
  }


    if(0==k2)//当K2按下时
  {
delay(100);
if(0==k2)
{
   if((0==ms)||(1==ms))
   {
   flag=2;
   }
}
  }
 else if(1==k2)
  {
 if((2==flag)&&(ms!=2))
 {
 ms=1;
 number=2;
 }
  }


    if(0==k3)//当K3按下时
  {
delay(100);
 if(0==k3)
{
   if((0==ms)||(1==ms))
   {
   flag=3;
   }
}
  }
    else if(1==k3)
  {
    if((3==flag)&&(ms!=2))
 {
 ms=1;
 number=3;
 }
  }


    if(0==k4)//当K4按下时
  {
delay(100);
 if(0==k4)
{
   if((0==ms)||(1==ms))
   {
   flag=4;
   }
}
  }
  else if(1==k4)
  {
 if((4==flag)&&(ms!=2))
 {
 ms=1;
 number=4;
 }
  }


    if(0==k5)//当K5按下时
  {
delay(100);
if(0==k5)
{
   if((0==ms)||(1==ms))
   {
   flag=5;
   }
}
  }
   else if(1==k5)
  {
 if((5==flag)&&(ms!=2))
 {
 ms=1;
 number=5;
 }
  }


    if(0==k6)//当K6按下时
  {
delay(100);
if(0==k6)
{
   if((0==ms)||(1==ms))
   {
   flag=6;
   }
}
  }else if(1==k6)
  {
 if((6==flag)&&(ms!=2))
 {
 ms=1;
 number=6;
 }
  }


    if(0==k7)//当K7按下时
  {
delay(100);
if(0==k7)
{
   if((0==ms)||(1==ms))
   {
   flag=7;
   }
}
  }
  else if(1==k7)
  {
 if((7==flag)&&(ms!=2))
 {
 ms=1;
 number=7;
 }
  }


    if(0==k8)//当K8按下时
  {
delay(100);
if(0==k8)
{
   if((0==ms)||(1==ms))
   {
   flag=8;
   }
}
  }else if(1==k8)
  {
 if((8==flag)&&(ms!=2))
 {
 ms=1;
 number=8;
 }
  }
  
}


void deng()



P0=wei[number]; 
}


void guan()
{
   P1=~duan[number];
}




void dsq()
{
  TMOD=0X01;//定时器
  TH0=0XFC;
  TL0=0X18;
  ET0=1;
  EA=1;
  TR0=1;
}


void main()
{
   dsq();
   while(1)
   {
   key();
   guan();
   deng();
   }
}
void interruot1() interrupt 1

static unsigned cnt=0,cnt1=0,cnt2=0;//静态
TH0=0XFC;
TL0=0X18;
cnt++;
   if(cnt>1000)
   {
     if(0==ms)
  {
      number++;
      if(number>8)
      {
       number=1;
      }
     }
cnt=0;
   }else if(ms==2)
{
if(cnt/500>0)
{
P0=0x00;
}else 
{
P0=0xff;
}
}
if(flag==number)
{
cnt1++;
if((cnt1>1000)&&(1==ms))
{
cnt2++;
if(cnt2>10)

P0=0XFF;
number=0;
ms=2;
cnt2=0;
}
      cnt1=0;
}
}else if(flag!=number)
{
cnt1=0;
cnt2=0;
}
}

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_735754647

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值