单片机课程设计 八路抢答器C语言文档格式.docx
《单片机课程设计 八路抢答器C语言文档格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计 八路抢答器C语言文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
它由主机、键盘、显示器等组成。
还有一类计算机,大多数人却不怎么熟悉。
这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。
顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。
因为它体积小,通常都藏在被控机械的“肚子”里。
它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。
现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。
各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。
现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。
究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
在知识竞赛中,特别是做抢答题时,在抢答过程中,为了更确切的知道哪一组或哪一位选手先抢答到题,必须要有一个系统来完成这个任务。
若在抢答中,只靠人的视觉(或者是听觉)是很难判断出哪一组(或哪一个选手)先抢答到题的。
利用单片机编程来设计抢答器,可以使以上问题得以解决,即使两组的抢答时间相差几微秒,也能轻松的分辨出哪一组(或哪个选手)先抢答到题的。
本文主要介绍了抢答器的工作原理及设计,以及它的实际用途。
1.2设计要求:
一、基本功能:
1、六路抢答,抢答有效时相应的灯亮,并有音乐提示;
2、每轮抢答需主持人按“开始”后,抢答才有效;
3、抢答无效时,有相应的灯及音乐提示;
二、扩展功能:
1、扩展到8路或以上;
2、抢答倒计时提示;
3、各路的参赛者有得分显示;
4、其他自行增加的功能;
二基本设计方案
2.1
单片机的选择
我选择STC89C52单片机芯片的理由如下:
1、在设计过程中可能会出现很多问题,89C52可重复烧程序;
2、是80C51的增强型,功能与我们所学的51单片机基本相同;
3、学校配套发的单片机开发板用的就是89C52,有很多相关教程,程序的测试与烧写都十分方便;
4、器材室很方便就能领到。
89C52单片机,是增强型RISC内载Flash的单片机,芯片上的Flash存储器附在用户的产品中,可随时编程,再编程,使用户的产品设计容易,更新换代方便。
89C52单片机采用增强的RISC结构,使其具有高速处理能力,在一个时钟周期内可执行复杂的指令,每MHz可实现1MIPS的处理能力。
89C52单片机工作电压为2.7~6.0V,可以实现耗电最优化。
89C52的单片机广泛应用于计算机外部设备,工业实时控制,仪器仪表,通讯设备,家用电器,宇航设备等各个领域.
2.2单片机的基本结构
MCS-52的引脚说明:
MCS-52系列单片机中的8032、8052及8752均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
具体引脚功能不做赘述了(详细请参见《单片机原理与接口技术》宋跃)。
图2-2-1
STC89C52的引脚图
2.3基本设计思路
因为之前做过单片机最小系统的电路,这次为了节约时间,采取在最小系统的板旁边再焊一块电路。
一看到题目我的基本思路就差不多了,我要实现基本功能好说,倒是拓展不太难,于是选择了拓展到8路和抢答倒计时。
最小系统已经包括了手动复位电路,时钟电路,电源电路和89C52的I/O口排插,这块板上可以用的地方不多,只能焊一个蜂鸣器及其驱动电路了。
在另一块板上需要有8个按键、8个LED灯和一个数码管,并分别对应三个插排。
两块电路板之间高低电平用两根导线连通。
2.4相关功能器材的选择
整体电路需要开关的地方:
电源的启动,主持人的开始与复位,8名抢答选手用的抢答按钮。
考虑到电源需长时间保持开启或断开状态,故采用可保持按下或不按下状态的开关。
同理主持人的“开始”和“未开始”也需要这样的开关。
8名抢答选手用的抢答按钮,只需用4脚的按键即可,按下即接通,松开就断路。
8个LED灯来显示选手的抢答状况,1个LED灯用来显示电源的状况;
一个数码管来显示主持人说“开始”后的倒计时;
一个有源蜂鸣器,用一个NPN管来驱动;
其他电容和电阻用最小系统的。
三具体设计
3.1硬件设计
如上所述,该电路部分电路采用之前做出来的单片机最小系统,根据前面的思路可以在ISIS中摆出电路,如下图所示:
图3.1仿真电路图
3.2软件设计
在ISIS中的89C52可以仿真烧录程序运行,这样可以先在Keil中编程然后烧录看仿真结果,省时省力。
我采用C语言编写程序,详细程序及分析请看附录。
3.3仿真测试
在ISIS中调入hex文件后即可开始仿真,仿真结果如下图所示:
图3.3仿真测试结果
主持人按下“开始”按钮后,数码管开始倒计时,从9到0一秒减一下,也就是抢答倒计时,在数码管显示0之前,8个开关无论哪一个先按下,对应的灯就会亮(蜂鸣器没响,因为仿真不出来),当这个灯亮起后,不论其他的开关怎样按都不能改变灯亮的情况,也就是实现了抢答的功能。
如果数码管减到0了都没人抢答,则抢答作废,这时无论再怎样抢答都不会有灯亮,实现抢答倒计时的功能。
在主持人再次按下“复位”按钮(和“开始”是同一个)时,数码管和LED都熄灭,同时所有人都不能抢答,实现清零功能。
四电路板的制作
4.1元件清单
元件
数量
STC89C52
1
40PIC座
按键
8
开关
2
LED灯(红)
9
排针
3
8管脚数码管
蜂鸣器
S9012
33pF瓷片电容
11.0592晶振
10uF电解电容
1k电阻
10k电阻
电源插口
导线
若干
万用板7*9CM
4.2焊接
在实际焊接过程中,有很多地方元件以及走线十分密集,如8个按键、8个LED灯、8脚数码管和3个排针的焊接,这需要十分的耐心,稍不注意就将排布密集的锡线焊到了一起,只能用锡枪吸走重新焊。
还有一些问题如元件如何摆放平整,如果不平整其他元件难以放得下;
LED灯和数码管不能用高温焊太久,否则会毁掉,到时候很难检查出问题;
元件的排版必须事先计算好,连走线都要想好,不然一步错步步错。
经过一个下午的焊接,最终还是将它做出来了。
五电路功能测试与调试
5.1测试
测试采用5V电源线接电脑供电,先用开发板将程序烧录进89C52,然后插入到板上的IC座,将剩余的线连好后开启电源,电源指示灯亮,结果数码管不亮,按抢答器也不亮,复位键也无任何作用,蜂鸣器也不响。
5.2调试
一下是我遇到的问题及解决的过程。
1、除电源键外,其他键都无反应,蜂鸣器也不响。
仔细检查电路后,我发现是接口接触的问题,而且我NPN管忘了接P0口。
2、通电后,数码管不亮,能实现抢答器的功能,但一旦按下按键蜂鸣器一直响。
后来发现是我程序我的问题,仿真上显示不出来,于是我修改程序。
3、通电后,能实现抢答的功能,蜂鸣器也能正常工作了,但是数码管显示乱码,还是一秒一跳。
后来我发现本身程序有一点问题,仿真程序上的数码管和我自己用的数码管不同,只能修改程序。
最后,经过一系列的调试与修改后,终于实现了预期功能。
六心得体会
经过一个星期的努力,我完成了设计任务,通过此次课程设计,我重新认识到了自学的重要性,以及学以致用的道理。
我在图书馆以及网上查阅了大量的资料,同时也认识到了查阅信息的重要作用。
通过此次的抢答器的设计,让我重新拾起了以前所学习的电子知识,及我觉得此次设计让我更加巩固了所学的知识并在设计的过程中学会了与时俱进,让我受益匪浅。
这一次课程设计的练习,很多事情我都不可以独立完成,很多方面都需要同学的帮助,我也深刻认识到自己的不足,知识的欠缺问题很大,需要在编程方面大下功夫。
同时因为我这次课程设计用的是C语言,也希望自己学的更好了以后,能用汇编语言来实现同样的功能。
还有一点很重要,不能依赖仿真软件,软件本身有很多弊端不说,仿真出来的结果也不一定正确,很容易被误导,
附录
电路板实物图:
C程序:
#include<
reg51.h>
unsignedcharflag,num1,num2;
sbita1=P3^0;
//P3口开关
sbita2=P3^1;
sbita3=P3^2;
sbita4=P3^3;
sbita5=P3^4;
sbita6=P3^5;
sbita7=P3^6;
sbita8=P3^7;
sbitb1=P1^0;
//P1口蜂鸣器
sbitb2=P1^1;
sbitb3=P1^2;
unsignedcharcodetable[]={0x80,0xf9,0x4c,0x60,0x31,0x22,0x02,0xf0,0x00,0x20};
//数码管显示
voiddisplay()
{
P2=table[num2];
//P2口数码管
}
voidinit()
num2=9;
TMOD=0X01;
TH0=(65536-45872)/256;
TL0=(65536-45872)/256;
EA=1;
ET0=1;
TR0=1;
flag=1;
//全局变量
P0=0xff;
//P0口LED灯
b1=1;
P2=0xff;
voiddelay(intz)//延时程序
inti,j;
for(i=0;
i<
z;
i++)
for(j=0;
j<
110;
j++);
voidmain()
init();
while(flag)
{
if(a1==0)
delay(100);
//调用延时程序消除抖动
if(a1==0)//判断开关a1是否按下
flag=0;
P0=0xfe;
//对应LED灯亮
b1=0;
//蜂鸣器响
while(!
a1);
//按住时持续响
b3=0;
}
if(a2==0)//同理判断a2
if(a2==0)
P0=0xfd;
a2);
}
if(a3==0)//同理判断a3
if(a3==0)
P0=0xfb;
a3);
if(a4==0)//同理判断a4
if(a4==0)
P0=0xf7;
while(