51单片机-6位抢答器


前言

新手小白,这是课设的内容,选择了最简单的抢答器。

一、用到哪些模块?

1.I/O接口

2.数码管

3.蜂鸣器

4.中断系统

二、代码说明

1.抢答定义;

代码如下:定义了段选和位选的数组;设置flag为按键的控制标志;P2.0-P2.6分别定义为按键的链接串口;蜂鸣器使用了P3.0串口。

void Delay7ms()		//7ms,用于按键消抖;
{
	unsigned char i, j;

	i = 82;
	j = 179;
	do
	{
		while (--j);
	} while (--i);
}


void delay(uint i)
{
	while(i--);
}

void PaoMa()			//无人抢答时,跑马;
{
	uint i,j;
	for(i=0;i<6;i++)
	{
		for(j=0;j<6;j++)
		{
			if(flag==0)break;
			P0=~wei[j];
			P1=duan[i];
			delay(10000);
		}
	}
}

void SMG_XS(uint i)		//数码管显示:有人抢到时,数码管显示该人号码;
{
		uchar j,m=5000;
		for(j=0;j<3;j++)
		{
			while(m--)
			{
				beep=1;
				delay(100);
				beep=0;
				delay(100);
			}
			P1=duan[i];
			P0=0x03;
			delay(60000);
		}
		for(j=0;j<6;j++)
		{
			while(m--)
			{
				beep=1;
				delay(100);
				beep=0;
				delay(100);
			}
			P0=0xff;
			delay(50000);
			P1=duan[i];
			P0=~wei[i];
			delay(50000);
		}
}

2.数码管的显示

代码如下:

        Delay7ms用来消除按键抖动的,消抖一般将延时设置在5-10ms之间,delay延时函数可以改变参数,用来延时数码管这些的显示;

        数码管跑马部分:数字“1”由第一位流动到第六位,然后“2”“3”“4”“5”“6”都是一样的。

        数码管显示部分(void  SMG_XS()):第一个人按下按键,蜂鸣器beep通过delay改变频率,发出声音,并且数码管会全部显示该"号码"一会儿,然后在对应的位置上闪烁5次。

void Delay7ms()        //7ms,用于按键消抖;
{
    unsigned char i, j;

    i = 82;
    j = 179;
    do
    {
        while (--j);
    } while (--i);
}


void delay(uint i)
{
    while(i--);
}

void PaoMa()            //无人抢答时,跑马;
{
    uint i,j;
    for(i=0;i<6;i++)
    {
        for(j=0;j<6;j++)
        {
            if(flag==0)break;
            P0=~wei[j];
            P1=duan[i];
            delay(10000);
        }
    }
}

void SMG_XS(uint i)        //数码管显示:有人抢到时,数码管显示该人号码;
{
        uchar j,m=5000;
        for(j=0;j<3;j++)
        {
            while(m--)
            {
                beep=1;
                delay(100);
                beep=0;
                delay(100);
            }
            P1=duan[i];
            P0=0x03;
            delay(60000);
        }
        for(j=0;j<6;j++)
        {
            while(m--)
            {
                beep=1;
                delay(100);
                beep=0;
                delay(100);
            }
            P0=0xff;
            delay(50000);
            P1=duan[i];
            P0=~wei[i];
            delay(50000);
        }
}

3.中断

        中断里面放的是按键,flag在这里面就用到了。

void int0()															//初始化
{
	TMOD=0X01;														//工作方式1;
	TH0=-50000/256;												//50ms;
	TL0=-50000%256;
	ET0=1;																//打开T0中断;
	TR0=1;																//启用T0中断;
	EA=1;
}

void int0_zd() interrupt 1
{
	TH0=-50000/256;												
	TL0=-50000%256;
		if(fuwei==0)
		{Delay7ms();
			if(fuwei==0)
			{
				flag=1;			//复位键,更改标志位flag,开启下次抢答;
				while(!fuwei);
			}
		}
		
		if(flag==1)
		{
		if(k1==0)
			{Delay7ms();
				if(k1==0)
				{
					flag=0;					//屏蔽别人的按键;
					SMG_XS(0); 	//k1对应1号,索引值为0;
					while(!k1);
				}
			}
			
			if(k2==0)
			{Delay7ms();
				if(k2==0)
				{
					SMG_XS(1);
					flag=0;					//屏蔽别人的按键;
				}
			}
			
			if(k3==0)
			{Delay7ms();
				if(k3==0)
				{
					SMG_XS(2);
					flag=0;					//屏蔽别人的按键;
				}
			}
			
			if(k4==0)
			{Delay7ms();
				if(k4==0)
				{
					 SMG_XS(3);
					flag=0;					//屏蔽别人的按键;
				}
			}
			
			if(k5==0)
			{Delay7ms();
				if(k5==0)
				{
					SMG_XS(4);
					flag=0;					//屏蔽别人的按键;
				}
			}
			
			if(k6==0)
			{Delay7ms();
				if(k6==0)
				{
					SMG_XS(5);
					flag=0;					//屏蔽别人的按键;
				}
			}
		}
}

4.主函数内容

                当复位键按下,flag==0;开启跑马模式。

void main()
{
	int0();			//初始化中断;
	while(1)
	{
		if(flag==1)
		{
			PaoMa();
		}
	}
}

总结

        我是新手,如果有没做好的地方,欢迎大家多多评论,对我指指点点。

代码在这里面链接:https://pan.baidu.com/s/1Ur2eu-PWLz3OP4Y3iJSvGg?pwd=0123 
提取码:0123

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值