单片机多路抢答器设计Word下载.docx
《单片机多路抢答器设计Word下载.docx》由会员分享,可在线阅读,更多相关《单片机多路抢答器设计Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
现在我们对这些引脚的功能加以说明。
图2-1STC89C52的引脚图
1.电源引脚
(1)Vcc(40脚)电源端
GND(20脚)接地端
(2)工作电压为5V
2.外接晶体引脚
XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。
内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。
晶振的频率可以在1MHz-24MHz内选择[4]。
电容取30PF左右。
图2-2晶振电路
3.复位RST(9引脚)
在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引退时,将使单片机复位,只要这个引脚保持高电平,51芯片便循环复位。
复位后P0-P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零[5]。
当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。
图2-3复位电路
4.输入输出引脚
(1)P3端口[P3.0-P3.7]P3是一个带有内部上拉电阻的8位双向I/0端口。
输出时可驱动4个TTL[5]。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接控制信息。
除此之外P3端口还用于一些专门功能,具体请看下面功能表。
表2-1P3功能表
(2)P2端口[P2.0-P2.7]P2是一个带有内部上拉电阻的8位双向I/0端口。
输出时可驱动4个TTL。
对内部Flash程序存储器编程时,接收高8位地址和控制信息。
在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。
而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。
(3)P1端口[P1.0-P1.7]P1是一个带有内部上拉电阻的8位双向I/0端口。
对内部Flash程序存储器编程时,接收低8位地址信息。
(4)P0端口[P0.0-P0.7]P0是一个8位漏极开路型双向I/O端口,端口置1(对端口写1)时作高阻抗输入端。
作为输出口时能驱动8个TTL。
对内部Flash程序存储器编程时,接收指令字节;
校验程序时输出指令字节,要求外接上拉电阻[7]。
在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,访问期间内部的上拉电阻起作用。
(二)、数码管简介
四、系统功能框图
本次设计八路抢答器系统主要有五部分电路:
选手抢答电路、八段显示电路、蜂鸣器报警电路、主持人控制电路。
本次设计的八路抢答器可实现以下基本功能:
◆启动电源后系统自动倒计时3秒。
◆抢答器同时供八名选手比赛,分别用八个按钮SW1~SW8表示。
◆抢答器具有锁存与显示功能。
即选手按动按钮时会锁存相应的编号,并且优先抢答选手的编号一直保持到主持人将系统清除为止。
◆违规抢答,蜂鸣器会报警,而且锁存抢答队员的号码,并闪烁显示。
◆主持人关电源清除号码。
五、硬件电路设计
1、最小系统设计
图3-1STC89C52最小系统
说明:
(1)复位电路:
教材一般电容取10u,电阻R取8.2K[9]。
(2)晶振电路:
典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)或者12MHz(产生精确的方波便于12分频,方便定时操作)。
(3)电源接5V变压器。
六、总电路图
下图是电路原理图
总电路图
七、系统主程序
目前,单片机的编程语言主要有C语言和汇编语言两种。
C语言是高级语言,编写起来比较简便且易维护,汇编语言介于机器语言和高级语言之间,更接近硬件,但编写起来比较冗长。
介于本次程序不太复杂,本人又更喜欢汇编,故本次设计的程序采用汇编语言来写,详见附录一。
八、系统仿真与调试
1、Protues软件介绍
Protues的ISIS是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业单片机仿真系统。
下图是Protues软件初始界面:
图5-1Protues软件初始界面该软件的特点有:
(1)满足常用单片机软件仿真系统的标准,并在同类产品中具有明显优势。
(2)具有模电仿真、数电仿真、单片机及其外围电路组成系统仿真。
(3)目前支持的单片机类型有:
68000系列、8051系列、AVR系列、PIC系列以及各种外围芯片。
(4)支持大量的存储器和外围芯片。
Protues与其它单片机仿真软件不同的是,它不仅能仿真单片机的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路情况。
因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程及结果。
对于这样的仿真实验,从某种意义上讲,弥补了实验和工程应用间脱节的矛盾现象。
2、Keil软件介绍
Keil软件是目前最流行开发MCS-51系列单片机软件,Keil软件提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
下图是本人安装的Keil软件初始界面:
图5-2Keil软件初始界面
九、实物图
十、元件清单:
位号
名称
规格
数量
D1
共阳数码管
3.8*5.6cm
1
晶振
12M
STC89C52
STC89C52单片机
led
红色led
5mm
R1
电阻
470欧姆
Q1
三极管
8550
U1
蜂鸣器
J1---J8
按键开关
8
S1
电源开关
自锁开关
万用板
7*9cm
插针
排插
常用排插
4+8=12
40引脚DIP插槽
DIP插槽
40引脚
电源接线插口
2口
十一、焊接问题及解决
一般来说,造成硬件问题的首要原因就是焊接失误,即焊接的好坏直接影响到产品的正常与否,在本次设计制作的焊接过程中遇到了一些问题,通过查找资料,找到了相关原因:
1)焊锡用量过多导致焊点的锡堆积;
焊锡过少又不足以包裹焊点;
2)冷焊。
焊接时烙铁温度过低或加热时间不足,焊锡未完全熔化、浸润、焊锡表面不光亮,有细小裂纹。
3)焊锡连桥。
指焊锡量过多,造成元器件的焊点之间短路。
4)焊点表面的焊锡形成尖锐的突尖。
这多是由于加热温度不足或焊剂过少,以及烙铁离开焊点时角度不当造成的。
有时,调试时最小系统的电路不工作,通过查资料才明白,首先应该确认电源电压是否正常。
用电压表测量接地引脚跟电源引脚之间的电压,看是否符合电源电压,电路需5V电源供电,故我们选择了用双公USB从电脑上供电,省去好多变压的麻烦。
参考文献
[1]王冬梅,张建秋.基于单片机的八路抢答器设计与实现[J].佳木斯大学学报,2009,
27(3):
350.
[2]周功明,周陈琛.基于单片机AT89C2051的九路多功能智力竞赛抢答器的设计[J].现代电子技术,2006,10(20):
4.
[3]谢道平.基于Proteus仿真的单片机多功能智能抢答器的设计[J].长春大学学报,2011,
21(10):
12.
[4]耿仁义等.新编微机原理及接口技术.2006.
[5]文明月.基于AT89S52单片机的抢答器设计与实现[J].科技创新导报,2009,28(10):
35.
[6]周润景,张丽娜.基于PROTEUS的电路及单片机系统设计与仿真[M].北京:
北京航天航空大学出版社,2006.
[7]周坚.单片机C语言轻松入门[M].北京:
[8]李萍,张池,张勃.AT89S51单片机原理、开发与应用实例[M].北京:
中国电力出版社,2008.
[9]杨居义,单片机原理,清华大学出版社
附录
附录一:
抢答器程序
#include<
reg52.h>
unsignedcharc1,c2,c3,c4,c5,c6;
intj,k;
sbitfeng=P3^7;
sbitk1=P1^0;
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
sbitk6=P1^5;
sbitk7=P1^6;
sbitk8=P1^7;
unsignedcodetable[]=
{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
voiddelay1()
{unsignedinti,j;
for(i=600;
i>
0;
i--)
for(j=10;
j>
j--);
}voidmain(){
for(k=400;
k>
k--)
{
for(j=100;
j--)
P2=table[3];
if(k1==0)
{while
(1)
feng=0;
P2=table[1];
delay1();
P2=0xff;
}
if(k2==0)
{feng=0;
P2=table[2];
}if(k3==0)
P2=table[3];
}if(k4==0)
P2=table[4];
}if(k5==0)
P2=table[5];
}if(k6==0)
P2=table[6];
}if(k7==0)
P2=table[7];
}if(k8==0)
P2=table[8];
}for(k=400;
k--){
P2=table[2];
if(k1==0)
P2=table[1];
}P2=table[0];
while
(1){if(k1==0)
while
(1);
}
if(k2==0){
}if(k3==0){
}if(k4==0){
P2=table[4];
}if(k5==0){
P2=table[5];
}if(k6==0){
P2=table[6];
}if(k7==0){
P2=table[7];
}if(k8==0){
P2=table[8];