【单片机系列】基于51单片机的16路抢答器
1.功能介绍
抢答器是一种应用非常广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观的分辨出最先获得发言权的选手。早期的抢答器只有几个三极管、可控硅、发光管等组成,能通过发光管的指示辨认出选手号码。现在大多数抢答器均使用单片机(如MCS-51型)和数字集成电路,并增加了许多新功能,如选手号码显示、抢答前或抢答后的计时、选手得分显示等功能。能够实现抢答器功能的方式有多种,可以采用前期的模拟电路、数字电路或模拟与数字电路相结合的方式。近年来随着科技的飞速发展,单片机的应用正在不断深入。
抢答器作为一种电子产品,早已广泛应用于各种智力知识竞赛场合,但目前所使用的抢答器有的电路较复杂不便于制作,可靠性低,实现起来很困难。为适应目前的状况,需要一种电路简单,元件普通,易于购买等优点,并且能够很好的解决各种问题。而目前的多数抢答器存在几个不足之处:第一,现场线路连接复杂,降低了抢答器的可能性,增加了安装难度;第二,电路设计复杂。因为单片机只能完成号码处理、计时、数据运算等动能,其他功能仍只能靠数字集成电路完成,电路延迟时间较大。
本设计利用AT89C51单片机及外围借口实现抢答系统,利用单片机的定时/计数器和计数原理,将软硬件有机的结合起来,使系统能够正确地进行计时,同时能够使LED数码管正确的显示时间和使LCD1602显示选手号码。用按键作为键盘输出,二极管、扬声器发出提示。系统可达到的要求:在抢答中,只有按下开始键抢答才有效,若在之前抢答则记为违规。抢答限定时间及回答限定时间均可调节;可以显示哪位选手抢答,抢答剩余时间及无效抢答,正确按键有声音提示;抢答时间及回答时间倒计时显示,时间计完后可由主持人控制复位;剩余时间为0秒时,选手便不可以进行抢答,须由主持人控制开始下一轮抢答。本设计采用模块化设计智能抢答器,在各种场合下均可应用。各组分别有一抢答按键,主持人有开始键、回答问题开始键、复位键、抢答时间调节键和答题时间调节键。通过设计验证,采用单片机设计,电路连接简单工作可靠,抗干扰性能力强。通过这次设计,可以掌握单片机的原理,了解多功能抢答器的组成原理,提高动手能力,巩固理论知识,建立一套完整的理论实践体系。
2.硬件设计
该抢答器硬件由 6 个部分组成时钟频率电路、复位电路、蜂鸣器电路、按键电路、LCD1602显示电路、数码管显示电路组成。
3.硬件电路图
4.源代码
其他函数
/**************************************************************************仿真实验3:16路选手抢答器的仿真设计(程序)由主持人控制开始抢答,主持人可以通过K1控制开始抢答,K2控制倒计时初始时间增加,K3控制倒计时初始时间减少。若未开始抢答有选手抢答,蜂鸣器将长鸣。开始抢答后若有选手抢答倒计时停止,LCD1602将第一行显示:" celebrate you! " ;第二行显示:"dat1[]~dat16[]";若无选手抢答数码管显示“FFFF”,由此实现抢答器功能。实验操作:S1-S4:dat1[]-dat4[]S5-S8:dat5[]-dat8[]S9-S12:dat9[]-dat12[]S13-S16:dat13[]-dat16[]***************************************************************************/#include<reg51.h>#define GPIO_KEY P1#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif/**********************************PIN口定义**********************************/#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;/**********************************函数声明**********************************//*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); //误差 0us/*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/void LcdWriteData(uchar dat) ;/*LCD1602初始化子程序*/void LcdInit(); typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;unsigned char KeyValue;//用来存放读取到的键值unsigned char KeyState;//用来存放按键状态sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;//设置38译码器的输入端sbit beep=P2^5;//定义蜂鸣器引脚sbit start=P3^1;//设置支持人控制开始键sbit add=P3^0; //设置抢答时间增加键sbit jian=P3^2;//设置抢答时间减少键u16 flag=3000,num=0;//设置数码管倒计时初值以及中断次数变量u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值u8 code smgduan1[16]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示数码管第三位“秒”(0.~9.)的值unsigned char PuZh[]=" celebrate you! ";unsigned char code dat1[] =" No.1 player ";unsigned char code dat2[]=" No.2 player ";unsigned char code dat3[]=" No.3 player ";unsigned char code dat4[]=" No.4 player ";unsigned char code dat5[]=" No.5 player ";unsigned char code dat6[]=" No.6 player ";unsigned char code dat7[]=" No.7 player ";unsigned char code dat8[]=" No.8 player ";unsigned char code dat9[]=" No.9 player ";unsigned char code dat10[]=" No.10 player ";unsigned char code dat11[]=" No.11 player ";unsigned char code dat12[]=" No.12 player ";unsigned char code dat13[]=" No.13 player ";unsigned char code dat14[]=" No.14 player ";unsigned char code dat15[]=" No.15 player ";unsigned char code dat16[]=" No.16 player ";/*************************************************************************** 函 数 名 : Lcd1602_Delay1ms* 函数功能 : 延时函数,延时1ms* 输 入 : c* 输 出 : 无* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。***************************************************************************/void Lcd1602_Delay1ms(uint c) //误差 0us{uchar a,b;for (; c>0; c--){for (b=199;b>0;b--){for(a=1;a>0;a--);} } }/*************************************************************************** 函 数 名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令* 输 入 : com* 输 出 : 无***************************************************************************/#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) //写入命令{LCD1602_E = 0; //使能LCD1602_RS = 0; //选择发送命令LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = com; //放入命令Lcd1602_Delay1ms(1); //等待数据稳定LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}#endif/*************************************************************************** 函 数 名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输 入 : dat* 输 出 : 无***************************************************************************/#ifndef LCD1602_4PINS void LcdWriteData(uchar dat) //写入数据{LCD1602_E = 0; //使能清零LCD1602_RS = 1; //选择输入数据LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = dat; //写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}#endif/*************************************************************************** 函 数 名 : LcdInit()* 函数功能 : 初始化LCD屏* 输 入 : 无* 输 出 : 无***************************************************************************/#ifndef LCD1602_4PINSvoid LcdInit() //LCD初始化子程序{LcdWriteCom(0x38); //开显示LcdWriteCom(0x0c); //开显示不显示光标LcdWriteCom(0x06); //写一个指针加1LcdWriteCom(0x01); //清屏LcdWriteCom(0x80); //设置数据指针起点}#endif/*************************************************************************** 函 数 名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us***************************************************************************/void delay(int i){while(i--);}/*************************************************************************** 函 数 名 : sound* 函数功能 : 控制蜂鸣器* 输 入 : 无* 输 出 : 无***************************************************************************/void sound(int dat){ int i=0;while(i<50){beep=~beep;delay(dat); //延时大约1ms 通过修改此延时时间达到不同的发声效果i++;}}/*************************************************************************** 函 数 名 : Timer0Init()* 函数功能 : 定时器中断函数* 输 入 : 无* 输 出 : 无***************************************************************************/void Timer0Init(void){TMOD =0x01; //设置定时器模式TL0 = 0x18; //设置定时初值TH0 = 0xFC; //设置定时初值 1msTF0 = 0; //清除TF0标志ET0 = 1; //定时/计数器T0中断允许开启EA = 1; //开启总中断TR0 = 1; //定时器0开始计时}/*************************************************************************** 函 数 名 : DelayMS()* 函数功能 : 提高倒计时数码管亮度* 输 入 : 无* 输 出 : 无***************************************************************************/void DelayMS(u8 i){//大约 1msu8 j=100;while(i--){while(j--); }}/*************************************************************************** 函 数 名 : DIGdisplay()* 函数功能 : 数码管显示倒计时* 输 入 : flag(初始化时间)* 输 出 : 数码管倒计时效果***************************************************************************/void DIGdisplay(){u8 i;for (i=0;i<4;i++){switch(i){case(0): LSA = 0 ;LSB = 0 ; LSC = 1;P0 = smgduan[flag%10] ;DelayMS(1);break;//第一位数码管case(1): LSA = 1 ;LSB = 0 ; LSC = 1 ;P0 = smgduan[flag/10%10] ;DelayMS(1);break;//第二位数码管case(2): LSA = 0 ;LSB = 1 ; LSC = 1 ;P0 = smgduan1[flag/100%10] ;DelayMS(1);break;//第三位数码管case(3): LSA = 1 ;LSB = 1 ; LSC = 1 ;P0 = smgduan[flag/1000] ;DelayMS(1);break;//第四位数码管 } P0 =0X00;//消隐}}/*************************************************************************** 函 数 名 : time()* 函数功能 : 初始化T0计时器* 输 入 : flag(初始化时间)* 输 出 : 数码管倒计时效果***************************************************************************/void time() interrupt 1{TL0 = 0x18; //设置定时初值TH0 = 0xFC; //设置定时初值 1msnum++;if(num==10) //20ms则跳数字{num=0;flag--;}if(flag==0){while(1){LSA = 0 ;LSB = 0 ; LSC = 1 ;P0=0x71;LSA = 1 ;LSB = 0 ; LSC = 1 ;P0=0X71;LSA = 0 ;LSB = 1 ; LSC = 1 ;P0=0x71;LSA = 1 ;LSB = 1 ; LSC = 1 ;P0=0X71;}}}/*************************************************************************** 函 数 名 : lcd_string* 函数功能 : 控制lcd1602字符显示的位置与显示的内容* 输 入 : 无* 输 出 : 无***************************************************************************/void lcd_string(u8 ad,u8 *s){LcdWriteCom(ad);while(*s>0){LcdWriteData(*s++) ;delay(100);}}/*************************************************************************** 函 数 名 : KeyDown* 函数功能 : 检测有按键按下并读取键值* 输 入 : 无* 输 出 : 无***************************************************************************/void KeyDown(void){char a;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f){delay(1000);if(GPIO_KEY!=0x0f){KeyState=1;GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07): KeyValue=1,sound(100);break;case(0X0b): KeyValue=2,sound(100);break;case(0X0d): KeyValue=3,sound(100);break;case(0X0e): KeyValue=4,sound(100);break;}GPIO_KEY=0XF0;delay(1000);switch(GPIO_KEY){case(0X70): KeyValue=KeyValue,sound(100);break;case(0Xb0): KeyValue=KeyValue+4,sound(100);break;case(0Xd0): KeyValue=KeyValue+8,sound(100);break;case(0Xe0): KeyValue=KeyValue+12,sound(100);break;}while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测{delay(1000);//消抖a++;}a=0;}}}
LCD1602显示函数
/*************************************************************************** 函 数 名 : xianshi()* 函数功能 : 使lcd1602显示第一行与第二行的内容* 输 入 : PuZh,dat1~dat16* 输 出 : PuZh,dat1~dat16***************************************************************************/void xianshi(){KeyDown() ;switch(KeyValue){case(1):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat1);while(1) ;break;case(2):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat2);while(1) ;break;case(3):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat3);while(1) ;break;case(4):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat4);while(1) ;break;case(5):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat5);while(1) ;break;case(6):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat6);while(1) ;break;case(7):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat7);while(1) ;break;case(8):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat8);while(1) ;break;case(9):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat9);while(1) ;break;case(10):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat10);while(1) ;break;case(11):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat11);while(1) ;break;case(12):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat12);while(1) ;break;case(13):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat13);while(1) ;break;case(14):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat14);while(1) ;break;case(15):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat15);while(1) ;break;case(16):lcd_string(0x80,PuZh),lcd_string(0x80+0x40,dat16);while(1) ;break;} }
main函数
/*************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无***************************************************************************/void main(void){ LcdInit();while(1){LSA = 0 ;LSB = 0 ; LSC = 1 ;P0=0x40;LSA = 1 ;LSB = 0 ; LSC = 1 ;P0=0X40;LSA = 0 ;LSB = 1 ; LSC = 1 ;P0=0x40;LSA = 1 ;LSB = 1 ; LSC = 1 ;P0=0x40;KeyDown();if( KeyValue!=0){while(1){sound(100);} }if(start==0){Timer0Init();delay(1000);if(start==0){while(1){DIGdisplay();xianshi(); }while(!start);}}if(add==0){delay(100);if(add==0){flag=flag+100;while(!add);}} if(jian==0){delay(1000);if(jian==0){flag=flag-100;while(!jian);}}}}
注:本人水平有限,大神请绕道,不喜勿喷。
【单片机系列】基于51单片机的16路抢答器相关推荐
- 51系列—基于51单片机的校园教室打铃系统(代码+仿真+电路图超级全)
基于51单片机的校园教室打铃系统(代码+仿真+电路图超级全) 本文主要介绍基于51单片机实现的校园打铃系统设计,实现了基本的上下课打铃功能.本设计基于51单片机,使用单片机定时计数器及LCD1602接 ...
- 51单片机入门——16路抢答器
文章目录 设计要求 电路原理图 硬件原理 时钟信号(晶振) 矩阵按键与独立按键 代码解析 设计要求 同时为16支参赛队提供抢答功能,抢答成功后应能通过数码管显示出参赛队号数,同时点亮发光二极管示意抢答 ...
- 51单片机sht30_基于51单片机和机智云的WIFI智能插座(2019版)
和大家分享一下我做STC15W4K56S4单片机(51单片机)连接机智云WIFI智能插座的过程,实现了网络时间获取.温湿度采集.定时开关.OLED屏幕显示.定时开关.数据定时保存等功能,供参考和交流. ...
- 【51单片机】基于51单片机的智能浇花系统的设计与实现
技术:C语言.单片机等 摘要: 本设计是基于51系列单片机而设计的智能浇花系统,本系统结合单片机编程技术.传感器技术以及GSM通信技术实现系统基本功能,使系统根据不一样的土壤湿度,能够相应的改变浇水要 ...
- 【Proteus仿真】【51单片机】基于51单片机防火防盗设计
文章目录 一.功能简介 二.软件设计 三.实验现象 联系作者 一.功能简介 本项目使用Proteus8仿真51单片机控制器,使用声光报警模块.LCD1602显示模块.DS18B20温度.烟雾传感器模块 ...
- p620光耦接单片机_基于51单片机的可控硅调压调光程序-带过零检测
标签: 单片机 单片机(Microcontrollers,亦称MCU)包括了CPU.随机存储器RAM.只读存储器ROM.多种I/O口和中断系统.定时器/计数器等功能集成到一块硅片上构成的一个小而完善的 ...
- 多功能数字钟c语言单片机PPT,基于51单片机多功能数字钟的设计
多功能数字钟设计 摘要 本设计以AT89C52单片机.DS1302时钟芯片和DS18B20温度传感器为核心,采用LCD1602液晶显示,辅以必要的电路,共同构成一个具有多功能的数字钟.该系统能够准确的 ...
- C语言 | 基于51单片机实现MPU6050的卡尔曼滤波算法(代码类2)
github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 之前写过一个博客(代码分享:单片机开发 | ...
- 单片机8位抢答器实训机电报告_16路抢答器单片机实训报告.docx
<16路抢答器单片机实训报告.docx>由会员分享,可在线阅读,更多相关<16路抢答器单片机实训报告.docx(33页珍藏版)>请在微传网上搜索. 1.四川信息职业技术学院课程 ...
最新文章
- Java项目:星际争霸游戏(java+swing+awt界面编程+IO输入输出流+socket+udp网络通信)
- Visual C++ 2011-6-6
- linux docker中gdb调试断点不停
- 混合云计算应用中小企业市场前景看好
- 面试 -- 多线程( 一) -- 基础
- C++, C#, Java, VB.NET,到底该选择哪一门语言?
- Spring Cloud微服务实战(五)-应用通信
- 在Ubuntu上下载、编译和安装Android 4.2 最新内核源代码(Linux Kernel)
- python语言语句块标记是_Python的基本语法——语句块
- Docker搭建SonarQube代码质量检查平台
- JavaScript开发工具--Aptana
- 内置函数filter()
- Conficker蠕虫病毒专杀工具集锦
- RFC2544性能测试简介
- c语言电脑蓝屏代码,电脑蓝屏代码0x0000001a的解决方法
- ws协议绑定服务器域名,Websocket直接域名连接
- EPLAN 教育版超详细安装说明
- java 成员变量什么时候初始化_Java中成员变量的初始化过程
- java程序设计俄罗斯方块_俄罗斯方块单人游戏JAVA程序设计
- 端口映射工具之80端口映射软件无公网IP时发布网站应用等应用
热门文章
- db2数据库 为列加注释
- mysql 语句优化的十个经验
- php dsa算法,openssl_private_encrypt使用DSA算法生成的密钥无法加密
- 抖音视频怎样放到项目中使用php,快手、抖音、微视类短视频SDK接入教程,7步就能搞定...
- 【毕业设计】基于单片机的智能避障扫地机器人 -物联网 嵌入式
- Android聊天软件界面开发
- iPhone Settings
- 【好工具】在线免费无限制的PDF处理工具(转换、编辑、分割、合并、压缩)...
- web前端学习中CSS,JS代码压缩
- graphics.h 的下载及安装