基于51单片机抢答器的课程设计Word下载.docx
《基于51单片机抢答器的课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机抢答器的课程设计Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
![基于51单片机抢答器的课程设计Word下载.docx](https://file1.bdocx.com/fileroot1/2023-2/1/a0f6c092-7156-4bbe-a061-645c0d1f1d0f/a0f6c092-7156-4bbe-a061-645c0d1f1d0f1.gif)
附录二程序清单ﻩ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
电阻(排阻)
RESPACK8
9
电容
10uF
2
晶振
12MHZ
按钮
15
液晶显示屏
LM020L
扬声器
BUZZER
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<reg51、h>
//包含单片机得头文件
#include〈intrins、h〉//包含_nop_()函数定义得头文件
sbit RS=P2^0;
//寄存器选择位,将RS位定义为P2、0引脚
sbitRW=P2^1;
//读写选择位,将RW位定义为P2、1引脚
sbit E=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;
sbit D4=P1^4;
sbit D5=P1^5;
sbitD6=P1^6;
sbitD7=P1^7;
unsignedcharnum=0;
unsignedchar a=30,b=60,n=0,qd,hd,d;
voiddisplay();
voiddelay1ms()
{
unsignedchar i,j;
for(i=0;
i<10;
i++)
for(j=0;
j<
33;
j++)
;
}
voiddelay(unsigned charn)
unsignedchar i;
for(i=0;
i<n;
i++)
delay1ms();
}
voidnopp(unsignedcharn)
unsignedchar i;
for(i=0;
i<
n;
i++)
_nop_();
}
bit lcd_bz()
{
bitresult;
RS=0;
//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;
//E=1,才允许读写
ﻩnopp(4);
//空操作四个机器周期,给硬件反应时间
result=(bit)(P0&0x80);
//将忙碌标志电平赋给result
E=0;
return result;
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);
void Display(unsignedchar string[])
{
unsignedchari;
ﻩ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;
}
D5){n=6;
break;
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"
);
break;
case4:
Display("
number:
4 ");
hd=1;
case5:
Display(”number:
5"
);
hd=1;
break;
case 6:
Display("
number:
6");
break;
case7:
Display("
number:
7");
hd=1;
case8:
Display("
number:
8");
hd=1;
break;
ﻩ }
n=0;
//WriteInstruction(0x01);
ﻩ delay(5000);
ﻩd=b;
ﻩ while(d+1);
}ﻩ
voiddisplay()
unsigned chartm[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("
setting hd_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)
voidT1_timer()interrupt 3 //中断服务程序
{
ﻩTH1=0X3C;
//重装初值
TL1=0XB0;
num++;
if(num==20)
ﻩ{
ﻩnum=0;
display();
ﻩ
d--;
ﻩ}
if(d==0)
{TR1=0;
ring=1;
ﻩdelay(500);