找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何使用单片机外部中断执行四位数码管的动态显示?

[复制链接]
跳转到指定楼层
楼主
基于单片机的三路抢答器的设计
设计内容:
1.具有3路抢答输入(由独立按键实现 )            
2.显示抢答剩余时间,初始为10秒,最小量化单位为1秒;
3.抢答结束后,成功的那一路,并显示抢答成功的号码;失败的其他路,并显示F;
4.如果没有人抢答,报警,并重新进入开始抢答状态。


我不知道如何该在外部中断执行第三条要求

#include<reg51.h>
#include <intrins.h>
#define uint unsigned int                 
#define uchar unsigned char
uchar code table[]={0xc0,0x90,0x80,0xF8,0x82,0x92,0x99,0xb0,0xa4,0xf9};
uchar code table1[]={0x71,0x06,0x00,0x71};//一抢
uchar code table2[]={0x06,0x71,0x00,0x71};        // 二抢
uchar code table3[]={0x71,0x71,0x00,0x06};        //        三抢
uchar code address[]={0x08,0x04,0x02,0x01};      
void delayms(uint);
sbit w=P3^6;
sbit p=P3^0;
sbit a=P3^2;
int n;
uint m;
void delay(uint z)          //延时子程序
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void delayms(uint m)
{
        while(m--);      
}
void main()
{        
        EA=1;
    EX0=1;
        IP=0X04;
    IT0=1;
        EX1=1;
        IT1=1;
        while(1);
}
void INT_0() interrupt 0
{        
        if(p==0)                                   //中断0,按下p3.2开始,d9亮并开始倒计时
        w=0;                                            
        EX0=0;
        delay(20);
        EX0=1;
        while(1)
        {
        if(m==10)
                {
                        P0=0x89;
                        a=0;
                        delayms(20);
                }
        else
                {P0=table[m];
                delay(1000);
                m++;}         
        }        
}
void INT_1() interrupt 2
{
    EX1=0;
        delay(20);
        EX1=1;
        while(1)
        if(w==0)
  {if(P2=0xfe)
     while(1)
    {
          if(m==4)m=0;
      P1=address[m];
          P0=table1[m++];delayms(500);
    }
        else if(P2=0xfd)
            {
             if(m==4)m=0;
         P1=address[m];
             P0=table2[m++];delayms(500);
                }
                else
                {
                 if(m==4)m=0;
         P1=address[m];
             P0=table3[m++];delayms(500);
                }

           }


}

255.PNG (50.27 KB, 下载次数: 14)

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

使用道具 举报

沙发
ID:21069 发表于 2018-12-22 02:19 来自手机 | 只看该作者
在按键按下后做一个判断函数,因抢答有一个时间差,在这其中你要判断只有一个按键按下的为通过,道时将按键置为0状态并给延时,当第二,第三个按键下时,由于低电平不是唯一的,都判定无效。

评分

参与人数 1黑币 +15 收起 理由
刀刀见红 + 15 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:393699 发表于 2018-12-22 10:26 | 只看该作者
楼主的中断函数不要放循环,容易死机。应该在外部中断放一个变量flag,当中断启动时,flag置1,主程序内放循环if判断检查标志位,然后放你要做的事情即可,第三点可按照上述思路改进
回复

使用道具 举报

地板
ID:439261 发表于 2018-12-22 13:44 | 只看该作者
1092648746 发表于 2018-12-22 10:26
楼主的中断函数不要放循环,容易死机。应该在外部中断放一个变量flag,当中断启动时,flag置1,主程序内放 ...

bit flag;

void main()
{       
        EA=1;
    EX0=1;
        IP=0X04;
    IT0=1;
        EX1=1;
        IT1=1;
        while(1);
        {
          if(flag==1)
          {          if(m==4)m=0;
      P1=address[m];
          P0=table1[m++];delayms(500);

          }
          if(flag==2)
          {   if(m==4)m=0;
         P1=address[m];
             P0=table2[m++];delayms(500);
          }
          if(flag==3)
          {    if(m==4)m=0;
         P1=address[m];
             P0=table3[m++];delayms(500);
          }
       
       
        }
}

void INT_1() interrupt 2
{
    EX1=0;
        delay(20);
        EX1=1;
        if(P2=0xfe)flag=1;
        if(P2=0xfd)flag=2;
        if(P2=0xfb)flag=3;
   
     

}
我把主程序和外部中断int1修改了一下,但还是不能亮
flag我也不是很了解,你能看看哪里出错了吗
回复

使用道具 举报

5#
ID:451718 发表于 2018-12-22 16:31 | 只看该作者
bit是位,怎么能赋值1,2,3呢,只能赋值0或者1两种状态?如果要实现多状态,你需要设置多个标志,并且在使用完标志后,记得还原标志位。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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