基于51单片机抢答器的课程设计.docx
《基于51单片机抢答器的课程设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机抢答器的课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
![基于51单片机抢答器的课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/5/ae2f6571-aa99-4f1c-a748-925735ce2227/ae2f6571-aa99-4f1c-a748-925735ce22271.gif)
基于51单片机抢答器的课程设计
作者:
旧在几
作品编号:
2254487796631145587263GF24000022
时间:
2020.12.13
西安文理学院物理与机械电子
工程学院专业课程设计报告
专业班级测控技术与仪器
课程51单片机技术与设计
题目基于51单片机的抢答器设计
学号
学生姓名
指导教师
2014年5月
基于51单片机的八位抢答器设计
摘要随着电子技术的飞速发展,基于单片机的控制系统已应用于工业、农业、电力、电子、智能楼宇等行业,微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。
抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。
但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。
作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购置的麻烦和及时性就会影响活动的开展,因此设计了本抢答器。
本设计是以八路抢答为基本理念。
考虑到依需设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时。
同时使液晶显示屏能够正确地显示时间,并且给出指令的提示,扬声器发生提示。
系统能够实现:
在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可在1-99s设定;可以显示是哪位选手有效抢答和无效抢答,正确按键后有声音的提示;抢答时间和回答问题时间倒记时显示,满时后系统计时有声音提示;抢答倒计时时间和回答问题时间均可通过硬件的按键调整。
关键词:
AT89C51;单片机;液晶显示屏;抢答器;智能
1引言
目前各种各样的竞赛越来越多,无论是学校、工厂、军队还是益智性电视节目,其中用到抢答器的概率非常大。
目前很多抢答器基本上采用小规模数字集成电路设计,使用起来不够理想。
因此设计一款更易于使用和区分度高的抢答器成了非常迫切的任务。
现在单片机已进入各个领域,以其功耗小、智能化而著称。
所以若利用单片机来设计抢答器,便使以上问题得以解决。
针对以上情况,本课程设计出以AT89C51单片机为核心的八路抢答器。
它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过液晶显示屏显示相应的路数和答题时间以及各项命令等,使竞赛真正达到公正、公开、公平。
2设计任务与要求概述
2.1题目
8路比赛抢答器
2.2设计任务
利用8051单片机中断系统,制作一个有8个按键的比赛抢答器,可供8名选手比赛的抢答,每组设置一个抢答按钮,按钮的编号与选手的编号对应,主持人设置控制开关,用来控制系统的清零和抢答的开始,在有人按键时进行对应选手显示。
2.3设计要求
1完成系统的硬件电路设计与软件设计;
2采用汇编或C语言编程;
3采用Proteus、KeilC等软件实现系统的仿真调试;
4论文要求思路清晰,结构合理,语言流畅,书写格式符合要求。
2.4设计目的
1综合运用相关课程中所学的理论知识去完成这一设计课题。
2通过查阅手册和相关文献资料,培养自己独立分析和解决问题的能力。
3进一步熟悉单片机和常用接口电路,加深对专业知识和理论知识学习的认识和理解。
4学会电路的设计与程序的调试。
5学会撰写课程设计论文。
6培养严肃认真的工作作风和严谨的科学态度。
3方案总体设计
3.1方案
3.1.1控制芯片
我们采用51系列单片机AT89C51作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。
单片机技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。
整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。
MCS-51单片机特点如下:
a、可靠性好:
单片机按照工业控制要求设计,抵抗工业噪声干扰优于一般的CPU,程序指令和数据都可以写在ROM里,许多信号通道都在同一芯片,因此可靠性高,易扩充。
b、单片机有一般电脑所必须的器件,如三态双向总线,串并行的输入及输出引脚,可扩充为各种规模的微电脑系统。
c、控制功能强:
单片机指令除了输入输出指令,逻辑判断指令外还有更丰富的条件分支跳跃指令。
3.1.2显示方式
在实现基本功能时,我们采用了四位数码管显示,后两位显示倒计时时间,第一位显示抢答组号,第三位置空,在此基础上还在程序里加了更改抢答时间和倒计时时间的模块,也可通过数码管显示,成为一个比较完整的系统。
后来在实现拓展功能时,我们想加入语音显示的模块,发现proteus软件无法仿真,就改为用液晶显示屏1602显示。
1602液晶显示屏也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,它可以通过简短的英文提示和数字使人明确看到比赛进行的整个过程。
3.1.3程序语言的选择
一开始实现基本功能时,使用数码管作为显示,采用了汇编语言,比较高效,条理也清晰;后来做拓展功能时改用液晶显示屏显示,发现液晶显示屏使用c语言编程更便捷高效,就整体使用了c语言。
3.2原理框图
图3.1原理框图
4硬件电路设计
4.1抢答器的工作原理
用单片机的两个外部中断作为修改时间的选择按钮,选择修改抢答倒计时时间还是回答问题时间;用定时器1作为时间的控制。
4.2单元电路设计
4.2.1抢答器电路
该电路有八个按钮分别接于P1.0~P1.7可实现两个功能:
一是分辨出选手按键的先后,并锁存优先抢答者的编号,同时译码显示电路显示编号;二是禁止其他选手按键操作无效。
如有再次抢答需由主持人将S开关重新置,“清除”然后再进行下一次抢答。
如图4.1
图4.1抢答器电路
4.2.2发声电路设计
用P3.6口和扬声器相连,主持人将控制开关拨到"开始"位置时,会发声,抢答电路和定时电路进人正常抢答工作状态;当参赛选手按动抢答键时,扬声器发声,抢答电路和定时电路停止工作。
如图4.2
4.2.3开始、复位按键输入电路的设计
复位是计算机的一个重要工作状态。
开始和复位键分别接于P3.0和P3.1口,在单片机工作时,接电之前,断电后也要复位。
在抢答器中复位则为定时做铺垫,在抢答之前要复位,抢答完也要复位。
按了复位键,显示屏的状态是“start……”。
如图4.3
图4.2发声电路图4.3开始、复位电路
4.2.4时钟震荡电路
CPU的操作需要精确的定时,可用一个晶体振荡器产生稳定的时钟脉冲来控制AT89C51单片机上的XTAL1和XTAL2分别为振荡电路的输入和输出。
如图4.4
4.2.5设定时间、加减时间电路设计
该电路主要是对答题时间和抢答时间调整设计的,抢答时间接P3.2,答题时间接P3.3,加一秒接P3.4,减一秒接P3.5。
如图4.5
图4.4时钟振荡电路图4.5加减时间电路
4.2.6显示电路的设计
本系统通过液晶显示屏来显示各提示信息。
如图4.6
图4.6显示时间电路
5软件设计
5.1抢答器工作流程
为了能够达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前必须先设定抢答的时间,因而在编开始抢答前的程序得先编写设定时间的程序,当时间设好了之后,主持人发布抢答命令按下P3.0按键,程序开始打开定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。
当在扫描到有人按下了答题键,马上关闭T0、调用显示程序、封锁键盘。
接通电源后,液晶显示屏显示“Ready……”,抢答器处于禁止状态,处于等待开始状态,此时有人抢答,会显示“error”,也可以调整抢答时间和回答问题时间,;主持人将开关置,“开始”状态,宣布“开始”抢答器工作,显示屏显示“go!
”,扬声器给出声响提示,定时器倒计时;选手在定时时间内抢答时,抢答器完成,显示组号,并且倒计时,时间到扬声器提示。
当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。
如果再次抢答必须由主持人再次操作"开始、停止"状态开关。
5.2流程框图
图5.1流程框图
6电路仿真调试
6.1上电准备状态
图6.1上电准备状态
6.2开始抢答
图6.2开始抢答
6.3非法抢答
图6.3非法抢答
6.4正常抢答
图6.4正常抢答
7实验仪器及元器件清单
表7-1实验仪器及元器件清单
器件名称
规格型号
数量
微处理器
AT89C51
1
极性电容
1uF
1
电阻(排阻)
RESPACK8
9
电容
10uF
2
晶振
12MHZ
1
按钮
15
液晶显示屏
LM020L
1
扬声器
BUZZER
1
8设计总结
通过这次课程设计,我更进一步地认识了抢答器的工作原理,掌握了它的调整及测试方法。
本系统通过采用AT89C51单片机作为核心,以八个按键输入抢答信号,以液晶显示屏显示,根据烧录到单片机中的程序控制整个系统的工作流程,整体性好,效率高,实现了抢答器的智能化。
在这过程之中也遇到了一些问题,比如对汇编语言理解还不够,将其转化为C语言时在时序上出现一些问题,还有C语言基础也需要加强,编程能力有待提高。
9致谢
通过此次的课程设计,让我更进一步的巩固了单片机的各种知识。
但在设计的过程中,遇到了很多的问题,有一些知识已经不太清楚了,但是通过一些资料又重新的翻阅并且认真的复习了相关教科书中的内容。
此次的课程设计树立了对自己工作能力的信心,相信会对今后的学习工作生活都有非常重要的影响,而且大大的提高了动手能力,使我充分的体会到了创造过程中的探索的艰难和成功的喜悦。
虽然这次做出的作品还存在很多需要改进的地方,但是在整个设计过程中所学习到的东西是这次实训所得到的最大收获跟财富,使我终身受益。
最后,我要感谢指导老师老师和杨浩辉同学在我将系统的汇编语言改为C语言时对我无私的帮助。
10参考文献
【1】戴梅蕚史嘉权编著,《微型计算机技术及应用》(第四版)清华大学出版社,北京,2008.3
【2】(美)BruceEckel著陈昊鹏译《JAVA编程思想》(第四版),机械工业出版社,北京,2007.6(2013.11重印)
【3】冯博琴吴宁主编,《微型计算机原理与接口技术》(第三版),清华大学出版社,北京密云胶印厂,2011.6
【4】张毅刚等编著,《新编MSC-51单片机应用设计》(第三版),哈尔滨工业大学出版社,哈尔滨东林印务有限公司,2008.4
附录一系统电路图
图附录系统电路图
附录二程序清单
#include//包含单片机的头文件
#include//包含_nop_()函数定义的头文件
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;
sbitring=P3^6;
sbitstart=P3^0;
sbitok=P3^1;
sbitadd=P3^4;
sbitsub=P3^5;
sbitD0=P1^0;
sbitD1=P1^1;
sbitD2=P1^2;
sbitD3=P1^3;
sbitD4=P1^4;
sbitD5=P1^5;
sbitD6=P1^6;
sbitD7=P1^7;
unsignedcharnum=0;
unsignedchara=30,b=60,n=0,qd,hd,d;
voiddisplay();
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
voiddelay(unsignedcharn)
{
unsignedchari;
for(i=0;idelay1ms();
}
voidnopp(unsignedcharn)
{
unsignedchari;
for(i=0;i_nop_();
}
bitlcd_bz()
{
bitresult;
RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;//E=1,才允许读写
nopp(4);//空操作四个机器周期,给硬件反应时间
result=(bit)(P0&0x80);//将忙碌标志电平赋给result
E=0;
returnresult;
}
voidWriteInstruction(unsignedchardictate)
{
while(lcd_bz()==1);//如果忙就等待
RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=1;//E置低电平
nopp
(2);//空操作两个机器周期,给硬件反应时间
P0=dictate;//将数据送入P0口,即写入指令或地址
nopp(4);//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平(正跳变)
nopp(4);//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
voidWriteData(unsignedchary)
{
while(lcd_bz()==1);
RS=1;//RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=1;//E置低电平
P0=y;//将数据送入P0口,即将数据写入液晶模块
nopp(4);//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平(正跳变)
nopp(4);//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
voidLcdInitiate(void)
{
delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x30);//显示模式设置:
8位数据,16×2显示,5×7点阵,
delay(5);//延时5ms
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x0c);//显示模式设置:
显示开,有光标,光标闪烁
delay(5);
WriteInstruction(0x06);//显示模式设置:
光标右移,字符不移
delay(5);
WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除
delay(5);
}
voidDisplay(unsignedcharstring[])
{
unsignedchari;
i=0;
while(string[i]!
='\0')
{//显示字符
WriteData(string[i]);
i++;
}
}
/*voidbark()
{
ring=1;
delay(10);
ring=0;
}*/
voidanswer()
{
ring=1;
delay(500);
ring=0;
WriteInstruction(0x01);
delay
(1);
Display("go!
");
TR1=1;
qd=1;
d=a;
while
(1){
//TR0=1;
if(!
D0){n=1;
break;}
if(!
D1){n=2;
break;}
if(!
D2){n=3;
break;}
if(!
D3){n=4;
break;}
if(!
D4){n=5;
break;}
if(!
D5){n=6;
break;}
if(!
D6){n=7;
break;}
if(!
D7){n=8;
break;}
}
WriteInstruction(0x01);
switch(n)
{
case1:
Display("number:
1");hd=1;break;
case2:
Display("number:
2");hd=1;break;
case3:
Display("number:
3");hd=1;break;
case4:
Display("number:
4");hd=1;break;
case5:
Display("number:
5");hd=1;break;
case6:
Display("number:
6");hd=1;break;
case7:
Display("number:
7");hd=1;break;
case8:
Display("number:
8");hd=1;break;
}
n=0;
//WriteInstruction(0x01);
delay(5000);
d=b;
while(d+1);
}
voiddisplay()
{
unsignedchartm[3]={0x20,0,0};
unsignedchara1,b1;
a1=d/10;
tm[1]=a1+0x30;
b1=d%10;
tm[2]=b1+0x30;
WriteInstruction(0x01);
delay
(1);
Display(tm);
}
voidmain(void)//主函数
{
TMOD=0X11;//选择定时器方式1
TH0=0X00;//给定时器赋处置
TL0=0XFF;
TH1=0X3C;
TL1=0XB0;
EA=1;
ET1=1;//开总中断
EX0=1;
ET0=1;
EX1=1;
TR1=1;
LcdInitiate();//调用LCD初始化函数
Display("ready......");
while
(1){
if(start)
{
if(!
(D0&D1&D2&D3&D4&D5&D6&D7))
{
WriteInstruction(0x01);
delay
(1);
Display("error");
ring=1;
delay(500);
ring=0;
delay(500);
WriteInstruction(0x01);
}
}
else
answer();
}
}
voidInt0()interrupt0//中断服务程序
{
WriteInstruction(0x01);
Display("settingqd_tm");
delay(1000);
WriteInstruction(0x01);
d=a;
display();
while
(1)
{if(!
add)
{a++;
d=a;
display();
delay(500);
}
elseif(!
sub)
{a--;d=a;
display();
delay(500);}
if(!
ok)
break;}
}
voidT0_timer()interrupt1//中断服务程序
{
TH0=0X00;
TL0=0XFF;
ring=0;
}
voidInt1()interrupt2//中断服务程序
{
WriteInstruction(0x01);
delay
(1);
Display("settinghd_tm");
delay(1000);
WriteInstruction(0x01);
d=b;
display();
while
(1)
{if(!
add)
{b++;
d=b;
display();
delay(500);
}
elseif(!
sub)
{b--;d=b;
display();
delay(500);}
if(!
ok)
break;
}
}
voidT1_timer()interrupt3//中断服务程序
{
TH1=0X3C;//重装初值
TL1=0XB0;
num++;
if(num==20)
{
num=0;
display();
d--;
}
if(d==0)
{TR1=0;
ring=1;
delay(500);
ring=0;}
}
作者:
旧在几
作品编号:
2254487796631145587263GF24000022
时间:
2020.12.13