前言
新手小白,这是课设的内容,选择了最简单的抢答器。
一、用到哪些模块?
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