单片机实训抢答器课程设计报告实验.docx

上传人:b****7 文档编号:9759144 上传时间:2023-02-06 格式:DOCX 页数:17 大小:146.76KB
下载 相关 举报
单片机实训抢答器课程设计报告实验.docx_第1页
第1页 / 共17页
单片机实训抢答器课程设计报告实验.docx_第2页
第2页 / 共17页
单片机实训抢答器课程设计报告实验.docx_第3页
第3页 / 共17页
单片机实训抢答器课程设计报告实验.docx_第4页
第4页 / 共17页
单片机实训抢答器课程设计报告实验.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

单片机实训抢答器课程设计报告实验.docx

《单片机实训抢答器课程设计报告实验.docx》由会员分享,可在线阅读,更多相关《单片机实训抢答器课程设计报告实验.docx(17页珍藏版)》请在冰豆网上搜索。

单片机实训抢答器课程设计报告实验.docx

单片机实训抢答器课程设计报告实验

 

第1章绪论

1.1单片机抢答器的背景

对于抢答器我们大家来说并不陌生,他是用于很多竞赛场合。

真正实现先抢先答,让最先抢到题的选手来回答问题。

抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气,选手们都站在同一个起跑线上,体现了公平公正的原则。

1.2抢答器的意义

本系统采用单片机作为整个控制核心。

控制系统的四个模块为:

显示模块、存储模块、抢答开关,总开关模块。

该系统通过一个自锁按键输入抢答信号;利用一个数码管来完成显示功能;用按键来让选手进行抢答,在数码管上显示哪一组先答题的,从而实现整个抢答过程。

在知识比赛中,特别是做抢答题目的时候,在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。

如果在抢答中,靠视觉是很难判断出哪组先答题。

利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。

相对于类似电视台这类花几万元采购的抢答器系统,如果个人组织小型的抢答比赛,这毕竟不合适,但是依靠单片机的低成本,低功耗,可以很好的解决个人用户需要举办小型抢答比赛的需求,而且精度高,操作性好。

第2章设计概述

2.1抢答器的工作原理

抢答器的工作原理是采用单片机最小系统,用中断式键盘进行抢答。

采用动态显示组号。

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

主持人没有按下开始抢答按纽(P3.0),各组人员无法抢答,主持人按下开始抢答按纽(P3.0),数码管10秒倒计时(10秒内抢答有效),如果有人按下按键,程序就会判断是谁先按下的,然后数码显示管就会显示抢答成功选手的号码,并封锁键盘,数码管显示当前选手的编号,禁止其他人按键的输入,从而实现了抢答的功能。

如果在设定的时间中没有一个人按下按键,一到时间,则倒计时停止,不可以抢答。

抢答成功后。

当要进行下一次的抢答时,由主持人抬起自锁按键,主程序再次进入初始化,进入下一次抢答的就绪状态。

2.2设计任务

(1)多路数字抢答器的硬件和软件设计;

(2)分析电路图;

(3)画出程序流程图;

(4)编写代码;

(5)程序分析与调试;

第3章系统硬件电路设计

3.1AT89C51单片机硬件电路

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

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

它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出适配器简单,功能较低[2]。

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

近年来,AT89C51在我国非常流行,它最大的特点是内部有可以多次重复编程的ROM,并且ROM可以直接用编程器来擦写,使用起来比较方便。

本设计使用到的元器件包括:

AT89C51芯片、LED二极管、七段LED数码管的译码。

其中AT89C51是系统的核心,它主要负责控制各个部分的协调工作。

在其外围接上复位电路,数码管,LED二极管,按钮以及振荡器,P1口为8个LED二极管,P2.1-P2.7为抢答输入键接口,数码管段选P0口,位选P3.5和P3.4口。

3.2原理及电路总框图

图3.1抢答器原理框图

 

图3.2抢答器总原理图

第4章系统软件设计

4.1主程序设计

单片机通电以后,2位数码管显示数字“10”此时自锁开关为打开状态,任何选手的按键都无效,8个LED等长灭,当自锁开关闭合后,数码管开始”10-0”的10秒倒计时,在10秒内任意选手抢答,数码管会立即显示对应选手的号码,对应号码的LED灯也会亮起,此时任何选手的按键都无效。

若10秒内无选手抢答,则倒计时完毕以后数码管显示“00”,LED全灭,任意选手按键无效。

在任意时候打开自锁开关,则程序初始化,再次按下时可再次抢答

4.2子程序设计

4.2.1数码管显示电路

LED数码管,实现七段数码管的显示二位十进制数。

来进行倒计时,即来限制抢答的时间。

由于本次课设选用的共阳接法所以对应的段码表如下

表4-1共阳接法数码管段码表

0xc0

0xf9

0xa4

0xb0

0x99

0x92

0x82

0xf8

0x80

0x90;

0

1

2

3

4

5

6

7

8

9

 

4.2.2键盘扫描段码表

本次键盘扫描程序采用的是行列翻转法扫描键盘,即先置行为0,读列值,存在变量1中,然后把列置为0,读行值,存在变量2中,把变量1和变量2相加即为按键对应的键值,下表为相应按键对应的键值

表4-2行列翻转法键盘键值表

0xb7

0xbb

0xbd

0xbe

0xd7

0xdb

0xdd

0xde

S1

S2

S3

S4

S5

S6

S7

S8

 

4.3系统流程图

4.3.1系统主程序流程图

4.3.2系统中断程序流程图

N

Y

Y

N

Y

Y

Y

N

 

N

N

Y

Y

N

Y

N

Y

4.4源程序代码

#include

sbitp3_0=P3^0;

sbitp3_4=P3^4;

sbitp3_5=P3^5;

unsignedcharkey,num;

unsignedcharx,y;

unsignedcharcount;

unsignedcharkeycode;

unsignedcharLED_T[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff};//P1口LED表

flag=0;

start=0;

flagl=0;

voiddelay()//延时

{

unsignedinti;

i=500;

while(i--);

}

intkeyscan()//键盘扫描

{

unsignedcharread,recode,keyvalue;

P2=0xf0;

read=P2;

if(read!

=0xf0)

{

delay();

if(read!

=0xf0)

{

P2=0x0f;

recode=P2;

keyvalue=read+recode;

returnkeyvalue;

}

}

return0;

}

voiddisplay()//显示

{

unsignedcharcodeTable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管段码表

switch(num)

{

case0:

{x=0;y=0;break;}

case1:

{x=1;y=0;break;}

case2:

{x=2;y=0;break;}

case3:

{x=3;y=0;break;}

case4:

{x=4;y=0;break;}

case5:

{x=5;y=0;break;}

case6:

{x=6;y=0;break;}

case7:

{x=7;y=0;break;}

case8:

{x=8;y=0;break;}

case9:

{x=9;y=0;break;}

case10:

{x=0;y=1;break;}

}

p3_4=0;

p3_5=0;

P0=Table[x];

p3_4=0;

p3_5=1;

delay();

p3_4=0;

p3_5=0;

P0=Table[y];

p3_4=1;

p3_5=0;

delay();

}

unsignedchardecode()//解码按键

{

switch(key)

{

case0xb7:

return1;

case0xbb:

return2;

case0xbd:

return3;

case0xbe:

return4;

case0xd7:

return5;

case0xdb:

return6;

case0xdd:

return7;

case0xde:

return8;

}

return0;

}

voidmain()

{

while

(1)

{

while(start==0)//P3.0自锁开关按下,程序跳出循环,开始初始化中断

{

num=10;

P1=LED_T[9];

display();

if(p3_0==0)

start=1;

}

EA=1;

TMOD=0x01;

TH0=0xd8;

TL0=0xf0;

ET0=1;

TR0=1;

count=100;

num=9;

while(flag==0&&p3_0==0)//flag=0且P3.0按下时执行此循环

{

if(flagl==1)//若中断里检测到按键,P1口对应LED亮起

P1=LED_T[num-1];

display();

}

start=0;

flag=0;

flagl=0;

}

}

voidtimer_1(void)interrupt1

{

TH0=0xD8;

TL0=0xf0;

if(p3_0==1)//中断途中抬起P3.0自锁开关,关中断

{

TR0=0;

flag=0;

}

key=keyscan();//检测到按键,解码按键至对应case,并且显示对应数字,关中断,防止再次进入中断,保证锁住状态

if(key!

=0)

{

num=decode();

display();

TR0=0;

flag=0;

flagl=1;

}

count--;//10秒倒计时

if(count==0)

{

num--;

if(num==0)

{

TR0=0;

flag=0;

}

count=100;

}

}

 

第5章结束语

5.1小结

为期一周的课程设计即将结束,在拿到课题后经过仔细的考虑和组员间的分组,我主要负责用绘图工具制作连线图的任务。

在程序以及硬件的完成后经过了解和深刻的认识后,我开始了绘制过程。

说道绘图工具,现在有很多,AUTOCAD,PROTEL,PROTEUS和altiumdesign9等等,我选用了PROTEL来绘制。

作为一款历史悠久的工具相比起PROTEUS的容易仿真,PROTEL也有着其容易控制和强大的PCB版设计。

在绘制过程中,遇到了许多问题,比如元器件的引脚,以及连线不能自动伸缩,在修改时要多费功夫,还有字体大小比例问题等。

在经过长时间的修改后,终于完成了绘制。

5.2心得体会

然后便是开始对实验报告的整理与对自己这一星期来的心得体会。

通过这次试验我发现自己对于软件方面尤其是编写程序那块有着长远的不足,这给了自己警示,提醒自己在未来的学习生活中要更加重视这块方面的练习与实践,光看懂是不够的,学生要能够自己流畅的编写这才是关键。

在这里我要感谢知道我的高桂革老师,是她在设计过程中给了我们许多的帮助,正因为有着她孜孜不倦的教导和指正才会是我们少走许多弯路,令我们顺利的完成了课题。

自己的努力,组员的合作加上老师的教导才有了这次的完成。

 

参考文献

[1]宋彩礼等.《单片机原理与C51编程》.西安交通大学出版社2008年

[2]李泉溪.《单片机原理与应用实例仿真》.北京航天航空大学出版社2009年

[3]江世明.《基于Proteus的单片机应用技术》.电子工业出版社2008年

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

[5]万光毅.《单片机实验与实践教程》.北京航天航空大学出版社2003年

 

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

当前位置:首页 > 职业教育 > 其它

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

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