基于51单片机抢答器的课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西安文理学院物理与机械电子
工程学院专业课程设计陈述
专业班级测控技术与仪器
课程51单片机技术与设计
题目基于51单片机的抢答器设计
学号
学生姓名
指导教师
2014年 5月
基于51单片机的八位抢答器设计
摘要随着电子技术的飞速发展,基于单片机的控制系统已应用于工业、农业、电力、电子、智能楼宇等行业,微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的惯例电子线路。

抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。

但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。

作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购
置的麻烦和及时性就会影响活动的开展,因此设计了本抢答器。

本设计是以八路抢答为基本理念。

考虑到依需设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时。

同时使液晶显示屏能够正确地显示时间,而且给出指令的提示,扬声器发生提示。

系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可在1-99s设定;可以显示是哪位选手有效抢答和无效抢答,正确按键后有声音的提示;抢答时间和回答问题时间倒记时显示,满时后系统计时有声音提示;抢答倒计时时间和回答问题时间均可通过硬件的按键调整。

关键词:AT89C51;单片机;液晶显示屏;抢答器;智能
目录
1 引言1
2 设计任务与要求概述1
2.1 题目1
2.2 设计任务1
2.3 设计要求1
2.4 设计目的1
3 方案总体设计2
3.1 方案2
3.1.1 控制芯片2
3.1.2 显示方式2
3.1.3 程序语言的选择2
3.2 原理框图3
4 硬件电路设计3
4.1 抢答器的工作原理3
4.2 单元电路设计3
4.2.1抢答器电路3
4.2.2 发声电路设计4
4.2.3 开始、复位按键输入电路的设计4
4.2.4时钟震荡电路4
4.2.5 设定时间、加减时间电路设计4
4.2.6 显示电路的设计5
5 软件设计6
5.1 抢答器工作流程6
5.2 流程框图6
6 电路仿真调试7
6.1 上电准备状态7
6.2 开始抢答7
6.3 非法抢答8
6.4 正常抢答8
7 实验仪器及元器件清单9
8 设计总结9
9 致谢9
10 参考文献10
附录一系统电路图11
附录二程序清单11
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 实验仪器及元器件清单
8 设计
总结
通过这
次课程设
计,我更
进一步地认识了抢答器的工作原理,掌握了它的调整及测试方法。

本系统通过采取AT89C51单片机作为核心,以八个按键输入抢答信号,以液晶显示屏显示,根据烧录到单片机中的程序控制整个系统的工作流程,整体性好,效率高,实现了抢答器的智能化。

在这过程之中也遇到了一些问题,比方对汇编语言理解还不敷,将其转化为C语言时在时序上出现一些问题,还有C语言基础也需要加强,编程能力有待提高。

9致谢
通过此次的课程设计,让我更进一步的巩固了单片机的各种知识。

但在设计的过程中,遇到了很多的问题,有一些知识已经不太清楚了,但是通过一些资料又重新的翻阅而且认真的复习了相关教科书中的内容。

此次的课程设计树立了对自己工作能力的信心,相信会对今后的学习工作生活都有非常重要的影响,而且大大的提高了动手能力,使我充分的体会到了创造过程中的探索的艰难和成功的喜悦。

虽然这次做出的作品还存在很多需要改进的地方,但是在整个设计过程中所学习到的东西是这次实训所得到的最大收获跟财富,使我终身受益。

最后,我要感谢指导老师老师和杨浩辉同学在我将系统的汇编语言改为C语言时对我无私的帮忙。

10 参考文献
【1】戴梅蕚史嘉权编著,《微型计算机技术及应用》(第四版)清华大
学出版社,北京,2008.3
【2】(美)Bruce Eckel 著陈昊鹏译《JAVA编程思想》(第四版),机
械工业出版社,北京,2007.6(2013.11重印)
【3】冯博琴吴宁主编,《微型计算机原理与接口技术》(第三版),清
华大学出版社,北京密云胶印厂,2011.6
【4】张毅刚等编著,《新编MSC-51单片机应用设计》(第三版),哈尔滨工业大学出版社,哈尔滨东林印务有限公司,2008.4
附录一系统电路图
图附录系统电路图
附录二程序清单
#include<reg51.h> //包含单片机的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2;
sbit ring=P3^6;
sbit start=P3^0;
sbit ok=P3^1;
sbit add=P3^4;
sbit sub=P3^5;
sbit D0=P1^0;
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit D5=P1^5;
sbit D6=P1^6;
sbit D7=P1^7;
unsigned char num=0;
unsigned char a=30,b=60,n=0,qd,hd,d;
void display();
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
void nopp(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
_nop_();
}
bit lcd_bz()
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
nopp(4); //空操纵四个机器周期,给硬件反应时间
result=(bit)(P0&0x80); //将忙碌标记电平赋给result
E=0;
return result;
}
void WriteInstruction (unsigned char dictate)
{
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由高电平跳酿成低电平时,液晶模块开始执行命令
}
void WriteData(unsigned char y)
{
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由高电平跳酿成低电平时,液晶模块开始执行命令
}
void LcdInitiate(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);
}
void Display(unsigned char string[])
{
unsigned char i;
i = 0;
while(string[i] != '\0')
{ // 显示字符
WriteData(string[i]);
i++;
}
}
/*void bark()
{
ring=1;
delay(10);
ring=0;
} */
void answer()
{
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)
{
case 1:Display(" number:1 ");hd=1;break; case 2:Display(" number:2 ");hd=1;break; case 3:Display(" number:3 ");hd=1;break; case 4:Display(" number:4 ");hd=1;break; case 5:Display(" number:5 ");hd=1;break;
case 6:Display(" number:6 ");hd=1;break;
case 7:Display(" number:7 ");hd=1;break;
case 8:Display(" number:8 ");hd=1;break; }
n=0;
//WriteInstruction(0x01);
delay(5000);
d=b;
while(d+1) ;
}
void display()
{
unsigned char tm[3]={0x20,0,0};
unsigned char a1,b1;
a1=d/10;
tm[1]=a1+0x30;
b1=d%10;
tm[2]=b1+0x30;
WriteInstruction(0x01);
delay(1);
Display(tm);
}
void main(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();
}
}
void Int0() interrupt 0 //中断服务程序{
WriteInstruction(0x01);
Display(" setting qd_tm");
delay(1000);
WriteInstruction(0x01);
d=a;
display();
while(1)
{if(!add)
{ a++;
d=a;
display();
delay(500);
}
else if(!sub)
{ a--;d=a;
display();
delay(500);}
if(!ok)
break;}
}
void T0_timer() interrupt 1 //中断服务程序{
TH0=0X00;
TL0=0XFF;
ring=0;
}
void Int1() interrupt 2 //中断服务程序{
WriteInstruction(0x01);
delay(1);
Display(" setting hd_tm");
delay(1000);
WriteInstruction(0x01);
d=b;
display();
while(1)
{if(!add)
{ b++;
d=b;
display();
delay(500);
}
else if(!sub)
{ b--;d=b;
display();
delay(500);}
if(!ok)
break;
}
}
void T1_timer() interrupt 3 //中断服务程序{
TH1=0X3C; //重装初值
TL1=0XB0;
num++;
if(num==20)
{
num=0;
display();
d--;
}
if(d==0)
{ TR1=0 ;
ring=1;
delay(500);
ring=0; }
}。

相关文档
最新文档