ORG 0000H
M: MOV P1, #0FEH
MOV P3, #00H
JNB P20, C1
JNB P21, C2
JNB P22, C3
SJMP M
C1: MOV P3, #06H
SJMP S1
C2: MOV P3, #5BH
SJMP S1
C3: MOV P3, #4FH
SJMP S1
S1: NOP
SJMP S1
END
这个是我以前做过的三路的抢答器的 你可以稍加改动一下就能实现八路的 我只会这一部分 很久没有接触了 都忘的差不多了
用单片机来判断先后,是相当粗放的。
如果两人按键相差在十多微秒之内,单片机即判断不出先后了,无法关断第二人的输入。
应该在单片机,和选手按键之间,加入硬件,如ALSTTL/HC类型的锁存器,它就可以区分出来几个纳秒的时间差。
如果有两人同时按下怎么解决呢?
只能通过软件编程,按照编者自定的顺序来查找 “先按下”的按键。
查到一个,便认定是它“先按下”,其它的选手,哪怕是先按下几个纳秒,也不理它了。
其实,那个庙里面,都有屈死的鬼。
另外,抢答器的按键,应该采用硬件消抖,不要用软件延时消抖。
共阴极数码管也就是说,当控制信号为1时该段LED点亮,8段数码管的数字0~9定义为:
3FH,06H,5BH,4FH,66H
;01234
6DH,7DH,07H,7FH,6fh
;56789
以下为简易8路抢答器的例程:
#include<reg51h>
#define
uchar
unsigned
char
uchar
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
sbit
rstkey=P2^2;
sbit
speaker=P2^0;
void
delay()//延时约400毫秒
{
uchar
i,j;
for(i=0;i<200;i++)
for(j=0;j<250;j++);
}
main()
{
uchar
i,key;
P2=0xff;
while(1)
{
i=0;
P1=table[i];
while(1)
{
key=P3;
if(key!=0)break;
}
switch(key)
{
case
0x01:i=1;break;
case
0x02:i=2;break;
case
0x04:i=3;break;
case
0x08:i=4;break;
case
0x10:i=5;break;
case
0x20:i=6;break;
case
0x40:i=7;break;
case
0x80:i=8;break;
default:break;
}
P1=table[i];//显示按下抢答器的号
P0=key;//显示按下键号的LED
while(1)
{
if(rstkey==0)break;//主持人按下复位键则重新开始
speaker=~speaker;//否则蜂鸣器报警
delay();
}
}
}
要让51单片机共阴数码管显示数字,只需要将单片机的P2端口输出数字对应的段码即可。
以显示数字“0”为例,c语言程序如下:
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
//数码管的段码编码
Uchar table[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(){//主函数
P0 = table[0];//显示0,大家可以修改里面的数据。
while(1);//程序不再执行其他步骤;
}
扩展资料:
数字0-9的对应段码:
数字0 0x3f
数字1 0x06
数字2 0x5b
数字3 0x4f
数字4 0x66
数字5 0x6d
数字6 0x7d
数字7 0x07
数字8 0x7f
数字9 0x6f
基于51单片机的抢答器设计属于电子信息工程领域。
51单片机是一种经典的嵌入式微控制器,广泛应用于各种电子产品中。抢答器又是一种基于电子技术的教育器材,通过电子信号控制来实现对比赛或考试过程中的答题者进行快速抢答。因此,基于51单片机的抢答器设计需要涉及到电路设计、程序开发、通信协议等多个方面的知识和技能,是典型的电子信息工程领域的应用案例之一。
此外,抢答器作为一种教育辅助器材,还常常被应用于学校、科研机构等场合,具有一定的社会意义和应用价值。
#include<reg51h>
#define uchar unsigned char
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
sbit rstkey=P2^2;
sbit speaker=P2^0;
void delay()//延时约400毫秒
{
uchar i,j;
for(i=0;i<200;i++)
for(j=0;j<250;j++);
}
main()
{
uchar i,key;
P2=0xff;
while(1)
{
i=0;
P1=table[i];
while(1)
{
key=P3;
if(key!=0)break;
}
switch(key)
{
case 0x01:i=1;break;
case 0x02:i=2;break;
case 0x04:i=3;break;
case 0x08:i=4;break;
case 0x10:i=5;break;
case 0x20:i=6;break;
case 0x40:i=7;break;
case 0x80:i=8;break;
default:break;
}
P1=table[i];//显示按下抢答器的号
P0=key;//显示按下键号的LED
while(1)
{
if(rstkey==0)break;//主持人按下复位键则重新开始
speaker=~speaker;//否则蜂鸣器报警
delay();
}
}
}
以上就是关于求~51单片机的八路抢答器设计程序和原理图,PCB全部的内容,包括:求~51单片机的八路抢答器设计程序和原理图,PCB、基于51单片机的抢答器如果有两人同时按下怎么解决呢 比如有四组 当其中一组按下抢答键时 屏蔽其他组、51单片机的共阴数码管怎么显示数字(c语言)知道等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)