找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 31220|回复: 2
打印 上一主题 下一主题
收起左侧

单片机四路抢答器课程设计报告 含完整源码

[复制链接]
跳转到指定楼层
楼主
ID:161768 发表于 2017-8-15 02:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
课程设计报告
课程名称电子技术课程设计
学院(部)
专    业      
班    级      
指导教师   
题    目     四路抢答器
组    员   

目录
设计要求2
方案讨论2
系统软件仿真3
系统硬件实现7
心得体会10
6.仿真代码11
附录17


  • 设计要求
四路抢答器
设计要求:抢答器整个系统可分为三个主要模块:抢答鉴别模块、计分模块、答题倒计时模块。即当抢答开始后,选手抢答按动按钮,锁存器锁存相应的选手编码,同时用数码管把选手的编码显示出来,对应加分模块的发光二极管也会发光。当有选手抢答成功后,30秒答题倒计时开始跑秒,若选手在规定的时间内答对题,主持人按下S6给相应的选手加一分并且按下S5,系统清零。

  • 方案论述

方案:对于仿真,我们是将整个系统分为三个主要模块:抢答鉴别模块AIM;抢答计时模块ATM;抢答计分模块ASM。整个系统的组成框图如下图所示。三个模块,选手抢答,然后倒计时开始,答完主持人加分(答对)。


I.本抢答器最多可提供4名参赛选手使用,编号为1~4号,各队分别用一个按钮(S1~S4)控制,并设置一个系统清零和抢答控制开关S5,该开关由主持人控制。

II.抢答器具有数据锁存功能,并将锁存数据用发光二极管指示灯显示出来,同时蜂鸣器发出间歇式声响,主持人清零后,声音提示停止。

III.抢答先后的分辨率为1ms。

IV.开关S5作为清零及抢答控制开关(有主持人控制),当开关S5被按下时,抢答电路清零,松开后则允许抢答,输入抢答信号由抢答按钮的S1~S4实现。

V.有抢答信号输入时,有数码管显示出相应组别的号码。此时再按其他任何一个抢答开关均无效,指示灯依旧保持第一个开关按下时所对应的状态不变。

VI.能完成由主持人控制的30秒倒计时,有抢答信号输入后计时器开始倒计时。

VII.能完成定时器复位,启动,暂停/继续计数。

VIII.能完成对每个选手抢答次数的记录,并可复位。


  • 系统软件仿真

仿真电路组成:




(1)完整电路:


(2)抢答电路:


电路组成

该电路由四个D触发器、与非门及脉冲触发电路等组成。。其中S1,S2,S3、S4为抢答人按钮,S5为主持人复位。74LS175为四D触发器。


电路测试:

①无人抢答时,S1~S2均未被按下,1D~4D均为低电平,Q1~Q2为低电平,7段数码管显示数值为0.

②当 主持人宣布“抢答开始”后,答题者立即按下抢答开关,产生输入信号,电路就可以工作了。例如,S1开关被按下,输入为D4D2D1=001,输出Q4Q2Q1=D3D2D1(7段数码管的输入,且D4==0)=001,数码管显示为1。Q4非Q2非Q1非和时钟脉冲通过一个与门形成上升沿信号作为74LS175的CLK端的输入,因为74LS175是下降沿触发,故除按下复位键之外不论什么按键都将不会发生电路状态的变化,即输入锁存,实现了抢答功能。

③若要清除,当主持人按下S5复位键完成,为下一次抢答做好准备。

(3)抢答计时模块:


电路组成:由两片74LS192同步十进制计数器、7段数码管、时钟脉冲以及相应逻辑门(3个或非门、与门、非门)构成。

电路测试

①无人抢答时,预置输入控制端输入为0,复位输入端为1,异步预置,十位片DCBA=0011,个位片 DCBA=0000,数码馆管显示30。

②答题者抢答时,开关接通,个位片工作模式为减计数,在数码管显示,当执行到输出QDQCQBQA=0000时,此时由于个位片的借位输出端BO与十位片的DOWN相连,十位片减计数一次,相应数码管数值减1,也即每当个位片的数码管从9—0时,十位片才做一次减计数。这样就实现了30秒倒计时。

③当数码馆显示00时或者答题者回答正确加分后,主持人按下复位键S5,74LS192的预置输入端为0,复位输入端为1,可实现异步置数,数码管显示30,为下一轮的抢答做准备。


(4)计分模块




电路组成

由四片74LS160、4个反相器、4个LED灯,4个7段数码管组成。

电路测试:

①无人抢答时,数码管全部显示为0,LED熄灭状态。

②抢答成功后并且在规定时间答对后,主持人按下S6加分键,通过74LS138译码器实现片选,选中的数码管工作模式为计数,此时对应的选手的数码管的值就会显示加1。

③主持人按下复位键S5的时候,因为74LS160的工作模式是保持不变,所以计分的数保持不变。


四、系统硬件实现

系统实现是由51单片机实现的。基于STC51开发板,用keil软件编写C语言程序代码实现其功能。              由于数码管数量有限,所以用四个LED小灯来分别代表四位选手,前面四个数码管依次显示四位选手的分数,最后两个数码管显示30秒倒计时,调试过程下载程序,开发板上电之后,数码管显示000030      按下第一行第一个按键,第一个LED小灯亮,倒计时开始;按下第四行第一个按键,第一个数码管加1,其他显示为0按下第四行第二个按键,LED熄灭,倒计时恢复为30,加分不变。      每次按下相应的按键,对应的小灯会分别亮,且每次只亮一个小灯。


51单片机最小系统

6位共阳极数码管

程序实现:

第一位选手抢答成功并加分
第二位选手抢答成功并加分
第三位选手抢答成功并加分:

第四位选手抢答成功并加分:
、心得体会这是第一次课设,还是遇到了很多的问题,从分析题目要求到软件仿真再到硬件实现,花费了很多的精力,但是也收获了很多。在使用Multism时,    许多元器件的英文不知道,不能很轻松的从元器件库里选出正确的器件;    一些元器件参数的选择并不是随意选定的,需要计算和参考课本或者网上的经验分享;    也学到了通过二极管单向导通的性质和D触发器以及7段数码管可以实现二进制的计数,大大简化了电路。

6、仿真代码

51单片机仿真
     因为并没有单片机基础,所以是边自学单片机边研究分析别人的程序;     关于程序中的中断,定时,数码管显示,以及消除按键抖动等都是反复练习和调试才慢慢熟练的。

  • 附录

部分芯片的管脚图以及功能


74LS192:


74LS160


单片机源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;
  6. sbit D1=P1^0;
  7. sbit D2=P1^1;
  8. sbit D3=P1^2;
  9. sbit D4=P1^3;
  10. sbit beep=P2^3;
  11. uchar code table[]={
  12. 0x3f,0x06,0x5b,0x4f,
  13. 0x66,0x6d,0x7d,0x07,
  14. 0x7f,0x6f,0x77,0x7c,
  15. 0x39,0x5e,0x79,0x71,0};
  16. uchar key,temp,daojishi=0x1e,x1=0,x2=0,x3=0,x4=0;
  17. bit begin,end,clear;
  18. unsigned int pp,qq;
  19. uchar a0=0;b0=0;c0=0;d0=0;e0=0;f0=3;
  20. void delay(uint z)
  21. {
  22.               uint x,y;
  23.               for(x=z;x>0;x--)
  24.                             for(y=110;y>0;y--);
  25. }

  26. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
  27. {
  28.    dula=1;
  29.    P0=table[a];
  30.    dula=0;
  31.    wela=1;
  32.    P0=0xfe;
  33.    wela=0;
  34.    delay(5);
  35. /////////////   
  36.    dula=1;
  37.    P0=table[b];
  38.    dula=0;
  39.    wela=1;
  40.    P0=0xfd;
  41.    wela=0;
  42.    delay(5);
  43. /////////////////
  44.    dula=1;
  45.    P0=table[c];
  46.    dula=0;
  47.    wela=1;  
  48.    P0=0xfb;
  49.    wela=0;
  50.    delay(5);
  51. /////////////
  52.    dula=1;
  53.    P0=table[d];
  54.    dula=0;
  55.    wela=1;  
  56.    P0=0xf7;
  57.    wela=0;
  58.    delay(5);
  59. // //////////////
  60.    dula=1;
  61.    P0=table[e];
  62.    dula=0;
  63.    wela=1;  
  64.    P0=0xef;
  65.    wela=0;
  66.    delay(5);
  67. /////////////
  68.    dula=1;
  69.    P0=table[f];
  70.    dula=0;
  71.    wela=1;  
  72.    P0=0xdf;
  73.    wela=0;
  74.    delay(5);
  75. }
  76. void keyscan()
  77. {
  78.               //P3^0口按下,矩阵第一行,P3^0            
  79.                             P3=0xfe;
  80.                             temp=P3;
  81.                             temp=temp&0xf0;//如果按下了,那么肯定就和0xf0不相等了
  82.                             while(temp!=0xf0)//有键按下了,此时为真,进入循环
  83.                             {
  84.                                           delay(5);//延时后,消除抖动;确认确实是有开关键按下了
  85.                                           temp=P3;//重新让temp读取P3口
  86.                                           temp=temp&0xf0;
  87.                                           D1=1;D2=1;D3=1;D4=1;
  88.                                           while(temp!=0xf0)
  89.                                           {
  90.                                                         temp=P3;//如果没有这条语句,此时的temp值是与0xf0与完后的值。而下面case中是为了给对应的数码管口显示
  91.                                                         switch(temp)
  92.                                                         {
  93.                                                                       case 0xee:D1=0;key=1;x1++;      //0xee=11101110  看第一行的哪一列被按下去
  94.                                                                                     break;//检测到是第一个按键被按下,就跳出这个while循环
  95.                                                                       case 0xde: D2=0; key=2;x2++; //11011110即第一行第二个按键按下之后显示2;
  96.                                                                                     break;
  97.                                                                       case 0xbe:D3=0;key=3;x3++;
  98.                                                                                     break;
  99.                                                                       case 0x7e: D4=0;key=4; x4++;
  100.                                                                                     break;
  101.                                                         }
  102.                                                         //松手检测
  103.                                                         while(temp!=0xf0)//检测是否松手,如果松手两者相等,while条件为假,不执行。但是若是因为抖动,那么就让temp重新与0xf0 AND
  104.                                                  {               
  105.                                                                       temp=P3;
  106.                                                                       temp=temp&0xf0;
  107.                                                                       beep=0;
  108.                                                         }
  109.                                                         beep=1;//按键按下发出响声,松开响声停止
  110.                                           }
  111.                             }
  112.                             P3=0xf7;//第四行
  113.                             temp=P3;
  114.                             temp=temp&0xf0;            
  115.                             while(temp!=0xf0)
  116.                             {
  117.                                           delay(5);//确认确实有键按下去了
  118.                                           temp=P3;
  119.                                           temp=temp&0xf0;
  120.                                           while(temp!=0xf0)
  121.                                           {
  122. ……………………

  123. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

全部资料(源码)51黑下载地址:



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表