收藏 分销(赏)

基于单片机的人抢答器专业课程设计.doc

上传人:w****g 文档编号:2683796 上传时间:2024-06-04 格式:DOC 页数:10 大小:38.04KB 下载积分:8 金币
下载 相关 举报
基于单片机的人抢答器专业课程设计.doc_第1页
第1页 / 共10页
基于单片机的人抢答器专业课程设计.doc_第2页
第2页 / 共10页


点击查看更多>>
资源描述
基于51单片机4人抢答器设计 设计规定: 以单片机为核心,设计一种4位竞赛抢答器:同步供4名选手或4个代表队比赛,分别用4个按钮S0~S3表达。 设立一种系统清除和抢答控制开关S,开关由主持人控制。 抢答器具备锁存与显示功能。即选手按按钮,锁存相应编号,并在优先抢答选手编号始终保持到主持人将系统清除为止。 抢答器具备定期抢答功能,且一次抢答时间由主持人设定(如30秒)。 当主持人启动“开始”键后,定期器进行减计时,同步扬声器发出短暂声响,声响持续时间为0.5s左右。 参赛选手在设定期间内进行抢答,抢答有效,定期器停止工作,显示屏上显示选手编号和抢答时间,并保持到主持人将系统清除为止。 如果定期时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定期显示屏上显示00。 工作原理: 通过键盘变化抢答时间,原理与闹钟时间设定相似,将定期时间变量置为全局变量后,通过键盘扫描程序使每按下一次按键,时间加1(超过30时置0)。同步单片机不断进行按键扫描,当参赛选手按键按下时,用于产生时钟信号定期计数器停止计数,同步将选手编号(按键号)和抢答时间分别显示在LED上。 #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar num; //定义中断变量,num计满20表达1秒时间到 uchar num1; //十秒倒计时显示初始值 uchar flag1,flag2; //清零键及开始键按下标志位 uchar flag3,flag4=0; //定义键盘按下标志位 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; //数码管编码 sbit dula=P1^6; //定义段选端口 sbit wela=P1^7; //定义位选端口 sbit sp=P3^0; //定义蜂鸣器端口 sbit clear=P1^0; //定义清零键 sbit start=P1^1; //开始键 sbit key1=P1^2; sbit key2=P1^3; sbit key3=P1^4; sbit key4=P1^5; //key1到key4为选手按键 void delay(uint z) //延时函数 { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void beep() //定义蜂鸣器函数 { sp=0; delay(500); sp=1; } void display(uint a) //选手编号显示函数 { wela=1; P2=0xff; //防止锁存干扰 wela=0; dula=1; P2=table[a]; dula=0; P2=0xff; wela=1; P2=0xfd; wela=0; delay(5); } void clr() //清零函数(主持人按下清零键后数码管显示0) { dula=1; P2=table[0]; dula=0; P2=0xff; wela=1; P2=0xfc; wela=0; delay(5); } void dis30s() //十秒倒计时显示函数 { uchar shi,ge; shi=num1/30; ge=num1%30; wela=1; P2=0xff; wela=0; dula=1; P2=table[shi]; dula=0; P2=0xff; wela=1; P2=0xfe; wela=0; delay(5); wela=1; P2=0xff; wela=0; dula=1; P2=table[ge]; dula=0; P2=0xff; wela=1; P2=0xfd; wela=0; delay(5); } void player() //选手按键检测函数 { if(key1==0&&flag4==0) { delay(10); if(key1==0&&flag4==0) { display(1); TR0=0; flag1=flag2=0; flag4=1; beep(); while(!key1); } } if(key2==0&&flag4==0) { delay(10); if(key2==0&&flag4==0) { display(2); TR0=0; flag1=flag2=0; flag4=1; beep(); while(!key2); } } if(key3==0&&flag4==0) { delay(10); if(key3==0&&flag4==0) { display(3); TR0=0; flag1=flag2=0; flag4=1; beep(); while(!key3); } } if(key4==0&&flag4==0) { delay(10); if(key4==0&&flag4==0) { display(4); TR0=0; flag1=flag2=0; flag4=1; beep(); while(!key4); } } } void keyscan() //检测按键 { if(clear==0&&flag2!=1) //判断清零键,判断语句作用是按下开始键清零键失效 { delay(10); if(clear==0&&flag2!=1) { while(!clear); //等待按键释放 flag1=0; flag2=0; flag3=0; flag4=0; num=0; num1=10; clr(); //清零 flag1=1; //按下清零键标志位 } } if(flag1==1) //如果按下清零键 { if(start==0&&flag3==0) //判断开始键,判断语句作用是按下开始键后开始键失效 { delay(10); if(start==0&&flag3==0) { flag2=1; flag3=1; while(!start); } } } if(flag2==1) //按下开始键 { TR0=1; //启动定期器0 dis30s(); player(); } } void main() { TMOD=0x01; //设立定期器0工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定期器0中断 while(1) //始终检测按键 { keyscan(); } } void T0_ser() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num++; if(num==20) { num=0; num1--; } if(num1==0) { TR0=0; flag1=0; flag2=0; num=0; num1=30; clr(); beep(); } }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服