资源描述
西安文理学院物理和机械电子
工程学院专业课程设计汇报
专业班级 测控技术和仪器
课 程 51单片机技术和设计
题 目 基于51单片机抢答器设计
学 号
学生姓名
指导老师
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 试验仪器及元器件清单
器件名称
规格型号
数量
微处理器
AT89C51
1
极性电容
1uF
1
电阻(排阻)
RESPACK8
9
电容
10uF
2
晶振
12MHZ
1
按钮
15
液晶显示器
LM020L
1
扬声器
BUZZER
1
8 设计总结
经过这次课程设计,我更深入地认识了抢答器工作原理,掌握了它调整及测试方法。本系统经过采取AT89C51单片机作为关键,以八个按键输入抢答信号,以液晶显示器显示,依据烧录到单片机中程序控制整个系统工作步骤,整体性好,效率高,实现了抢答器智能化。在这过程之中也碰到了部分问题,比如对汇编语言了解还不够,将其转化为C语言时在时序上出现部分问题,还有C语言基础也需要加强,编程能力有待提升。
9 致谢
经过此次课程设计,让我更深入巩固了单片机多种知识。但在设计过程中,碰到了很多问题,有部分知识已经不太清楚了,不过经过部分资料又重新翻阅而且认真复习了相关教科书中内容。此次课程设计树立了对自己工作能力信心,相信会对以后学习工作生活全部有很关键影响,而且大大提升了动手能力,使我充足体会到了发明过程中探索艰苦和成功喜悦。即使这次做出作品还存在很多需要改善地方,不过在整个设计过程中所学习到东西是这次实训所得到最大收获跟财富,使我终生受益。最终,我要感谢指导老师老师和杨浩辉同学在我将系统汇编语言改为C语言时对我无私帮助。
10 参考文件
【1】戴梅蕚 史嘉权 编著,《微型计算机技术及应用》(第四版)清华大学出版社,北京,.3
【2】(美)Bruce Eckel 著 陈昊鹏 译《JAVA编程思想》(第四版),机械工业出版社,北京,.6(.11重印)
【3】冯博琴 吴宁 主编,《微型计算机原理和接口技术》(第三版),清华大学出版社,北京密云胶印厂,.6
【4】张毅刚等 编著,《新编MSC-51单片机应用设计》(第三版),哈尔滨工业大学出版社,哈尔滨东林印务,.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; }
}
展开阅读全文