单片机课设八路抢答器Word格式.docx
《单片机课设八路抢答器Word格式.docx》由会员分享,可在线阅读,更多相关《单片机课设八路抢答器Word格式.docx(11页珍藏版)》请在冰点文库上搜索。
![单片机课设八路抢答器Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/869e15cf-19e1-49e3-814c-b6a2b1ad90b3/869e15cf-19e1-49e3-814c-b6a2b1ad90b31.gif)
在主持人确认后,按下复原按钮,状态指示灯重新点亮,为下一次的抢答作好准备。
电路中的蜂鸣器LS是一只带有助音腔的压电陶瓷蜂鸣器,用于模拟发出报警声的功率放大器和喇叭。
LS可以看作是一个电容性负载,本身不能流过直流电流。
发声的原理是,作用在两个电极极板的电位在发生变化时,陶瓷材料就发生弯曲,从而振动空气发出声音。
2系统硬件设计
2.1AT89C51单片机介绍
AT89C51单片机主要有以下部件构成:
八位微处理器CPU、振荡电路、总线控制部件、中断控制部件、片内Flash存储器、片内RAM、并行I/O接口、定时器和串行I/O接口。
AT89C51单片机内部由CPU、4KB的FPEROM,128B的RAM,两个16位的定时/计数器T0和T1,4个8位的I/O端P0、P1、P2、P3等组成。
单片微机内部最核心的部分是CPU。
AT89C51的主要引脚如图3.1所示。
图3.1AT89C51引脚图
2.2系统原理电路图
基于以上各个模块的设计,可以设计出系统原理电路图,P3.0为开始抢答,P3.1为停止,P1.0-P1.7为八路抢答输入,数码管段选P0口,位选P2口低3位,蜂鸣器输出为P3.6口,RST复位,XTAL1和XTAL2接晶振电路。
系统原理电路图如图3.2所示。
图3.2系统原理电路图
3系统软件设计
为了能够达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前必须先设定抢答的时间,因而在编开始抢答前的程序得先编写设定时间的程序,当时间设好了之后,主持人发布抢答命令按下P3.0按键,程序开始打开定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。
当在扫描到有人按下了答题键,马上关闭T0、调用显示程序、封锁键盘。
3.1系统流程图设计
系统流程图如图4.1所示。
图4.1系统流程图
4总结
本次设计按照题目要求,基于单片机,利用较合适的控制算法,成功的实现了抢答器的基本功能。
硬件原理结构简单,减少硬件成本和繁琐的电脑连接;
软件设计方面,设计简单,可塑造性强,便于维护。
通过此次单片机课程设计,我学到了很多的东西,不仅巩固了以前所学过的知识,而且在调试仿真的实际操作过程中加强了实践能力。
这使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能提高自己的综合实力。
在此次设计的过程中,也遇到了不少困难,发现了自己的不足之处,如对以前所学过的知识理解得不够深刻,掌握得不够牢固,这次课程设计之后,一定把以前所学过的知识重新温故,提高对知识的实际应用能力。
参考文献
[1]冯育长.单片机系统设计与实例指导[M].西安:
西安电子科技大学出版社,2007.
[2]李华,王思明,张明敏.单片机及应用[M].兰州:
兰州大学出版社,2001.
[3]高伟.AT89单片机原理及应用[M].北京:
国防工业出版社,2008.
附录1(程序代码)
序名:
QuizBuzzer.c
源程序代码如下:
#include<
reg51.h>
#defineuintunsignedint
#defineucharunsignedchar
unsignedcharcodetable[]={0x40,0x79,/*共阴极数码管编码表0-f显示*/
0x24,0x30,0x19,0x12,0x02,0x78,0x00,
0x10,0x08,0x03,0x46,0x21,0x06,0x0e};
sbitstart=P3^6;
/*变量定义*/
sbitstop=P3^5;
sbitreset=P3^7;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitkey6=P1^5;
sbitkey7=P1^6;
sbitkey8=P1^7;
sbitbuzzer=P3^4;
bitstart_flag=0;
bitstop_flag=0;
bitkey1_flag=0;
bitkey2_flag=0;
bitkey3_flag=0;
bitkey4_flag=0;
bitkey5_flag=0;
bitkey6_flag=0;
bitkey7_flag=0;
bitkey8_flag=0;
bitreset_flag=0;
bitaction=0;
ucharsecond=20;
uchartimer0_count=0;
ucharnumber=0;
ucharnumber_display=0;
voiddelay(uintz)/*延时函数delay()*/
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voiddisplay(ucharnumber,ucharsecond)/*数码管显示驱动函数display()*/
ucharsecond_first,second_second;
second_first=second/10;
second_second=second%10;
P2=0xfe;
P0=table[number];
delay
(2);
P2=0xfd;
P0=0x3f;
P2=0xfb;
P0=table[second_first];
P2=0xf7;
P0=table[second_second];
voidstart_keyscan()/*开始键扫描函数start_keyscan()*/
if(start==0)
{
delay(8);
if((start==0)&
&
(!
start_flag))
{
start_flag=1;
action=1;
TR0=1;
}
}
else
start_flag=0;
}
voidfengming()/*蜂鸣函数fengming(),脉宽t=1ms周期T
{=2ms,频率f=0.5khz,用以报警*/
buzzer=0;
/*给P3.7口送高电平*/
delay(100);
/*延时1ms*/
buzzer=1;
delay(100);
voidmain()/*主函数main()*/
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
while
(1)
{
start_keyscan();
reset_keyscan();
while(action==1)
{if(second<
=5&
second>
0)
fengming();
while(!
key_scan8()&
!
stop==0)
{
display(number_display,second);
if(second==0)
{
second=20;
break;
}
}
TR0=0;
display(number_display,second);
action=0;
break;
display(number_display,second);
voidtimer0()interrupt1/*中断服务函数timer0()interrupt1*/
timer0_count++;
if(timer0_count==20)
timer0_count=0;
second--;
if(second<
if(second==0)
TR0=0;
number_display=0;
action=0;
附录2(仿真图)
开始时的仿真图和抢答后的仿真图分别如图1、2所示。
图1开始时仿真图
图2抢答后仿真图