基于51单片机的抢答器实验报告

说明: 说明: 江苏师范大学校标说明: 说明: 江苏师范大学艺术字

                             

实习(设计)报告

姓     名                       

班     级                       

学     号                       

实习(设计)科目  基于51单片机的五路抢答器

实习(设计)地点                           

实习(设计)时间                           

电气工程及自动化学院

School of Electrical Engineering & Automation

说明:(1)本日志用于记录实习(设计)过程中的各项活动内容,要求学生必须填写具体、齐全、工整。

(2)实习(设计)结束后由专业科主任审查签字。

实习(设计)成绩评定表

班级                     姓名                    学号                  

1、实习(设计)名称:    基于51单片机的五路抢答器                                                    

2、实习(设计)题目:    基于51单片机的五路抢答器                                                     

3、实习(设计)时间:自 2013  年 12 月 30  日 至  20##  年 1 月 17 日

4、实习(设计)地点:12#405A

5、主要内容简述:设计一个五路抢答器,必须有主持人按钮,当主持人按下按

钮,开始30秒倒计时,这30秒内即是五位选手抢答的时长,若30秒内没有选手

抢答,则视为所有选手弃权。倘若30秒内有人抢答,定时到10秒,同时在屏幕

上显示该抢答选手号码,当主持人按下开始答题键时,则倒计时从10秒开始,同

时选手号码清零。若10秒内无法回答,则该选手视为回答错误。             

                                                                      

                                                                      

6、指导教师评语:                                                     

                                                                      

                                                                      

                                                                      

                                                                      

7、指导小组复评意见:                                                 

                                                                      

                                                                      

                                                                      

                                                                      

8、成绩:            

指导教师签名:

年     月     日

指导小组组长签名:

年     月     日

教研室主任签名:

年     月     日


摘   要
  此次设计提出了用AT89C51单片机为核心控制元件,设计一个简易的抢答器, 本方案以AT89C51单片机作为主控核心,与74HC573、发光二极管、数码管、等构成五路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的抢答器具有实时显示抢答选手的号码和抢答时间的特点,还有复位电路,使其再开始新的一轮的答题和比赛,同时还利用C语言编程,使其实现一些基本的功能。本设计的系统实用性强、判断精确、操作简单、扩展功能强。

关键字  单片机  抢答器  数码管  74HC573

目   录

一.绪论……………………………………………………………………3

1.1单片机抢答器背景 ………………………………………………3

1.2单片机抢答器意义 ………………………………………………3

1.3抢答器意义 ………………………………………………………3

二.实验安排 …………………………. …………………………………4

三.整体设计方案…………………………………………………………5

3.1单片机的选择 ……………………………………………………5

3.2单片机的基本结构 ………………………………………………7

3.3单片机的存储配置 ………………………………………………10

四.单片机设计……………………………………………………………12

4.1抢答器流程图 ……………………………………………………12

4.2最小系统的设计 …………………………………………………13

4.3数码管显示电路 …………………………………………………14

4.4按键控制电路 ……………………………………………………15

五.单片机调试……………………………………………………………16

六.结束语…………………………………………………………………18

参考文献……………………………………………………………………19

附录一   五路抢答器源程序 ……………………………………………20

附录二   五路抢答器原理图 ……………………………………………30

一.绪论

1.1 单片机抢答器的背景
  二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词--“智能型”。
  在知识竞赛中,往往会用到抢答器。故此我们就选择利用单片机编程来设计抢答器,即使两组的抢答时间相差几微秒,也能轻松的分辨出哪一组(或哪个选手)先抢答到题。
  1.2  单片机抢答器的意义
  本系统采用单片机作为整个控制核心。控制系统的三个模块为:显示模块、存储模块、抢答开关模块。该系统通过开关电路五个按键输入抢答信号,利用一个数码管来完成显示功能,用按键来让选手进行抢答,在数码管上显示哪一组先答题的,从而实现整个抢答过程。本文主要介绍了单片机抢答器设计及工作原理,以及它的实际用途。系统工作原理本系统采用89C52单片机作为核心。控制系统的四个模块分别为:存储模块、显示模块、语音模块、抢答开关模块。该抢答器系统通过开关电路五个按键输入抢答信号, 利用一个数码管来完成显示功能。工作时,用按键通过开关电路输入各路的抢答信号,经单片机的处理, 输出控制信号,单片机控制的智能抢答器设计。
  1.3 抢答器的应用  随着我国经济和文化事业的发展,在很多公开竞争场合要求有公正的竞争裁决,诸如证券、股票交易及各种智力竞赛等,因此出现了抢答器。抢答器一般是由很多电路组成的,线路复杂,可靠性不高,功能也比较简单,特别是当抢答路数很多时,实现起来就更为困难。因此我们设计了以单片机为核心的新型智能的抢答器,增加了数码管显示电路实现了其它功能。抢答器又称为第一信号鉴别器,其主要应用于各种知识竞赛、文艺活动等场合。

二.实验安排

1.   设计一个八路抢答器。

2.   必须有主持人按钮,当主持人按下按钮,开始30秒倒计时,这30秒内即是八位选手抢答的时长,若30秒内无人抢答,则视为所有选手弃权。

3.   倘若主持人按下开始的30秒内有人抢答,定时到10秒,同时在一屏幕上显示该抢答选手号码,当主持人按下开始答题键时,则倒计时从10秒开始,同时选手号码清零。若10秒内无法回答,则该选手视为题目回答错误。

三.整体设计方案

3.1 单片机的选择
  3.1.1 什么是单片机
  单片机是指一个集成在一块芯片上的完整计算机系统。尽管它的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU 、内存、内部和外部总线系统。单片机是将中央处理器,随机存储器。只读存储器,定时器芯片和I/O接口电路集成于一个芯片上的微控制器。
  单片机也被称为微控制器(Microcontroler),是因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对提及要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
  早期的单片机都是8位或4位的。其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。此后在8031上发展出了MCS51系列单片机系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大的提高。随着INTELI960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。
  单片机是靠程序的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板,但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别。只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性。
  目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
  3.1.2 单片机的应用
  单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:
  1.在智能仪器仪表上的应用
  单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析仪)。
  2.在工业控制中的应用
  用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
  3.在家用电器中的应用
  可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。
  4.在计算机网络和通信领域中的应用
  现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
  5.单片机在医用设备领域中的应用
  单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。
  此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。
  3.1.3 如何选择单片机
  ATMEL公司的89C52单片机,是增强型RISC内载Flash的单片机,芯片上的Flash存储器附在用户的产品中,可随时编程,再编程,使用户的产品设计容易,更新换代方便。89C52单片机采用增强的RISC结构,使其具有高速处理能力,在一个时钟周期内可执行复杂的指令,每MHz可实现1MIPS的处理能力。89C52单片机工作电压为2.7~6.0V,可以实现耗电最优化。89C52的单片机广泛应用于计算机外部设备,工业实时控制,仪器仪表,通讯设备,家用电器,宇航设备等各个领域。
  由于单片机的种类很多,在选择单片机时要依据实际设计要求选择合适的单片机。例如当设计仅仅需要一个单片机定时器那么选择89C1051或89C2051即可,而不选择89C52,因为后者的价格较高一些。当然若程序和数据区的要求较高那么选择的单片机还要满足程序空间的要求。
  51和52的比较      

 在本课题中,我们选用现在较为流行的52系列单片机,即选用ATMEL公司的STC89C52。
  3.2 单片机的基本结构
  3.2.1  单片机的引脚分布及功能
  MCS-52系列单片机中的8032、8052及8752均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加以说明:

 
 STC89C52的引脚图
  Pin9:RESET/Vpd复位信号复用脚,当8052通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,8052的初始态。
  8052的复位方式可以是自动复位,也可以是手动复位,见下图4。此外,RESET/Vpd还是一复用脚,Vcc掉电其间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。

 
 复位电路和晶振电路图
  1、8位微处理器和控制器
  2、内部含有4KB的程序ROM。
  3、2个16位的计数/定时器。
  4、内部时钟振荡器
  5、全双工方式的串行接口(UART)种寻址方式。
  6、最高时钟振荡频率可达12MHZ,大部分指令执行时间为1?s,乘、除指令为4?s。
  2.2 信号引脚介绍:
  1.输入/输出口线
  2.ALE地址锁存控制信号
  3.在系统扩展时,ALE用于控制把 口输出的底8位地址送入锁存器锁存起来,以实现低位地址和数据的分时传送。此外由于ALE是以十二分之一晶振频率的固定频率输出的正脉冲,因此可作为外部时钟或外部定时脉冲使用。
  4.外部程序存储器读选通信号
  5.在读外部ROM时 有效(低电平),以实现外部ROM单元的读操作
  6.访问程序存储器控制信号
  7.当信号为低电平时,对ROM的读操作限定在外部程序存储器;而当 信号为高电平时,则对ROM的读操作是从内部程序存储器开始,并可延续至外部程序存储
  8.RST 复位信号
  当输入的复位信号延续2个机器周期以上高电平时即为有效,用以完成单片机的复位操作。
  9.XTAL1和XTAL2外接晶体引线端
  当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
  10.GND地线
  11.VCC+5V 电源

3.3  单片机的存储器配置

 
        单片机的内部存储器配置
  从用户的角度存储器分3个逻辑地址空间:
  1. 片内外统一编址的64KB程序存储器地址空间0000H~FFFFH即(a)图;
  2. 256B的片内数据存储器地址空间00H~FFH(包括低128B的内部RAM地址00H~7FH和高128B的特殊功能寄存器地址空间)即(b)图;
  3.64KB的外部数据存储器或扩展I/O接口地址空间0000H~FFFFH如(c)图。
  4.画出RAM的组成
  RAM共有256个单元,按功能分为两部分低128单元(单元地址00H~7FH)和高128单元(单元地址80H~FFH)。其中高128单元是供给专用寄存器使用,因这些寄存器的功能已作为专门规定故此称之为特殊功能寄存器SFR-11个SFR有位寻址作用,而且要说明低128单元是单片机的真正RAM存储器。
        RAM的组成图     

四.单片机的设计

4.1抢答器流程图


  

4.2 单片机的最小系统


   ①复位电路:由电容串联电阻构成,由图并结合“电容电压不能突变”的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.一般教科书推荐C 取10,R取8.2K。当然也有其他取法的,原则就要让RC组合可以在RST脚上产生不少于2个机周期的高电平;
  ②复位输入高电平有效,当振荡器工作是,RST引脚出现两个机器周期以上的高电平,使单片机复位。此电路除具有上电复位功能外,若要复位只需按“RST”键,此电源Vcc经电阻分压,在RST端产生一个复位高电平;
  ③晶振电路:典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的方波便于12分频,方便定时操作);
  ④单片机:一片AT89S51/52或其他51系列兼容单片机;
  注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行;
  ⑤电源部分:接+5伏特的电压。
  4.3 数码管显示电路
  LED显示器,实现七段数码管的显示三位十六进制数。来进行倒计时,即来限制抢答的时间。
  其中数码管的显示可以分为两种:静态显示和动态显示。静态显示的段选位和位选位均单独连接,因此占用的I/O接口多,无法扩展多个数码管,在这种采用这种方式,必须要给LED恒定的电压,要求电压一直保持,所以一般在LED和单片机之间加锁存器,这种显示方式亮度高,编程较简单,结构清晰,管理也较简单,占用的CPU时间少。② 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共端COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。从电路上,按数码管的接法不同又分为共阴和共阳两种。 

4.4 74hc573简介

HC573引脚功能表:

        图1    HC573引脚图                                    图2 HC573 国际电工委员会逻辑符号

   

4.5 按键控制电路
  在一些按键控制电路中,人机接口通常是LED显示器和小型按键。常见的工作方式有两种:一是直接使用系统中的CPU对显示器进行动态显示和键盘检测;二是专用的显示、键盘芯片。但这两种方式存在着不能及时响应、价格较高等缺点。介绍了一种性价比高的显示/键盘电路的结构及工作原理。以ATMEL89C51系列单片机为核心构成的显示/键盘电路,他具有功能强、价格低廉等特点。

附录一  五路抢答器源程序

/*《五路抢答器》c语言程序设计*/

#include <reg52.h>

#define uchar unsigned char

#define uint  unsigned int

sbit wela_hao=P3^0;     //显示选手的数码管位选

sbit wela1=P3^1;

sbit wela2=P3^7;

sbit qing=P3^5;

sbit host=P3^6;

sbit answer=P3^4;

sbit key1=P1^0;

sbit key2=P1^1;

sbit key3=P1^2;

sbit key4=P1^3;

sbit key5=P1^4;

uchar hao,shu,shi,ge,t0,start,flag;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void init();/*初始函数申明*/

void display(uchar shi,uchar ge,uchar hao);

void delay(uint z);

void keyscan();

void main()

{

  init();

 while(1)

     {

       

      

        if(host==0) //主持人      

           {

                delay(5);

                if(host==0)

                {

               

                 shu=30;

                

              hao=0; 

                 flag=1;

              start=1;

                    delay(5);

                   while(!host);

                }

           }

       

        if(qing==0) //清零

           {

                delay(5);

                if(qing==0)

                {

                    

             

              while(1)

             {

                 shu=0;

                 shi=shu/10;

                 ge=shu%10;

                  TR0=0;

                 delay(5);

               

                  hao=0;

                  wela1=0;

                  wela2=0;

                   wela_hao=0;

                  delay(1);

                display(shi,ge,hao);

               if(host==0)break;

               

              }

             

                    delay(5);

                   while(!qing);

                }

           }

         if(answer==0)     //开始答题

           {

             delay(5);

             if(answer==0)

                {

                 flag=1;

                  shu=10;

                  start=1;

                  hao=0;

                 

                }

              delay(5);

             while(!answer);

           }

      

          if(flag==1)

                         {

                                 

                                      

                             if(start==0)      //选手按下,定时10秒

                                          {

                                 shu=10;

                                 shi=shu/10;

                                 ge=shu%10;

                                             wela1=0;

                                             wela2=0;

                                 wela_hao=0;

                                            delay(1);

                                                        TR0=0;

                                                       

                                            display(shi,ge,hao);

                                            delay(1);

                              

                                           }

                                   

                              if(start==1)      //主持人按下,倒计时30秒

                                          {

                               

                                            wela1=1;

                                            wela2=1;

                                wela_hao=1;

                                            delay(1);

                                           TR0=1;

                               

                                                     display(shi,ge,hao);

                                            delay(1);

                                                        keyscan();

                                                       

                                           }

                                           

                                } 

         

     }

}

void init()    /*初始化*/

{

 t0=0;

 t1=0;

 shi=shu/10;

 ge=shu%10;

 flag=0;

 shu=30;

 wela_hao=1;

 hao=0;

 TMOD=0x11;

 TH0=(65536-50000)/256;

 TL0=(65536-50000)%256;

  EA=1;

  ET0=1;

  TR0=0;

}

void display(uchar shi,uchar ge,uchar hao)         /*数码管动态扫描*/

{

 wela1=1;

 wela2=0;

 P0=table[ge];

 delay(5);

 wela2=1;

 wela1=0;

 P0=table[shi];

 delay(5);

 wela_hao=0;

 P2=table[hao];

 delay(5);

}

void keyscan()       /*按键扫描函数*/

{

   

   if(key1==0)         

   {

          delay(5);

       if(key1==0)

          {

        

               hao=1;       

               P2=table[hao];

            start=0;

               delay(5);

               while(!key1);

             }

           

   }

 if(key2==0)             

   {

          delay(5);

       if(key2==0)

          {

               hao=2;       

               P2=table[hao];

         start=0;

               delay(5);

               while(!key2);

             }

           

   }

 if(key3==0)             

   {

          delay(5);

       if(key3==0)

          {

               hao=3;       

               P2=table[hao];

         start=0;

               delay(5);

               while(!key3);

             }

            

   }

 if(key4==0)             

   {

          delay(5);

       if(key4==0)

          {

               hao=4;       

               P2=table[hao];

         start=0;

               delay(5);

               while(!key4);

             }

           

   }

 if(key5==0)             

   {

          delay(5);

       if(key5==0)

          {

               hao=5;       

               P2=table[hao];

         start=0;

               delay(5);

               while(!key5);

             }

           

   }

}

void delay(uint z)       /*延时函数*/

{

 uint x,y;

 for(x=z;x>0;x--)

    for(y=110;y>0;y--);

}

void time0() interrupt 1    /*定时器0*/

{

 TH0=(65536-50000)/256;

 TL0=(65536-50000)%256;

 shi=shu/10;

 ge=shu%10;

  t0++;

   if(t0==20)

   {

    t0=0;

    shu--;

    shi=shu/10;

    ge=shu%10;

      if(shu==0)

        {

             while(1)

               {

                  shu=0;

                  hao=0;

                  wela1=0;

                  wela2=0;

                  wela_hao=0;

                  delay(1);

                display(shi,ge,hao);

                  if(host==0)break;

               

             

              }

        }

   }

}                        

附录二   五路抢答器原理图

相关推荐