×
单片机 > 单片机程序设计 > 详情

51单片机三路抢答器

发布时间:2021-11-13 发布时间:
|

单片机程序源码:

/*******************************************************************************

* 标题: 三路抢答器 *

* 时间 2018年8月5日17:59:20 *

* *

* 实验说明:在10s的时间内,三位选手进行按键抢答,如果1号抢答,那么数码管将显示*

1号选手的号码。并且蜂鸣器响,以此类推。如果10s时间到,蜂鸣器响,选手 *

无法进行抢答 *

********************************************************************************

* 实验心得:做法相对简单,注意共阴数码管还是共阳数码管 *

********************************************************************************/


#include


//IO口定义

#define GPIO_DIG P0

#define GPIO_SHOW P2


sbit LSA=P3^0;

sbit beep=P1^5;

sbit K1=P3^1;

sbit K2=P1^0;

sbit K3=P1^1;

sbit K4=P1^2;


//--定义全局变量--//

typedef unsigned int u16;

unsigned char code DIG_CODE[18]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned int Ge=0;

unsigned int Shi=1;

unsigned int num=0;

unsigned int Res=10;

unsigned int flag=0;


//全局函数

void DigDisplay();


void delay(u16 i)

{

while(i--);

}


void main()

{

TMOD = 0x01;

TH0 = 0x3C;

TL0 = 0x0B0;

EA = 1;

ET0 = 1;

TR0 = 1;

DigDisplay();



}



void DigDisplay()

{

unsigned char i;

unsigned int j;

while(1)

{

for(i=0;i<2;i++)

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=0;

GPIO_DIG=DIG_CODE[Shi];//发送段码

break;//显示第0位

case(1):

LSA=1;

GPIO_DIG=DIG_CODE[Ge];//发送段码

break;//显示第1位

}

/****************************************************************************/

/*消隐函数要在数码管更新频率很快的条件下,才起作用,手动更换数码管位选完全达不到这么快的速度,因此在这种情况下也是没必要用消隐的 */

j=10; //扫描间隔时间设定

while(j--);

GPIO_DIG=0x00;//消隐

}

if(K1==0)

{

Res=10;

flag=0;

}


else if(K2==0)

{

GPIO_SHOW=~DIG_CODE[1];

while(1)

{

beep=~beep;

delay(10);

if(K1==0)

{

Res=10;

flag=0;

GPIO_SHOW=~DIG_CODE[17];

break;

}

}


}


else if(K3==0)

{

GPIO_SHOW=~DIG_CODE[2];

while(1)

{

beep=~beep;

delay(10);

if(K1==0)

{

Res=10;

flag=0;

GPIO_SHOW=~DIG_CODE[17];

break;

}

}

}


else if(K4==0)

{

GPIO_SHOW=~DIG_CODE[3];

while(1)

{

beep=~beep;

delay(10);

if(K1==0)

{

Res=10;

flag=0;

GPIO_SHOW=~DIG_CODE[17];

break;

}

}

}


}



}


void Int1() interrupt 1

{

TMOD = 0x01;

TH0 = 0x3C;

TL0 = 0x0B0;

num++;


if(num==20)

{

num=0;

flag++;

Res--;

Ge=Res%10;

Shi=Res/10;

}

if(flag==10)

{

while(1)

{

beep=~beep;

delay(10);


if(K1==0)

{

Res=10;

flag=0;

break;



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会