找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7509|回复: 12
收起左侧

基于单片机的6路抢答器的设计报告+源码+仿真

  [复制链接]
ID:329016 发表于 2018-12-30 16:15 | 显示全部楼层 |阅读模式
实训题目:基于单片机的抢答器的设计
1 系统设计
1.1 设计要求
1.1.1设计任务  
基于单片机的抢答器的设计
1.1.2性能指标要求
① 需要自己设计电路并焊接电路板。
② 基本要求:有一个主持人控制开关和6路抢答按扭,当主持人允许抢答时才能进行抢答操作,并用一个数码管显示抢答选手的号码,同时其他选手不能再抢答。
③ 当主持人允许抢答后倒计时5秒时间,在这5秒内抢答有效,过后就不能进行抢答了。
④ 电路上要加个蜂鸣器的电路,当有选手抢答时蜂鸣器响一下。
⑤ 当有选手抢答后,进行倒计时20秒作为选手回答问题时间,用两个数码管显示,倒计时时间到时有声光提示。
⑥ 画电路板时要增加下载接口,方便调试程序。
⑦ 扩展功能(选做):
用按键可设置倒计时的时间,范围在5秒到30秒之间。
1.2 设计思路及设计框图
1.2.1设计思路
设计思路如下:
电路通电后,LED闪烁三次,表示电路各功能正常。抢答之前必须由主持人控制,所以在芯片的P1^0脚处接入开始按键。抢答时必须有选手抢答电路,因为题目要求6位选手抢答,所以分别在P1^1~P1^6设置了从1~6号选手的抢答按键。当主持人按下开始抢答键时,6位选手连接的单片机从P1^1~P1^6的任意1位选手都可以进行抢答,抢答时间为5s。主持人按下开始抢答按键以后,会进入5s倒计时抢答时间,如若在5s之内,有选手抢答成功,则数码管显示抢答选手的号数,抢答成功后灯光提示0.5秒,系统开始自动设定回答问题时间为20s,倒计结束时LED灯亮,并且蜂鸣器响1s,1秒后重新等待主持人控制。
拓展功能利用三个按键来实现控制回答问题的时间的增减,有1号和6号选手按键同时按下开启回答时间调整功能,时间加计数的设置控制键为P1^1,每当按键按下并松开,则倒计时加一。时间减计数的设置控制按键为P1^6,每当按键按下并松开,则倒计时减一,主持人按键P1^0按下来确定回答问题的时间,而且加减计时时间的范围在5s~30s内,主持人确定时间后会有1s的灯光提示,表示调整完成。P0口接的是一个四位一体共阴数码管,P2.0~P2.3作为数码管的位选。三极管8050在电路当中起了开关的作用,当控制三极管开关状态的管脚P3^3输出高电平时,蜂鸣器响,反之蜂鸣器停。

1.2.2总体设计框图


2 各个模块程序的设计
2.1 单片机


STC89C52RC是以51为内核的8位单片机,芯片总共有40个引脚。
P0~P3:总共占32个引脚,其中P0是低8位地址线/数据线的端口,P1是数据线端口,P2是高8位地址线/数据线端口,P3是数据线/第二功能线端口。P0口内部没有上拉电阻,所以在P0用作输出时必须外加上拉电阻。
EA~ /VPP:片外程序ROM有效编程电源,作EA~用时为输出信号,EA~=0片外程序ROM有效,EA~=1片内ROM有效,作VPP用时为电源输入。
XTAL1和XTAL2:外部时钟震荡输入端
RST/VPD:复位/备用电源接入。正常工作时作复位信号引入,当VCC失电时,此脚接入备用电源,使片内RAM中的数据处于底功能保护。
2.2 最小系统


这两部分电路分别为晶振电路和复位电路,这两块电路与单片机的电源电路共同组成了单片机的最小系统。
晶振电路由晶振和两个瓷片电容组成,本实训采用晶振为12MHZ,瓷片电容的容量为22PF,瓷片电容是没有正负极之分的。
本次实训采用的复位电路是手动复位方式,当复位键按下,RST由低电平变为高电平,RST引脚获得2个机器周期的脉冲后,实现手动硬件复位,使单片机重新开始执行程序。
2.3 按键模块电路


按键一端接地,一端接单片机I/O口。当按键按下时,电平状态因一端接地被拉低。
2.4 数码管显示模块电路


本次实训用的是四位共阴数码管,A,B,C,D,E,F,G,DP控制段选;1,2,3,4控制位选。
2.5 蜂鸣器与LED灯模块电路

在本次实训中,蜂鸣器电路材料有8050(NPN)三极管,一个限流电阻,一个蜂鸣器,此时电路中的三极管充当开关作用,当P3^3=1时三极管导通,则蜂鸣器响,反之不响。
LED负极端通过限流电阻接地,正极接入I/O口,当P3^4=1时,LED亮,反之灭。
3  调试过程
焊完板子后用下载线接通电源,观察电源指示灯是否正常,指示灯闪烁后停止工作,断电检查电路,发现有一接地端未联通,接通后发现电源指示灯不在工作。
软件烧录时一直在检测单片机,在尝试断电重连,读写反接后烧录成功。
在验证功能期间发现“选手回答问题结束”后,蜂鸣器和LED一直处在开启状态,需要复位按键复位后才能使用;电源指示灯不工作(可能烧坏了),无法判断电路是否正常;修改代码将声光提醒改为1s,1s后自动恢复等待主持人操作;通电后LED闪烁三次,闪烁结束后等待主持人操作。
在硬件不改变的前提增加扩展功能,使用1号和6号选手按键同时按下开启回答时间调整功能,时间加计数的设置控制键为P1^1,每当按键按下并松开,则倒计时减1。时间减计数的设置控制按键为P1^6,每当按键按下并松开,则倒计时加1,或者一直按着加(减)按键,倒计时会每个0.5s实现自加(减)1,主持人按键P1^0按下来确定回答问题的时间,加减计时时间的调整范围在5s~30s内,主持人确定时间后会有1s的灯光提示,表示调整完成。
4  功能测试
4.1 测试仪器与设备
电脑 :一台
万用表 :一台
烧录器 :一个
4.2 性能指标测试
1.总共有六路抢答,在主持人允许抢答才可以开始抢答,倒计时5秒。
2.一个抢答后,其他选手不能再抢答,可以设定时间来限制回答问题的时间。
3.当有选手开始抢答时,蜂鸣器响一声。
4.选手回答时间结束时有声光显示
5.可以通过按键来设置回答问题时间(5-30秒)。
4.3 误差分析
有时候按键不防抖或无反应
5  实训心得体会
经过这一周的单片机实训,结合之前的单片机理论课和实验课,各个书本与老师的答疑解惑下,我终于完成了本次实训,在单片机电路连接中只需要把单片机最小系统做出来然后把IO口接各个外围器件,写好程序进行操控就可以了,但是也非常考察人的细心和焊功是否牢固。
在这学习的过程中,我通过网上查了许多单片机的资料,让我明白了51单片机的I/0的作用,由于P0口与P1\P2\P3口不同,因为其内部没有上拉电阻,如果不加上拉电阻,会呈现高阻状态,所以当我们需要用P0口给数码管进行段选时,P0口必须外加上拉电阻,通常为10K的排阻。通过分析网上列出的几种不同的蜂鸣器控制电路,我懂得了本次实训蜂鸣器控制电路中的三极管在电路中充当着开关作用,电阻充当着限流作用,保护电路。51单片机I/O口充当控制作用。
在此,我感谢指导我的老师们,通过本次实训学习到的知识是从理论课本上获取不到的,这些调试电路的经验,调试代码的经验,51单片机的原理,统统需要实践的积累。在今后遇到使用单片机所做的项目,我都会通过这次的实训的经验来拟定好一个方案,并能够设计基础电路,在软件方面还需多加练习,多写程序,吸收别人的思维方式,脑海中要构造好流程图,流程图做好,每一步需要怎么写怎么做就一目了然了。

附录1:仿真图

附录2:程序

  1. #include <reg52.h>
  2. /*******定 义 参 数*******/
  3. unsigned char xianshi, kaishi=5, daojishi=20, haoma=0, bitdisplay=0, k=0;
  4. unsigned int i,n=0,  bittime=0;
  5. sbit d1=P1^1;      //选手1
  6. sbit d2=P1^2;      //选手2
  7. sbit d3=P1^3;      //选手3
  8. sbit d4=P1^4;      //选手4
  9. sbit d5=P1^5;      //选手5
  10. sbit d6=P1^6;      //选手6
  11. sbit start=P1^0;   //主持人
  12. sbit LED=P3^4;
  13. sbit fmq=P3^3;     //蜂鸣器
  14. unsigned char Tab[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
  15. /*******延 时 计 数*******/
  16. void delay (unsigned int t) //t=1时,延时1ms
  17. {
  18.               unsigned int a,b;
  19.               for(a=0;a<t;a++)
  20.                             for(b=0;b<120;b++);
  21. }
  22. /*******中断函数*******/
  23. void timer0(void)interrupt 1  //5ms中断一次
  24. {
  25.               TH0 = (65536-5000)/256;
  26.               TL0 = (65536-5000)%256;
  27.               switch(bitdisplay)   //动态显示
  28.               {
  29.               case 0:P2=0xFE;P0=Tab[xianshi/10];break;
  30.               case 1:P2=0xFD;P0=Tab[xianshi%10];
  31. break;
  32.               case 2:P2=0xF7;P0=Tab[haoma];break;
  33.               case 3:P2=0xFB;P0=0x40; break;
  34.               }
  35.               bitdisplay++;                 
  36.               bittime++;                                         
  37.               if(bitdisplay==4)
  38.                             bitdisplay=0;
  39.               if(bittime==200)               //5*200=1000ms
  40.               {
  41.                             bittime=0;
  42.                             xianshi--;
  43.               }
  44.               if(xianshi==0) /*如果倒计时结束则蜂鸣器与LED显示*/
  45.               {
  46.                             P2=0xff;
  47.                             fmq=1;
  48.                             LED=1;              
  49.                             delay(1000);
  50.                             fmq=0;
  51.                             LED=0;
  52.                             TR0=0;
  53.               }
  54. }
  55. void djtime() //倒计时间修改
  56. {
  57. if(d1==0&&d6==0)
  58.               {
  59.                             n=1;
  60.               }
  61.               while(n)
  62.                             {
  63.                                           for(i=0;i<50;i++)
  64.                                           {
  65.                                           P2=0xFB;P0=Tab[daojishi/10];
  66.                                                         delay(5);
  67.                                P2=0xF7;P0=Tab[daojishi%10];
  68.                                                         delay(5);
  69.                                           }
  70.                                           if(d1==0)
  71.                                           delay(33);
  72.                                           if(d1==0)
  73.                                           daojishi--;
  74.                                           if(d6==0)
  75.                                           delay(33);
  76.                                           if(d6==0)
  77.                                           daojishi++;
  78.                                           if(daojishi>30)
  79.                                           daojishi=30;
  80.                                           if(daojishi<5)
  81.                                           daojishi=5;
  82.                                           if(start==0)
  83.                                           delay(33);
  84.                                           if(start==0)
  85.                                           {
  86.                                           n=0;
  87.                                           LED=1;
  88.                                           for(i=0;i<100;i++)
  89.                                           {
  90.                                           P2=0xFB;P0=Tab[daojishi/10];
  91.                                                         delay(5);
  92. P2=0xF7;P0=Tab[daojishi%10];
  93.                                                         delay(5);
  94.                                           }
  95.                                           P2=0xff;                                                                     
  96.                                           LED=0;
  97.                                           }
  98.                             }
  99. }
  100. /*******主  函  数*******/
  101. void main()
  102. {            
  103.               TMOD=0X01;                           
  104.               TH0 = (65536-5000)/256;
  105.               TL0 = (65536-5000)%256;
  106.               EA=1;                           
  107.               ET0=1;                 //定时器中断
  108.               TR0=0;              //定时器,等待手动开启
  109.               fmq=0;
  110.               for(i=0;i<6;i++)
  111.                             {
  112.                                           LED=~LED;
  113.                                           delay(500);
  114.                             }
  115.               LED=0;  
  116.               while(1)
  117.               {  
  118.                             djtime();
  119.                             if(start==0)      
  120.                                           delay(33);
  121.                             if(start==0)
  122.                             {
  123.                                           k=1;
  124.                                           haoma=0;                 
  125.                                           xianshi=kaishi;               
  126.                                           TR0=1;
  127.                             }                                         
  128.                             while(k)
  129.                             {
  130.                                           while(xianshi)
  131.                                           {
  132.                                                         if(d1==0)
  133.                                                                       delay(33);
  134.                                                         if(d1==0)
  135.                                                         {            
  136.                                                                       haoma=1;
  137.                                                                       break;            
  138.                                                         }
  139.                                                         if(d2==0)
  140.                                                                       delay(33);
  141.                                                         if(d2==0)
  142.                                                         {                                                      
  143.                                                                       haoma=2;
  144.                                                                       break;                                         
  145.                                                         }
  146.                                                         if(d3==0)              
  147.                                                                       delay(33);
  148.                                                         if(d3==0)
  149.                                                         {                                                      
  150.                                                                       haoma=3;
  151.                                                                       break;                                         
  152.                                                         }                           
  153.                                                         if(d4==0)                                          
  154.                                                                       delay(33);
  155.                                                         if(d4==0)
  156.                                                         {                                                      
  157.                                                                       haoma=4;
  158.                                                                       break;                                         
  159.                                                         }                                         
  160.                                                         if(d5==0)                                          
  161.                                                                       delay(33);
  162.                                                         if(d5==0)

  163.                                                         {                                                      
  164. ……………………

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

全部资料51hei下载地址:
抢答器.7z (445.8 KB, 下载次数: 218)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:555534 发表于 2019-6-5 12:49 | 显示全部楼层
后面为啥看不见
回复

使用道具 举报

ID:551117 发表于 2019-6-6 13:59 | 显示全部楼层
求一个三路抢答器带液晶屏的仿真和源代码
回复

使用道具 举报

ID:561689 发表于 2019-6-13 14:01 | 显示全部楼层
厉害~~~~~
回复

使用道具 举报

ID:570523 发表于 2019-6-24 09:39 | 显示全部楼层
太厉害了吧
回复

使用道具 举报

ID:570523 发表于 2019-6-24 09:41 | 显示全部楼层
厉害厉害 太爱楼楼了
回复

使用道具 举报

ID:641767 发表于 2019-11-14 10:52 | 显示全部楼层
后面的没有了吗
回复

使用道具 举报

ID:644142 发表于 2019-11-18 11:30 来自手机 | 显示全部楼层
也太厉害了吧
回复

使用道具 举报

ID:110278 发表于 2019-11-19 14:14 | 显示全部楼层
看不到了。
回复

使用道具 举报

ID:674921 发表于 2019-12-30 03:02 | 显示全部楼层
有12个按键的嘛
回复

使用道具 举报

ID:678490 发表于 2019-12-31 22:43 | 显示全部楼层
写的很好,也很对,里面通过1和6按键修改倒计时,而且还能实现抢答的功能,k用来控制抢答,n用来控制修改时间,多谢楼主帮助。
回复

使用道具 举报

ID:1099065 发表于 2023-11-23 20:59 来自手机 | 显示全部楼层
用不了
回复

使用道具 举报

ID:1098917 发表于 2023-11-28 21:09 | 显示全部楼层
还不错的程序,值得借鉴
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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