基于单片机的多路抢答器设计说明书.docx

上传人:b****2 文档编号:16919466 上传时间:2023-04-24 格式:DOCX 页数:31 大小:482.28KB
下载 相关 举报
基于单片机的多路抢答器设计说明书.docx_第1页
第1页 / 共31页
基于单片机的多路抢答器设计说明书.docx_第2页
第2页 / 共31页
基于单片机的多路抢答器设计说明书.docx_第3页
第3页 / 共31页
基于单片机的多路抢答器设计说明书.docx_第4页
第4页 / 共31页
基于单片机的多路抢答器设计说明书.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

基于单片机的多路抢答器设计说明书.docx

《基于单片机的多路抢答器设计说明书.docx》由会员分享,可在线阅读,更多相关《基于单片机的多路抢答器设计说明书.docx(31页珍藏版)》请在冰豆网上搜索。

基于单片机的多路抢答器设计说明书.docx

基于单片机的多路抢答器设计说明书

西安文理学院机械与材料工程学院

 

课程设计报告

 

专业班级测控1502

课程单片机课程设计

题目抢答器的设计

教研室测控技术与仪器

学号**********

学生姓名高宇璠

指导教师杨森林

 

2017年9月

 

摘要

本次的课程设计基于单片机技术原理,以美国ATMEL公司开发的AT89S52芯片作为核心控制器。

通过硬件电路的制作及软件程序的编制,设计制作了一种具有复位、校时功能的数字时钟系统。

利用七段数码管实现星期、上下午和时间信息并且可以通过蜂鸣器和二极管实现整点提醒功能,用户可通过系统上的按键对时间进行调整,实现实时的时钟显示。

本次设计的硬件由主控模块、提示模块以及显示模块构成。

复位模块主要由电阻、电容、按键组成;提示模块主要由蜂鸣器、三极管、二极管、排阻组成;显示模块则由七段数码管构成,用于显示提示信息和实时时钟。

关键词:

AT89S51;七段数码管;蜂鸣器

 

 

1.任务与要求

设计任务:

以51单片机为核心,设计一个供4组选手比赛的抢答器。

每组设置一个抢答按钮,按钮的编号与选手的编号对应。

主持人控制开始、复位和分数按键。

初始状态,每组成绩均为0分,倒计时和组号显示全零。

抢答开始,主持人按下开始键,系统显示15秒倒计时,绿灯亮。

如果15秒内有选手抢答,则所有抢答开关被锁定,系统显示相应的组号,蜂鸣器响1声。

此时,主持人按下答题键,选手开始答题,系统开始30秒倒计时显示。

时间到,红灯亮1秒,蜂鸣器响1秒。

答题结束,主持人将选手回答情况进行加分或减分,每按一次“+”或“—”对应1分;每题分值改变范围为-3~3分。

如果15秒内没有选手抢答,则所有抢答开关都将无效,此时红灯闪烁3秒,蜂鸣器间断响3秒。

比赛结束,主持人按下复位键,系统将回到初始状态。

设计要求:

1.完成系统的硬件电路设计与软件设计;

2.采用C51语言编程;

3.采用Proteus、KeilC等软件实现系统的仿真调试;

4.设计报告要求思路清晰,结构合理,语言流畅,书写格式符合要求。

5.能条理清晰地讲述每个设计环节,完成设计答辩。

2.单片机的设计方案

2.电路设计

2.1电路元件清单及部分元件简介

2.1.1电路基本元件

电路元件

元件型号

电路元件

元件型号

单片机

AT89S51

电阻

RES

电容

CAP

极性电容

CAP-ELEC

晶振

CRYSTAL

按键开关

BUTTON

数码管

7SEG-MPX8-CA-BULL

LED

LED-RED&GREEN

蜂鸣器

BUZZER

三极管

MPSA56

2.1.2部分主要元器件简介

AT89S51芯片

AT89s51管脚图

图1..AT89S51引脚

AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。

管脚说明

VCC:

电源电压输入端。

GND:

电源地。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为低八位地址接收。

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写"1"时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址"1"时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入"1"后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口除了作为普通I/O口,还有第二功能:

P3.0RXD(串行输入口)

P3.1TXD(串行输出口)

P3.2/INT0(外部中断0)

P3.3/INT1(外部中断1)

P3.4T0(T0定时器的外部计数输入)

P3.5T1(T1定时器的外部计数输入)

P3.6/WR(外部数据存储器的写选通)

P3.7/RD(外部数据存储器的读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。

读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。

只有读端口时才真正地把外部的数据读入到内部总线。

89C51的P0、P1、P2、P3口作为输入时都是准双向口。

除了P1口外P0、P2、P3口都还有其他的功能。

RST:

复位输入端,高电平有效。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

地址锁存允许/编程脉冲信号端。

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令时ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

PSEN:

外部程序存储器的选通信号,低电平有效。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

EA/VPP:

外部程序存储器访问允许。

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:

片内振荡器反相放大器和时钟发生器的输入端。

XTAL2:

片内振荡器反相放大器的输出端。

7SEG-MPX8-CA-BULL

7seg-mpx8-ca是共阳极数码管显示器,它左下侧的abcdefgdp是LED数码管显示器的I/O口,是段选信号,右下侧的12345678是它的位选信号,就是从左到右分别是第一位到第八位,段选信号与位选信号分别接到单片机的不同输出口,例如段选信号可以接到P0口,位选信号可以接到P2口,共阳极的字形显示代码为:

ucharcodshuzi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}.位选信号代码为:

ucharwei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};当选中第一位时,段选信号就执行从0到9的显示。

如果想显示数字的话,就要通过程序来执行:

#include

#include

#defineucharunsignedchar

#defineuintunsigneint

#defineuintunsignedint

ucharcodeshuzi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

ucharcodewei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

voidmain()

{uchari;

while

(1)

{for(i=0;i<8;i++)

{P0=shuzi[i];

P2=位[i];

}

}

}

这样它就能显示数字了,这是在AT89s51单片机下的程序,P0口还要加一个上拉电阻。

2.2基本电路

2.2.1整体电路

图2.抢答器基本电路图

2.2.2片机的最小系统

单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。

对51系列单片机来说,最小系统一般应该包括:

单片机、晶振电路、复位电路。

AT89S51单片机的最小系统电路图:

图3.AT89S51最小系统

2.2.3晶振模块

单片机晶振的作用是为系统提供基本的时钟信号。

通常一个系统共用一个晶振,便于各部分保持同步。

有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。

单片机晶振两端有2个电容,这2个电容叫晶振的负载电容,分别接在晶振的2个脚上和对地的电容,一般在几十皮法。

它会影响到晶振的振谐频率和输出幅度。

晶振的负载电容=[(Cd*Cg)/(Cd+Cg)]+Cic+C。

图4.晶振模块示意图

2.2.4复位模块

电路由电容、电阻、复位按键组成,如图3.2所示。

AT89C51的复位引脚(RESET)是第9脚,当此引脚连接高电平超过2个。

机器周期,即可产生复位的动作。

以12MHZ的时钟脉冲为例,每个时钟脉冲为1uS,两个机器周期为2us,因此,在第9脚上连接一个2US的高电平脉冲,即可产生复位动作。

最简单的就是只有一个电阻跟一个电容就可组成一个可靠复位的电路,复杂一点的就加个按键,可以进行手动复位。

如图所示

图5.晶振模块示意图

2.2.5数码管显示模块

根据设计,系统包含4个LED数码管,都为八段(a、b、c、d、e、f、g、dp),数码管分别显示四位参赛选手的分数。

该系统采用共阳极数码管,对于阳阴极数码管,其公共端必须接高电平。

数码管中选手初始分都为0分,每当主持人控制对应选手加减分时,数码管显示的数字对应发生改变。

图6.数码管显示模块

 

2.2.6键盘模块

尝试采用最简单的复位开关完成输入功能。

通过按压按键K1,控制抢答开始以及答题开始,数码管显示倒计时。

通过按压按键K2,,重置比赛,清零比分。

通过按压按键K3以及K4,对正在答题的选手进行加减分。

其余按键均为选手抢答专用,抢答成功的选手组好会在LED屏上显示。

图7.键盘输入模块示意图

2.2.7发声模块

发声模块由单片机和峰鸣器两大主要部分组成,如图3.5所示,当选手抢答完成

时或分数满10分时给P3.7输入高电平,蜂鸣器发出声音。

图8.发声模块电路图

3.参考文献

由于个人能力实在不济,程序编写过程以及电路设计过程中参考了他人的经验。

[1]马轲瀛.八路数字抢答器系统[J].华商,2007,(23).

[2]蔡朝阳.单片机控制实习与专题制作[M].北京:

北京航空航天大学出版社,2006年

[3]林凌,李刚,丁茹,李小霞.新型单片机接口器件与技术[M].西安:

西安电子科技大学

出版社,2005年.

[4]杨凌霄微型计算机原理及应用DM].江苏:

中国矿业大学出版社,2004年.

[5]丁建伟抢答器电路设计[J].兰州工业高等专科学校学报,2008,(04)..

4.总结与感悟

我在这一次抢答器的设计过程中,很是受益匪浅。

通过对自己在大学期间所学的知识的|顾,并充分发挥对所学知识的理解和对本次课程设计论文的思考及书面表达能力,最终完成了。

这为自己今后进步深化学习,积累了一定宝贵的经验。

撰写论文的过程也是专业知识的学习过程,它使我运用己有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练培养了我运用所学知识解决实际问题的

能力。

由于个人能力实在不济,于是我只能在海量的信息和与组员的讨论中慢慢摸索,虽然结果并不完美。

但是我已经很满意了,在这里我要感谢在这个过程中所有帮助过我的人。

今后的学习中我仍需要加强keil与protues软件的使用熟练度,为以后的学习与工作打下基础。

附录

图9.抢答器工作流程图

运行程序

#include"reg52.h"//引入51单片机头文件

#include"math.h"//数学计算方法头文件

#defineucharunsignedchar//快捷定义

#defineuintunsignedint//快捷定义

#definekeyP3//按键借口

#defineduanP2//数码管段选借口

#defineweiP1//数码管位选接口

#definewei2P0//数码管位选接口

sbitkey1=P3^0;//按键1

sbitkey2=P3^1;//按键2

sbitkey3=P3^2;//按键3

sbitkey4=P3^3;//按键4

sbitkey5=P1^7;//按键4

sbitpeople1=P3^4;//按键4

sbitpeople2=P3^5;//按键4

sbitpeople3=P3^6;//按键4

sbitpeople4=P3^7;//按键4

sbitled=P0^0;//指示灯接口

sbitbuzzer=P0^1;//蜂鸣器接口

sbitledH=P0^2;//指示灯接口

sbitledL=P0^3;//指示灯接口

uchari=0;//数码管显示计时

ucharqinflag;//移位标志

bitbeepStart,ks,beepStart2;//报警标志

ucharcodeshuzi[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff,0xbf};//0~9,a,b,c,d,e,f,p,不显示,-,

ucharcodeweizi[11]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x10,0x20};//位选数据

ucharcodeerror[10]={0xff,0xaf,0xc0,0xaf,0xaf,0x86,0xff,0xff,0xff};//error

ucharplayshuzu[11];

ucharweishu;//位数,输入标志,错误次数,错误标志

chartime;

uchartimeQD;//时间计时

uchartimeDT;//答题时间

ucharid;//选手编号

bitstartQD;//抢答启动

bitstartDT;//答题启动

bitselect;//选择

uintcount;//定时计时变量

charfs1,fs2,fs3,fs4;//分数

bita;

voidinit();//初始化

ucharscanzhi();//获取按键值

voiddisplay();//数码管显示

voidduzhichuli();//数据处理

voiddisplayerror();//错误显示

//===================================================

voidkeyscan()

{

if(key1==0)//检测按键K1是否按下开始

{

//Delay10ms();//消除抖动

while(key1==0);//松手检测

if(a==0)

{

startQD=1;//启动抢答

timeQD=15;//倒计时15秒

select=1;//启动选择

ledL=1;//绿灯亮

}

else

{

startDT=1;//倒计时启动

}

a=~a;

}

if(key2==0)//检测按键K2是否按下复位

{

//Delay10ms();//消除抖动

while(key2==0);//松手检测

ledL=0;//绿灯灭

ledH=0;//红灯灭

select=1;//选择

fs1=0;//1号分数清零

fs2=0;//2号分数清零

fs3=0;//3号分数清零

fs4=0;//4号分数清零

for(i=1;i<12;i++)//显示数据清零

playshuzu[i]=shuzi[0];

}

if(key3==0)//检测按键K3是否按下分数加

{

//Delay10ms();//消除抖动

while(key3==0);//松手检测

switch(id)//选手编号

{

case1:

//选手1

{

fs1=fs1+1;//分数加3

if(fs1<0)//分数小于0

{

//fs1=abs(fs1);//

playshuzu[1]=shuzi[18];//显示负号

playshuzu[2]=shuzi[abs(fs1)];

}

else

{

playshuzu[1]=shuzi[fs1/10];

playshuzu[2]=shuzi[fs1%10];

}

break;

}

case2:

//选手2

{

fs2=fs2+1;//分数加3

if(fs2<0)//分数小于0

{

//fs2=abs(fs2);

playshuzu[3]=shuzi[18];//显示负号

playshuzu[4]=shuzi[abs(fs2)];//显示数

}

else

{

playshuzu[3]=shuzi[fs2/10];//显示数

playshuzu[4]=shuzi[fs2%10];//显示数

}

break;

}

case3:

//选手3

{

fs3=fs3+1;//分数加3

if(fs3<0)//分数小于0

{

//fs3=abs(fs3);

playshuzu[5]=shuzi[18];//显示负号

playshuzu[6]=shuzi[abs(fs3)];//显示数

}

else

{

playshuzu[5]=shuzi[fs3/10];//显示数

playshuzu[6]=shuzi[fs3%10];//显示数

}

break;

}

case4:

//选手4

{

fs4=fs4+1;//分数加3

if(fs4<0)//分数小于0

{

fs4=abs(fs4);

playshuzu[7]=shuzi[18];//显示负号

playshuzu[8]=shuzi[fs4%10];//显示数

}

else

{

playshuzu[7]=shuzi[fs4/10];//显示数

playshuzu[8]=shuzi[fs4%10];//显示数

}

break;

}

}

}

if(key4==0)//检测按键K4是否按下

{

//Delay10ms();//消除抖动

while(key4==0);//松手检测

switch(id)

{

case1:

//选手1

{

fs1=fs1-1;

if(fs1<0)//分数小于0

{

fs1=abs(fs1);

playshuzu[1]=shuzi[18];//显示负号

playshuzu[2]=shuzi[fs1%10];//显示数

}

else

{

playshuzu[1]=shuzi[fs1/10];//显示数

playshuzu[2]=shuzi[fs1%10];//显示数

}

break;

}

case2:

//选手2

{

fs2=fs2-1;

if(fs2<0)//分数小于0

{

//fs2=abs(fs2);

playshuzu[3]=shuzi[18];//显示负号

playshuzu[4]=shuzi[abs(fs2)];//显示数

}

else

{

playshuzu[3]=shuzi[fs2/10];//显示数

playshuzu[4]=shuzi[fs2%10];//显示数

}

break;

}

case3:

//选手3

{

fs3=fs3-1;

if(fs3<0)//分数小于0

{

//fs3=abs(fs3);

playshuzu[5]=shuzi[18];//显示负号

playshuzu[6]=shuzi[abs(fs3)];//显示数

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1