草庐IT

基于51单片机的4位竞赛抢答器的设计

BT-BOX 2023-10-03 原文

设计编号:Q001
资料下载

功能要求:

以单片机为核心,设计一个4位竞赛抢答器:同时供4名选手或4个代表队比赛,分别用4个按钮S0~S4表示。
1.设置一个系统清除和抢答控制开关S,开关由主持人控制。
2.抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。
3.抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如20秒)。
4.当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5s左右。
参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
5.如果在主持人启动"开始"键前抢答 ,抢答无效。且显示器上会显示抢答选手编号。
6.如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。

1.2 任务和要求
本设计是以抢答为出发点。考虑到依需设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,发光二极管和蜂鸣器发出提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;在软件中还应用了外部中断,通过中断解除抢答的锁存,似的设计更加灵活,实用性更强。
本设计主要设计指标:
(1) 按键输入模块,包括主持人时间加,时间减,开始抢答,新一轮4个按键和选手1号到4号共抢4答按键;
(2) 显示模块,可以抢答实现倒计时和显示抢答选手编号。
(3) 蜂鸣器模块,用于倒计时提醒,倒计时开始后发出短暂的声响,声响持续的时间为0.5s左右。

演示视频:

基于51单片机的四位抢答器proteus演示视频

设计说明目录

1 概述 3
1.1 课程设计目的 3
1.2 任务和要求 3
1.3 系统结构图 4
2 理论分析与计算 4
3 硬件设计 4
3.1 AT89C51最小系统 5
3.2 显示模块 6
3.3键盘模块 7
3.4蜂鸣器模块 8
4 软件设计 9
4.1 主程序 10
4.2 按键扫描子函数 12
4.3显示子程序 13
4.4蜂鸣器提示子函数 14
5 PROTEUS EDA仿真测试 15
5.1 PROTEUS EDA仿真图绘制 15
5.2 测试 15
6 总结以及展望 18
参考文献 19

1 概述
1.1 课程设计目的
(1) 综合所学的单片机原理及接口技术等课程的理论知识完成本课程设计;
(2) 学习并掌握基本电路设计与使用方法,单片机的编程与应用方法;
(3) 提高综合分析、解决实际问题的能力。

4.1 主程序
主程序完成外部中断初始化、定时器初始化、蜂鸣器模块初始化。主程序扫描主持人不断扫描按键,进行对应的操作。
进入主程序后,显示显示预设的倒计时数字20,程序扫描主持人按键倒计时加减键和开始按键。按下开始按键后,倒计时开始工作,实时刷新倒计时数字,每倒计时1秒蜂鸣器beep引脚拉低0.5秒,蜂鸣器短鸣0.5秒。在扫描到选手按下按键后,倒计时定时器停止工作,显示选手编号和按下抢答键的时间。

主要(关键)代码:

	EA=1;
 EX0=1;//外部中断0
	IT0=1;//设置下降沿触发中断0
	TMOD=0x11;
	TH0=(65536-50000)/256;//这是50ms的
	TL0=(65536-50000)%256;
	ET0=1;
	TR0=0; 
	TH1=(65536-50000)/256;//这是50ms的
	TL1=(65536-50000)%256;
	ET1=1;
	TR1=1; 
	time=20; //定时时间
	num=0; //选手编号
	flag=0; //抢答模式标志位
	beep=0;//蜂鸣器为0 不响

此段程序是完成外部中断初始化、定时器初始化、蜂鸣器模块初始化。完成后进入大循环。

TempData[2]=dofly_DuanMa[time/10];
//分解显示信息,如要显示68,则68/10=6  68%10=8  
TempData[3]=dofly_DuanMa[time%10];
if(num!=0)
	m=1;
if(start==0)
{
	DelayMs(10); 
	if(start==0)
	{	
		flag=1;
	    while(!start);
			}
	}

这段函数完成了倒计时的显示和扫描是否开始倒计时。在没有开始抢答时,选手按下按键会显示选手编号和清零时间,一起防止选手抢答。开始抢答后,标志位flag变为1。开始执行按键扫描函数check2();

void check1()
{
	if(num==1)
	{
		TempData[0]=dofly_DuanMa[num/10];
//分解显示信息,如要显示68,则68/10=6  68%10=8  
		TempData[1]=dofly_DuanMa[num%10];
		beep=0;
		Display(0,8); //数码管显示函数
		TR0=0;	
		while(m);
	}  	  		

假如按键1按下,会显示选手编号。同时程序会卡在while(m);循环。此时除了新一轮按键之外的任何按键都系统没有任何变化。

新一轮按键是系统复位,即使程序一直在执行while(m)循环,按下按键后,程序会执行一次硬件复位,将变量清零,函数重新执行按键扫描。

4.2 按键扫描子函数

关键代码介绍

if(key1==0)
{
	DelayMs(10); 
	if(key1==0)
	{	
		num=1;
		while(!key1);
	}
}

程序一直判断按键引脚电压,按下按键电压为0。按键会产生抖动,需要进行消抖处理,演示10毫秒后,如果按键电压还是0,令按键数目num为1。表示按下的按键是按键1。供主函数处理按键消息。

4.3显示子程序
关键代码介绍

void Display(unsigned char FirstBit,unsigned char Num)
{
	unsigned char i;
	  
	for(i=0;i<Num;i++)
	{ 
		DataPort=0;   //清空数据,防止有交替重影
       	DUAN=1;     //段锁存
       	DUAN=0;

       	DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
       	WEI=1;     //位锁存
       	WEI=0;

       	DataPort=TempData[i]; //取显示数据,段码
       	DUAN=1;     //段锁存
       	DUAN=0;
       
	   	DelayMs(2); // 扫描间隙延时,时间太长会闪烁,太短会造成重影

	}
}  

该函数用于动态扫描数码管。输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示,如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2。显示主要控制74HC573锁存数据。先清除数据,清段锁存。然后选择位码。开位锁存将数据存在位锁存器,选择到了需要显示的数码管。位锁存完成后将数据写进段锁存数据,将需要显示的数据写到数码管中。

4.4蜂鸣器提示子函数
蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基极B经过限流电阻R3后由单片机的beep引脚控制,当beep输出低电平时,三级管QS截止,没有电流流过线圈,蜂鸣器不发声;当beep输出高电平时,三级管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制beep脚的电平来使蜂鸣器发出声音和关闭。

beep=0;	
if(t==20)//设置为20,就是0.5s为高0.5s为低
{
	beep=1;
	t=0;
	time--;
	TempData[2]=dofly_DuanMa[time/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
	TempData[3]=dofly_DuanMa[time%10];
	if(time<=0)
	{
		time=0;			
	}			
}

在50ms一次的定时器0中断中,每10次中断令蜂鸣器置零。第20次中断令蜂鸣器置一。以此产生0.5s短暂提醒。
5 PROTEUS EDA仿真测试
5.1 PROTEUS EDA仿真图绘制

图 7仿真图
5.2 测试
1.初始化。

图8 初始化
2.未按下开始抢答键,选手抢答无效。

图9 抢答无效

3.按下开始抢答键,进入抢答倒计时。

图10 抢答倒计时
3.有选手按下抢答键,显示选手号码及剩余时间。

图11 抢答成功

6 总结以及展望
在硬件电路焊接和软件程序设计分别完成的基础之上,进行软硬件的结合与调试。通过下载将在电脑上已完成的程序下载到单片机芯片中。在调试中发现软件中存在的问题,及时解决问题,确保系统能正常工作并达到设计要求。通过反复的调试与实验,可以证明该系统能够较好地完成设计所需的基本要求。即能够正确的完成抢答器预期功能。
在完成系统时我们遇到了很多困难,从一开始电路设计不够优化导致蜂鸣器不能正常发声,到后来查阅资料一点点丰富我们的设计。在整个设计过程中,我们充分发挥团队精神,分工合作,发挥人的主观能动性,自主学习,学到了许多没学到的知识,较好的完成了作品。相互学习、相互讨论研究,共同进步,完了最初的设想。在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。反而达到事半功倍的效果。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,理清了思路,反而得心应手。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一个脚印。此次比赛也练就了我们的耐心,让我们认识到了学习基础知识的重要性,当设计完整的系统时,要考虑到硬件和软件两者的结合,有时硬件的不足,我们可以用软件程序来弥补,从而节约硬件成本,在设计软件程序时要模块化,可以提高程序的可读性。总之,通过此次单片机课程设计我们的能力得到了全方位的提高。
参考文献
[1] 柴钰.单片机原理及应用.西安:西安电子科技大学出版社,2009
[2] 魏芬.基于Proteus的单片机实验与.清华大学出版社,2015
[3] 阎石.数字电子技术基础[M].第五版.北京:高等教育出版社,2004年
[4] 侯玉宝等. 基于Proteus的51系列单片机设计与仿真[M]. 北京: 电子工业出版社,2008
[5] 余锡存,曹国华. 单片机原理及接口技术(第二版)[M].西安:西安电子科技大学出版社,2007
[6] 赵建领,薛园园等. 51单片机开发与应用技术详解[M]北京:电子工业出版社,2009
[7] 胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,2004
[8] 李群芳等.单片机微型计算机与接口技术(第2版)[M].北京:电子工业出版社,2005.1
[9] 宁成军等,基于 Proteus和Keil接口的单片机外围硬件电路仿真,北京:现代电子技术出版社,2006
[10] 楼然苗,李光飞. 单片机课程设计指导(第2版)[M]. 北京:北京航空航天大学出版社,2012.1
[11] 李华等.MCS-51系列单片机应用系统设计[M]北京:北京航空航天大学出版社,1995
[12]杨居义 主编. 单片机课程设计指导[M]. 北京:清华大学出版,2009.9
[13]80C51 8bit flash microcontroller family P89C51RB2/P89C51RC2/P89C51RD2. Data Book, Philips Semicon-ductors, 2001,6(1).
[14] 康华光,陈大钦.电子技术基础数字部分(第四版)[M].北京:高等教育出版社,2001.6
[15] 齐玲, 继电器综合参数检测系统[J] 河北:河北工业大学学报,2009
[16] 周润景等,基于PROTEUS的电路及单片机系统设计与仿真.北京:北京航空航天大学出版社,2006.
[17]马忠梅等.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,2003.11.

有关基于51单片机的4位竞赛抢答器的设计的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  9. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  10. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

随机推荐