基于单片机的八路抢答器设计报告.docx

上传人:b****3 文档编号:12644592 上传时间:2023-04-21 格式:DOCX 页数:21 大小:127.31KB
下载 相关 举报
基于单片机的八路抢答器设计报告.docx_第1页
第1页 / 共21页
基于单片机的八路抢答器设计报告.docx_第2页
第2页 / 共21页
基于单片机的八路抢答器设计报告.docx_第3页
第3页 / 共21页
基于单片机的八路抢答器设计报告.docx_第4页
第4页 / 共21页
基于单片机的八路抢答器设计报告.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于单片机的八路抢答器设计报告.docx

《基于单片机的八路抢答器设计报告.docx》由会员分享,可在线阅读,更多相关《基于单片机的八路抢答器设计报告.docx(21页珍藏版)》请在冰豆网上搜索。

基于单片机的八路抢答器设计报告.docx

基于单片机的八路抢答器设计报告

八路抢答器设计报告

 

设计课题:

八路抢答器

 

专业班级:

学生姓名:

学  号:

  

指导教师:

设计时间:

 

一、系统设计内容

1.1系统设计依据

抢答器由计数器、寄存器、集成定时器和译码显示等组合、时序电路组成。

可分为抢答电路,定时电路,报警电路等几个单元部分。

每个单元电路分别可以处理一些抢答竞赛中的基本问题。

本次课程设计设计的是一个多路定时抢答器,是一个多于两位选手参赛的一个抢答器,具有锁存和显示功能。

同时有主持人控制系统的清零和抢答的开始。

抢答开始后,若有任何一名选手按动抢答按钮,抢答器就会显示该选手编号直至系统被主持人清零,并有扬声器发出提示,同时其他人再抢答就无效了。

这次设计的抢答器还有自动定时功能,主持人可以设定选手答题的时间。

当主持人启动“开始”键后,定时器会自动减计时,这个会显示在显示器上。

选手只有在抢答时间内抢答才有效,若在答题时间内没有选手答题,时间到时,报警电路就会发出警报亮灯并且禁止抢答。

1.2设计任务和要求

设计一个八路抢答器

要求:

(1)设计出硬件电路;

(2)设计出软件编程方法,并写出源代码;

(3)用PROTEUS进行仿真;

(4)论文格式要符合学院的统一规定,结构要合符逻辑,表达要得体。

1.3设计目的

通过设计学习单片机最小系统的基本设计方法,掌握单片机应用系统的开发调试过程。

(1)学习单片机开发工具功能、特点和使用方法。

(2)学会单片机控制系统程序的编制和编制和调试方法。

(3)设计单片机抢答器硬件电路,绘制出电路原理图。

(4)编制并调试出键盘扫描程序和显示驱动程序。

(5)掌握单片机定时器的基本用法,编制出定时器的中断程序。

第2章硬件设计

2.1单片机控制原理

单片机(SCM)是单片微型计算机(SingleChipMicrocomputer)的简称。

它是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口电路、定时/计数器以及输入输出适配器都集成在一块芯片上,构成一个完整的微型计算机。

它的最大优点是体积小,可放在仪表内部。

但存储量小,输入输出适配器简单,功能较低。

目前,单片机在民用和工业测控领域得到最广泛的应用,早已深深地融入人们的生活中。

简单的说,用单片机系统来设计抢答器,实现两组的抢答时间即使是相差几微秒,也可分辨出哪组优先答题。

P0端口(P0.0-P0.7):

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1端口(P1.0-P1.7):

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高电平,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2端口(P2.0-P2.7):

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3端口(P3.0-P3.7):

P3口管脚是一个带有内部上拉电阻的8位的双向I/O端口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入端时,由于外部下拉为低电平,P3口将输出电流(ILL)。

2.2抢答器的原理

抢答器的工作原理是采用单片机最小系统,用程序查询方式采用动态显示组号。

主持人按下开始抢答键才可以抢答。

主持人没有按下开始抢答按纽(P3.0),有人抢答则抢答违规,报警并显示组号,主持人按下开始抢答开关重新抢答。

主持人按下开始抢答按纽(P3.0),蜂鸣响声提示,数码管30秒倒计时抢答,蜂鸣器响声提示并显示他的组号,30秒内有人抢答则开始60秒倒计时(60秒内必须回答完问题),最后五秒倒计时警报。

单片机最小系统、抢答按键模块(四位并行数码显示)、显示模块、显示驱动模块、抢答开关模块、蜂鸣器音频输出模块。

2.2.1原理及电路总框图

图2.2.1抢答器总原理图

 

2.3功能模块电路

2.3.1晶振复位及开始抢答电路

晶振的频率为12MHZ,提供89C51的时钟脉冲使89C51工作,复位电路是单片机初始化,使单片机重新开始执行程序。

当复位开关按下RST由低电平变为高电平,则程序从头开始执行,在此次课程设计电路中当一个问题结束主持人后按下复位开关后进行下一题的准备。

图2.3.1晶振复位电路

图2.3.1开始抢答电路

2.3.2选手抢答键(矩阵式键盘)

89C51的P1口做一个为选手抢答的输入按键引脚,P1.0至P1.7轮流输出低电位,给每一个选手编号1至8,当选手按下按钮时,P1口个端口的电平变化从P1口输入,经单片机处理后从P0输出由数码管显示抢答者编号。

图2.3.2选手抢答电路

 

2.3.3显示与显示驱动电路

此电路包括显示和驱动,显示采用数码管,驱动用P2口,违规者编号、抢答30秒倒计时、正常抢答者编号和回答问题时间60秒倒计时,数码管采用动态显示。

驱动电路P2口,查询显示程序利用P0口做段选码口输出P2低3位做位选码输出,当为低电平则能驱动数码管使其显示数字。

在+5V电压下接10k的电阻,保证正常压降。

图2.3.3示与显示驱动电路

 

2.3.4蜂鸣器音频输出电路

通过控制不同频率的矩形脉冲来控制蜂鸣器发声。

此次课程设计中只需要一些简单的提示声音和稍微显眼的灯控,有抢答违规,开始抢答,抢答时间结束和回答时间到得提示声和亮灯提醒。

图2.3.4蜂鸣器音频输出电路

 

第3章软件设计

3.1程序设计

3.1.1系统流程图

 

3.1.2显示抢答违规流程图

 

3.1.3抢答成功流程图

 

3.2程序代码

3.2.1主程序

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitm1=P3^1;//主持人按键答对加分,按一下加一分

sbitm2=P3^2;//答错减分

sbitk1=P1^0;

sbitk2=P1^1;

sbitk3=P1^2;

sbitk4=P1^3;

sbitk5=P1^4;

sbitk6=P1^5;

sbitk7=P1^6;

sbitk8=P1^7;//选手按键

sbitk=P3^0;//主持人按键开始

sbitbeep=P3^7;//蜂鸣器

ucharcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};//0-9代码

ucharshiwei,gewei,xuanshou,count,i,second;

ucharscore1,score2,score3,score4,score5,score6,score7,score8;//选手1~8的分数

uintt,m,n,a,a1,a2,a3,a4,a5,a6,a7,a8;

voidTimer()

{

TMOD|=0x01;

TH0=0xd8;//初值55536,计数10000次,每次1US,总计10ms

TL0=0xf0;

IE=0x82;//这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时

TR0=1;

}

voidtim(void)interrupt1using1//为定时中断TR0

{

TH0=0xd8;//重新赋值

TL0=0xf0;

count++;

if(count==100)//100*10ms=1秒

{

count=0;

second--;//秒减1

}

}

voiddelay(uintz)//延时函数

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voiddisplay(ucharshiwei,gewei,xuanshou)//显示函数

{

P2=0xfe;//打开显示时间十位的位选

P0=shiwei;//显示十位

delay(5);

P2=0xfd;//个位位选

P0=gewei;

delay(5);

P2=0xf7;//选手位选

P0=xuanshou;

delay(5);

}

voiddis(void)

{

shiwei=tab[second/10];

gewei=tab[second%10];

xuanshou=tab[i];

display(shiwei,gewei,xuanshou);

}

voidinit()//初始化函数

{

P2=0x04;

P0=0x3f;

t=0;

beep=0;

i=0;

second=29;

score1=60;

score2=60;

score3=60;

score4=60;

score5=60;

score6=60;

score7=60;

score8=60;

a1=1;

a2=1;

a3=1;

a4=1;

a5=1;

a6=1;

a7=1;

a8=1;

}

voidmain()

{

init();

if(k==0)//主持人按下开始键

{

Timer();

delay(10);

while(!

k);

while

(1)

{

dis();

m=0;

n=0;

if(second==10){beep=1;delay(500);beep=0;}

if(second==0){

TR0=0;n=1;

if(k==0)

{beep=1;delay(500);beep=0;second=29;TR0=1;m=1;}

}

if(n==0)

{

if(k1==0){delay(5);if(k1==0);while(!

k1);t=1;}

elseif(k2==0){delay(5);if(k2==0);while(!

k2);t=2;}

elseif(k3==0){delay(5);if(k3==0);while(!

k2);t=3;}

elseif(k4==0){delay(5);if(k4==0);while(!

k2);t=4;}

elseif(k5==0){delay(5);if(k5==0);while(!

k2);t=5;}

elseif(k6==0){delay(5);if(k6==0);while(!

k2);t=6;}

elseif(k7==0){delay(5);if(k7==0);while(!

k2);t=7;}

elseif(k8==0){delay(5);if(k8==0);while(!

k2);t=8;}

elseif(k==0){delay(5);if(k==0);while(!

k);t=0;i=0;second=29;beep=1;delay(500);beep=0;TR0=1;}

}

while(t)

{

if(m==0)//开关,保证程序只执行一次

{

switch(t)

{

case1:

{

TR0=0;i=1;second=0;beep=1;delay(500);beep=0;

a1=0;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break;

}

case2:

{

TR0=0;i=2;second=0;beep=1;delay(500);beep=0;

a2=0;a1=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break;

}

case3:

{

TR0=0;i=3;second=0;beep=1;delay(500);beep=0;

a3=0;a1=1;a2=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break;

}

case4:

{

TR0=0;i=4;second=0;beep=1;delay(500);beep=0;

a4=0;a1=1;a2=1;a3=1;a5=1;a6=1;a7=1;a8=1;m=1;break;

}

case5:

{

TR0=0;i=5;second=0;beep=1;delay(500);beep=0;

a5=0;a1=1;a2=1;a3=1;a4=1;a6=1;a7=1;a8=1;m=1;break;

}

case6:

{

TR0=0;i=6;second=0;beep=1;delay(500);beep=0;

a6=0;a1=1;a2=1;a3=1;a4=1;a5=1;a7=1;a8=1;m=1;break;

}

case7:

{

TR0=0;i=7;second=0;beep=1;delay(500);beep=0;

a7=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a8=1;m=1;break;

}

case8:

{

TR0=0;i=8;second=0;beep=1;delay(500);beep=0;

a8=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;m=1;break;

}

}

}

if(a1==0)//选手1的分数

{second=score1;

dis();

if(m1==0){delay(5);if(m1==0);while(!

m1);beep=1;delay(100);beep=0;score1+=1;if(score1==99)score1=60;}

elseif(m2==0){delay(5);if(m2==0);while(!

m2);beep=1;delay(100);beep=0;score1-=1;if(score1==0)score1=60;}

dis();

}

elseif(a2==0)

{second=score2;

dis();

if(m1==0){delay(5);if(m1==0);while(!

m1);beep=1;delay(100);beep=0;score2+=1;if(score2==99)score2=60;}

elseif(m2==0){delay(5);if(m2==0);while(!

m2);beep=1;delay(100);beep=0;score2-=1;if(score2==0)score2=60;}

dis();

}

elseif(a3==0)

{second=score3;

dis();

if(m1==0){delay(5);if(m1==0);while(!

m1);beep=1;delay(100);beep=0;score3+=1;if(score3==99)score3=60;}

elseif(m2==0){delay(5);if(m2==0);while(!

m2);beep=1;delay(100);beep=0;score3-=1;if(score3==0)score3=60;}

second=score3;

dis();

}

elseif(a4==0)

{

second=score4;

dis();

if(m1==0){delay(5);if(m1==0);while(!

m1);beep=1;delay(100);beep=0;score4+=1;if(score4==99)score4=60;}

elseif(m2==0){delay(5);if(m2==0);while(!

m2);beep=1;delay(100);beep=0;score4-=1;if(score4==0)score4=60;}

second=score4;

dis();

}

elseif(a5==0)

{

second=score5;

dis();

if(m1==0){delay(5);if(m1==0);while(!

m1);beep=1;delay(100);beep=0;score5+=1;if(score5==99)score5=60;}

elseif(m2==0){delay(5);if(m2==0);while(!

m2);beep=1;delay(100);beep=0;score5-=1;if(score5==0)score5=60;}

second=score5;

dis();

}

elseif(a6==0)

{

second=score6;

dis();

if(m1==0){delay(5);if(m1==0);while(!

m1);beep=1;delay(100);beep=0;score6+=1;if(score6==99)score6=60;}

elseif(m2==0){delay(5);if(m2==0);while(!

m2);beep=1;delay(100);beep=0;score6-=1;if(score6==0)score6=60;}

second=score6;

dis();

}

elseif(a7==0)

{

second=score7;

dis();

if(m1==0){delay(5);if(m1==0);while(!

m1);beep=1;delay(100);beep=0;score7+=1;if(score7==99)score7=60;}

elseif(m2==0){delay(5);if(m2==0);while(!

m2);beep=1;delay(100);beep=0;score7-=1;if(score7==0)score7=60;}

second=score7;

dis();

}

elseif(a8==0)

{

second=score8;

dis();

if(m1==0){delay(5);if(m1==0);while(!

m1);beep=1;delay(100);beep=0;score8+=1;if(score8==99)score8=60;}

elseif(m2==0){delay(5);if(m2==0);while(!

m2);beep=1;delay(100);beep=0;score8-=1;if(score8==0)score8=60;}

second=score8;

dis();

}

if(k==0){i=0;t=0;second=29;beep=1;delay(500);beep=0;TR0=1;}

while(!

k);

}

}

}

}

四、系统调试

软件的设计与调试实行分模块实现的方法。

本设计软件调试中的分模块包括显示功能模块,调整时间功能模块,抢答功能模块以及报警功能模块。

各个独立模块功能调试成功后,将这些模块程序通过主程序合并在一起,最后再对合并后的总程序进行调试。

各软件模块首先要通过PC和仿真器进行软件调试,当仿真效果符合要求后在烧写进单片机看是否在实际电路板上正常工作。

本设计通过利用Proteus仿真,将所编写的程序用Keil软件编译,所仿真原理图见附录。

 

五、结论

自接触单片机以来,一直觉得单片机非常难,这次的课程设计我开始是以老师布置题目为主要选择对象的,但是后面发现,像八路抢答器在我脑海中根本没得一点意象,上网搜了很多资料,也感觉不怎么很懂,于是问老师怎么弄,后面发现老师的意见和我的原本的程序和图只有几个地方不同,于是便将两者综合了一下,经调试和运行后,发现还行的通,于是便开始了忐忑的正文模版之路,以为快搞完了,后面发现其实程序和图还是要细细的弄懂才能写好报告,于是我又将程序和图细细的剖析了一遍,慢慢的画出流程图,然后慢慢将流程图和proteus图画好和截取下来,经过最近这段时间的在电脑前面的驻守,觉得只要自己肯付出和努力,发现其实很多的东西不是那么难懂的,以后还是要好好提升自己的动手能力和独立思考的能力。

在此,还是非常感谢我们的指导老师,她是一位很负责和很细心的老师,谢谢她的辅导和鼓励,这次的课程设计给了我一个很好的开始,我会好好努力的以后。

纵然课程设计是学校所要求的科目,纵然每次都这么紧张和辛苦,但是我还是觉得有些东西做了,就一定会有一定的价值吧。

 

参考文献资料

[1]张迎新.《单片机初级教程》.北京航天航空大学出版社2000年.

[2]康华光.《电子技术基础(模拟部分)》.第四版高等教育出版社1999年.

[3]喻宗泉.《单片机原理与应用技术》.西安电子科技大学出版社2005年.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1