历史上的今天
今天是:2025年12月20日(星期六)
2022年12月20日 | 51单片机抢答器设计
2022-12-20 来源:zhihu
任务描述
某企业承担了某抢答比赛抢答器系统的设计,要求如下:①可同时供3名选手参加比赛,他们的编号分别是1、2、3,每名选手各用一个抢答按钮,按钮的编号与选手的编号相对应,分别是S1、S2、S3。②给主持人设置两个控制开关“START”和”END”,用来控制系统中抢答的开始和结束。③抢答器具有数据所存、显示和声音提示的功能。抢答开始前,若有选手按动抢答按钮,视为违规,要显示其编号,并长响蜂鸣器;抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示出选手的编号,同时蜂鸣器给出音响提示,此外,要封锁输入电路,禁止其他选手抢答。优先抢答选手的编号将一直保存到主持人将系统清零为止。
硬件电路图

元件清单

C语言程序
#include unsigned char dip[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xfb,0x80,0x90}; //共阳极数码管段码 sbit KEY9=P3^1; //开始键 sbit KEY10=P3^2; //结束键 sbit BUZZ=P3^0; //蜂鸣器 bit start_key(); //抢答开始键检测函数 bit end_key(); //抢答结束键检测函数 unsigned int number_key(); //选手按键扫描 void delay_20ms(); //延时函数 void buzz_on(); //蜂鸣器开关 void main() //主函数 { unsigned char key_number,n; while(1) { P0=0xff; //关闭数码管显示 BUZZ=1; // 关闭蜂鸣器 if(start_key()==1) //抢答允许检测 { key_number=number_key(); //抢答开始前检测有无选手违规 if(key_number==0) //无人违规 continue; //返回 else P0=dip[key_number]; // 有人违规,显示违规选手号码 while(end_key()==1) //主持人结束键没有按下则蜂鸣器长响 buzz_on(); } if(start_key()==0) //主持人开始键按下前无人违规抢答 { //数码管显示“三”允许抢答 P0=0Xb6; while (end_key()==1) { n=0; key_number=number_key(); //检测是否有选手抢答 if(key_number==0) continue; while(key_number!=0) { P0=dip[key_number]; //显示第一个选手抢答的号码 for(;n<150;n++) buzz_on(); //蜂鸣器响一会儿 if(end_key()==0) // 主持人结束键按下,结束本轮抢答 break; } } } } } bit start_key() { if(KEY9==1) return 1; //返回值1表示主持人没有按开始键 else delay_20ms(); //延时防抖 if(KEY9==1) return 1; else return 0; } bit end_key() { if(KEY10==1) return 1; else return 0; } unsigned int number_key() { unsigned char key_state=0; key_state=P1; if(key_state==0xff) return 0; //返回0无选手抢答 else { if(key_state==0xfe) //1号抢答 return 1; else if(key_state==0xfd) //2号抢答 return 2; else return 3; //3号抢答 } } void buzz_on() { unsigned char i; BUZZ=0; for(i=0;i<26;i++) delay_20ms(); BUZZ=1; } void delay_20ms() { unsigned int j; for(j=0;j<10;j++); }
下一篇:十字路口交通信号灯设计
史海拾趣
|
谁做过驱动啊?告诉我什么得什么样的流程啊,我假如我对scsi进行编程怎么办? 谁做过驱动啊?告诉我什么得什么样的流程啊,我假如我对scsi进行编程怎么办? PCI有13个关于scsi的针脚,怎么样的过程或流程给我说下被,如何编写?但是寄存器的首地址无法确定 该怎么做呢?… 查看全部问答> |
|
Linux下CAN驱动问题(HMs30c7202) c_candrv-1.2.0 目前接手一项目,头有点大,CAN在运行过程中,会出现不能收发的情况,从新上电后正常 使用的是c_candrv-1.2.0驱动程序,个人感觉可能是使用方法不对 #define can0file \"/dev/can0\" #define can1file \"/dev/can1\" #define can2file \"/dev/can ...… 查看全部问答> |
|
昨天看了一下电路图,发现内存(SDRAM)和2440接口有点不可思议(后来发现ATmel的ARM也是这么接的),后来仔细对比。 发现问题在LDQM,UDQM这两个引脚,他们接到2440的四个nWBE引脚。内存资料是这么说的:Data Input/Output Mask Controls output ...… 查看全部问答> |
|
有没有人用过 LoadAnimatedCursor 这个API啊? 环境 evc4, Standard SDK for wince 5.0 我在 resource.h 下这么定义 #define IDB_BITMAP1 MAKEINTRESOURCE(104) #define IDB_BITMAP2   ...… 查看全部问答> |
|
vcredist_x86.exe 每次我一安装都出现这个提示,请问这是怎么回事,该怎么解决?谢谢 vcredist_x86.exe 每次我一安装都出现这个提示,请问这是怎么回事,该怎么解决?谢谢 无法访问 Windows Installer 服务 Windows Installer 没有正确安装时可能发生这种情况。 请与技术支持人员联系以获得帮助。… 查看全部问答> |




