单片机八人抢答器课程设计报告.docx
《单片机八人抢答器课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机八人抢答器课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
单片机八人抢答器课程设计报告
单片机计课程设报告
八人抢答器
专业:
电子信息工程
姓名:
学号:
2014-12-3
一:
名称与目的
1.设计要求及目的
二:
硬件电路设计
1.总体原理图
2.时钟频率电路的设计
3.复位电路的设计
4.显示电路的设计
5.键盘扫描电路的设计
6.发声
7.系统复位
三.系统软件设计
1.系统原理图
2.程序流程图
3.程序
四.调试
1.系统的调试
2.具体调试
3.调试实物图
第一章:
要求:
1、八人抢答逻辑:
只有一个最先抢答有效。
2、在主持人控制下,10秒内抢答有效。
3、采用数码管显示抢答10秒倒计时,若有抢答直接结束,显示结果。
4、抢答结束后用数码管显示抢答结果:
抢答有效人编号;若有异常(提前抢答,犯规),显示抢答人编号和E,本次抢答结束。
5、设主持人控制键、复位键。
控制键:
启动抢答
复位键:
系统复位
6、开始、正常结束、抢答结束、违规抢答采用声音提示。
第二章:
系统硬件设计
为使硬件电路设计尽可能合理,应注意以下几方面:
(1)尽可能采用功能强的芯片,以简化电路,功能强的芯片可以代替若干普通芯片,随着生产工艺的提高,新型芯片的的价格不断下降,并不一定比若干普通芯片价格的总和高。
(2)留有设计余地。
在设计硬件电路时,要考虑到将来修改扩展的方便。
因为很少有一锤定音的电路设计,如果现在不留余地,将来可能要为一点小小的修改或扩展而被迫进行全面返工。
(3)程序空间,选用片内程序空间足够大的单片机,本设计采用STC89C52单片机。
(4)I/O端口,在样机研制出来后进行现场试用时,往往会发现一些被忽视的问题,而这些问题不是靠单纯的软件措施来解决的。
如有些新的信号需要采集,就必须增加输入检测端;有些物理量需要控制,就必须增加输出端。
如果在硬件电路设计就预留出一些I/O端口,虽然当时空着没用,那么用的时候就派上用场了。
原理图:
2.时钟频率电路的设计:
单片机必须在时钟的驱动下才能工作.在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度
。
外部振荡源电路
一般选用石英晶体振荡器。
此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。
电路中两个电容C1,C2的作用有两个:
一是帮助振荡器起振;二是对振荡器的频率进行微调。
C1,C2的典型值为30PF。
单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。
其大小是时钟信号频率的倒数,常用fosc表示。
如时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12µs
3.复位电路的设计
单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如图所示:
复位电路
值得注意的是,在设计当中使用到了硬件复位和软件复位两种功能,由上面的硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值,而前面的功能介绍中提到了倒计时时间的记忆功能,该功能的实现的前提条件就是不能对单片机进行硬件复位,所以设定了软复位功能。
软复位实际上就是当程序执行完毕之后,将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。
4.显示电路的设计
显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。
5.键盘扫描电路的设计
键盘是人与微机系统打交道的主要设备。
关于键盘硬件电路的设计方法也可以在文献和书籍中找到,配合各种不同的硬件电路,这些书籍中一般也提供了相应的键盘扫描程序。
站在系统监控软件设计的立场上来看,仅仅完成键盘扫描,读取当前时刻的键盘状态是不够的,还有不少问题需要妥善解决,否则,人们在操作键盘就容易引起误操作和操作失控现象。
在单片机应用中键盘用得最多的形
式是独立键盘及矩阵键盘。
独立键盘
而且在程序设计上也不复杂,一般用在对硬件电路要求不高的简单电路中;矩阵键盘与独立键盘有很大区别,首先在硬件电路上它要比独立键盘复杂得多,而且在程序算法上比它要烦琐,但它在节省端口资源上有优势得多,因此它更适合于多按键电路。
其次就是消除在按键过程中产生的“毛刺”现象。
这里采用最常用的方法,即延时重复扫描法,延时法的原理为:
因为“毛刺”脉冲一般持续时间短,约为几ms,而我们按键的时间一般远远大于这个时间,所以当单片机检测到有按键动静后再延时一段时间(这里我们取10ms)后再判断此电平是否保持原状态,如果是则为有效按键,否则无效。
6.发声
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使喇叭发出不同的声音。
7.系统复位
使CPU进入初始状态,从0000H地址开始执行程序的过程叫系统复位。
从实现系统复位的方法来看,系统复位可分为硬件复位和软件复位。
硬件复位必须通过CPU外部的硬件电路给CPU的RESET端加上足够时间的高电位才能实现。
三.系统软件设计
软件任务分析和硬件电路设计结合进行,哪些功能由硬件完成,哪些任务由软件完成,在硬件电路设计基本定型后,也就基本上决定下来了。
1.系统原理图
2.2.程序流程图
在本设计中包括了以下八个主要的程序:
主程序;非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。
主流程图如图所示:
程序:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#definesled_dm_portp0
#definesled_wm_portp2
uchar
table{}={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,
0x86,0x8e};
/*0123456789
abcdef*/
sbitSW1=P2^0;
sbitSW2=P2^1;
sbitSW3=P2^2;
sbitSW4=P2^3;
sbitSW5=P2^4;
sbitSW6=P2^5;
sbitSW7=P2^6;
sbitSW8=P2^7;
sbitSTART=P1^3;
sbitRESET=P1^5;
sbitADD=P1^6;
sbitDEC=P1^7;
sbitA=P1^4;
sbitH1=P1^0;
sbitH2=P1^1;
sbitH3=P1^2;
voidfengming();
voidkeyscan();
voiddisplay();
voiddelay(uint);
voidFUWEI();
voidqushu();
uintinput=30;
ucharge,shi,bai=0,n=1,m=0,t=0,temp;
voidmain()
{
TMOD=0x01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
EA=1;
ET0=1;
while
(1)
{
keyscan();
qushu();
display();
}
}
voidFUWEI()
{
TR0=0;
TH0==(65536-46080)/256;
TL0=(65536-46080)%256;
T=0;
fengming();
bai=0;
input=30;
}
voiddisplay()
{
H1=0;
P0=table[bai];
Delay
(1);
H1=1;
H2=0;
P0=table[shi];
delay
(1);
H2=1;
H3=0;
P0=table[ge];
Delay
(1);
H3=1;
}
voidqushu()
{
shi=input/10;
ge=input%10;
}
voidkeyscan()
{
if(RESET==0)
{
delay(200);
FUWEI();
n=1;
}
if(n)
if(START==0)
{
fengming();
TR0=1;
m=1;
n=0;
}
If(n)
{
If(ADD==0)
{
Delay(200)
Input++
}
If(DEC==0)
{
Delay(200);
Input--;
}
}
If(m)
{
If(P1!
=0xFF)
{
temp=P1;
m=0;
START
switch(temp)
{
case0xFE:
bai=1,fengming();
break;
case0xFD:
bai=2,fengming();
break;
case0xFB:
bai=3,fengming();
break;
case0xF7:
bai=4,fengming();
break;
case0xEF:
bai=5,fengming();
break;
case0xDF:
bai=6,fengming();
break;
case0xBF:
bai=7,fengming();
break;
case0x7F:
bai=8,fengming();
break;
}
TR0=0;
}
}
}
voidtimer()interrupt1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
t++;
if(t==20)
{
t=0;
input--;
if(input==0)
FUWEI();
qushu();
}
}
voiddelay(uintz)
{
uintx,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
voidfengming()
{
uinti;
for(i=1;i>0;i--)
{A=1;
delay(500);
A=0;
}
最后一步进行此程序的调试运行。
该仿真结果显示了当评委按下复位健时并开始时,计时器从10秒开始计时,然后每个选手可在十秒内的时间里答出题,并可按下按键。
该课程设计需要C语言的编程知识,并且需要硬件接口电路的仿真,从中学了很多的东西。