资源描述
电子科协竞赛项目报告书
参赛作品:基于51单片机四路电子抢答器
小 组 成 员: TH XZ
专 业 班 级: 电信1005班
报告提交日期: 3 月 16 日
目录
1设计规定与功能 4
1.1设计基本规定…………………………………………………………………...4
2 硬件设计 4
2.1控制系统及所需元件…………………………………………………………. 4
2.2抢答器显示模块………………………………………………………………...5
2.3 电源方案选取 6
2.4 抢答器键盘选取 6
2.5蜂鸣器模块 7
2.6外部振荡电路 7
3 程序设计 7
3.1程序流程图 7
3.2系统调试…… ………………………………….. …………………………9
3.3 焊接问题及解决……………………………………………………… …10
4总结 10
附录 C程序 11
一设计规定与功能
1.1设计基本规定
(1)抢答器同步供4名选手或4个代表队比赛使用,分别用4个按钮K1~K4表达。
(2)设立裁判开关k5和清零开关k6,该开关由主持人控制,当主持人按下k6,系统复位,预备抢答,当主持人按下总控制控制开关k5,开始抢答;
(3)抢答器具备定期抢答功能,抢答时间为倒计时15秒。当主持人启动“开始”键后,定期器进行减计时,同步扬声器发出短暂提示声响,声响持续时间0.5秒左右,当计时不大于5秒后,每减少一秒,便报警一次以提示选手。
(4)抢答器具备锁存功能,参赛选手在设定期间内进行抢答,抢答有效,蜂鸣器发声,计时停止,数码管上显示选手编号和时间,选手相应信号灯被点亮,其她选手再抢答时无效。
(5)如果定期时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答。等待下一轮抢答。
。
二 硬件设计
2.1控制系统及所需元件
控制系统重要由单片机应用电路、存储器接口电路、显示接口电路构成。其中单片机STC89C52是系统工作核心,它重要负责控制各个某些协调工作。
所需元件:该系统核心器件是 STC89C52。各口功能:
P0.0-P0.3 是数码管位选口;
P2.0-P2.7是数码管段选口,为其传送段选信号;
P1.0-P1.3是4组抢答信号输入口;
P1.4、P1.5由裁判控制,分别是抢答开始\复位功能键;
P1.6为蜂鸣器控制口;
P3.4-P3.7为选手信号灯输出口;
在其外围接上电复位电路、数码管电路、LED发光二极管、按键电路及扬声器电路。
电子抢答器用单片机来设计制作完毕,由于其功能实现重要是通过软件编程来完毕,因此采用单片机STC89C52,它是一种低电压,高性能CMOS 8位单片机,片内含8k bytes可重复擦写Flash只读程序存储器和512 bytes随机存取数据存储器(RAM),器件采用ATMEL公司高密度、非易失性存储技术生产,兼容原则MCS-51指令系统,片内置通用8位中央解决器和Flash存储单元,功能强大STC89C52单片机可为您提供许多较复杂系统控制应用场合。下图为其I/O口引脚图:
STC89C52管脚图
2.2. 抢答器显示模块
显示模块分为数码管模块和LED信号灯模块
分别采用四位一体共阴极数码管和四个发光二极管,体积小,功耗低,故障率低,程序编译容易,资源占用较少。(见图1,图2)
图1
图2
2.3 电源方案选取
系统需要5V电源来驱动单片机STC89C52。
运用电脑USB接口可以提供5V电压来驱动单片机。
2.4抢答器键盘选取
键盘是单片机不可缺少输入设备,是实现人机对话纽带。键盘按构造形式可以分为非编码键盘和编码键盘,前者用软件办法产生键码,而后者则用硬件办法来产生键码。在单片机中使用都是非编码键盘,由于非编码键盘构造简朴,成本低廉,非编码键盘类型诸多,惯用有独立式键盘,行列式键盘等。
本设计采用独立式键盘。
键盘接口中使用多少根I/O线,键盘中就有几种按键,键盘接口使用了6根I/O口线,该键盘就有6个按键,这种类型键盘,其按键比较少,且键盘中各按键工作互不干扰。因而可以依照实际需要对键盘中按键灵活编码。如图所示。
最简朴编码方式就是依照I/O输入口所直接反映相应按键,按下状态进行编码,称按键直接状态码,对于这样编码独立式键盘,CPU可以通过直接读取I/O口状态来获取按键直接状态编码值,依照这个值直接进行按键辨认,这样形式键盘构造简朴,按键辨认容易。
独立式键盘缺陷是需要占用比较多I/O口线,当单片机应用系统键盘中需要按键比较少或I/O口线比较富余时,可以采用这样类型键盘。
其模块电路图如图4所示。采用六个BUTTON 按钮作为抢答选取按钮,与STC89C52P1.0-P1.5相连。
图4 键盘模块
2.5蜂鸣器模块
蜂鸣器是一种一体化构造电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定期器等电子产品中作发声器件,其图形如图所示.
2.6 外部振荡电路
外部振荡电路单片机必要在AT89C52驱动下才干工作.在单片机内部有一种时钟振荡电路,只需要外接一种振荡源就能产生一定期钟信号送到单片机内部各个单元,外部振荡电路见图所示。
三 程序设计
3.1程序流程图:
初始化某些
K5= =0
启动中断,数码管开始倒计时
若有选手抢答
中断停止,数码管显示选手标号并点亮信号灯
结束
开始
N
Y
Y
N
抢答器主程序流程图
定期器0中断
1秒时间到?
中断返回
N
秒加1
数码管显示秒值
Y
抢答器定期器中断流程图
扫 描 键 盘
K0键按下
K1键按下
K3键按下
K2键按下
扫描停止
与K0键相应发光二极管亮及数码管显示
与K1键相应发光二极管亮及数码管显示
与K2键相应发光二极管亮及数码管显示
与K3键相应发光二极管亮及数码管显示
Y
Y
Y
Y
N
N
N
N
键盘扫描流程图
主程序
咱们组所设计抢答器程序采用是C程序设计,C语言明显特点是用二进制来编写程序,程序各个某些除了必要信息交流外彼此之间互相独立。这种构造化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供应顾客,这些函数可以便调用,并具备各种循环、条件语句控制程序流向,从而使程序完全构造化。虽然C语言也是强类型语言,但它语法比较灵活,容许程序编写者有较大自由度。本次设计主程序中涉及时钟设计程序,定期器中断子程序,LED显示程序以及按键控制子程序,详细程序见附件。
3.2系统调试
系统调试涉及硬件调试和软件调试,并且两者是密不可分。咱们设计好硬件电路和软件程序,只有通过联合调试,才干验证其对的性;软硬件配人状况以及与否达到设计任务规定,也只有通过调试,才干发现问题并加以解决、完善,最后开发成实用产品。
硬件调试分单元电路调试和联机调试,单元电路实验在硬件电路设计时已经进行,这里调试只是将其制成印刷电路板后实验电路与否对的,并排除某些加工工艺性错误(如错线、开路、短路等)。这种调试可单独模仿进行,也可通过开发装置由软件配合进行。硬件联机调试则必要在系统软件配合下进行。
软件调试普通涉及分块调试和联机调试两个阶段。程序分块调试普通在单片机开发装置上进行,可依照所调程序功能块入口参量初值编制一种特殊程序段,并连同被调程序功能块一起在开发装置上运营;也可配合相应硬件电路单独运营某程序功能块,然后检查与否对的,如果执行成果与预想不一致,可以通过单步运营或设立断点办法,查出因素并加以改正,直到运营成果对的为止。这时该 程序功能块已调试完毕,可去掉附加程序段。其他程序功能块可按此法进行调试。程序联机调试就是将已调试好各程序功能块按总体构造联成一种完整程序,在所研制硬件电路上运营。从而实验程序整体运营完整性、对的性和与硬件电路配合状况。在联调中也许会有某些支路上程序、功能块因受条件制约而得不到相应输入参数,这时,调试人员应创造条件进行模仿调试。在联调中如发现硬件问题也应及时修正,直到单片机系统软件、硬件所有调试成功为止。系统调试完毕后,还要进行一段时间试运营,从而检查系统稳定性和抗干扰能力,验证系统功能与否达到设计规定,与否达到预期效果。
3.3 焊接问题及解决
普通来说,导致硬件问题首要问题就是焊接了,也就是说焊接好与坏直接响产品正常运营。导致焊接质量不高常用因素是:①焊锡用量过多,形成焊点锡堆积;焊锡过少,局限性以包裹焊点。②冷焊。焊接时烙铁温度过低或加热时间局限性,焊锡未完全熔化、浸润、焊锡表面不光亮(不光滑),有细小裂纹(犹如豆腐渣同样!)。③夹松香焊接,焊锡与元器件或印刷板之间夹杂着一层松香,导致电连接不良。若夹杂加热局限性松香,则焊点下有一层黄褐色松香膜;若加热温度太高,则焊点下有一层碳化松香黑色膜。对于有加热局限性松香膜状况,可以用烙铁进行补焊。对于已形成黑膜,则要"吃"净焊锡,清洁被焊元器件或印刷板表面,重新进行焊接才行。④焊锡连桥。指焊锡量过多,导致元器件焊点之间短路。这在对超小元器件及细小印刷电路板进行焊接时要尤为注意。⑤焊剂过量,焊点明围松香残渣诸多。当少量松香残留时,可以用电烙铁再轻轻加热一下,让松香挥发掉,也可以用蘸有无水酒精棉球,擦去多余松香或焊剂。⑥焊点表面焊锡形成尖锐突尖。这多是由于加热温度局限性或焊剂过少,以及烙铁离开焊点时角度不当浩成内。
。
总 结
通过近半个月努力,在咱们合伙下,咱们较好完毕了这次设计项目,通过本次电子制作比赛,咱们重新结识到了自学重要性,以及学以致用道理。咱们在图书馆和网上查阅了大量资料,同步也结识到了图书馆重要作用。 通过本次抢答器设计,让咱们更加注重到专业知识重要性及动手能力 必要性,在整个制作过程中,咱们浮现诸多问题,但咱们并没有因而而放弃,在不断调试和失败中,咱们不但学到了专业知识,更是磨炼了咱们心智,让咱们受益匪浅。任何事情只要去做,多多去尝试,努力要以自己去做为前提心态,那么任何事情虽然做不好,也会受益诸多,不是有句话叫做:心态决定成败话吗,实在是有理。无论做什么事情都不也许一帆风顺,遇到阻碍不要舍弃,不要踟蹰不前,不经历风雨,怎么见彩虹!
在此后学习过程中,应当多到图书馆看某些专业方面书籍,例如protel画图,proteus仿真软件,以丰富自己知识,掌握更多硬件与软件设计技巧,使咱们在此后制作中提高效率。这次设计任务也使咱们加深了对单片机及接口技术理解和应用,由于知识水平局限,设计中也许会存在着某些局限性,咱们真诚接受教师和同窗批评和指正.。
附录(C程序)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
Uchar code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管0~9编码
uint i,j,time,num;
uchar ge,shi;
bit flag,flag1;
sbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;
sbit k4=P1^3;sbit k5=P1^4;sbit k6=P1^5;
//k1~k4为选手按键,k5为主持人开关,k6为复位键
sbit beep=P1^6;//定义蜂鸣器端口
sbit wei1=P0^0;sbit wei2=P0^1;
sbit wei3=P0^2;sbit wei4=P0^3;//定义数码管位选端口
sbit led1=P3^4;sbit led2=P3^5;
sbit led3=P3^6;sbit led4=P3^7;//定义LED灯端口
void delay(uint a)//延时函数
{
uint i,j;
for(i=a;i>0;i--)
for(j=110;j>0;j--);
}
void display()//显示函数
{
shi=time/10;
ge=time%10;
P2=table[num];//显示选手编号
wei1=0;delay(1);
wei1=1;
P2=table[shi];
wei3=0;
delay(1); //显示时间
wei3=1;
P2=table[ge];
wei4=0;
delay(1);
wei4=1;
}
void keyscan()
{
if(k1==0)//按键按下
{
delay(10);//延时去抖动
if(k1==0)
{
num=1;led1=0;flag=1;TR0=~TR0;TR1=0;//开定期器0,关定期器1
beep=1;delay(500);beep=0;//蜂鸣器响500毫秒
while(!k1);//等待按键释放
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
num=2;led2=0;flag=1;TR0=~TR0;TR1=0;
beep=1;delay(500);beep=0;
while(!k2);
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
num=3;led3=0;flag=1;TR0=~TR0;TR1=0;
beep=1;delay(500);beep=0;
while(!k3);
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
num=4;led4=0;flag=1;TR0=~TR0;TR1=0;
beep=1;delay(500);beep=0;
while(!k4);
}
}
display();//显示选手编号和时间
if(time==0)
{
TR0=0;
TR1=0;
flag=1;//关计时器0和1
}
if(time==6)
TR1=1;
}
void init()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;ET0=1;ET1=1;
beep=0;//作品上蜂鸣器是赋高电平响,开始置低关闭
}
void main()
{
init();//初始化
while(1)
{
display();
if(k6==0)
{
delay(10);
if(k6==0)
{
P3=0xff;//关闭所有LED灯
flag1=k6;
time=15;
wei1=0;
num=0;
P2=table[num];
while(!flag1)
{
if(k5==0)
{
delay(10);
if(k5==0)
{
flag1=1;flag=k5;
TR0=1;
beep=1;delay(500);beep=0;
while(!k5);
while(!flag)
keyscan();//扫描键盘
}
}
}
}
}
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20)
{
i=0;
time--;
}
}
void time1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
j++;
if(j==10)
{
j=0;
beep=~beep;
}
}
展开阅读全文