找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2467|回复: 5
打印 上一主题 下一主题
收起左侧

51单片机八路抢答器的程序问题

[复制链接]
跳转到指定楼层
楼主
各位大佬,我是一名单片机小白,要求一个选手通过P2按键抢答后其他选手按下时没反应,可是我的程序按了其他按键数字也跟着变,换了几种方式都改变不了,请大家帮我看看哪个地方出错了
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char//宏定义
sbit host=P3^0;
sbit deng=P3^6;
uchar flag=0;
uchar code table[]={0x40,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阴数码管"0-9"编码表
void delay(uint c)                    // 延时子程序
{  
        uint i,j;
        for(;c>0;c--)
                for(i=142;i>0;i--)
                        for(j=2;j>0;j--);
}
void INT_0() interrupt 0
{
EX0=0;
delay(20);
EX0=1;
switch(P2)
{
case 0xfe: if(flag==1) P1=0xfe;deng=1;num=0;break;        //按键1
case 0xfd: if(flag==1) P1=0xfd;deng=1;num=1;break;        //按键2
case 0xfb: if(flag==1) P1=0xfb;deng=1;num=2;break;        //按键3
case 0xf7: if(flag==1) P1=0xf7;deng=1;num=3;break;        //按键4
case 0xef: if(flag==1) P1=0xef;deng=1;num=4;break;        //按键5
case 0xdf: if(flag==1) P1=0xdf;deng=1;num=5;break;        //按键6
case 0xbf: if(flag==1) P1=0xbf;deng=1;num=6;break;        //按键7
case 0x7f: if(flag==1) P1=0x7f;deng=1;num=7;break;        //按键8
}
if(flag)
{P0=table[num];flag=0;}
}

void main()                           //主函数
{
          while(1)
           {
             if(host==0)          //开关1被按下
                {
                        EA=1;
                        EX0=1;
                          IT0=0;
                        deng=0;
                        flag=1;
                        while(!flag);
                        P0=table[0];

                }
        }
}


捕获.PNG (91.8 KB, 下载次数: 75)

捕获.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2020-7-5 17:33 | 只看该作者
if(flag==1){ P1=0xfe;deng=1;num=0;break; }       //按键1
回复

使用道具 举报

板凳
ID:332444 发表于 2020-7-5 17:34 | 只看该作者
if(flag==1) {P1=0xfe;deng=1;num=0;}break;        //按键1
回复

使用道具 举报

地板
ID:797796 发表于 2020-7-5 19:47 | 只看该作者
xianfajushi 发表于 2020-7-5 17:33
if(flag==1){ P1=0xfe;deng=1;num=0;break; }       //按键1

明白了,蟹蟹大佬
回复

使用道具 举报

5#
ID:808700 发表于 2020-7-29 11:22 | 只看该作者
if后面没有大括号,,判断为真也只能执行一条语句
回复

使用道具 举报

6#
ID:213173 发表于 2020-7-30 10:39 | 只看该作者
不论是正常抢答还是违规抢答,一旦中断被触发即刻关闭EX0=0封死所有抢答键,只有主持键才能解锁。这只是最基本的抢答器,还需要完善超时弃答,各路加减计分等等。
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char//宏定义
  4. sbit host=P3^0;
  5. sbit deng=P3^6;
  6. bit   flag=0;
  7. bit   sign;
  8. bit   key_value;
  9. uchar count=0;
  10. uint  count1=0;
  11. uchar num=0;
  12. uchar code table[]={//共阳数码管段码"0~f-."
  13.                 0xc0,0xf9,0xa4,0xb0,
  14.                 0x99,0x92,0x82,0xf8,
  15.                 0x80,0x90,0x88,0x83,
  16.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};

  17. void delay(uint c)                    // 延时子程序
  18. {  
  19.         uint i,j;
  20.         for(i=c;i>0;i--)
  21.                 for(j=120;j>0;j--);
  22. }

  23. void main()                           //主函数
  24. {
  25.         EA=1;
  26.         EX0=1;
  27.         IT0=0;
  28.         while(1)
  29.         {
  30.                 if(host==0)          //主持开关1被按下
  31.                 {
  32.                         count++;                                //消抖计数
  33.                         if(count>=10 && sign==0)
  34.                         {
  35.                                 sign=1;                        //锁定键态
  36.                                 key_value=~key_value;
  37.                                 if(key_value==1)//开始抢答
  38.                                         flag=1;
  39.                                 if(key_value==0)//复位
  40.                                 {
  41.                                         key_value=0;
  42.                                         EX0=1;
  43.                                         flag=0;
  44.                                         deng=1;
  45.                                         num=0;
  46.                                         P1=0xff;
  47.                                 }
  48.                         }
  49.                 }
  50.                 else //松手清0
  51.                 {
  52.                         count=0;
  53.                         sign=0;
  54.                 }
  55.                 if(flag==0 && num==0)
  56.                         P0=table[0];//显示0
  57.                 else if(flag==1 && num==0)
  58.                         P0=table[16];//显示"-"
  59.                 else if(flag==1 && num!=0)
  60.                         P0=table[num];//显示编号
  61.                 else if(flag!=1 && num!=0)       
  62.                 {//闪烁显示违规编号
  63.                         count1++;
  64.                         if(count1<500)
  65.                                 P0=table[num];
  66.                         else P0=0xff;
  67.                         if(count1>=1000)
  68.                                 count1=0;
  69.                 }
  70.                 delay(1);//控制主循环周期约1ms
  71.         }
  72. }
  73. void INT_0() interrupt 0
  74. {
  75. //由于中断自封锁,无需消抖
  76.         EX0=0;
  77.         switch(P2)
  78.         {
  79.                 case 0xfe: P1=0xfe;num=1;break;        //按键1
  80.                 case 0xfd: P1=0xfd;num=2;break;        //按键2
  81.                 case 0xfb: P1=0xfb;num=3;break;        //按键3
  82.                 case 0xf7: P1=0xf7;num=4;break;        //按键4
  83.                 case 0xef: P1=0xef;num=5;break;        //按键5
  84.                 case 0xdf: P1=0xdf;num=6;break;        //按键6
  85.                 case 0xbf: P1=0xbf;num=7;break;        //按键7
  86.                 case 0x7f: P1=0x7f;num=8;break;        //按键8
  87.         }
  88.         deng=0;
  89. //        EX0=1;
  90. }
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表