基于单片机实现智能4路抢答器的设计报告Word文档下载推荐.docx
《基于单片机实现智能4路抢答器的设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机实现智能4路抢答器的设计报告Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
![基于单片机实现智能4路抢答器的设计报告Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/15/a441b7a6-dce1-42f4-836d-f5d9f96fd881/a441b7a6-dce1-42f4-836d-f5d9f96fd8811.gif)
2、系统总体设计方案与实现框图……………………3
三、理论分析…………………………………………………3
四、电路设计…………………………………………………4
1、按键部分………………………………………………4
2、显示部分………………………………………………5
3、总原理图………………………………………………6
五、软件流程图模块……………………………………………7
六、结论…………………………………………………………8
七、程序………………………………………………………9
一、前言
本设计要求能够在主持人按下开始键后,四个参赛者开始抢按自己的按键,谁的按键先按下,谁面前的灯就会亮并且有相应的提示,当参赛者耗时太多时又会有相应的提示。
根据设计的要求,本系统采用独立式按键,通过单片机不停的扫描按键来控制LED灯和蜂鸣器,并用定时器T0、T1来定超时的时间,其中抢答定时时间可以由主持人随意的修改。
当超时的时候让蜂鸣器响和点亮相应的LED灯(T0用于参赛者回答问题的定时,T1用于参赛者抢答时间的选定)。
二、方案设计
1、方案比较
(1)、总体设计
方案一:
采用可编程I/O口扩展芯片8155
8155作为单片机的扩展接口能实现很多功能,但是这个系统并不复杂,用8155会浪费很多的资源,而且8155要用P0和P2端口作为地址线对它进行读写,这样不仅浪费端口还使得编程变的复杂。
从节省资源和简化编程的角度考虑,放弃了此方案。
方案二:
直接采用AT89C51单片机
直接用单片机不仅编程被简化,还有效的利用了各个端口。
8051单片机的资源完全够这个系统的要求。
所以最终选择了此方案。
(2)、模块
方案一:
采用4*4矩阵键盘
此种键盘是常用的按键扫描方法,但是本系统只需要六个按键,这样就会浪费十个,而且矩阵按键扫描要送数读数,对于编程很复杂,最终放弃了此方案。
方案二:
采用独立式键盘
本系统只要8个按键就可以,用独立式键盘不仅节省端口还使编程变得简单。
程序只要不停的读数检查就行。
所以,最终选择此方案。
2、系统总体设计方案与实现框图
抢答模块、修改抢答时间模块、主持人控制模块一共采用8个独立式的键盘作为按键输入,当在主持人按下开始键后有参赛者按键按下时,就会有对应于这个按键的灯亮并且蜂鸣器响一声,其它按键再按也无效。
在规定时间之后如不清除,蜂鸣器就会一直响,超时的LED会点亮,提示已经到时间。
框图如图1。
修改抢答时间是在按下了修改按键之后就会等待增量、减量的输入以修改时间,直到再一次按下修改键以确定修改完成。
图1
三、理论分析
51单片机的端口上电是高电平,而且当外部没有输入时能自动的弹跳到高电平,所以通过按键所接端口的高低电平变化可以判断出哪个按键按下了。
图2
四、电路设计
图3
1、按键扫描部分
单片机不停的扫描P1口的电平变化,当有按键按下时,对应的I/O口会跳变为低电平,单片机检测到后,经过处理将作出相应的显示。
电路如图1.
图4
2、显示部分
根据按键按下的情况LED作出相应的亮灭,蜂鸣器作出相应的反应。
当开始键按下启动后,当S1按下时,则灯D1亮,并蜂鸣器响一声,如果超过规定时间,蜂鸣器一直响,并提示超时LED灯被点亮。
如果S1在限定的时间内再次被按下,说明参赛者1已完成回答;
当S2按下时,则灯D2亮,并蜂鸣器响一声,如果超过规定时间,蜂鸣器一直响,并提示超时LED灯被点亮。
如果S2在限定的时间内再次被按下,说明参赛者2已完成回答;
当S3按下时,则灯D3亮,并蜂鸣器响一声,如果超过规定时间,蜂鸣器一直响,并提示超时LED灯被点亮。
如果S3在限定的时间内再次被按下,说明参赛者3已完成回答;
当S4按下时,则灯D4亮,并蜂鸣器响一声,如果超过规定时间,蜂鸣器一直响,并提示超时LED灯被点亮。
如果S4在限定的时间内再次被按下,说明参赛者4已完成回答;
抢答完后可以按下主持人的确定键将其初始化。
总原理图如图所示:
五、软件模块
本系统用了定时器0和定时器1。
图5
六、结论
本次设计按照题目要求,基于单片机,利用较合适的控制算法,成功的实现了抢答器的基本功能。
硬件原理结构简单,减少硬件成本和繁琐的电路连接;
软件设计方面,设计简单,可塑造性强,便于维护。
因此选择使用单片机实现四人抢答器的设计具有很强的效益,能任意地修改抢答时间,使此抢答器适合在很多场合使用且成本低。
通过此课程设计让我真正的了解到了程序设计的难点所在,难的并不是程序框架的搭建、理论上的思考此方法是否可行、代码的写入、调试其结果,真正难的是在调试的过程中,明明知道是有些问题的,但是又无法锁定问题所在,造成的结果是心理的成就感受到抨击,反复的对可能存在的问题反复修改,一次又一次的修改,可怕的是代码越修越错,结果该不会来。
折腾一段时间后,一不小心才发现开始的时候问题仅仅时非常简单、愚蠢的错误。
从这程序设计过程中不断的提醒我,必须步步为营,步步小心,耐心加细心即等于完美的程序设计的实现。
七、程序代码:
//实现功能:
四人抢答器
/*1、只有主持人宣布开始抢答时,选手才能进行抢答,抢答有一定的时间限制,超过一定时间就会出现报警声。
2、选手回答时必须在规定的时间里面回答,否则就会出现报警声
3、数码管会显示时间
4、各通道的规定:
5、抢答时间是可以设置的*/
#include<
reg52.h>
#include<
intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitbeep=P3^6;
//makingvoice(低电平有效)
sbitLED1=P2^7;
//competitor1(低电平有效)
sbitONE=P1^0;
//(高电平有效)
sbitLED2=P2^6;
//competitor2(低电平有效)
sbitTWO=P1^1;
sbitLED3=P2^5;
//competitor3(低电平有效)
sbitTHREE=P1^2;
sbitLED4=P2^1;
//competitor4
sbitFOUR=P1^3;
sbitLED5=P2^0;
//hostannouncedbeging
sbitHOST=P1^5;
//低电平有效
sbitOVER=P3^7;
//overtime
sbitCHANG=P1^4;
//changetheovertime(低电平有效)
sbitUP=P1^6;
//(低电平有效)
sbitDOWN=P1^7;
sbitLS138A=P2^2;
//定义译码器输入端A在P2.2管脚上
sbitLS138B=P2^3;
//定义译码器输入端B在P2.3管脚上
sbitLS138C=P2^4;
//定义译码器输入端C在P2.4管脚上
staticuintmax1=10,num1=20;
uintmax,num,temp,tt=0,dd=0x00;
//max用于表示选手抢答的时间
//uinti,LedNumVal=1;
//uintLedOut[10];
unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
voiddelay(uintx);
voiddisplay(uintKey_Val);
voidchange();
voidpress(void);
voidtime1_max();
voidtime0_num();
//unsignedlong
uintLedOut[5],LedhdsjVal;
voiddisplay(uintKey_Val)
{
uchari;
/********以下将键值送到LED数码管显示*************/
LedhdsjVal=Key_Val;
//把键值送到LedhdsjVal变量中
LedOut[0]=Disp_Tab[LedhdsjVal%10000/1000];
LedOut[1]=Disp_Tab[LedhdsjVal%1000/100];
//|0x80;
LedOut[2]=Disp_Tab[LedhdsjVal%100/10];
//十位
LedOut[3]=Disp_Tab[LedhdsjVal%10];
//个位
for(i=1;
i<
4;
i++)
{
P0=LedOut[i];
/*switch(i)
{//138译码
case0:
LS138A=0;
LS138B=0;
LS138C=0;
break;
case1:
LS138A=1;
case2:
LS138B=1;
case3:
}
delay(100);
*/
switch(i)
case0:
delay(10);
//P0=0x00;
//LS138A=1;
}
//voidtime()//选手的回答时间,时间不可更改
//{
/***********************************************************
purpose:
系统初始化
/**********************************************************/
voidtime1_max()
{
TMOD|=0x11;
TH1=(65536-50000)/256;
//12.000
TL1=(65536-50000)%256;
IE=0x8A;
TR1=1;
}
voidtime0_num()
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x83;
TR0=1;
}
voiddelay(uintx)
uinty;
for(